117 lines
3.9 KiB
Text
Executable file
117 lines
3.9 KiB
Text
Executable file
#!/usr/bin/newlisp
|
|
|
|
; Test libffi routines - all of the tests are performed using only the
|
|
; OS platforms libc system library. For tests compiling a C libray
|
|
; with source code in util/ffitest.c see qa-libffi
|
|
|
|
; some simple libc functions
|
|
|
|
; when doing "make testall" only text lines starting with ">>>" are printed
|
|
|
|
(set-locale "C")
|
|
|
|
(when (zero? (& 1024 (sys-info -1)))
|
|
(println ">>>>> qa-libc-libffi: tests only run on extended FFI enabled versions compiled with ffilib")
|
|
(exit))
|
|
|
|
(set 'is64bit (not (zero? (& 256 (sys-info -1))))) ; used later
|
|
|
|
(define (get-libc-name)
|
|
(letn (libc-name (first (exec "gcc -print-file-name=libc.so"))
|
|
libc-filetype (first (exec (string "file -b " libc-name))))
|
|
(if (find "ASCII" libc-filetype)
|
|
(first (regex "[^ \t]+/libc\\.so\\.*[0-9]*" (read-file libc-name)))
|
|
libc-name))
|
|
)
|
|
|
|
(define LIBC
|
|
(case ostype
|
|
("Windows" "msvcrt.dll")
|
|
("Cygwin" "msvcrt.dll")
|
|
("OSX" "libc.dylib")
|
|
("BSD" (get-libc-name) )
|
|
("Linux" (get-libc-name) )
|
|
))
|
|
|
|
(println "\nTesting imports from " LIBC "\n")
|
|
|
|
(unless (catch (import LIBC "sprintf" "int" "char*" "char*" "int" "double") 'result)
|
|
(println ">>>>> ERR cannot find library in qa-libc-libffi")
|
|
(exit))
|
|
|
|
(set 'buff (dup "\000" 64))
|
|
(sprintf buff "int 42 => %i, double Pi => %6.4f" 42 (mul 2 (acos 0)))
|
|
(set 'buff (get-string buff)) ;; trim buff of trailing zeroes
|
|
(println "->" buff "<-")
|
|
(unless (= buff "int 42 => 42, double Pi => 3.1416")
|
|
(println ">>>>> ERR problem importing sprinf() in qa-libc-libffi"))
|
|
|
|
(import LIBC "atof" "double" "char*")
|
|
(println {(atof "3.141") => } (atof "3.141"))
|
|
(unless (= (atof "3.141") 3.141)
|
|
(println ">>>>> ERR problem importing atof() in qa-libc-libffi"))
|
|
|
|
(import LIBC "atoi" "int" "char*")
|
|
(println {(atoi "3434") => } (atoi "3434"))
|
|
(unless (= (atoi "3434") 3434)
|
|
(println ">>>>> ERR problem importing atoi() in qa-libc-libffi"))
|
|
|
|
(import LIBC "strcpy" "char*" "char*" "char*")
|
|
(set 'from "Hello World")
|
|
(set 'to (dup "\000" (length from)))
|
|
(strcpy to from)
|
|
(println "(strcpy from to) => " to)
|
|
(unless (= to from)
|
|
(println ">>>>> ERR problem importing strcpy() in qa-libc-libffi"))
|
|
|
|
(when (!= ostype "Linux")
|
|
(import LIBC "fabs" "double" "double")
|
|
(println {(fabs -8.230) => } (fabs 8.230))
|
|
(println {(fabs 3.14159) => } (fabs 3.14159))
|
|
(unless (and (= (fabs -8.230) 8.230) (= (fabs 3.14159) 3.14159))
|
|
(println ">>>>> ERR problem importing fabs() in qa-libc-libffi"))
|
|
)
|
|
|
|
; test struct pack unpack
|
|
|
|
(import LIBC "asctime" "char*" "void*")
|
|
(import LIBC "localtime" "void*" "void*")
|
|
|
|
(if (find ostype '("Windows"))
|
|
(struct 'tm "int" "int" "int" "int" "int" "int" "int" "int" "int")
|
|
(struct 'tm "int" "int" "int" "int" "int" "int" "int" "int" "int" "long" "char*")
|
|
)
|
|
|
|
(if (find ostype '("Windows" "Cygwin"))
|
|
(set 'tmlist '(1 2 3 4 5 6 7 8 9))
|
|
(set 'tmlist '(1 2 3 4 5 6 7 8 9 10 "hello world")))
|
|
|
|
(if (= tmlist (unpack tm (pack tm tmlist)))
|
|
(println "unpack pack => true")
|
|
(println ">>>>> ERR problem in struct pack/unpack in qa-libc-libffi"))
|
|
|
|
(set 'ptr (localtime (address (date-value))))
|
|
(println "unpack localtime structure => " (unpack tm ptr))
|
|
(println "struct testing, today => " (asctime (localtime (address (date-value)))))
|
|
|
|
; test callback
|
|
|
|
(import LIBC "qsort" "void" "void*" "int" "int" "void*")
|
|
(set 'len 1000)
|
|
(set 'rlist (rand 10 len))
|
|
(set 'carray (pack (dup "ld " len) rlist))
|
|
(define (cmp a b) (- (get-int a) (get-int b)))
|
|
(qsort (address carray) len 4 (callback 'cmp "int" "void*" "void*"))
|
|
(println "qsort " len " elements => " (apply <= (unpack (dup "ld " len) carray)))
|
|
(unless (apply <= (unpack (dup "ld " len) carray))
|
|
(println ">>>>> ERR problem in import qsort() with callback in qa-libc-libffi"))
|
|
|
|
|
|
(unless (= ostype "Linux")
|
|
(import LIBC "atexit" "void" "void*")
|
|
(define (quit) (println "-> Quit ! => true"))
|
|
(print "atexit callback => ")
|
|
(atexit (callback 'quit "void" "void"))
|
|
)
|
|
|
|
(exit)
|