Currently the interface of the library is in okay shape. It
- propably will not change much but no guarantees are being made
- just yet.
+ In alpha.
+
-
-
-
-
+
-
-
-
-
-
+
+
+
+
@@ -207,10 +195,6 @@ Documentation - 0.6.0
| X |
X |
X |
- X |
- X |
- X |
- X |
|
@@ -222,10 +206,6 @@ Documentation - 0.6.0
| X |
X |
X |
- X |
- X |
- X |
- X |
| Cyclone |
@@ -234,23 +214,15 @@ Documentation - 0.6.0
X |
X |
X |
- |
- X |
- X |
- X |
X |
|
| Gambit |
X |
- X |
|
|
|
- X |
- |
- |
|
|
|
@@ -263,18 +235,10 @@ Documentation - 0.6.0
X |
X |
X |
- X |
- X |
- X |
- X |
|
| Gerbil |
- X |
- |
- |
- |
|
|
|
@@ -292,10 +256,6 @@ Documentation - 0.6.0
X |
X |
X |
- X |
- X |
- X |
- X |
| Kawa |
@@ -306,17 +266,9 @@ Documentation - 0.6.0
X |
X |
X |
- X |
- X |
- X |
- X |
| Larceny |
- X |
- |
- |
- |
|
|
|
@@ -332,10 +284,6 @@ Documentation - 0.6.0
X |
X |
X |
- |
- X |
- X |
- X |
X |
X |
@@ -348,10 +296,6 @@ Documentation - 0.6.0
X |
X |
X |
- X |
- X |
- X |
- X |
| Saggittarius |
@@ -362,17 +306,9 @@ Documentation - 0.6.0
X |
X |
X |
- X |
- X |
- X |
- X |
| Skint |
- X |
- |
- |
- |
|
|
|
@@ -386,10 +322,6 @@ Documentation - 0.6.0
X |
X |
X |
- X |
- X |
- |
- X |
|
|
|
@@ -404,10 +336,6 @@ Documentation - 0.6.0
|
|
|
- |
- |
- |
- |
| Ypsilon |
@@ -418,10 +346,6 @@ Documentation - 0.6.0
X |
X |
X |
- X |
- X |
- X |
- X |
@@ -430,8 +354,11 @@ Documentation - 0.6.0
These features are built upon the primitives and if
primitives are implemented and work, they should work too.
- - pffi-pointer-allocate
- - pffi-pointer-free
+ - make-c-bytevector
+ - make-c-null
+ - c-null?
+ - pffi-pointer-address
+ - c-free
- pffi-pointer->string
- pffi-string->pointer
- pffi-struct-make
@@ -619,19 +546,19 @@ make <SCHEME>
Always call this first, on most implementation it does
nothing but some implementations might need initialisation
run.
- pffi-size-of
-
- pffi-size-of object -> number
+ c-size-of
+
+ c-size-of object -> number
Returns the size of the pffi-struct, pffi-enum or
pffi-type.
pffi-align-of
pffi-align-of type -> number
Returns the align of the type.
- pffi-define-library
-
- pffi-define-library headers
- shared-object-name [options] -> object
+ define-c-library
+
+ define-c-library headers shared-object-name
+ [options] -> object
Load given shared object automatically searching many
predefined paths.
Takes as argument a list of C headers, these are for the
@@ -656,12 +583,12 @@ make <SCHEME>
Example:
(cond-expand
- (windows (pffi-define-library libc-stdlib
+ (windows (define-c-library libc-stdlib
'("stdlib.h")
"ucrtbase"
'((additional-versions ("0" "6"))
(additiona-paths (".")))))
- (else (pffi-define-library libc-stdlib
+ (else (define-c-library libc-stdlib
(list "stdlib.h")
"c"
'((additional-versions ("0" "6"))
@@ -681,38 +608,47 @@ make <SCHEME>
As ’(… and not (list…
- pffi-pointer-null
-
- pffi-pointer-null -> pointer
+ make-c-null
+
+ make-c-null -> pointer
Returns a new NULL pointer.
- pffi-pointer-null?
-
- pffi-pointer-null? pointer -> boolean
+ c-null?
+
+ c-null? pointer -> boolean
Returns #t if given pointer is null pointer, #f
otherwise.
- pffi-pointer-allocate
-
- pffi-pointer-allocate size -> pointer
+ make-c-bytevector
+
+ make-c-bytevector size -> pointer
Returns newly allocated pointer of given size.
pffi-pointer-address
pffi-pointer-address pointer ->
- number
- Returns the address of given pointer as number.
- pffi-pointer?
+ pointer
+ Returns the address of given pointer inside a pointer. This
+ is used when passing pointers to pointers to foreign procedures.
+ This is similar to the c’s &. One important
+ difference is that after you have passed a pointer to
+ the procedure you must get value from it back to the pointer
+ which address you are passing. Example:
+ (define input-pointer (make-c-bytevector <needed size>))
+(define input-pointer-address (pffi-pointer-address input-pointer))
+(<foreign-procedure-that takes &pointer as argument> input-pointer-address)
+(set! input-pointer (pffi-pointer-get input-pointer-address 'pointer 0))
+ c-bytevector?
- pffi-pointer? object -> boolean
+ c-bytevector? object -> boolean
Returns #t if given object is pointer, #f otherwise.
- pffi-pointer-free
-
- pffi-pointer-free pointer
+ c-free
+
+ c-free pointer
Frees given pointer.
pffi-pointer-set!
pffi-pointer-set! pointer type offset
value
Sets the value on a pointer on given offset. For example:
- (define p (pffi-pointer-allocate 128))
+ (define p (make-c-bytevector 128))
(pffi-pointer-set! p 'int 64 100)
Would set the offset of 64, on pointer p to value 100.
pffi-pointer-get
@@ -721,18 +657,18 @@ make <SCHEME>
object
Gets the value from a pointer on given offset. For
example:
- (define p (pffi-pointer-allocate 128))
+ (define p (make-c-bytevector 128))
(pffi-pointer-set! p 'int 64 100)
(pffi-pointer-get p 'int 64)
> 100
- pffi-string->pointer
-
- pffi-string->pointer string ->
+
string->c-bytevector
+
+ string->c-bytevector string ->
pointer
Makes pointer out of a given string.
- pffi-pointer->string
-
- pffi-pointer->string pointer ->
+
c-bytevector->string
+
+ c-bytevector->sring pointer ->
string
Makes string out of a given pointer.
pffi-struct-make
@@ -804,16 +740,16 @@ make <SCHEME>
pffi-array->list type list length
Converts given C array into list of given type and
length.
- pffi-define-function
-
- pffi-define-function scheme-name
- shared-object c-name return-type argument-types
+ define-c-procedure
+
+ define-c-procedure scheme-name shared-object
+ c-name return-type argument-types
Defines a new foreign function to be used from Scheme code.
For example:
(cond-expand
- (windows (pffi-define-library libc-stdlib '("stdlib.h") "ucrtbase" '("")))
- (else (pffi-define-library libc-stdlib '("stdlib.h") "c" '("" "6"))))
-(pffi-define-function c-puts libc-stdlib 'puts 'int '(pointer))
+ (windows (define-c-library libc-stdlib '("stdlib.h") "ucrtbase" '("")))
+ (else (define-c-library libc-stdlib '("stdlib.h") "c" '("" "6"))))
+(define-c-procedure c-puts libc-stdlib 'puts 'int '(pointer))
(c-puts "Message brought to you by FFI!")
pffi-define-callback
@@ -823,11 +759,11 @@ make <SCHEME>
code. For example:
; Load the shared library
(cond-expand
- (windows (pffi-define-library libc-stdlib '("stdlib.h") "ucrtbase" '()))
- (else (pffi-define-library '("stdlib.h") "c" '("" "6"))))
+ (windows (define-c-library libc-stdlib '("stdlib.h") "ucrtbase" '()))
+ (else (define-c-library '("stdlib.h") "c" '("" "6"))))
; Define C function that takes a callback
-(pffi-define-function qsort libc-stdlib 'qsort 'void '(pointer int int callback))
+(define-c-procedure qsort libc-stdlib 'qsort 'void '(pointer int int callback))
; Define our callback
(pffi-define-callback compare
@@ -841,17 +777,17 @@ make <SCHEME>
((< a b) -1)))))
; Create new array of ints to be sorted
-(define array (pffi-pointer-allocate (* (pffi-size-of 'int) 3)))
-(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 0) 3)
-(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 1) 2)
-(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 2) 1)
+(define array (make-c-bytevector (* (c-size-of 'int) 3)))
+(pffi-pointer-set! array 'int (* (c-size-of 'int) 0) 3)
+(pffi-pointer-set! array 'int (* (c-size-of 'int) 1) 2)
+(pffi-pointer-set! array 'int (* (c-size-of 'int) 2) 1)
(display array)
(newline)
;> (3 2 1)
; Sort the array
-(qsort array 3 (pffi-size-of 'int) compare)
+(qsort array 3 (c-size-of 'int) compare)
(display array)
(newline)
diff --git a/documentation/R7RS-PFFI.pdf b/documentation/R7RS-PFFI.pdf
index 2e6fcde..2ac5fa0 100644
Binary files a/documentation/R7RS-PFFI.pdf and b/documentation/R7RS-PFFI.pdf differ
diff --git a/retropikzel/pffi.sld b/retropikzel/pffi.sld
index 229e9b9..200c0c0 100644
--- a/retropikzel/pffi.sld
+++ b/retropikzel/pffi.sld
@@ -1,14 +1,15 @@
(define-library
- (retropikzel pffi)
+ (retropikzel pffi) ; (foreign r7rs)? (foreign c)?
(cond-expand
(chibi
- (import (scheme base)
+ (import (except (scheme base) bytevector-copy!)
(scheme write)
(scheme char)
(scheme file)
(scheme process-context)
(chibi ast)
- (chibi))
+ (chibi)
+ (r6rs bytevectors))
(include-shared "pffi/chibi-pffi"))
(chicken
(import (scheme base)
@@ -21,7 +22,8 @@
(chicken locative)
(chicken syntax)
(chicken memory)
- (chicken random)))
+ (chicken random)
+ (r6rs bytevectors)))
(cyclone
(import (scheme base)
(scheme write)
@@ -29,14 +31,16 @@
(scheme file)
(scheme process-context)
(cyclone foreign)
- (scheme cyclone primitives)))
+ (scheme cyclone primitives)
+ (r6rs bytevectors)))
(gambit
(import (scheme base)
(scheme write)
(scheme char)
(scheme file)
(scheme process-context)
- (only (gambit) c-declare c-lambda c-define define-macro)))
+ (only (gambit) c-declare c-lambda c-define define-macro)
+ (r6rs bytevectors)))
(gauche
(import (scheme base)
(scheme write)
@@ -44,29 +48,32 @@
(scheme file)
(scheme process-context)
(gauche base)
- (retropikzel pffi gauche)))
+ (retropikzel pffi gauche)
+ (r6rs bytevectors)))
(gerbil
(import (scheme base)
(scheme write)
(scheme char)
(scheme file)
- (scheme process-context)))
+ (scheme process-context)
+ (r6rs bytevectors)))
(guile
(import (scheme base)
(scheme write)
(scheme char)
(scheme file)
(scheme process-context)
- (rnrs bytevectors)
(system foreign)
(system foreign-library)
- (only (guile) include-from-path)))
+ (only (guile) include-from-path)
+ (rnrs bytevectors)))
(kawa
- (import (scheme base)
+ (import (except (scheme base) bytevector-copy bytevector-copy!)
(scheme write)
(scheme char)
(scheme file)
- (scheme process-context)))
+ (scheme process-context)
+ (r6rs bytevectors)))
(larceny
(import (scheme base)
(scheme write)
@@ -77,14 +84,16 @@
(primitives std-ffi)
(primitives foreign-procedure)
(primitives foreign-file)
- (primitives foreign-stdlib)))
+ (primitives foreign-stdlib)
+ (r6rs bytevectors)))
(mosh
- (import (scheme base)
+ (import (except (scheme base) bytevector-copy!)
(scheme write)
(scheme char)
(scheme file)
(scheme process-context)
- (mosh ffi)))
+ (mosh ffi)
+ (r6rs bytevectors)))
(racket
(import (scheme base)
(scheme write)
@@ -95,37 +104,87 @@
(ffi winapi)
(compatibility mlist)
(ffi unsafe)
- (ffi vector)))
+ (ffi vector)
+ (except (r6rs bytevectors) bytevector-copy!)))
(sagittarius
(import (scheme base)
(scheme write)
(scheme char)
(scheme file)
(scheme process-context)
- (sagittarius ffi)
- (sagittarius)))
+ (except (sagittarius ffi) c-free c-malloc)
+ (sagittarius)
+ (r6rs bytevectors)))
(skint
(import (scheme base)
(scheme write)
(scheme char)
(scheme file)
- (scheme process-context)))
+ (scheme process-context)
+ (r6rs bytevectors)))
(stklos
(import (scheme base)
(scheme write)
(scheme char)
(scheme file)
(scheme process-context)
- (stklos))
+ (only (stklos)
+ make-external-function
+ allocate-bytes
+ free-bytes
+ cpointer?
+ cpointer-null?
+ cpointer-data
+ cpointer-data-set!
+ pointer-set-c-int8_t!
+ pointer-ref-c-int8_t
+ pointer-set-c-uint8_t!
+ pointer-ref-c-uint8_t
+ pointer-set-c-int16_t!
+ pointer-ref-c-int16_t
+ pointer-set-c-uint16_t!
+ pointer-ref-c-uint16_t
+ pointer-set-c-int32_t!
+ pointer-ref-c-int32_t
+ pointer-set-c-uint32_t!
+ pointer-ref-c-uint32_t
+ pointer-set-c-int64_t!
+ pointer-ref-c-int64_t
+ pointer-set-c-uint64_t!
+ pointer-ref-c-uint64_t
+ pointer-set-c-char!
+ pointer-ref-c-char
+ pointer-set-c-short!
+ pointer-ref-c-short
+ pointer-set-c-unsigned-short!
+ pointer-ref-c-unsigned-short
+ pointer-set-c-int!
+ pointer-ref-c-int
+ pointer-set-c-unsigned-int!
+ pointer-ref-c-unsigned-int
+ pointer-set-c-long!
+ pointer-ref-c-long
+ pointer-set-c-unsigned-long!
+ pointer-ref-c-unsigned-long
+ pointer-set-c-float!
+ pointer-ref-c-float
+ pointer-set-c-double!
+ pointer-ref-c-double
+ pointer-set-c-pointer!
+ pointer-ref-c-pointer
+ void?)
+ (r6rs bytevectors))
(export make-external-function
calculate-struct-size-and-offsets
- struct-make))
+ struct-make
+ pffi:string-split))
(tr7
(import (scheme base)
(scheme write)
(scheme char)
(scheme file)
- (scheme process-context)))
+ (scheme process-context)
+ (r6rs bytevectors)))
(ypsilon
(import (scheme base)
(scheme write)
@@ -134,42 +193,67 @@
(scheme process-context)
(ypsilon c-ffi)
(ypsilon c-types)
- (only (core) define-macro syntax-case))))
- (export pffi-init
- pffi-size-of
- pffi-type?
- pffi-align-of
- pffi-define-library
- pffi-pointer-null
- pffi-pointer-null?
- pffi-pointer-allocate
- pffi-pointer-address
- pffi-pointer?
- pffi-pointer-free
- pffi-pointer-set!
- pffi-pointer-get
- pffi-string->pointer
- pffi-pointer->string
- pffi-define-struct
- pffi-struct-pointer
- pffi-struct-offset-get
- pffi-struct-get
- pffi-struct-set!
- pffi-array-allocate
- pffi-array-pointer
- pffi-array?
- pffi-pointer->array
- pffi-array-get
- pffi-array-set!
- pffi-list->array
- pffi-array->list
- pffi-define-function
- pffi-define-callback)
+ (only (core) define-macro syntax-case)
+ (except (rnrs bytevectors)
+ bytevector-copy!
+ bytevector-copy
+ string->utf8
+ utf8->string))))
+ (export ;; Primitives
+ c-size-of
+ define-c-library
+ define-c-procedure
+ ;pffi-define-callback; define-c-callback (?)
+ c-bytevector?
+ pffi-pointer-set!;c-bytevector-u8-set! and so on
+ pffi-pointer-get;c-bytevector-u8-ref and so on
+
+ ;; c-bytevector
+ make-c-bytevector
+ c-bytevector ;; TODO Documentation, Testing
+ make-c-null
+ c-null?
+ c-free
+ c-bytevector-string-length ;; TODO Documentation, Testing
+ bytevector->c-bytevector
+ c-bytevector->bytevector
+ call-with-address-of-c-bytevector ;; Todo Documentation
+ string->c-bytevector
+ c-bytevector->string
+
+ ;c-bytevector-u8-ref ;; TODO Documentation, Testing
+
+ ;; c-struct
+ pffi-define-struct;define-c-struct
+ pffi-struct-pointer;c-struct-bytevector
+ pffi-struct-offset-get;c-struct-offset
+ pffi-struct-set!;c-struct-set!
+ pffi-struct-get;c-struct-get
+
+ ;; c-array
+ ;define-c-array (?)
+ pffi-array-allocate;make-c-array
+ pffi-array-pointer;c-array-pointer
+ pffi-array?;c-array?
+ pffi-pointer->array;c-bytevector->array
+ pffi-array-get;c-array-get
+ pffi-array-set!;c-array-set!
+ pffi-list->array;list->c-array
+ pffi-array->list;c-array->list
+
+ ;; c-variable
+ ;define-c-variable (?)
+ )
(cond-expand
(chibi (include "pffi/chibi.scm"))
- (chicken-5 (include "pffi/chicken.scm"))
+ (chicken-5 (export foreign-declare
+ foreign-safe-lambda
+ void)
+ (include "pffi/chicken.scm"))
(chicken-6 (include-relative "pffi/chicken.scm"))
- (cyclone (include "pffi/cyclone.scm"))
+ (cyclone (export calculate-struct-size-and-offsets
+ struct-make)
+ (include "pffi/cyclone.scm"))
(gambit (include "pffi/gambit.scm"))
(gauche (include "pffi/gauche.scm"))
(gerbil (include "pffi/gerbil.scm"))
@@ -182,14 +266,14 @@
(skint (include "pffi/skint.scm"))
(stklos (include "pffi/stklos.scm"))
(tr7 (include "pffi/tr7.scm"))
- (ypsilon (include "pffi/ypsilon.scm")))
- ;(include "pffi/shared/union.scm")
+ (ypsilon (export c-function)
+ (include "pffi/ypsilon.scm")))
(cond-expand
(chicken-6 (include-relative "pffi/shared/main.scm")
- (include-relative "pffi/shared/pointer.scm")
- (include-relative "pffi/shared/array.scm")
- (include-relative "pffi/shared/struct.scm"))
+ (include-relative "pffi/shared/pointer.scm")
+ (include-relative "pffi/shared/array.scm")
+ (include-relative "pffi/shared/struct.scm"))
(else (include "pffi/shared/main.scm")
+ (include "pffi/shared/struct.scm")
(include "pffi/shared/pointer.scm")
- (include "pffi/shared/array.scm")
- (include "pffi/shared/struct.scm"))))
+ (include "pffi/shared/array.scm"))))
diff --git a/retropikzel/pffi/chibi-src/pffi.stub b/retropikzel/pffi/chibi-src/pffi.stub
index 7354e47..e46001a 100644
--- a/retropikzel/pffi/chibi-src/pffi.stub
+++ b/retropikzel/pffi/chibi-src/pffi.stub
@@ -4,7 +4,7 @@
(c-system-include "dlfcn.h")
(c-system-include "ffi.h")
-;; pffi-size-of
+;; c-size-of
(c-declare "
int size_of_int8_t() { return sizeof(int8_t); }
int size_of_uint8_t() { return sizeof(uint8_t); }
@@ -47,7 +47,7 @@
(define-c int (size-of-double size_of_double) ())
(define-c int (size-of-pointer size_of_pointer) ())
-;; pffi-shape-object-load
+;; pffi-shared-object-load
(define-c-const int (RTLD-NOW "RTLD_NOW"))
(define-c (maybe-null pointer void*) dlopen (string int))
(define-c (maybe-null pointer void*) dlerror ())
@@ -70,10 +70,10 @@
}")
(define-c sexp (pointer? is_pointer) (sexp))
-(c-declare "intptr_t pointer_address(struct sexp_struct* pointer) {
- return (intptr_t)&sexp_cpointer_value(pointer);
+(c-declare "void* pointer_address(struct sexp_struct* pointer) {
+ return (void*)&sexp_cpointer_value(pointer);
}")
-(define-c uint32_t (pointer-address pointer_address) (sexp))
+(define-c (maybe-null pointer void*) (pointer-address pointer_address) (sexp))
(c-declare "void pointer_free(void* pointer) { free(pointer); }")
(define-c void (pointer-free pointer_free) ((maybe-null pointer void*)))
@@ -99,8 +99,8 @@
(c-declare "void pointer_set_c_uint64_t(void* pointer, int offset, uint64_t value) { *(uint64_t*)((char*)pointer + offset) = value; }")
(define-c void (pointer-set-c-uint64_t! pointer_set_c_uint64_t) ((pointer void*) int uint64_t))
-(c-declare "void pointer_set_c_char(void* pointer, int offset, char value) { *((char*)pointer + offset) = value; }")
-(define-c void (pointer-set-c-char! pointer_set_c_char) ((pointer void*) int char))
+(c-declare "void pointer_set_c_char(void* pointer, int offset, int8_t value) { *((char*)pointer + offset) = value; }")
+(define-c void (pointer-set-c-char! pointer_set_c_char) ((pointer void*) int int8_t))
(c-declare "void pointer_set_c_unsigned_char(void* pointer, int offset, unsigned char value) { *(unsigned char*)((char*)pointer + offset) = value; }")
(define-c void (pointer-set-c-unsigned-char! pointer_set_c_unsigned_char) ((pointer void*) int unsigned-char))
@@ -149,8 +149,8 @@
(c-declare "uint64_t pointer_ref_c_uint64_t(void* pointer, int offset) { return *(uint64_t*)((char*)pointer + offset); }")
(define-c uint64_t (pointer-ref-c-uint64_t pointer_ref_c_uint64_t) ((pointer void*) int))
-(c-declare "char pointer_ref_c_char(void* pointer, int offset) { return *(char*)((char*)pointer + offset); }")
-(define-c char (pointer-ref-c-char pointer_ref_c_char) ((pointer void*) int))
+(c-declare "int8_t pointer_ref_c_char(void* pointer, int offset) { return *(char*)((char*)pointer + offset); }")
+(define-c int8_t (pointer-ref-c-char pointer_ref_c_char) ((pointer void*) int))
(c-declare "unsigned char pointer_ref_c_unsigned_char(void* pointer, int offset) { return *(unsigned char*)((char*)pointer + offset); }")
(define-c unsigned-char (pointer-ref-c-unsigned-char pointer_ref_c_unsigned_char) ((pointer void*) int))
@@ -178,15 +178,7 @@
(c-declare "void* pointer_ref_c_pointer(void* pointer, int offset) { char* p = (char*)pointer + offset; return *(char**)p; }")
(define-c (maybe-null pointer void*) (pointer-ref-c-pointer pointer_ref_c_pointer) ((pointer void*) int))
-;; pffi-string->pointer
-;(c-declare "void* string_to_pointer(char* string) { return (void*)string; }")
-;(define-c (maybe-null pointer void*) (string-to-pointer string_to_pointer) (string))
-
-;; pffi-pointer->string
-;(c-declare "char* pointer_to_string(void* pointer) { return (char*)pointer; }")
-;(define-c string (pointer-to-string pointer_to_string) ((maybe-null pointer void*)))
-
-;; pffi-define-function
+;; define-c-procedure
(c-declare "ffi_cif cif;")
(define-c (pointer void*) dlsym ((maybe-null pointer void*) string))
diff --git a/retropikzel/pffi/chibi.scm b/retropikzel/pffi/chibi.scm
index c914484..2915a5c 100644
--- a/retropikzel/pffi/chibi.scm
+++ b/retropikzel/pffi/chibi.scm
@@ -29,32 +29,22 @@
(lambda (path options)
(let ((shared-object (dlopen path RTLD-NOW))
(maybe-error (dlerror)))
- (when (not (pffi-pointer-null? maybe-error))
- (error (pffi-pointer->string maybe-error)))
+ #;(when (not (pffi-pointer-null? maybe-error))
+ (error (c-bytevector->string maybe-error)))
shared-object)))
-(define pffi-pointer-null
- (lambda ()
- (pointer-null)))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (not pointer))) ; #f is null on Chibi
-
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(or (equal? object #f) ; False can be null pointer
(pointer? object))))
-(define pffi-pointer-allocate
- (lambda (size)
- (pointer-allocate size)))
+(define make-c-bytevector
+ (lambda (k . byte)
+ (if (null? byte)
+ (pointer-allocate k)
+ (bytevector->c-bytevector (make-bytevector k byte)))))
-(define pffi-pointer-address
- (lambda (pointer)
- (pointer-address pointer)))
-
-(define pffi-pointer-free
+(define c-free
(lambda (pointer)
(pointer-free pointer)))
@@ -68,7 +58,7 @@
((equal? type 'uint32) (pointer-set-c-uint32_t! pointer offset value))
((equal? type 'int64) (pointer-set-c-int64_t! pointer offset value))
((equal? type 'uint64) (pointer-set-c-uint64_t! pointer offset value))
- ((equal? type 'char) (pointer-set-c-char! pointer offset value))
+ ((equal? type 'char) (pointer-set-c-char! pointer offset (char->integer value)))
((equal? type 'short) (pointer-set-c-short! pointer offset value))
((equal? type 'unsigned-short) (pointer-set-c-unsigned-short! pointer offset value))
((equal? type 'int) (pointer-set-c-int! pointer offset value))
@@ -90,7 +80,7 @@
((equal? type 'uint32) (pointer-ref-c-uint32_t pointer offset))
((equal? type 'int64) (pointer-ref-c-int64_t pointer offset))
((equal? type 'uint64) (pointer-ref-c-uint64_t pointer offset))
- ((equal? type 'char) (pointer-ref-c-char pointer offset))
+ ((equal? type 'char) (integer->char (pointer-ref-c-char pointer offset)))
((equal? type 'short) (pointer-ref-c-short pointer offset))
((equal? type 'unsigned-short) (pointer-ref-c-unsigned-short pointer offset))
((equal? type 'int) (pointer-ref-c-int pointer offset))
@@ -102,14 +92,6 @@
((equal? type 'void) (pointer-ref-c-pointer pointer offset))
((equal? type 'pointer) (pointer-ref-c-pointer pointer offset)))))
-#;(define pffi-string->pointer
- (lambda (string-content)
- (string-to-pointer string-content)))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- (pointer-to-string pointer)))
-
(define pffi-type->native-type
(lambda (type)
(cond ((equal? type 'int8) 'int8_t)
@@ -136,7 +118,7 @@
((equal? type 'callback) '(maybe-null void*))
(else (error "pffi-type->native-type -- No such pffi type" type)))))
-;; pffi-define-function
+;; define-c-procedure
(define pffi-type->libffi-type
(lambda (type)
@@ -166,7 +148,7 @@
(define argument->pointer
(lambda (value type)
(cond ((procedure? value) (scheme-procedure-to-pointer value))
- (else (let ((pointer (pffi-pointer-allocate (size-of-type type))))
+ (else (let ((pointer (make-c-bytevector (size-of-type type))))
(pffi-pointer-set! pointer type 0 value)
pointer)))))
@@ -175,10 +157,10 @@
(dlerror) ;; Clean all previous errors
(let ((c-function (dlsym shared-object c-name))
(maybe-dlerror (dlerror)))
- (when (not (pffi-pointer-null? maybe-dlerror))
- (error (pffi-pointer->string maybe-dlerror)))
+ #;(when (not (pffi-pointer-null? maybe-dlerror))
+ (error (c-bytevector->string maybe-dlerror)))
(lambda arguments
- (let ((return-value (pffi-pointer-allocate
+ (let ((return-value (make-c-bytevector
(if (equal? return-type 'void)
0
(size-of-type return-type)))))
@@ -193,7 +175,7 @@
(cond ((not (equal? return-type 'void))
(pffi-pointer-get return-value return-type 0))))))))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
diff --git a/retropikzel/pffi/chicken.scm b/retropikzel/pffi/chicken.scm
index 370180e..af795b2 100644
--- a/retropikzel/pffi/chicken.scm
+++ b/retropikzel/pffi/chicken.scm
@@ -25,11 +25,11 @@
((equal? type 'struct) 'c-pointer)
(else (error "pffi-type->native-type -- No such pffi type" type)))) )
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(pointer? object)))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(er-macro-transformer
(lambda (expr rename compare)
(let* ((pffi-type->native-type ; Chicken has this procedure in three places
@@ -136,18 +136,17 @@
((equal? type 'string) (foreign-value "sizeof(void*)" int))
((equal? type 'callback) (foreign-value "sizeof(void*)" int)))))
-#;(define pffi-pointer-allocate
- (lambda (size)
- (allocate size)))
-
-(define pffi-pointer-address
- (lambda (pointer)
- (pointer->address pointer)))
-
-(define pffi-pointer-null
+(define make-c-null
(lambda ()
(address->pointer 0)))
+(define-syntax define-c-library
+ (syntax-rules ()
+ ((_ scheme-name headers object-name options)
+ (begin
+ (define scheme-name #t)
+ (pffi-shared-object-load headers)))))
+
(define-syntax pffi-shared-object-load
(er-macro-transformer
(lambda (expr rename compare)
@@ -158,13 +157,7 @@
`(foreign-declare ,(string-append "#include <" header ">")))
headers))))))
-#;(define pffi-pointer-free
- (lambda (pointer)
- (if (not (pointer? pointer))
- (error "pffi-pointer-free -- Argument is not pointer" pointer))
- (free pointer)))
-
-(define pffi-pointer-null?
+(define c-null?
(lambda (pointer)
(if (and (not (pointer? pointer))
pointer)
@@ -215,8 +208,3 @@
((equal? type 'float) (pointer-f32-ref (pointer+ pointer offset)))
((equal? type 'double) (pointer-f64-ref (pointer+ pointer offset)))
((equal? type 'pointer) (address->pointer (pointer-u64-ref (pointer+ pointer offset)))))))
-
-(define pffi-struct-dereference
- (lambda (struct)
- (pffi-pointer-address (pffi-struct-pointer struct))))
-
diff --git a/retropikzel/pffi/cyclone.scm b/retropikzel/pffi/cyclone.scm
index 6948847..05d00b8 100644
--- a/retropikzel/pffi/cyclone.scm
+++ b/retropikzel/pffi/cyclone.scm
@@ -23,23 +23,23 @@
((equal? type 'struct) 'c-pointer)
(else (error "pffi-type->native-type -- No such pffi type" type)))))
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(opaque? object)))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(er-macro-transformer
(lambda (expr rename compare)
(let* ((pffi-type->native-type
(lambda (type)
- (cond ((equal? type 'int8) 'byte)
- ((equal? type 'uint8) 'unsigned-byte)
- ((equal? type 'int16) 'int16_t)
- ((equal? type 'uint16) 'uint16_t)
- ((equal? type 'int32) 'int32)
- ((equal? type 'uint32) 'unsigned-int32)
- ((equal? type 'int64) 'integer-64)
- ((equal? type 'uint64) 'unsigned-integer64)
+ (cond ((equal? type 'int8) 'int)
+ ((equal? type 'uint8) 'int)
+ ((equal? type 'int16) 'int)
+ ((equal? type 'uint16) 'int)
+ ((equal? type 'int32) 'int)
+ ((equal? type 'uint32) 'int)
+ ((equal? type 'int64) 'int)
+ ((equal? type 'uint64) 'int)
((equal? type 'char) 'char)
((equal? type 'unsigned-char) 'unsigned-char)
((equal? type 'short) 'short)
@@ -50,22 +50,21 @@
((equal? type 'unsigned-long) 'unsigned-long)
((equal? type 'float) 'float)
((equal? type 'double) 'double)
- ((equal? type 'pointer) 'c-pointer)
- ((equal? type 'void) 'void)
- ((equal? type 'struct) 'c-pointer)
+ ((equal? type 'pointer) 'opaque)
+ ((equal? type 'void) 'c-void)
(else (error "pffi-type->native-type -- No such pffi type" type)))))
- (scheme-name (car (cdr expr)))
+ (scheme-name (cadr expr))
(c-name (symbol->string (car (cdr (car (cdr (cdr (cdr expr))))))))
(return-type (pffi-type->native-type (car (cdr (car (cdr (cdr (cdr (cdr expr)))))))))
(argument-types
- (let ((types (cdr (car (cdr (cdr (cdr (cdr (cdr expr)))))))))
+ (let ((types (cadr (car (cdr (cdr (cdr (cdr (cdr expr)))))))))
(if (null? types)
'()
- (map pffi-type->native-type (map car (map cdr types)))))))
+ (map pffi-type->native-type types)))))
(if (null? argument-types)
`(c-define ,scheme-name ,return-type ,c-name)
`(c-define ,scheme-name
- ,return-type ,c-name ,@ argument-types))))))
+ ,return-type ,c-name ,@argument-types))))))
(define pffi-define-callback
(lambda (scheme-name return-type argument-types procedure)
@@ -93,38 +92,31 @@
((equal? type 'double) (c-value "sizeof(double)" int))
((equal? type 'pointer) (c-value "sizeof(void*)" int)))))
-#;(define-c pffi-pointer-allocate
- "(void *data, int argc, closure _, object k, object size)"
- "make_c_opaque(opq, malloc(obj_obj2int(size)));
+(define-c pffi-pointer-address
+ "(void *data, int argc, closure _, object k, object pointer)"
+ "make_c_opaque(opq, &(void*)opaque_ptr(pointer));
return_closcall1(data, k, &opq);")
(define pffi-pointer-null
(lambda ()
(make-opaque)))
-#;(define-c pffi-string->pointer
- "(void *data, int argc, closure _, object k, object s)"
- "make_c_opaque(opq, string_str(s));
- return_closcall1(data, k, &opq);")
-
-#;(define-c pffi-pointer->string
- "(void *data, int argc, closure _, object k, object p)"
- "make_string(s, opaque_ptr(p));
- return_closcall1(data, k, &s);")
+(define-syntax define-c-library
+ (syntax-rules ()
+ ((_ scheme-name headers object-name options)
+ (begin
+ (define scheme-name #t)
+ (pffi-shared-object-load headers)))))
(define-syntax pffi-shared-object-load
(er-macro-transformer
(lambda (expr rename compare)
- `(begin
- ,@ (map
- (lambda (header)
- `(include-c-header ,(string-append "<" header ">")))
- (cdr (car (cdr expr))))))))
-
-#;(define-c pffi-pointer-free
- "(void *data, int argc, closure _, object k, object pointer)"
- "free(opaque_ptr(pointer));
- return_closcall1(data, k, make_boolean(boolean_t));")
+ (let* ((headers (cadr (cadr expr)))
+ (includes (map
+ (lambda (header)
+ `(include-c-header ,(string-append "<" header ">")))
+ headers)))
+ `(,@includes)))))
(define pffi-pointer-null?
(lambda (pointer)
diff --git a/retropikzel/pffi/gambit.scm b/retropikzel/pffi/gambit.scm
index b7aef6c..3c2d145 100644
--- a/retropikzel/pffi/gambit.scm
+++ b/retropikzel/pffi/gambit.scm
@@ -1,11 +1,6 @@
(c-declare "#include ")
(c-declare "#include ")
-(define-macro
- (pffi-init)
- `(begin (c-define-type pointer (pointer void))
- (c-define-type callback (pointer void))))
-
(define size-of-int8_t (c-lambda () int "___return(sizeof(int8_t));"))
(define size-of-uint8_t (c-lambda () int "___return(sizeof(uint8_t));"))
(define size-of-int16_t (c-lambda () int "___return(sizeof(int16_t));"))
@@ -52,16 +47,18 @@
(else (error "Can not get size of unknown type" type)))))
(define-macro
- (pffi-define-library name headers object-name . options)
- `(begin (define ,name #t)
- (c-declare ,(apply string-append
- (map
- (lambda (header)
- (string-append "#include <" header ">" (string #\newline)))
- (cdr headers))))))
+ (define-c-library name headers object-name . options)
+ (begin
+ (let ((c-code (apply string-append
+ (map
+ (lambda (header)
+ (string-append "#include <" header ">" (string #\newline)))
+ (car (cdr headers))))))
+ `(begin (define ,name #t) (c-declare ,c-code)))))
+
(define pointer? (c-lambda ((pointer void)) bool "___return(1);"))
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(call-with-current-continuation
(lambda (k)
@@ -69,20 +66,6 @@
(lambda (x) #f)
(lambda () (pointer? object)))))))
-(define pffi-pointer-null (c-lambda () (pointer void) "void* p = NULL; ___return(p);"))
-
-(define pointer-null? (c-lambda ((pointer void)) bool "if(___arg1 == NULL) { ___return(1); } else { ___return(0); }"))
-(define pffi-pointer-null?
- (lambda (pointer)
- (and (pffi-pointer? pointer)
- (pointer-null? pointer))))
-
-;(define pffi-pointer-allocate (c-lambda (int) (pointer void) "void* p = malloc(___arg1); ___return(p);"))
-
-(define pffi-pointer-address (c-lambda ((pointer void)) ptrdiff_t "void* p = ___arg1; ___return((intptr_t)&p);"))
-
-;(define pffi-pointer-free (c-lambda ((pointer void)) void "free(___arg1);"))
-
(define pointer-set-c-int8_t! (c-lambda ((pointer void) int int8) void "*(int8_t*)((char*)___arg1 + ___arg2) = ___arg3;"))
(define pointer-set-c-uint8_t! (c-lambda ((pointer void) int unsigned-int8) void "*(uint8_t*)((char*)___arg1 + ___arg2) = ___arg3;"))
(define pointer-set-c-int16_t! (c-lambda ((pointer void) int int16) void "*(int16_t*)((char*)___arg1 + ___arg2) = ___arg3;"))
@@ -167,31 +150,57 @@
((equal? type 'pointer) (pointer-ref-c-pointer pointer offset)))))
(define-macro
- (pffi-define-function scheme-name shared-object c-name return-type argument-types)
- (letrec* ((native-argument-types
- (if (equal? '(list) argument-types)
- (list)
- (let ((types (map cdr (cdr argument-types))))
- (if (null? types) types (map car types)))))
- (native-return-type (car (cdr return-type)))
- (c-arguments (lambda (index argument-count result)
- (if (> index argument-count)
- result
- (c-arguments (+ index 1)
- argument-count
- (string-append result
- "___arg"
- (number->string index)
- (if (< index argument-count)
- ", "
- ""))))))
- (c-code (string-append
- (if (equal? 'void (cadr return-type)) "" "___return(")
- (symbol->string (cadr c-name))
- "(" (c-arguments 1 (- (length argument-types) 1) "") ")"
- (if (equal? 'void (cadr return-type)) "" ")")
- ";")))
- `(define ,scheme-name
- (c-lambda ,native-argument-types
- ,native-return-type
- ,c-code))))
+ (define-c-procedure scheme-name shared-object c-name return-type argument-types)
+ (begin
+ (letrec* ((pffi-type->native-type
+ (lambda (type)
+ (cond ((equal? type 'int8) 'byte)
+ ((equal? type 'uint8) 'unsigned-int8)
+ ((equal? type 'int16) 'int16_t)
+ ((equal? type 'uint16) 'uint16_t)
+ ((equal? type 'int32) 'int32)
+ ((equal? type 'uint32) 'unsigned-int32)
+ ((equal? type 'int64) 'int64)
+ ((equal? type 'uint64) 'unsigned-int64)
+ ((equal? type 'char) 'char)
+ ((equal? type 'unsigned-char) 'unsigned-char)
+ ((equal? type 'short) 'short)
+ ((equal? type 'unsigned-short) 'unsigned-short)
+ ((equal? type 'int) 'int)
+ ((equal? type 'unsigned-int) 'unsigned-int)
+ ((equal? type 'long) 'long)
+ ((equal? type 'unsigned-long) 'unsigned-long)
+ ((equal? type 'float) 'float)
+ ((equal? type 'double) 'double)
+ ((equal? type 'pointer) '(pointer void))
+ ((equal? type 'void) 'void)
+ ((equal? type 'callback) 'c-pointer)
+ ((equal? type 'struct) 'c-pointer)
+ (else (error "pffi-type->native-type -- No such pffi type" type)))))
+ (native-argument-types
+ (if (equal? '(list) argument-types)
+ (list)
+ (let ((types (map pffi-type->native-type (cadr argument-types))))
+ (if (null? types) types types))))
+ (native-return-type (pffi-type->native-type (cadr return-type)))
+ (argument-count (length native-argument-types))
+ (c-arguments (lambda (index result)
+ (if (>= index argument-count)
+ result
+ (c-arguments (+ index 1)
+ (string-append result
+ "___arg"
+ (number->string (+ index 1))
+ (if (<= index (- argument-count 2))
+ ", "
+ ""))))))
+ (c-code (string-append
+ (if (equal? 'void (cadr return-type)) "" "___return(")
+ (symbol->string (cadr c-name))
+ "(" (c-arguments 0 "") ")"
+ (if (equal? 'void (cadr return-type)) "" ")")
+ ";")))
+ `(define ,scheme-name
+ (c-lambda ,native-argument-types
+ ,native-return-type
+ ,c-code)))))
diff --git a/retropikzel/pffi/gauche-src/gauchelib.scm b/retropikzel/pffi/gauche-src/gauchelib.scm
index 403864f..d801f43 100644
--- a/retropikzel/pffi/gauche-src/gauchelib.scm
+++ b/retropikzel/pffi/gauche-src/gauchelib.scm
@@ -71,8 +71,6 @@
(define-cproc pointer-get-double (pointer offset::) pointer_get_double)
(define-cproc pointer-get-pointer (pointer offset::) pointer_get_pointer)
- (define-cproc string->pointer (string-content) string_to_pointer)
- (define-cproc pointer->string (pointer) pointer_to_string)
(define-cproc dlerror () pffi_dlerror)
(define-cproc dlsym (shared-object c-name) pffi_dlsym)
(define-cproc internal-ffi-call (nargs rtype atypes fn rvalue avalues) internal_ffi_call)
diff --git a/retropikzel/pffi/gauche.scm b/retropikzel/pffi/gauche.scm
index 3102bbd..ec70147 100644
--- a/retropikzel/pffi/gauche.scm
+++ b/retropikzel/pffi/gauche.scm
@@ -1,17 +1,15 @@
(define-module retropikzel.pffi.gauche
(export size-of-type
pffi-shared-object-load
- pffi-pointer-null
- pffi-pointer-null?
- pffi-pointer-allocate
+ ;pffi-pointer-null
+ ;pffi-pointer-null?
+ make-c-bytevector
pffi-pointer-address
- pffi-pointer?
- pffi-pointer-free
+ c-bytevector?
+ c-free
pffi-pointer-set!
pffi-pointer-get
- pffi-string->pointer
- pffi-pointer->string
- pffi-define-function))
+ define-c-procedure))
(select-module retropikzel.pffi.gauche)
(dynamic-load "retropikzel/pffi/gauche-pffi")
@@ -45,27 +43,15 @@
(lambda (path options)
(shared-object-load path)))
-(define pffi-pointer-null
- (lambda ()
- (pointer-null)))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (pointer-null? pointer)))
-
-(define pffi-pointer-allocate
+(define make-c-bytevector
(lambda (size)
(pointer-allocate size)))
-(define pffi-pointer-address
- (lambda (object)
- (pointer-address object)))
-
-(define pffi-pointer?
+(define c-bytevector?
(lambda (pointer)
(pointer? pointer)))
-(define pffi-pointer-free
+(define c-free
(lambda (pointer)
(pointer-free pointer)))
@@ -141,7 +127,7 @@
(define argument->pointer
(lambda (value type)
(cond ((procedure? value) (scheme-procedure-to-pointer value))
- (else (let ((pointer (pffi-pointer-allocate (size-of-type type))))
+ (else (let ((pointer (make-c-bytevector (size-of-type type))))
(pffi-pointer-set! pointer type 0 value)
pointer)))))
@@ -150,10 +136,10 @@
(dlerror) ;; Clean all previous errors
(let ((c-function (dlsym shared-object c-name))
(maybe-dlerror (dlerror)))
- (when (not (pffi-pointer-null? maybe-dlerror))
- (error (pffi-pointer->string maybe-dlerror)))
+ #;(when (not (pffi-pointer-null? maybe-dlerror))
+ (error (c-bytevector->string maybe-dlerror)))
(lambda arguments
- (let ((return-value (pffi-pointer-allocate
+ (let ((return-value (make-c-bytevector
(if (equal? return-type 'void)
0
(size-of-type return-type)))))
@@ -168,7 +154,7 @@
(cond ((not (equal? return-type 'void))
(pffi-pointer-get return-value return-type 0))))))))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
diff --git a/retropikzel/pffi/gerbil.scm b/retropikzel/pffi/gerbil.scm
index cd726ad..a780a83 100644
--- a/retropikzel/pffi/gerbil.scm
+++ b/retropikzel/pffi/gerbil.scm
@@ -2,11 +2,11 @@
(lambda (type)
(error "Not defined")))
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(error "Not defined")))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(error "Not defined"))))
@@ -15,34 +15,10 @@
(lambda (type)
(error "Not defined")))
-(define pffi-pointer-allocate
- (lambda (size)
- (error "Not defined")))
-
-(define pffi-pointer-null
- (lambda ()
- (error "Not defined")))
-
-#;(define pffi-string->pointer
- (lambda (string-content)
- (error "Not defined")))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- pointer))
-
(define pffi-shared-object-load
(lambda (header path)
(error "Not defined")))
-(define pffi-pointer-free
- (lambda (pointer)
- (error "Not defined")))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (error "Not defined")))
-
(define pffi-pointer-set!
(lambda (pointer type offset value)
(let ((p pointer))
@@ -51,7 +27,3 @@
(define pffi-pointer-get
(lambda (pointer type offset)
(error "Not defined")))
-
-(define pffi-pointer-deref
- (lambda (pointer)
- (error "Not defined")))
diff --git a/retropikzel/pffi/guile.scm b/retropikzel/pffi/guile.scm
index d776977..01d2d21 100644
--- a/retropikzel/pffi/guile.scm
+++ b/retropikzel/pffi/guile.scm
@@ -25,11 +25,11 @@
((equal? type 'struct) '*)
(else #f))))
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(pointer? object)))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
@@ -53,39 +53,10 @@
(native-type (sizeof native-type))
(else #f)))))
-#;(define pffi-pointer-allocate
- (lambda (size)
- (bytevector->pointer (make-bytevector size 0))))
-
-(define pffi-pointer-address
- (lambda (pointer)
- (pointer-address pointer)))
-
-(define pffi-pointer-null
- (lambda ()
- (make-pointer 0)))
-
-#;(define pffi-string->pointer
- (lambda (string-content)
- (string->pointer string-content)))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- (pointer->string pointer)))
-
(define pffi-shared-object-load
(lambda (path options)
(load-foreign-library path)))
-#;(define pffi-pointer-free
- (lambda (pointer)
- #t))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (and (pffi-pointer? pointer)
- (null-pointer? pointer))))
-
(define pffi-pointer-set!
(lambda (pointer type offset value)
(let ((p (pointer->bytevector pointer (+ offset 100))))
@@ -106,8 +77,7 @@
((equal? type 'unsigned-long) (bytevector-u64-set! p offset value (native-endianness)))
((equal? type 'float) (bytevector-ieee-single-set! p offset value (native-endianness)))
((equal? type 'double) (bytevector-ieee-double-set! p offset value (native-endianness)))
- ((equal? type 'pointer) (bytevector-sint-set! p offset (pointer-address value) (native-endianness) (size-of-type type)))
- ((equal? type 'string) (bytevector-sint-set! p offset (pointer-address (pffi-string->pointer value)) (native-endianness) (size-of-type type)))))))
+ ((equal? type 'pointer) (bytevector-sint-set! p offset (pointer-address value) (native-endianness) (size-of-type type)))))))
(define pffi-pointer-get
(lambda (pointer type offset)
@@ -129,9 +99,4 @@
((equal? type 'unsigned-long) (bytevector-u64-ref p offset (native-endianness)))
((equal? type 'float) (bytevector-ieee-single-ref p offset (native-endianness)))
((equal? type 'double) (bytevector-ieee-double-ref p offset (native-endianness)))
- ((equal? type 'pointer) (make-pointer (bytevector-sint-ref p offset (native-endianness) (size-of-type type))))
- ((equal? type 'string) (pffi-pointer->string (make-pointer (bytevector-sint-ref p offset (native-endianness) (size-of-type type)))))))))
-
-#;(define pffi-struct-dereference
- (lambda (struct)
- (dereference-pointer (pffi-struct-pointer struct))))
+ ((equal? type 'pointer) (make-pointer (bytevector-sint-ref p offset (native-endianness) (size-of-type type))))))))
diff --git a/retropikzel/pffi/kawa.scm b/retropikzel/pffi/kawa.scm
index 0ce506b..e9e91c9 100644
--- a/retropikzel/pffi/kawa.scm
+++ b/retropikzel/pffi/kawa.scm
@@ -54,14 +54,14 @@
((equal? type 'struct) (invoke (static-field java.lang.foreign.ValueLayout 'ADDRESS) 'withByteAlignment 8))
(else #f))))
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(string=? (invoke (invoke object 'getClass) 'getName)
"jdk.internal.foreign.NativeMemorySegmentImpl")))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
- ((pffi-define-function scheme-name shared-object c-name return-type argument-types)
+ ((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
(lambda vals
(invoke (invoke (cdr (assoc 'linker shared-object))
@@ -131,28 +131,10 @@
(invoke native-type 'byteAlignment)
#f))))
-#;(define pffi-pointer-allocate
- (lambda (size)
- (invoke (invoke arena 'allocate size 1) 'reinterpret size)))
-
-(define pffi-pointer-address
- (lambda (pointer)
- (invoke pointer 'address)))
-
-(define pffi-pointer-null
+(define make-c-null
(lambda ()
(static-field java.lang.foreign.MemorySegment 'NULL)))
-#;(define pffi-string->pointer
- (lambda (string-content)
- (let ((size (+ (invoke string-content 'length) 1)))
- (invoke (invoke arena 'allocateFrom (invoke string-content 'toString))
- 'reinterpret size))))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- (invoke (invoke pointer 'reinterpret (static-field java.lang.Integer 'MAX_VALUE)) 'getString 0)))
-
(define pffi-shared-object-load
(lambda (path options)
(let* ((library-file (make java.io.File path))
@@ -169,11 +151,7 @@
(list (cons 'linker linker)
(cons 'lookup lookup)))))
-#;(define pffi-pointer-free
- (lambda (pointer)
- #t))
-
-(define pffi-pointer-null?
+(define c-null?
(lambda (pointer)
(invoke pointer 'equals (pffi-pointer-null))))
diff --git a/retropikzel/pffi/larceny.scm b/retropikzel/pffi/larceny.scm
index 8f92241..656c792 100644
--- a/retropikzel/pffi/larceny.scm
+++ b/retropikzel/pffi/larceny.scm
@@ -1,6 +1,4 @@
(require 'std-ffi)
-;(require "Standard/foreign-stdlib")
-;(require "Lib/Common/system-interface")
;; FIXME
(define size-of-type
@@ -28,49 +26,12 @@
((eq? type 'callback) 4)
(else (error "Can not get size of unknown type" type)))))
-(define c-malloc (foreign-procedure "malloc" '(int) 'void*))
-;(define c-malloc (stdlib/malloc rtd-void*))
-#;(define pffi-pointer-allocate
- (lambda (size)
- (c-malloc size)))
-
-#;(define c-free (foreign-procedure "free" '(void*) 'int))
-;(define c-malloc (stdlib/malloc rtd-void*))
-#;(define pffi-pointer-free
- (lambda (pointer)
- (c-free pointer)))
-
-(define pffi-pointer-null (lambda () 0))
-
-(define pffi-pointer-null?
- (lambda (object)
- (and (number? object)
- (= object 0))))
-
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
;(void*? object)
(number? object)
))
-(define pffi-pointer-address
- (lambda (pointer)
- ;(void*->address pointer)
- pointer
- ))
-
-(define pffi-pointer->string
- (lambda (pointer)
- ;(char*->string pointer)
- pointer
- ))
-
-(define pffi-string->pointer
- (lambda (string-content)
- ;(string->char* string-content)
- string-content
- ))
-
(define pffi-shared-object-load
(lambda (headers path . options)
(foreign-file path)))
@@ -122,7 +83,7 @@
((equal? type 'void) (%peek-pointer (+ pointer offset)))
((equal? type 'pointer) (%peek-pointer (+ pointer offset))))))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
diff --git a/retropikzel/pffi/mosh.scm b/retropikzel/pffi/mosh.scm
index 5a15eca..3395f22 100644
--- a/retropikzel/pffi/mosh.scm
+++ b/retropikzel/pffi/mosh.scm
@@ -25,33 +25,13 @@
(else #f))))
(define pffi-shared-object-load
- (lambda (path . options)
+ (lambda (path options)
(open-shared-library path)))
-(define pffi-pointer-null
- (lambda ()
- pointer-null))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (pointer-null? pointer)))
-
-#;(define pffi-pointer-allocate
- (lambda (size)
- (malloc size)))
-
-(define pffi-pointer-address
- (lambda (pointer)
- (pointer->integer pointer)))
-
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(pointer? object)))
-#;(define pffi-pointer-free
- (lambda (pointer)
- (free pointer)))
-
(define pffi-pointer-set!
(lambda (pointer type offset value)
(cond ((equal? type 'int8) (pointer-set-c-int8! pointer offset value))
@@ -96,22 +76,6 @@
((equal? type 'void) (pointer-ref-c-pointer pointer offset))
((equal? type 'pointer) (pointer-ref-c-pointer pointer offset)))))
-#;(define pffi-string->pointer
- (lambda (string-content)
- (let ((pointer (pffi-pointer-allocate (+ (string-length string-content) 1)))
- (index 0))
- (string-for-each
- (lambda (c)
- (pffi-pointer-set! pointer 'char (* index (size-of-type 'char)) c)
- (set! index (+ index 1)))
- string-content)
- (pffi-pointer-set! pointer 'char (* index (size-of-type 'char)) #\null)
- pointer)))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- (pointer->string pointer)))
-
(define pffi-type->native-type
(lambda (type)
(cond ((equal? type 'int8) 'int8_t)
@@ -139,7 +103,7 @@
((equal? type 'struct) 'void*)
(else (error "pffi-type->native-type -- No such pffi type" type)))))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
@@ -155,7 +119,3 @@
(make-c-callback (pffi-type->native-type return-type)
(map pffi-type->native-type argument-types)
procedure)))))
-
-#;(define pffi-struct-dereference
- (lambda (struct)
- (pffi-struct-pointer struct)))
diff --git a/retropikzel/pffi/racket.scm b/retropikzel/pffi/racket.scm
index e890647..3cfb1f2 100644
--- a/retropikzel/pffi/racket.scm
+++ b/retropikzel/pffi/racket.scm
@@ -21,15 +21,14 @@
((equal? type 'pointer) _pointer)
((equal? type 'void) _void)
((equal? type 'callback) _pointer)
- ((equal? type 'string) _pointer)
((equal? type 'struct) _pointer)
(else #f))))
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(cpointer? object)))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
@@ -53,31 +52,6 @@
(ctype-sizeof native-type)
#f))))
-#;(define pffi-pointer-allocate
- (lambda (size)
- (malloc 'raw size)))
-
-(define pffi-pointer-address
- (lambda (pointer)
- pointer))
-
-(define pffi-pointer-null
- (lambda ()
- #f )) ; #f is the null pointer on racket
-
-#;(define pffi-string->pointer
- (lambda (string-content)
- (let* ((size (string-length string-content))
- (pointer (pffi-pointer-allocate (+ size 1))))
- (memmove pointer (cast (string-append string-content "") _string _pointer) (+ size 1))
- pointer)))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- (when (pffi-pointer-null? pointer)
- (error "Can not make string from null pointer" pointer))
- (string-copy (cast pointer _pointer _string))))
-
(define pffi-shared-object-load
(lambda (path options)
(if (and (not (null? options))
@@ -87,14 +61,6 @@
(list #f))))
(ffi-lib path))))
-#;(define pffi-pointer-free
- (lambda (pointer)
- (free pointer)))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (not pointer))) ; #f is the null pointer on racket
-
(define pffi-pointer-set!
(lambda (pointer type offset value)
(ptr-set! pointer
@@ -114,7 +80,3 @@
(if (equal? type 'char)
(integer->char r)
r))))
-
-#;(define pffi-struct-dereference
- (lambda (struct)
- (pffi-struct-pointer struct)))
diff --git a/retropikzel/pffi/sagittarius.scm b/retropikzel/pffi/sagittarius.scm
index 98df939..f2aab32 100644
--- a/retropikzel/pffi/sagittarius.scm
+++ b/retropikzel/pffi/sagittarius.scm
@@ -1,3 +1,33 @@
+(define size-of-type
+ (lambda (type)
+ (cond ((eq? type 'int8) size-of-int8_t)
+ ((eq? type 'uint8) size-of-uint8_t)
+ ((eq? type 'int16) size-of-int16_t)
+ ((eq? type 'uint16) size-of-uint16_t)
+ ((eq? type 'int32) size-of-int32_t)
+ ((eq? type 'uint32) size-of-uint32_t)
+ ((eq? type 'int64) size-of-int64_t)
+ ((eq? type 'uint64) size-of-uint64_t)
+ ((eq? type 'char) size-of-char)
+ ((eq? type 'unsigned-char) size-of-char)
+ ((eq? type 'short) size-of-short)
+ ((eq? type 'unsigned-short) size-of-unsigned-short)
+ ((eq? type 'int) size-of-int)
+ ((eq? type 'unsigned-int) size-of-unsigned-int)
+ ((eq? type 'long) size-of-long)
+ ((eq? type 'unsigned-long) size-of-unsigned-long)
+ ((eq? type 'float) size-of-float)
+ ((eq? type 'double) size-of-double)
+ ((eq? type 'pointer) size-of-void*)
+ ((eq? type 'void) 0)
+ ((eq? type 'string) size-of-void*)
+ ((eq? type 'callback) size-of-void*)
+ (else #f))))
+
+(define pffi-shared-object-load
+ (lambda (path options)
+ (open-shared-library path)))
+
(define pffi-type->native-type
(lambda (type)
(cond ((equal? type 'int8) 'int8_t)
@@ -25,11 +55,7 @@
((and (pair? type) (equal? 'struct (car type))) 'void*)
(else #f))))
-(define pffi-pointer?
- (lambda (object)
- (pointer? object)))
-
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(define scheme-name
@@ -46,72 +72,9 @@
(map pffi-type->native-type argument-types)
procedure)))))
-(define size-of-type
- (lambda (type)
- (cond ((eq? type 'int8) size-of-int8_t)
- ((eq? type 'uint8) size-of-uint8_t)
- ((eq? type 'int16) size-of-int16_t)
- ((eq? type 'uint16) size-of-uint16_t)
- ((eq? type 'int32) size-of-int32_t)
- ((eq? type 'uint32) size-of-uint32_t)
- ((eq? type 'int64) size-of-int64_t)
- ((eq? type 'uint64) size-of-uint64_t)
- ((eq? type 'char) size-of-char)
- ((eq? type 'unsigned-char) size-of-char)
- ((eq? type 'short) size-of-short)
- ((eq? type 'unsigned-short) size-of-unsigned-short)
- ((eq? type 'int) size-of-int)
- ((eq? type 'unsigned-int) size-of-unsigned-int)
- ((eq? type 'long) size-of-long)
- ((eq? type 'unsigned-long) size-of-unsigned-long)
- ((eq? type 'float) size-of-float)
- ((eq? type 'double) size-of-double)
- ((eq? type 'pointer) size-of-void*)
- ((eq? type 'void) 0)
- ((eq? type 'string) size-of-void*)
- ((eq? type 'callback) size-of-void*)
- (else #f))))
-
-#;(define pffi-pointer-allocate
- (lambda (size)
- (c-malloc size)))
-
-(define pffi-pointer-address
- (lambda (pointer)
- (address pointer)))
-
-(define pffi-pointer-null
- (lambda ()
- (empty-pointer)))
-
-#;(define (string->c-string s)
- (let* ((bv (string->utf8 s))
- (p (allocate-pointer (+ (bytevector-length bv) 1))))
- (do ((i 0 (+ i 1)))
- ((= i (bytevector-length bv)) p)
- (pointer-set-c-uint8! p i (bytevector-u8-ref bv i)))
- p))
-
-#;(define pffi-string->pointer
- (lambda (string-content)
- (string->c-string string-content)))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- (pointer->string pointer)))
-
-(define pffi-shared-object-load
- (lambda (path options)
- (open-shared-library path)))
-
-#;(define pffi-pointer-free
- (lambda (pointer)
- (when (pointer? pointer)
- (c-free pointer))))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (null-pointer? pointer)))
+(define c-bytevector?
+ (lambda (object)
+ (pointer? object)))
(define pffi-pointer-set!
(lambda (pointer type offset value)
@@ -156,3 +119,4 @@
((equal? type 'double) (pointer-ref-c-double pointer offset))
((equal? type 'void) (pointer-ref-c-pointer pointer offset))
((equal? type 'pointer) (pointer-ref-c-pointer pointer offset)))))
+
diff --git a/retropikzel/pffi/shared/array.scm b/retropikzel/pffi/shared/array.scm
index ed347d4..9d4bd7e 100644
--- a/retropikzel/pffi/shared/array.scm
+++ b/retropikzel/pffi/shared/array.scm
@@ -8,8 +8,8 @@
(define pffi-list->array
(lambda (type list-arg)
(let* ((array-size (length list-arg))
- (type-size (pffi-size-of type))
- (array (pffi-pointer-allocate (* type-size array-size)))
+ (type-size (c-size-of type))
+ (array (make-c-bytevector (* type-size array-size)))
(offset 0))
(for-each
(lambda (item)
@@ -25,7 +25,7 @@
(define pffi-array->list
(lambda (array)
(letrec* ((type (pffi-array-type array))
- (type-size (pffi-size-of type))
+ (type-size (c-size-of type))
(max-offset (* type-size (pffi-array-size array)))
(array-pointer (pffi-array-pointer array))
(looper (lambda (offset result)
@@ -40,19 +40,19 @@
(define pffi-array-allocate
(lambda (type size)
- (array-make type size (pffi-pointer-allocate-calloc size (pffi-size-of type)))))
+ (array-make type size (pffi-pointer-allocate-calloc size (c-size-of type)))))
(define pffi-array-get
(lambda (array index)
(let ((type (pffi-array-type array)))
(pffi-pointer-get (pffi-array-pointer array)
type
- (* (pffi-size-of type) index)))))
+ (* (c-size-of type) index)))))
(define pffi-array-set!
(lambda (array index value)
(let ((type (pffi-array-type array)))
(pffi-pointer-set! (pffi-array-pointer array)
type
- (* (pffi-size-of type) index)
+ (* (c-size-of type) index)
value))))
diff --git a/retropikzel/pffi/shared/main.scm b/retropikzel/pffi/shared/main.scm
index 986ce39..fe8425d 100644
--- a/retropikzel/pffi/shared/main.scm
+++ b/retropikzel/pffi/shared/main.scm
@@ -1,4 +1,4 @@
-(cond-expand
+#;(cond-expand
(mosh (define pffi-init (lambda () #t)))
(chicken
(define-syntax pffi-init
@@ -8,7 +8,7 @@
(chicken memory))
#t))))
(gambit #t)
- (ypsilon
+ #;(ypsilon
(define-syntax pffi-init
(syntax-rules ()
((_)
@@ -22,37 +22,12 @@
#f
#t)))
-(define pffi-size-of
+(define c-size-of
(lambda (object)
(cond ((pffi-struct? object) (pffi-struct-size object))
((pffi-type? object) (size-of-type object))
(else (error "Not pffi-struct, pffi-enum of pffi-type" object)))))
-(define pffi-string->pointer
- (lambda (str)
- (letrec* ((str-length (string-length str))
- (pointer (pffi-pointer-allocate (+ str-length 1)))
- (looper (lambda (index)
- (when (< index str-length)
- (pffi-pointer-set! pointer
- 'char
- index
- (string-ref str index))
- (looper (+ index 1))))))
- (looper 0)
- (pffi-pointer-set! pointer 'char str-length #\null)
- pointer)))
-
-(define pffi-pointer->string
- (lambda (pointer)
- (letrec* ((looper (lambda (index str)
- (let ((c (pffi-pointer-get pointer 'char index)))
- (if (char=? c #\null)
- str
- (looper (+ index 1) (cons c str)))))))
- (list->string (reverse (looper 0 (list)))))))
-
-
(define pffi-types
'(int8
uint8
@@ -75,7 +50,7 @@
pointer
void))
-(define string-split
+(define pffi:string-split
(lambda (str mark)
(let* ((str-l (string->list str))
(res (list))
@@ -93,16 +68,11 @@
res)))
(cond-expand
- (gambit #t)
- ((or chicken cyclone)
- (define-syntax pffi-define-library
- (syntax-rules ()
- ((_ scheme-name headers object-name options)
- (begin
- (define scheme-name #t)
- (pffi-shared-object-load headers))))))
+ (gambit #t) ; Defined in pffi/gambit.scm
+ (chicken #t) ; Defined in pffi/chicken.scm
+ (cyclone #t) ; Defined in pffi/cyclone.scm
(else
- (define-syntax pffi-define-library
+ (define-syntax define-c-library
(syntax-rules ()
((_ scheme-name headers object-name options)
(define scheme-name
@@ -125,7 +95,7 @@
(windows
(append
(if (get-environment-variable "PFFI_LOAD_PATH")
- (string-split (get-environment-variable "PFFI_LOAD_PATH") #\;)
+ (pffi:string-split (get-environment-variable "PFFI_LOAD_PATH") #\;)
(list))
(if (get-environment-variable "SYSTEM")
(list (get-environment-variable "SYSTEM"))
@@ -144,7 +114,7 @@
(list))
(list ".")
(if (get-environment-variable "PATH")
- (string-split (get-environment-variable "PATH") #\;)
+ (pffi:string-split (get-environment-variable "PATH") #\;)
(list))
(if (get-environment-variable "PWD")
(list (get-environment-variable "PWD"))
@@ -152,7 +122,7 @@
(else
(append
(if (get-environment-variable "PFFI_LOAD_PATH")
- (string-split (get-environment-variable "PFFI_LOAD_PATH") #\:)
+ (pffi:string-split (get-environment-variable "PFFI_LOAD_PATH") #\:)
(list))
; Guix
(list (if (get-environment-variable "GUIX_ENVIRONMENT")
@@ -161,7 +131,7 @@
"/run/current-system/profile/lib")
; Debian
(if (get-environment-variable "LD_LIBRARY_PATH")
- (string-split (get-environment-variable "LD_LIBRARY_PATH") #\:)
+ (pffi:string-split (get-environment-variable "LD_LIBRARY_PATH") #\:)
(list))
(list
;;; x86-64
diff --git a/retropikzel/pffi/shared/pointer.scm b/retropikzel/pffi/shared/pointer.scm
index 186f4b2..7b12f0e 100644
--- a/retropikzel/pffi/shared/pointer.scm
+++ b/retropikzel/pffi/shared/pointer.scm
@@ -1,75 +1,105 @@
(cond-expand
- (windows (pffi-define-library pffi-libc-stdlib
- '("stdlib.h")
- "ucrtbase"
- '((additional-versions ("0" "6")))))
- (else (pffi-define-library pffi-libc-stdlib
- '("stdlib.h")
- "c"
- '((additional-versions ("0" "6"))))))
+ (windows (define-c-library libc
+ '("stdlib.h" "string.h")
+ "ucrtbase"
+ '((additional-versions ("0" "6")))))
+ (else (define-c-library libc
+ '("stdlib.h" "string.h")
+ "c"
+ '((additional-versions ("0" "6"))))))
-(cond-expand
- (windows (pffi-define-library pffi-libc-stdio
- '("stdio.h")
- "ucrtbase"
- '((additional-versions ("0" "6")))))
- (else (pffi-define-library pffi-libc-stdio
- '("stdio")
- "c"
- '((additional-versions ("0" "6"))))))
-;(pffi-define-function c-snprintf pffi-libc-stdio 'snprintf 'int '(pointer int pointer pointer))
-;(pffi-define-function c-strtol pffi-libc-stdio 'strtol 'uint64 '(pointer pointer int))
+(define-c-procedure c-strlen libc 'strlen 'int '(pointer))
+(define-c-procedure pffi-pointer-allocate-calloc libc 'calloc 'pointer '(int int))
+(define-c-procedure c-memset-address->pointer libc 'memset 'pointer '(uint64 uint8 int))
+(define-c-procedure c-memset-pointer->address libc 'memset 'uint64 '(pointer uint8 int))
+(define-c-procedure c-printf libc 'printf 'int '(pointer pointer))
+(define-c-procedure c-malloc libc 'malloc 'pointer '(int))
+(define-c-procedure c-strlen libc 'strlen 'int '(pointer))
(cond-expand
(chibi #t) ; FIXME
- (else (pffi-define-function pffi-pointer-allocate pffi-libc-stdlib 'malloc 'pointer '(int))))
+ (else (define make-c-bytevector
+ (lambda (k . byte)
+ (if (null? byte)
+ (c-malloc k)
+ (bytevector->c-bytevector (make-bytevector k (car byte))))))))
-(pffi-define-function pffi-pointer-allocate-calloc pffi-libc-stdlib 'calloc 'pointer '(int int))
+(define c-bytevector
+ (lambda bytes
+ (bytevector->c-bytevector (apply bytevector bytes))))
(cond-expand
(chibi #t) ; FIXME
- (else (pffi-define-function pffi-pointer-free pffi-libc-stdlib 'free 'void '(pointer))))
+ (else (define-c-procedure c-free libc 'free 'void '(pointer))))
-#;(define pffi-pointer-null
- (lambda ()
- (let ((pointer (pffi-pointer-allocate (pffi-size-of 'pointer))))
- (pffi-pointer-set! pointer 'int 0 0)
+(define bytevector->c-bytevector
+ (lambda (bytes)
+ (letrec* ((bytes-length (bytevector-length bytes))
+ (pointer (make-c-bytevector bytes-length))
+ (looper (lambda (index)
+ (when (< index bytes-length)
+ (pffi-pointer-set! pointer
+ 'uint8
+ index
+ (bytevector-u8-ref bytes index))
+ (looper (+ index 1))))))
+ (looper 0)
pointer)))
-#;(define pffi-pointer-null?
- (lambda (pointer)
- (let ((address
- (let ((str (pffi-pointer-allocate 512)))
- (c-snprintf str 512 (pffi-string->pointer "%p") pointer)
- (display "Scheme: p1 address: ")
- (write (pffi-pointer->string str))
- (newline)
- (display "Scheme: p1 address int: ")
- (write (c-strtol str (pffi-pointer-null) 16))
- (newline)
- (c-strtol str (pffi-pointer-null) 16))))
- (= address 0))))
+(define c-bytevector->bytevector
+ (lambda (pointer size)
+ (letrec* ((bytes (make-bytevector size))
+ (looper (lambda (index)
+ (let ((byte (pffi-pointer-get pointer 'uint8 index)))
+ (if (= index size)
+ bytes
+ (begin
+ (bytevector-u8-set! bytes index byte)
+ (looper (+ index 1))))))))
+ (looper 0))))
-#;(define pffi-pointer-address
+(define c-bytevector-string-length
+ (lambda (bytevector)
+ (c-strlen bytevector)))
+
+(define c-bytevector->string
(lambda (pointer)
- (let* ((address-number
- (let ((str (pffi-pointer-allocate 512)))
- (c-snprintf str 512 (pffi-string->pointer "%p") pointer)
- (display "Scheme: p1 address: ")
- (write (pffi-pointer->string str))
- (newline)
- (display "Scheme: p1 address int: ")
- (write (c-strtol str (pffi-pointer-null) 16))
- (newline)
- (c-strtol str (pffi-pointer-null) 16)))
- (address (pffi-pointer-allocate (pffi-size-of 'uint64))))
- (display "Scheme: p2 address: ")
- (write address)
- (newline)
- ;address-number
- (pffi-pointer-set! address 'uint64 0 address-number)
- ;address-number
- ;(pffi-pointer-get address 'pointer 0)
- address
- )
- ))
+ (when (not (c-bytevector? pointer))
+ (error "c-bytevector->string argument not c-bytevector" pointer))
+ (let ((size (c-strlen pointer)))
+ (utf8->string (c-bytevector->bytevector pointer size)))))
+
+(define string->c-bytevector
+ (lambda (text)
+ (when (not (string? text))
+ (error "string->bytevector argument not string" text))
+ (bytevector->c-bytevector (string->utf8 (string-append text (string #\null))))))
+
+(cond-expand
+ (kawa #t) ; FIXME
+ (chicken #t) ; FIXME
+ (else (define make-c-null
+ (lambda ()
+ (cond-expand (stklos (let ((pointer (make-c-bytevector 1)))
+ (free-bytes pointer)
+ pointer))
+ (else (c-memset-address->pointer 0 0 0)))))))
+
+(cond-expand
+ (kawa #t) ; FIXME
+ (chicken #t) ; FIXME
+ (else (define c-null?
+ (lambda (pointer)
+ (if (c-bytevector? pointer)
+ (= (c-memset-pointer->address pointer 0 0) 0)
+ #f)))))
+
+(define-syntax call-with-address-of-c-bytevector
+ (syntax-rules ()
+ ((_ input-pointer thunk)
+ (let ((address-pointer (make-c-bytevector (c-size-of 'pointer))))
+ (pffi-pointer-set! address-pointer 'pointer 0 input-pointer)
+ (apply thunk (list address-pointer))
+ (set! input-pointer (pffi-pointer-get address-pointer 'pointer 0))
+ (c-free address-pointer)))))
+
diff --git a/retropikzel/pffi/shared/struct.scm b/retropikzel/pffi/shared/struct.scm
index 66c3786..926b9ee 100644
--- a/retropikzel/pffi/shared/struct.scm
+++ b/retropikzel/pffi/shared/struct.scm
@@ -15,33 +15,13 @@
(size (cdr (assoc 'size size-and-offsets)))
(offsets (cdr (assoc 'offsets size-and-offsets)))
(pointer (if (and (not (null? arguments))
- (pffi-pointer? (car arguments)))
+ (c-bytevector? (car arguments)))
(car arguments)
- (pffi-pointer-allocate size)))
+ (make-c-bytevector size)))
(c-type-string (if (string? c-type) c-type (symbol->string c-type))))
(struct-make c-type-string size pointer offsets)))))))
-#;(define pffi-struct-dereference
- (lambda (struct)
- (let ((pointer (pffi-pointer-allocate (pffi-struct-size struct)))
- (offset 0))
- (for-each
- (lambda (struct-member)
- (let* ((member-type (cadr struct-member))
- (member-name (car struct-member))
- (member-size (pffi-size-of member-type)))
- (pffi-pointer-set! pointer
- member-type
- offset
- (pffi-struct-get struct member-name))
- (set! offset (+ offset member-size))))
- (pffi-struct-members struct))
- ;(pffi-pointer-get (pffi-struct-pointer struct) 'pointer 0)
- ;(pffi-pointer-get pointer 'pointer 0)
- pointer
- )))
-
-(define pffi-align-of
+(define c-align-of
(lambda (type)
(cond-expand
;(guile (alignof (pffi-type->native-type type)))
@@ -60,7 +40,7 @@
(offsets (map (lambda (member)
(let* ((name (cdr member))
(type (car member))
- (type-alignment (pffi-align-of type)))
+ (type-alignment (c-align-of type)))
(when (> (size-of-type type) largest-member-size)
(set! largest-member-size (size-of-type type)))
(if (or (= size 0)
@@ -97,7 +77,7 @@
(let* ((size-and-offsets (calculate-struct-size-and-offsets members))
(size (cdr (assoc 'size size-and-offsets)))
(offsets (cdr (assoc 'offsets size-and-offsets)))
- (pointer (if (null? pointer) (pffi-pointer-allocate size) (car pointer)))
+ (pointer (if (null? pointer) (make-c-bytevector size) (car pointer)))
(c-type (if (string? c-type) c-type (symbol->string c-type))))
(struct-make c-type size pointer offsets))))
diff --git a/retropikzel/pffi/shared/union.scm b/retropikzel/pffi/shared/union.scm
deleted file mode 100644
index 93527f3..0000000
--- a/retropikzel/pffi/shared/union.scm
+++ /dev/null
@@ -1,8 +0,0 @@
-
-(define-record-type
- (union-make c-type size pointer members)
- pffi-union?
- (c-type pffi-union-c-type)
- (size pffi-union-size)
- (pointer pffi-union-pointer)
- (members pffi-union-members))
diff --git a/retropikzel/pffi/stklos.scm b/retropikzel/pffi/stklos.scm
index 89ffe90..e9babd6 100644
--- a/retropikzel/pffi/stklos.scm
+++ b/retropikzel/pffi/stklos.scm
@@ -1,13 +1,13 @@
(define pffi-type->native-type
(lambda (type)
- (cond ((equal? type 'int8) :int)
- ((equal? type 'uint8) :uint)
- ((equal? type 'int16) :int)
- ((equal? type 'uint16) :uint)
+ (cond ((equal? type 'int8) :char)
+ ((equal? type 'uint8) :char)
+ ((equal? type 'int16) :short)
+ ((equal? type 'uint16) :ushort)
((equal? type 'int32) :int)
((equal? type 'uint32) :uint)
- ((equal? type 'int64) :int)
- ((equal? type 'uint64) :uint)
+ ((equal? type 'int64) :long)
+ ((equal? type 'uint64) :ulong)
((equal? type 'char) :char)
((equal? type 'unsigned-char) :uchar)
((equal? type 'short) :short)
@@ -19,21 +19,15 @@
((equal? type 'float) :float)
((equal? type 'double) :double)
((equal? type 'pointer) :pointer)
- ((equal? type 'string) :string)
((equal? type 'void) :void)
((equal? type 'struct) :void)
(else (error "pffi-type->native-type -- No such pffi type" type)))))
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
- (display "HERE: ")
- (write object)
- (newline)
- (write (cpointer? object))
- (newline)
(cpointer? object)))
-(define-syntax pffi-define-function
+(define-syntax define-c-procedure
(syntax-rules ()
((_ scheme-name shared-object c-name return-type argument-types)
(begin
@@ -76,53 +70,25 @@
; FIXME
(define size-of-type
(lambda (type)
- (cond
- ((equal? type 'int8) 1)
- ((equal? type 'uint8) 1)
- ((equal? type 'int16) 2)
- ((equal? type 'uint16) 2)
- ((equal? type 'int32) 4)
- ((equal? type 'uint32) 4)
- ((equal? type 'int64) 8)
- ((equal? type 'uint64) 8)
- ((equal? type 'char) 1)
- ((equal? type 'unsigned-char) 1)
- ((equal? type 'short) 2)
- ((equal? type 'unsigned-short) 2)
- ((equal? type 'int) 4)
- ((equal? type 'unsigned-int) 4)
- ((equal? type 'long) 8)
- ((equal? type 'unsigned-long) 8)
- ((equal? type 'float) 4)
- ((equal? type 'double) 8)
- ((equal? type 'pointer) 8)
-
- )))
-
-#;(define pffi-pointer-allocate
- (lambda (size)
- (allocate-bytes size)))
-
-;; FIXME
-(define pffi-pointer-address
- (lambda (pointer)
- 0))
-
-;; FIXME
-(define pffi-pointer-null
- (lambda ()
- (let ((p (allocate-bytes 0)))
- (free-bytes p)
- p)))
-
-#;(define pffi-pointer-free
- (lambda (pointer)
- (free-bytes pointer)))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (and (cpointer? pointer)
- (cpointer-null? pointer))))
+ (cond ((equal? type 'int8) 1)
+ ((equal? type 'uint8) 1)
+ ((equal? type 'int16) 2)
+ ((equal? type 'uint16) 2)
+ ((equal? type 'int32) 4)
+ ((equal? type 'uint32) 4)
+ ((equal? type 'int64) 8)
+ ((equal? type 'uint64) 8)
+ ((equal? type 'char) 1)
+ ((equal? type 'unsigned-char) 1)
+ ((equal? type 'short) 2)
+ ((equal? type 'unsigned-short) 2)
+ ((equal? type 'int) 4)
+ ((equal? type 'unsigned-int) 4)
+ ((equal? type 'long) 8)
+ ((equal? type 'unsigned-long) 8)
+ ((equal? type 'float) 4)
+ ((equal? type 'double) 8)
+ ((equal? type 'pointer) 8))))
(define pffi-pointer-set!
(lambda (pointer type offset value)
diff --git a/retropikzel/pffi/ypsilon.scm b/retropikzel/pffi/ypsilon.scm
index 5dd9386..f59d640 100644
--- a/retropikzel/pffi/ypsilon.scm
+++ b/retropikzel/pffi/ypsilon.scm
@@ -25,52 +25,13 @@
((eq? type 'void) 0)
(else #f))))
-;(define c-malloc (c-function void* malloc (size_t)))
-;(define c-free (c-function int free (void*)))
-
-#;(define pffi-pointer-allocate
- (lambda (size)
- (c-malloc size)))
-
-(define pffi-pointer-address
- (lambda (pointer)
- pointer))
-
-(define pffi-pointer?
+(define c-bytevector?
(lambda (object)
(number? object)))
-#;(define pffi-pointer-free
- (lambda (pointer)
- (c-free pointer)))
-
-(define pffi-pointer-null
- (lambda ()
- 0))
-
-(define pffi-pointer-null?
- (lambda (pointer)
- (and (pffi-pointer? pointer)
- (= (pffi-pointer-address pointer) 0))))
-
-#;(define pffi-pointer->string
- (lambda (pointer)
- (c-string-ref pointer)))
-
-;(define c-memset(c-function int memset (void* int int)))
-;(define c-snprintf (c-function int snprintf (void* size_t void*) (long double)))
-#;(define pffi-string->pointer
- (lambda (string-content)
- (let* ((c-string (make-c-string string-content))
- (c-string-length (bytevector-length c-string))
- (pointer (c-malloc c-string-length)))
- (c-memset pointer 0 c-string-length)
- (c-snprintf pointer c-string-length (make-c-string "%s") c-string)
- pointer)))
-
(define pffi-pointer-set!
(lambda (pointer type offset value)
- (let ((bv (make-bytevector-mapping (+ pointer offset) (pffi-size-of type))))
+ (let ((bv (make-bytevector-mapping (+ pointer offset) (c-size-of type))))
(cond ((equal? type 'int8) (bytevector-c-int8-set! bv 0 value))
((equal? type 'uint8) (bytevector-c-int8-set! bv 0 value))
((equal? type 'int16) (bytevector-c-int16-set! bv 0 value))
@@ -93,7 +54,7 @@
(define pffi-pointer-get
(lambda (pointer type offset)
- (let ((bv (make-bytevector-mapping (+ pointer offset) (pffi-size-of type))))
+ (let ((bv (make-bytevector-mapping (+ pointer offset) (c-size-of type))))
(cond ((equal? type 'int8) (bytevector-c-int8-ref bv 0))
((equal? type 'uint8) (bytevector-c-uint8-ref bv 0))
((equal? type 'int16) (bytevector-c-int16-ref bv 0))
@@ -115,44 +76,96 @@
((equal? type 'pointer) (bytevector-c-void*-ref bv 0))))))
(define pffi-shared-object-load
- (lambda (headers path options)
+ (lambda (path options)
(load-shared-object path)))
-(define-macro (pffi-type->native-type type)
- `(cond ((equal? ,type int8) int8_t)
- ((equal? ,type uint8) uint8_t)
- ((equal? ,type int16) int16_t)
- ((equal? ,type uint16) uint16_t)
- ((equal? ,type int32) int32_t)
- ((equal? ,type uint32) uint32_t)
- ((equal? ,type int64) int64_t)
- ((equal? ,type uint64) uint64_t)
- ((equal? ,type char) char)
- ((equal? ,type unsigned-char) char)
- ((equal? ,type short) short)
- ((equal? ,type unsigned-short) unsigned-short)
- ((equal? ,type int) int)
- ((equal? ,type unsigned-int) unsigned-int)
- ((equal? ,type long) long)
- ((equal? ,type unsigned-long) unsigned-long)
- ((equal? ,type float) float)
- ((equal? ,type double) double)
- ((equal? ,type pointer) void*)
- ((equal? ,type string) void*)
- ((equal? ,type void) void)
- ((equal? ,type callback) void*)
- (else (error "pffi-type->native-type -- No such pffi type" ,type))))
+#;(define-macro
+ (pffi-type->native-type type)
+ `(cond ((equal? ,type 'int8) 'int8_t)
+ ((equal? ,type 'uint8) 'uint8_t)
+ ;((equal? ,type 'int16) 'int16_t)
+ ;((equal? ,type 'uint16) 'uint16_t)
+ ;((equal? ,type 'int32) 'int32_t)
+ ;((equal? ,type 'uint32) 'uint32_t)
+ ;((equal? ,type 'int64) 'int64_t)
+ ;((equal? ,type 'uint64) 'uint64_t)
+ ;((equal? ,type 'char) 'char)
+ ;((equal? ,type 'unsigned-char) 'char)
+ ;((equal? ,type 'short) 'short)
+ ;((equal? ,type 'unsigned-short) 'unsigned-short)
+ ((equal? ,type 'int) 'int)
+ ;((equal? ,type 'unsigned-int) 'unsigned-int)
+ ;((equal? ,type 'long) 'long)
+ ;((equal? ,type 'unsigned-long) 'unsigned-long)
+ ;((equal? ,type 'float) 'float)
+ ;((equal? ,type 'double) 'double)
+ ((equal? ,type 'pointer) 'void*)
+ ;((equal? ,type 'string) 'void*)
+ ((equal? ,type 'void) 'void)
+ ;((equal? ,type 'callback) 'void*)
+ (else (error "pffi-type->native-type -- No such pffi type" ,type))))
(define-macro
- (pffi-define-function scheme-name shared-object c-name return-type argument-types)
- `(define ,scheme-name
- (c-function ,(pffi-type->native-type return-type)
- ,(cadr c-name)
- ,(map pffi-type->native-type (cdr argument-types)))))
+ (define-c-procedure scheme-name shared-object c-name return-type argument-types)
+ (begin
+ (let ((pffi-type->native-type
+ (lambda (type)
+ (cond ((equal? type 'int8) 'int8_t)
+ ((equal? type 'uint8) 'uint8_t)
+ ((equal? type 'int16) 'int16_t)
+ ((equal? type 'uint16) 'uint16_t)
+ ((equal? type 'int32) 'int32_t)
+ ((equal? type 'uint32) 'uint32_t)
+ ((equal? type 'int64) 'int64_t)
+ ((equal? type 'uint64) 'uint64_t)
+ ((equal? type 'char) 'char)
+ ((equal? type 'unsigned-char) 'char)
+ ((equal? type 'short) 'short)
+ ((equal? type 'unsigned-short) 'unsigned-short)
+ ((equal? type 'int) 'int)
+ ((equal? type 'unsigned-int) 'unsigned-int)
+ ((equal? type 'long) 'long)
+ ((equal? type 'unsigned-long) 'unsigned-long)
+ ((equal? type 'float) 'float)
+ ((equal? type 'double) 'double)
+ ((equal? type 'pointer) 'void*)
+ ((equal? type 'string) 'void*)
+ ((equal? type 'void) 'void)
+ ((equal? type 'callback) 'void*)
+ (else (error "pffi-type->native-type -- No such pffi type" type))))))
+ `(define ,scheme-name
+ (c-function ,(pffi-type->native-type (cadr return-type))
+ ,(cadr c-name)
+ ,(map pffi-type->native-type (cadr argument-types)))))))
(define-macro
(pffi-define-callback scheme-name return-type argument-types procedure)
+ (let ((pffi-type->native-type
+ (lambda (type)
+ (cond ((equal? type 'int8) 'int8_t)
+ ((equal? type 'uint8) 'uint8_t)
+ ((equal? type 'int16) 'int16_t)
+ ((equal? type 'uint16) 'uint16_t)
+ ((equal? type 'int32) 'int32_t)
+ ((equal? type 'uint32) 'uint32_t)
+ ((equal? type 'int64) 'int64_t)
+ ((equal? type 'uint64) 'uint64_t)
+ ((equal? type 'char) 'char)
+ ((equal? type 'unsigned-char) 'char)
+ ((equal? type 'short) 'short)
+ ((equal? type 'unsigned-short) 'unsigned-short)
+ ((equal? type 'int) 'int)
+ ((equal? type 'unsigned-int) 'unsigned-int)
+ ((equal? type 'long) 'long)
+ ((equal? type 'unsigned-long) 'unsigned-long)
+ ((equal? type 'float) 'float)
+ ((equal? type 'double) 'double)
+ ((equal? type 'pointer) 'void*)
+ ((equal? type 'string) 'void*)
+ ((equal? type 'void) 'void)
+ ((equal? type 'callback) 'void*)
+ (else (error "pffi-type->native-type -- No such pffi type" type))))))
`(define ,scheme-name
(c-callback ,(pffi-type->native-type return-type)
,(map pffi-type->native-type (cdr argument-types))
- ,procedure)))
+ ,procedure))))
diff --git a/tests/compliance.scm b/tests/compliance.scm
index f4ad12d..6604552 100755
--- a/tests/compliance.scm
+++ b/tests/compliance.scm
@@ -72,343 +72,343 @@
;; pffi-init
-(print-header 'pffi-init)
+;(print-header 'pffi-init)
-(pffi-init)
+;(pffi-init)
;; pffi-type?
-(print-header 'pffi-type?)
+;(print-header 'pffi-type?)
-(debug (pffi-type? 'int8))
-(assert equal? (pffi-type? 'int8) #t)
-(debug (pffi-type? 'uint8))
-(assert equal? (pffi-type? 'uint8) #t)
-(debug (pffi-type? 'int16))
-(assert equal? (pffi-type? 'int16) #t)
-(debug (pffi-type? 'uint16))
-(assert equal? (pffi-type? 'uint16) #t)
-(debug (pffi-type? 'int32))
-(assert equal? (pffi-type? 'int32) #t)
-(debug (pffi-type? 'uint32))
-(assert equal? (pffi-type? 'uint32) #t)
-(debug (pffi-type? 'int64))
-(assert equal? (pffi-type? 'int64) #t)
-(debug (pffi-type? 'uint64))
-(assert equal? (pffi-type? 'uint64) #t)
-(debug (pffi-type? 'char))
-(assert equal? (pffi-type? 'char) #t)
-(debug (pffi-type? 'unsigned-char))
-(assert equal? (pffi-type? 'unsigned-char) #t)
-(debug (pffi-type? 'short))
-(assert equal? (pffi-type? 'short) #t)
-(debug (pffi-type? 'unsigned-short))
-(assert equal? (pffi-type? 'unsigned-short) #t)
-(debug (pffi-type? 'int))
-(assert equal? (pffi-type? 'int) #t)
-(debug (pffi-type? 'unsigned-int))
-(assert equal? (pffi-type? 'unsigned-int) #t)
-(debug (pffi-type? 'long))
-(assert equal? (pffi-type? 'long) #t)
-(debug (pffi-type? 'unsigned-long))
-(assert equal? (pffi-type? 'unsigned-long) #t)
-(debug (pffi-type? 'float))
-(assert equal? (pffi-type? 'float) #t)
-(debug (pffi-type? 'double))
-(assert equal? (pffi-type? 'double) #t)
-(debug (pffi-type? 'pointer))
-(assert equal? (pffi-type? 'pointer) #t)
-(debug (pffi-type? 'void))
-(assert equal? (pffi-type? 'void) #t)
-(debug (pffi-type? 'callback))
-(assert equal? (pffi-type? 'callback) #t)
+;(debug (pffi-type? 'int8))
+;(assert equal? (pffi-type? 'int8) #t)
+;(debug (pffi-type? 'uint8))
+;(assert equal? (pffi-type? 'uint8) #t)
+;(debug (pffi-type? 'int16))
+;(assert equal? (pffi-type? 'int16) #t)
+;(debug (pffi-type? 'uint16))
+;(assert equal? (pffi-type? 'uint16) #t)
+;(debug (pffi-type? 'int32))
+;(assert equal? (pffi-type? 'int32) #t)
+;(debug (pffi-type? 'uint32))
+;(assert equal? (pffi-type? 'uint32) #t)
+;(debug (pffi-type? 'int64))
+;(assert equal? (pffi-type? 'int64) #t)
+;(debug (pffi-type? 'uint64))
+;(assert equal? (pffi-type? 'uint64) #t)
+;(debug (pffi-type? 'char))
+;(assert equal? (pffi-type? 'char) #t)
+;(debug (pffi-type? 'unsigned-char))
+;(assert equal? (pffi-type? 'unsigned-char) #t)
+;(debug (pffi-type? 'short))
+;(assert equal? (pffi-type? 'short) #t)
+;(debug (pffi-type? 'unsigned-short))
+;(assert equal? (pffi-type? 'unsigned-short) #t)
+;(debug (pffi-type? 'int))
+;(assert equal? (pffi-type? 'int) #t)
+;(debug (pffi-type? 'unsigned-int))
+;(assert equal? (pffi-type? 'unsigned-int) #t)
+;(debug (pffi-type? 'long))
+;(assert equal? (pffi-type? 'long) #t)
+;(debug (pffi-type? 'unsigned-long))
+;(assert equal? (pffi-type? 'unsigned-long) #t)
+;(debug (pffi-type? 'float))
+;(assert equal? (pffi-type? 'float) #t)
+;(debug (pffi-type? 'double))
+;(assert equal? (pffi-type? 'double) #t)
+;(debug (pffi-type? 'pointer))
+;(assert equal? (pffi-type? 'pointer) #t)
+;(debug (pffi-type? 'void))
+;(assert equal? (pffi-type? 'void) #t)
+;(debug (pffi-type? 'callback))
+;(assert equal? (pffi-type? 'callback) #t)
-;; pffi-size-of
+;; c-size-of
-(print-header 'pffi-size-of)
+(print-header 'c-size-of)
-(define size-int8 (pffi-size-of 'int8))
+(define size-int8 (c-size-of 'int8))
(debug size-int8)
(assert equal? (number? size-int8) #t)
(assert = size-int8 1)
-(define size-uint8 (pffi-size-of 'uint8))
+(define size-uint8 (c-size-of 'uint8))
(debug size-uint8)
(assert equal? (number? size-uint8) #t)
(assert = size-uint8 1)
-(assert equal? (number? (pffi-size-of 'uint8)) #t)
-(define size-int16 (pffi-size-of 'int16))
+(assert equal? (number? (c-size-of 'uint8)) #t)
+(define size-int16 (c-size-of 'int16))
(debug size-int16)
(assert equal? (number? size-int16) #t)
(assert = size-int16 2)
-(assert equal? (number? (pffi-size-of 'int16)) #t)
-(define size-uint16 (pffi-size-of 'uint16))
+(assert equal? (number? (c-size-of 'int16)) #t)
+(define size-uint16 (c-size-of 'uint16))
(debug size-uint16)
(assert equal? (number? size-uint16) #t)
(assert = size-uint16 2)
-(assert equal? (number? (pffi-size-of 'uint16)) #t)
-(define size-int32 (pffi-size-of 'int32))
+(assert equal? (number? (c-size-of 'uint16)) #t)
+(define size-int32 (c-size-of 'int32))
(debug size-int32)
(assert equal? (number? size-int32) #t)
(assert = size-int32 4)
-(assert equal? (number? (pffi-size-of 'int32)) #t)
-(define size-uint32 (pffi-size-of 'uint32))
+(assert equal? (number? (c-size-of 'int32)) #t)
+(define size-uint32 (c-size-of 'uint32))
(debug size-uint32)
(assert equal? (number? size-uint32) #t)
(assert = size-uint32 4)
-(assert equal? (number? (pffi-size-of 'uint32)) #t)
-(define size-int64 (pffi-size-of 'int64))
+(assert equal? (number? (c-size-of 'uint32)) #t)
+(define size-int64 (c-size-of 'int64))
(debug size-int64)
(assert equal? (number? size-int64) #t)
(assert = size-int64 8)
-(assert equal? (number? (pffi-size-of 'int64)) #t)
-(define size-uint64 (pffi-size-of 'uint64))
+(assert equal? (number? (c-size-of 'int64)) #t)
+(define size-uint64 (c-size-of 'uint64))
(debug size-uint64)
(assert equal? (number? size-uint64) #t)
(assert = size-uint64 8)
-(assert equal? (number? (pffi-size-of 'uint64)) #t)
-(define size-char (pffi-size-of 'char))
+(assert equal? (number? (c-size-of 'uint64)) #t)
+(define size-char (c-size-of 'char))
(debug size-char)
(assert equal? (number? size-char) #t)
(assert = size-char 1)
-(assert equal? (number? (pffi-size-of 'char)) #t)
-(define size-unsigned-char (pffi-size-of 'unsigned-char))
+(assert equal? (number? (c-size-of 'char)) #t)
+(define size-unsigned-char (c-size-of 'unsigned-char))
(debug size-unsigned-char)
(assert equal? (number? size-unsigned-char) #t)
(assert = size-unsigned-char 1)
-(assert equal? (number? (pffi-size-of 'unsigned-char)) #t)
-(define size-short (pffi-size-of 'short))
+(assert equal? (number? (c-size-of 'unsigned-char)) #t)
+(define size-short (c-size-of 'short))
(debug size-short)
(assert equal? (number? size-short) #t)
(assert = size-short 2)
-(assert equal? (number? (pffi-size-of 'short)) #t)
-(define size-unsigned-short (pffi-size-of 'unsigned-short))
+(assert equal? (number? (c-size-of 'short)) #t)
+(define size-unsigned-short (c-size-of 'unsigned-short))
(debug size-unsigned-short)
(assert equal? (number? size-unsigned-short) #t)
(assert = size-unsigned-short 2)
-(assert equal? (number? (pffi-size-of 'unsigned-short)) #t)
-(define size-int (pffi-size-of 'int))
+(assert equal? (number? (c-size-of 'unsigned-short)) #t)
+(define size-int (c-size-of 'int))
(debug size-int)
(assert equal? (number? size-int) #t)
(assert = size-int 4)
-(assert equal? (number? (pffi-size-of 'int)) #t)
-(define size-unsigned-int (pffi-size-of 'unsigned-int))
+(assert equal? (number? (c-size-of 'int)) #t)
+(define size-unsigned-int (c-size-of 'unsigned-int))
(debug size-unsigned-int)
(assert equal? (number? size-unsigned-int) #t)
(assert = size-unsigned-int 4)
(cond-expand
(i386
- (assert equal? (number? (pffi-size-of 'long)) #t)
- (define size-long (pffi-size-of 'long))
+ (assert equal? (number? (c-size-of 'long)) #t)
+ (define size-long (c-size-of 'long))
(debug size-long)
(assert equal? (number? size-long) #t)
(assert = size-long 4))
(else
- (assert equal? (number? (pffi-size-of 'long)) #t)
- (define size-long (pffi-size-of 'long))
+ (assert equal? (number? (c-size-of 'long)) #t)
+ (define size-long (c-size-of 'long))
(debug size-long)
(assert equal? (number? size-long) #t)
(assert = size-long 8)))
(cond-expand
(i386
- (assert equal? (number? (pffi-size-of 'unsigned-long)) #t)
- (define size-unsigned-long (pffi-size-of 'unsigned-long))
+ (assert equal? (number? (c-size-of 'unsigned-long)) #t)
+ (define size-unsigned-long (c-size-of 'unsigned-long))
(debug size-unsigned-long)
(assert equal? (number? size-unsigned-long) #t)
(assert = size-unsigned-long 4))
(else
- (assert equal? (number? (pffi-size-of 'long)) #t)
- (define size-unsigned-long (pffi-size-of 'unsigned-long))
+ (assert equal? (number? (c-size-of 'long)) #t)
+ (define size-unsigned-long (c-size-of 'unsigned-long))
(debug size-unsigned-long)
(assert equal? (number? size-unsigned-long) #t)
(assert = size-unsigned-long 8)))
-(assert equal? (number? (pffi-size-of 'float)) #t)
-(define size-float (pffi-size-of 'float))
+(assert equal? (number? (c-size-of 'float)) #t)
+(define size-float (c-size-of 'float))
(debug size-float)
(assert equal? (number? size-float) #t)
(assert = size-float 4)
-(assert equal? (number? (pffi-size-of 'double)) #t)
-(define size-double (pffi-size-of 'double))
+(assert equal? (number? (c-size-of 'double)) #t)
+(define size-double (c-size-of 'double))
(debug size-double)
(assert equal? (number? size-double) #t)
(assert = size-double 8)
(cond-expand
(i386
- (define size-pointer (pffi-size-of 'pointer))
+ (define size-pointer (c-size-of 'pointer))
(debug size-pointer)
(assert equal? (number? size-pointer) #t)
(assert = size-pointer 4))
(else
- (define size-pointer (pffi-size-of 'pointer))
+ (define size-pointer (c-size-of 'pointer))
(debug size-pointer)
(assert equal? (number? size-pointer) #t)
(assert = size-pointer 8)))
-;; pffi-align-of
+;; c-align-of
+;
+;(print-header 'c-align-of)
+;
+;(define align-int8 (c-align-of 'int8))
+;(debug align-int8)
+;(assert equal? (number? align-int8) #t)
+;(assert = align-int8 1)
+;
+;(define align-uint8 (c-align-of 'uint8))
+;(debug align-uint8)
+;(assert equal? (number? align-uint8) #t)
+;(assert = align-uint8 1)
+;
+;(assert equal? (number? (c-align-of 'uint8)) #t)
+;(define align-int16 (c-align-of 'int16))
+;(debug align-int16)
+;(assert equal? (number? align-int16) #t)
+;(assert = align-int16 2)
+;
+;(assert equal? (number? (c-align-of 'int16)) #t)
+;(define align-uint16 (c-align-of 'uint16))
+;(debug align-uint16)
+;(assert equal? (number? align-uint16) #t)
+;(assert = align-uint16 2)
+;
+;(assert equal? (number? (c-align-of 'uint16)) #t)
+;(define align-int32 (c-align-of 'int32))
+;(debug align-int32)
+;(assert equal? (number? align-int32) #t)
+;(assert = align-int32 4)
+;
+;(assert equal? (number? (c-align-of 'int32)) #t)
+;(define align-uint32 (c-align-of 'uint32))
+;(debug align-uint32)
+;(assert equal? (number? align-uint32) #t)
+;(assert = align-uint32 4)
+;
+;(assert equal? (number? (c-align-of 'uint32)) #t)
+;(define align-int64 (c-align-of 'int64))
+;(debug align-int64)
+;(assert equal? (number? align-int64) #t)
+;(assert = align-int64 8)
+;
+;(assert equal? (number? (c-align-of 'int64)) #t)
+;(define align-uint64 (c-align-of 'uint64))
+;(debug align-uint64)
+;(assert equal? (number? align-uint64) #t)
+;(assert = align-uint64 8)
+;
+;(assert equal? (number? (c-align-of 'uint64)) #t)
+;(define align-char (c-align-of 'char))
+;(debug align-char)
+;(assert equal? (number? align-char) #t)
+;(assert = align-char 1)
+;
+;(assert equal? (number? (c-align-of 'char)) #t)
+;(define align-unsigned-char (c-align-of 'unsigned-char))
+;(debug align-unsigned-char)
+;(assert equal? (number? align-unsigned-char) #t)
+;(assert = align-unsigned-char 1)
+;
+;(assert equal? (number? (c-align-of 'unsigned-char)) #t)
+;(define align-short (c-align-of 'short))
+;(debug align-short)
+;(assert equal? (number? align-short) #t)
+;(assert = align-short 2)
+;
+;(assert equal? (number? (c-align-of 'short)) #t)
+;(define align-unsigned-short (c-align-of 'unsigned-short))
+;(debug align-unsigned-short)
+;(assert equal? (number? align-unsigned-short) #t)
+;(assert = align-unsigned-short 2)
+;
+;(assert equal? (number? (c-align-of 'unsigned-short)) #t)
+;(define align-int (c-align-of 'int))
+;(debug align-int)
+;(assert equal? (number? align-int) #t)
+;(assert = align-int 4)
+;
+;(assert equal? (number? (c-align-of 'int)) #t)
+;(define align-unsigned-int (c-align-of 'unsigned-int))
+;(debug align-unsigned-int)
+;(assert equal? (number? align-unsigned-int) #t)
+;(assert = align-unsigned-int 4)
+;
+;(cond-expand
+; (i386
+; (assert equal? (number? (c-align-of 'long)) #t)
+; (define align-long (c-align-of 'long))
+; (debug align-long)
+; (assert equal? (number? align-long) #t)
+; (assert = align-long 4))
+; (else
+; (assert equal? (number? (c-align-of 'long)) #t)
+; (define align-long (c-align-of 'long))
+; (debug align-long)
+; (assert equal? (number? align-long) #t)
+; (assert = align-long 8)))
+;
+;(cond-expand
+; (i386
+; (assert equal? (number? (c-align-of 'unsigned-long)) #t)
+; (define align-unsigned-long (c-align-of 'unsigned-long))
+; (debug align-unsigned-long)
+; (assert equal? (number? align-unsigned-long) #t)
+; (assert = align-unsigned-long 4))
+; (else
+; (assert equal? (number? (c-align-of 'long)) #t)
+; (define align-unsigned-long (c-align-of 'unsigned-long))
+; (debug align-unsigned-long)
+; (assert equal? (number? align-unsigned-long) #t)
+; (assert = align-unsigned-long 8)))
+;
+;(assert equal? (number? (c-align-of 'float)) #t)
+;(define align-float (c-align-of 'float))
+;(debug align-float)
+;(assert equal? (number? align-float) #t)
+;(assert = align-float 4)
+;
+;(assert equal? (number? (c-align-of 'double)) #t)
+;(define align-double (c-align-of 'double))
+;(debug align-double)
+;(assert equal? (number? align-double) #t)
+;(assert = align-double 8)
+;
+;(cond-expand
+; (i386
+; (define align-pointer (c-align-of 'pointer))
+; (debug align-pointer)
+; (assert equal? (number? align-pointer) #t)
+; (assert = align-pointer 4))
+; (else
+; (define align-pointer (c-align-of 'pointer))
+; (debug align-pointer)
+; (assert equal? (number? align-pointer) #t)
+; (assert = align-pointer 8)))
-(print-header 'pffi-align-of)
-
-(define align-int8 (pffi-align-of 'int8))
-(debug align-int8)
-(assert equal? (number? align-int8) #t)
-(assert = align-int8 1)
-
-(define align-uint8 (pffi-align-of 'uint8))
-(debug align-uint8)
-(assert equal? (number? align-uint8) #t)
-(assert = align-uint8 1)
-
-(assert equal? (number? (pffi-align-of 'uint8)) #t)
-(define align-int16 (pffi-align-of 'int16))
-(debug align-int16)
-(assert equal? (number? align-int16) #t)
-(assert = align-int16 2)
-
-(assert equal? (number? (pffi-align-of 'int16)) #t)
-(define align-uint16 (pffi-align-of 'uint16))
-(debug align-uint16)
-(assert equal? (number? align-uint16) #t)
-(assert = align-uint16 2)
-
-(assert equal? (number? (pffi-align-of 'uint16)) #t)
-(define align-int32 (pffi-align-of 'int32))
-(debug align-int32)
-(assert equal? (number? align-int32) #t)
-(assert = align-int32 4)
-
-(assert equal? (number? (pffi-align-of 'int32)) #t)
-(define align-uint32 (pffi-align-of 'uint32))
-(debug align-uint32)
-(assert equal? (number? align-uint32) #t)
-(assert = align-uint32 4)
-
-(assert equal? (number? (pffi-align-of 'uint32)) #t)
-(define align-int64 (pffi-align-of 'int64))
-(debug align-int64)
-(assert equal? (number? align-int64) #t)
-(assert = align-int64 8)
-
-(assert equal? (number? (pffi-align-of 'int64)) #t)
-(define align-uint64 (pffi-align-of 'uint64))
-(debug align-uint64)
-(assert equal? (number? align-uint64) #t)
-(assert = align-uint64 8)
-
-(assert equal? (number? (pffi-align-of 'uint64)) #t)
-(define align-char (pffi-align-of 'char))
-(debug align-char)
-(assert equal? (number? align-char) #t)
-(assert = align-char 1)
-
-(assert equal? (number? (pffi-align-of 'char)) #t)
-(define align-unsigned-char (pffi-align-of 'unsigned-char))
-(debug align-unsigned-char)
-(assert equal? (number? align-unsigned-char) #t)
-(assert = align-unsigned-char 1)
-
-(assert equal? (number? (pffi-align-of 'unsigned-char)) #t)
-(define align-short (pffi-align-of 'short))
-(debug align-short)
-(assert equal? (number? align-short) #t)
-(assert = align-short 2)
-
-(assert equal? (number? (pffi-align-of 'short)) #t)
-(define align-unsigned-short (pffi-align-of 'unsigned-short))
-(debug align-unsigned-short)
-(assert equal? (number? align-unsigned-short) #t)
-(assert = align-unsigned-short 2)
-
-(assert equal? (number? (pffi-align-of 'unsigned-short)) #t)
-(define align-int (pffi-align-of 'int))
-(debug align-int)
-(assert equal? (number? align-int) #t)
-(assert = align-int 4)
-
-(assert equal? (number? (pffi-align-of 'int)) #t)
-(define align-unsigned-int (pffi-align-of 'unsigned-int))
-(debug align-unsigned-int)
-(assert equal? (number? align-unsigned-int) #t)
-(assert = align-unsigned-int 4)
-
-(cond-expand
- (i386
- (assert equal? (number? (pffi-align-of 'long)) #t)
- (define align-long (pffi-align-of 'long))
- (debug align-long)
- (assert equal? (number? align-long) #t)
- (assert = align-long 4))
- (else
- (assert equal? (number? (pffi-align-of 'long)) #t)
- (define align-long (pffi-align-of 'long))
- (debug align-long)
- (assert equal? (number? align-long) #t)
- (assert = align-long 8)))
-
-(cond-expand
- (i386
- (assert equal? (number? (pffi-align-of 'unsigned-long)) #t)
- (define align-unsigned-long (pffi-align-of 'unsigned-long))
- (debug align-unsigned-long)
- (assert equal? (number? align-unsigned-long) #t)
- (assert = align-unsigned-long 4))
- (else
- (assert equal? (number? (pffi-align-of 'long)) #t)
- (define align-unsigned-long (pffi-align-of 'unsigned-long))
- (debug align-unsigned-long)
- (assert equal? (number? align-unsigned-long) #t)
- (assert = align-unsigned-long 8)))
-
-(assert equal? (number? (pffi-align-of 'float)) #t)
-(define align-float (pffi-align-of 'float))
-(debug align-float)
-(assert equal? (number? align-float) #t)
-(assert = align-float 4)
-
-(assert equal? (number? (pffi-align-of 'double)) #t)
-(define align-double (pffi-align-of 'double))
-(debug align-double)
-(assert equal? (number? align-double) #t)
-(assert = align-double 8)
-
-(cond-expand
- (i386
- (define align-pointer (pffi-align-of 'pointer))
- (debug align-pointer)
- (assert equal? (number? align-pointer) #t)
- (assert = align-pointer 4))
- (else
- (define align-pointer (pffi-align-of 'pointer))
- (debug align-pointer)
- (assert equal? (number? align-pointer) #t)
- (assert = align-pointer 8)))
-
-;; pffi-define-library
+;; define-c-library
(print-header 'pffi-define-library)
(cond-expand
- (windows (pffi-define-library libc-stdlib
+ (windows (define-c-library libc-stdlib
'("stdlib.h")
"ucrtbase"
'((additional-versions ("0" "6")))))
- (else (pffi-define-library libc-stdlib
+ (else (define-c-library libc-stdlib
'("stdlib.h")
"c"
'((additional-versions ("0" "6"))))))
@@ -416,108 +416,146 @@
(debug libc-stdlib)
(cond-expand
- (windows (pffi-define-library libc-stdio
+ (windows (define-c-library libc-stdio
'("stdio.h")
"ucrtbase"
'((additional-versions ("0" "6")))))
- (else (pffi-define-library libc-stdio
+ (else (define-c-library libc-stdio
'("stdio.h")
"c"
'((additional-versions ("0" "6"))))))
(debug libc-stdio)
-(pffi-define-library c-testlib
+(define-c-library c-testlib
'("libtest.h")
"test"
'((additional-paths ("." "./tests"))))
(debug c-testlib)
-;; pffi-pointer-null
+;; define-c-procedure
-(print-header 'pffi-pointer-null)
+(print-header 'define-c-procedure)
-(define null-pointer (pffi-pointer-null))
+(define-c-procedure c-abs libc-stdlib 'abs 'int '(int))
+(debug c-abs)
+(define absoluted (c-abs -2))
+(debug absoluted)
+(assert = absoluted 2)
+
+(define-c-procedure c-puts libc-stdlib 'puts 'int '(pointer))
+(debug c-puts)
+(define chars-written (c-puts (string->c-bytevector "puts: Hello from testing, I am C function puts")))
+(debug chars-written)
+(assert = chars-written 47)
+
+(define-c-procedure c-atoi libc-stdlib 'atoi 'int '(pointer))
+(assert = (c-atoi (string->c-bytevector "100")) 100)
+
+(define-c-procedure c-fopen libc-stdio 'fopen 'pointer '(pointer pointer))
+(define output-file (c-fopen (string->c-bytevector "testfile.test")
+ (string->c-bytevector "w")))
+(debug output-file)
+(define-c-procedure c-fprintf libc-stdio 'fprintf 'int '(pointer pointer))
+(define characters-written
+ (c-fprintf output-file (string->c-bytevector "Hello world")))
+(debug characters-written)
+(assert equal? (= characters-written 11) #t)
+(define-c-procedure c-fclose libc-stdio 'fclose 'int '(pointer))
+(define closed-status (c-fclose output-file))
+(debug closed-status)
+(assert equal? (= closed-status 0) #t)
+(assert equal? (file-exists? "testfile.test") #t)
+(assert equal? (string=? (with-input-from-file "testfile.test"
+ (lambda () (read-line)))
+ "Hello world") #t)
+
+(define-c-procedure c-takes-no-args c-testlib 'takes_no_args 'void '())
+(debug c-takes-no-args)
+(c-takes-no-args)
+
+(define-c-procedure c-takes-no-args-returns-int c-testlib 'takes_no_args_returns_int 'int '())
+(debug c-takes-no-args)
+(define takes-no-args-returns-int-result (c-takes-no-args-returns-int))
+(assert equal? (= takes-no-args-returns-int-result 0) #t)
+
+;; c-bytevector?
+
+(print-header 'c-bytevector?)
+
+(define is-pointer (make-c-bytevector 100))
+(debug is-pointer)
+(assert equal? (c-bytevector? is-pointer) #t)
+;(assert equal? (c-bytevector? 100) #f)
+(assert equal? (c-bytevector? 'bar) #f)
+
+;; make-c-null
+
+(print-header 'make-c-null)
+
+(define null-pointer (make-c-null))
(debug null-pointer)
-(assert equal? (pffi-pointer-null? null-pointer) #t)
+(assert equal? (c-null? null-pointer) #t)
-;; pffi-pointer-null?
+;; c-null?
-(print-header 'pffi-pointer-null?)
+(print-header 'c-null?)
-(define is-null-pointer (pffi-pointer-null))
+(define is-null-pointer (make-c-null))
(debug is-null-pointer)
-(assert equal? (pffi-pointer-null? is-null-pointer) #t)
-(assert equal? (pffi-pointer-null? 100) #f)
-(assert equal? (pffi-pointer-null? 'bar) #f)
+(assert equal? (c-null? is-null-pointer) #t)
+(assert equal? (c-null? 100) #f)
+(assert equal? (c-null? 'bar) #f)
-;; pffi-pointer-allocate
+;;make-c-bytevector
-(print-header 'pffi-pointer-allocate)
+(print-header 'make-c-bytevector )
-(define test-pointer (pffi-pointer-allocate 100))
+(define test-pointer (make-c-bytevector 100))
(debug test-pointer)
-(assert equal? (pffi-pointer? test-pointer) #t)
-;(assert equal? (pffi-pointer? 0) #f)
-;(assert equal? (pffi-pointer? #t) #f)
-;(assert equal? (pffi-pointer? "Hello world") #f)
-(assert equal? (pffi-pointer-null? test-pointer) #f)
+(assert equal? (c-bytevector? test-pointer) #t)
+;(assert equal? (c-bytevector? 0) #f)
+;(assert equal? (c-bytevector? #t) #f)
+;(assert equal? (c-bytevector? "Hello world") #f)
+(assert equal? (c-null? test-pointer) #f)
-;; pffi-pointer-address
+;; call-with-address-of-c-bytevector
-(print-header 'pffi-pointer-allocate)
-(pffi-define-function test-passing-pointer-address
+(print-header 'call-with-address-of-c-bytevector)
+
+(define-c-procedure test-passing-pointer-address
c-testlib
'test_passing_pointer_address
'int
'(pointer pointer))
-(pffi-define-function pa c-testlib 'pa 'pointer '(pointer))
-(pffi-define-function printa c-testlib 'printa 'void '(pointer))
-(define test-pointer1 (pffi-pointer-allocate 100))
-(debug test-pointer1)
-(debug (pffi-pointer? test-pointer1))
-(assert equal? (pffi-pointer? test-pointer1) #t)
-(debug (pffi-pointer-address test-pointer1))
-
-(define input-pointer (pffi-pointer-allocate (pffi-size-of 'int)))
+(define input-pointer (make-c-bytevector (c-size-of 'int)))
(pffi-pointer-set! input-pointer 'int 0 100)
-(define input-pointer-address (pffi-pointer-address input-pointer))
-(debug input-pointer-address)
-(test-passing-pointer-address input-pointer input-pointer-address)
-(debug input-pointer)
-(debug input-pointer-address)
(debug (pffi-pointer-get input-pointer 'int 0))
-;(assert equal? (pffi-pointer? input-pointer-address) #t)
-;(assert equal? (= (pffi-pointer-get input-pointer 'int 0) 42) #t)
-;(assert equal? (> (pffi-pointer-address test-pointer1) 0) #t)
+(call-with-address-of-c-bytevector
+ input-pointer
+ (lambda (address)
+ (test-passing-pointer-address input-pointer address)))
+(debug input-pointer)
+(debug (pffi-pointer-get input-pointer 'int 0))
+(assert equal? (= (pffi-pointer-get input-pointer 'int 0) 42) #t)
-;; pffi-pointer?
+;; c-free
-(print-header 'pffi-pointer?)
+(print-header 'c-free)
-(define is-pointer (pffi-pointer-allocate 100))
-(debug is-pointer)
-(assert equal? (pffi-pointer? is-pointer) #t)
-;(assert equal? (pffi-pointer? 100) #f)
-(assert equal? (pffi-pointer? 'bar) #f)
-
-;; pffi-pointer-free
-
-(print-header 'pffi-pointer-free)
-
-(define pointer-to-be-freed (pffi-pointer-allocate 100))
+(define pointer-to-be-freed (make-c-bytevector 100))
(debug pointer-to-be-freed)
-(pffi-pointer-free pointer-to-be-freed)
+(c-free pointer-to-be-freed)
(debug pointer-to-be-freed)
;; pffi-pointer-set! and pffi-pointer-get 1/2
(print-header "pffi-pointer-set! and pffi-pointer-get 1/2")
-(define set-pointer (pffi-pointer-allocate 256))
+(define set-pointer (make-c-bytevector 256))
(define offset 64)
(define value 1)
(debug set-pointer)
@@ -573,32 +611,32 @@
(pffi-define-struct test-struct1 'teststruct1 '((int . r) (int . g) (int . b)))
(define struct1 (test-struct1))
(debug struct1)
-(debug (pffi-size-of struct1))
-(assert = (pffi-size-of struct1) 12)
+(debug (c-size-of struct1))
+(assert = (c-size-of struct1) 12)
(pffi-define-struct test-struct2 'test2 '((int8 . r) (int8 . g) (int . b)))
(define struct2 (test-struct2))
(debug struct2)
-(debug (pffi-size-of struct2))
-(assert = (pffi-size-of struct2) 8)
+(debug (c-size-of struct2))
+(assert = (c-size-of struct2) 8)
(pffi-define-struct test-struct3 'test3 '((int8 . r) (int8 . g) (int . b)))
(define struct3 (test-struct3))
(debug struct3)
-(debug (pffi-size-of struct3))
-(assert = (pffi-size-of struct3) 8)
+(debug (c-size-of struct3))
+(assert = (c-size-of struct3) 8)
(pffi-define-struct test-struct4 'test4 '((int8 . r) (pointer . a) (int8 . g) (int . b)))
(define struct4 (test-struct4))
(debug struct4)
-(debug (pffi-size-of struct4))
-(assert = (pffi-size-of struct4) 24)
+(debug (c-size-of struct4))
+(assert = (c-size-of struct4) 24)
(pffi-define-struct test-struct5 'test5 '((int8 . r) (char . b) (pointer . a) (int8 . g) (int . b)))
(define struct5 (test-struct5))
(debug struct5)
-(debug (pffi-size-of struct5))
-(assert = (pffi-size-of struct5) 24)
+(debug (c-size-of struct5))
+(assert = (c-size-of struct5) 24)
(pffi-define-struct test-struct6 'test6 '((int8 . a)
(char . b)
@@ -616,18 +654,33 @@
(float . n)))
(define struct6 (test-struct6))
(debug struct6)
-(debug (pffi-size-of struct6))
-(assert = (pffi-size-of struct6) 96)
+(debug (c-size-of struct6))
+(assert = (c-size-of struct6) 96)
-;; pffi-string->pointer
+;; bytevector->c-bytevector c-bytevector->bytevector
-(print-header 'pffi-string->pointer)
+(print-header "bytevector->c-bytevector c-bytevector->bytevector")
-(define string-pointer (pffi-string->pointer "Hello world"))
+(define bt1 (bytevector 1 2 3 4 5 6 7 8))
+(debug bt1)
+(define btp1 (bytevector->c-bytevector bt1))
+(debug btp1)
+(assert equal? (c-bytevector? btp1) #t)
+(define bt2 (c-bytevector->bytevector btp1 (bytevector-length bt1)))
+(debug bt2)
+(assert equal? (bytevector? bt2) #t)
+(debug (list bt1 bt2))
+(assert equal? bt1 bt2)
+
+;; string->c-bytevector
+
+(print-header 'string->c-bytevector)
+
+(define string-pointer (string->c-bytevector "Hello world"))
(debug string-pointer)
-(debug (pffi-pointer->string string-pointer))
-(assert equal? (pffi-pointer? string-pointer) #t)
-(assert equal? (pffi-pointer-null? string-pointer) #f)
+(debug (c-bytevector->string string-pointer))
+(assert equal? (c-bytevector? string-pointer) #t)
+(assert equal? (c-null? string-pointer) #f)
(debug (pffi-pointer-get string-pointer 'char 0))
(assert char=? (pffi-pointer-get string-pointer 'char 0) #\H)
(debug (pffi-pointer-get string-pointer 'char 1))
@@ -641,28 +694,28 @@
(debug (pffi-pointer-get string-pointer 'char 10))
(assert char=? (pffi-pointer-get string-pointer 'char 10) #\d)
-;; pffi-pointer->string
+;; c-bytevector->string
-(print-header 'pffi-pointer->string)
+(print-header 'c-bytevector->string)
-(define pointer-string (pffi-pointer->string string-pointer))
+(define pointer-string (c-bytevector->string string-pointer))
(debug pointer-string)
(assert equal? (string? pointer-string) #t)
(assert string=? pointer-string "Hello world")
-(assert string=? (pffi-pointer->string (pffi-string->pointer "https://scheme.org")) "https://scheme.org")
+(assert string=? (c-bytevector->string (string->c-bytevector "https://scheme.org")) "https://scheme.org")
(define test-url-string "https://scheme.org")
(debug test-url-string)
-(define test-url (pffi-string->pointer test-url-string))
+(define test-url (string->c-bytevector test-url-string))
(debug test-url)
-(debug (pffi-pointer->string test-url))
-(assert equal? (string=? (pffi-pointer->string test-url) test-url-string) #t)
+(debug (c-bytevector->string test-url))
+(assert equal? (string=? (c-bytevector->string test-url) test-url-string) #t)
;; pffi-pointer-get
(print-header "pffi-pointer-get")
(define hello-string "hello")
-(define hello-string-pointer (pffi-string->pointer hello-string))
+(define hello-string-pointer (string->c-bytevector hello-string))
(debug (pffi-pointer-get hello-string-pointer 'char 0))
(assert char=? (pffi-pointer-get hello-string-pointer 'char 0) #\h)
@@ -675,81 +728,36 @@
(print-header "pffi-pointer-set! and pffi-pointer-get 2/2")
-(define pointer-to-be-set (pffi-string->pointer "FOOBAR"))
+(define pointer-to-be-set (string->c-bytevector "FOOBAR"))
(debug pointer-to-be-set)
-(debug (pffi-pointer->string pointer-to-be-set))
+(debug (c-bytevector->string pointer-to-be-set))
(pffi-pointer-set! set-pointer 'pointer offset pointer-to-be-set)
(debug (pffi-pointer-get set-pointer 'pointer offset))
(assert equal?
- (pffi-pointer? (pffi-pointer-get set-pointer 'pointer offset))
+ (c-bytevector? (pffi-pointer-get set-pointer 'pointer offset))
#t)
-(debug (pffi-pointer->string (pffi-pointer-get set-pointer 'pointer offset)))
+(debug (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)))
(assert equal?
- (string? (pffi-pointer->string (pffi-pointer-get set-pointer 'pointer offset)))
+ (string? (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)))
#t)
-(debug (pffi-pointer->string (pffi-pointer-get set-pointer 'pointer offset)))
+(debug (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)))
(assert equal?
- (string=? (pffi-pointer->string (pffi-pointer-get set-pointer 'pointer offset)) "FOOBAR")
+ (string=? (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)) "FOOBAR")
#t)
(define string-to-be-set "FOOBAR")
(debug string-to-be-set)
-(pffi-pointer-set! set-pointer 'pointer offset (pffi-string->pointer string-to-be-set))
-(assert string=? (pffi-pointer->string (pffi-pointer-get set-pointer 'pointer offset)) "FOOBAR")
+(pffi-pointer-set! set-pointer 'pointer offset (string->c-bytevector string-to-be-set))
+(assert string=? (c-bytevector->string (pffi-pointer-get set-pointer 'pointer offset)) "FOOBAR")
-;; pffi-define
-
-(print-header 'pffi-define)
-
-(pffi-define-function c-abs libc-stdlib 'abs 'int '(int))
-(debug c-abs)
-(define absoluted (c-abs -2))
-(debug absoluted)
-(assert = absoluted 2)
-
-(pffi-define-function c-puts libc-stdlib 'puts 'int '(pointer))
-(debug c-puts)
-(define chars-written (c-puts (pffi-string->pointer "puts: Hello from testing, I am C function puts")))
-(debug chars-written)
-(assert = chars-written 47)
-
-(pffi-define-function c-atoi libc-stdlib 'atoi 'int '(pointer))
-(assert = (c-atoi (pffi-string->pointer "100")) 100)
-
-(pffi-define-function c-fopen libc-stdio 'fopen 'pointer '(pointer pointer))
-(define output-file (c-fopen (pffi-string->pointer "testfile.test")
- (pffi-string->pointer "w")))
-(debug output-file)
-(pffi-define-function c-fprintf libc-stdio 'fprintf 'int '(pointer pointer))
-(define characters-written
- (c-fprintf output-file (pffi-string->pointer "Hello world")))
-(debug characters-written)
-(assert equal? (= characters-written 11) #t)
-(pffi-define-function c-fclose libc-stdio 'fclose 'int '(pointer))
-(define closed-status (c-fclose output-file))
-(debug closed-status)
-(assert equal? (= closed-status 0) #t)
-(assert equal? (file-exists? "testfile.test") #t)
-(assert equal? (string=? (with-input-from-file "testfile.test"
- (lambda () (read-line)))
- "Hello world") #t)
-
-(pffi-define-function c-takes-no-args c-testlib 'takes_no_args 'void '())
-(debug c-takes-no-args)
-(c-takes-no-args)
-
-(pffi-define-function c-takes-no-args-returns-int c-testlib 'takes_no_args_returns_int 'int '())
-(debug c-takes-no-args)
-(define takes-no-args-returns-int-result (c-takes-no-args-returns-int))
-(assert equal? (= takes-no-args-returns-int-result 0) #t)
;; pffi-struct-get
(print-header 'pffi-struct-get)
-(pffi-define-function c-init-struct c-testlib 'init_struct 'pointer '(pointer))
-(pffi-define-function c-check-offset c-testlib 'check_offset 'void '(int int))
+(define-c-procedure c-init-struct c-testlib 'init_struct 'pointer '(pointer))
+(define-c-procedure c-check-offset c-testlib 'check_offset 'void '(int int))
(pffi-define-struct struct-test-get1 'test_get1
'((int8 . a)
(char . b)
@@ -793,18 +801,18 @@
(debug (pffi-struct-get struct-test 'd))
(assert char=? (pffi-struct-get struct-test 'd) #\d)
(debug (pffi-struct-get struct-test 'e))
-(debug (pffi-pointer-null? (pffi-struct-get struct-test 'e)))
-(assert equal? (pffi-pointer-null? (pffi-struct-get struct-test 'e)) #t)
+(debug (c-null? (pffi-struct-get struct-test 'e)))
+(assert equal? (c-null? (pffi-struct-get struct-test 'e)) #t)
(debug (pffi-struct-get struct-test 'f))
(assert = (pffi-struct-get struct-test 'f) 6.0)
(debug (pffi-struct-get struct-test 'g))
-(debug (pffi-pointer->string (pffi-struct-get struct-test 'g)))
-(assert equal? (string=? (pffi-pointer->string (pffi-struct-get struct-test 'g)) "FOOBAR") #t)
+(debug (c-bytevector->string (pffi-struct-get struct-test 'g)))
+(assert equal? (string=? (c-bytevector->string (pffi-struct-get struct-test 'g)) "FOOBAR") #t)
(debug (pffi-struct-get struct-test 'h))
(assert = (pffi-struct-get struct-test 'h) 8)
(debug (pffi-struct-get struct-test 'i))
-(debug (pffi-pointer-null? (pffi-struct-get struct-test 'i)))
-(assert equal? (pffi-pointer-null? (pffi-struct-get struct-test 'i)) #t)
+(debug (c-null? (pffi-struct-get struct-test 'i)))
+(assert equal? (c-null? (pffi-struct-get struct-test 'i)) #t)
(debug (pffi-struct-get struct-test 'j))
(assert = (pffi-struct-get struct-test 'j) 10)
(debug (pffi-struct-get struct-test 'k))
@@ -820,7 +828,7 @@
(print-header "pffi-struct-set! 1")
-(pffi-define-function c-test-check c-testlib 'test_check 'int '(pointer))
+(define-c-procedure c-test-check c-testlib 'test_check 'int '(pointer))
(pffi-define-struct struct-test-set1 'test_set1
'((int8 . a)
(char . b)
@@ -841,11 +849,11 @@
(pffi-struct-set! struct-test1 'b #\b)
(pffi-struct-set! struct-test1 'c 3.0)
(pffi-struct-set! struct-test1 'd #\d)
-(pffi-struct-set! struct-test1 'e (pffi-pointer-null))
+(pffi-struct-set! struct-test1 'e (make-c-null))
(pffi-struct-set! struct-test1 'f 6.0)
-(pffi-struct-set! struct-test1 'g (pffi-string->pointer "foo"))
+(pffi-struct-set! struct-test1 'g (string->c-bytevector "foo"))
(pffi-struct-set! struct-test1 'h 8)
-(pffi-struct-set! struct-test1 'i (pffi-pointer-null))
+(pffi-struct-set! struct-test1 'i (make-c-null))
(pffi-struct-set! struct-test1 'j 10)
(pffi-struct-set! struct-test1 'k 11)
(pffi-struct-set! struct-test1 'l 12)
@@ -857,7 +865,7 @@
;(print-header "pffi-struct constructor with pointer")
-;(pffi-define-function c-test-new c-testlib 'test_new 'pointer '())
+;(define-c-procedure c-test-new c-testlib 'test_new 'pointer '())
;(define struct-test2-pointer (c-test-new))
#;(define struct-test2 (pffi-struct-make 'test
'((int8 . a)
@@ -888,17 +896,17 @@
;(debug (pffi-struct-get struct-test2 'd))
;(assert char=? (pffi-struct-get struct-test2 'd) #\d)
;(debug (pffi-struct-get struct-test2 'e))
-;(debug (pffi-pointer-null? (pffi-struct-get struct-test2 'e)))
-;(assert equal? (pffi-pointer-null? (pffi-struct-get struct-test2 'e)) #t)
+;(debug (c-null? (pffi-struct-get struct-test2 'e)))
+;(assert equal? (c-null? (pffi-struct-get struct-test2 'e)) #t)
;(debug (pffi-struct-get struct-test2 'f))
;(assert = (pffi-struct-get struct-test2 'f) 6.0)
-;(debug (pffi-pointer->string (pffi-struct-get struct-test2 'g)))
-;(assert equal? (string=? (pffi-pointer->string (pffi-struct-get struct-test2 'g)) "FOOBAR") #t)
+;(debug (c-bytevector->string (pffi-struct-get struct-test2 'g)))
+;(assert equal? (string=? (c-bytevector->string (pffi-struct-get struct-test2 'g)) "FOOBAR") #t)
;(debug (pffi-struct-get struct-test2 'h))
;(assert = (pffi-struct-get struct-test2 'h) 8)
;(debug (pffi-struct-get struct-test2 'i))
-;(debug (pffi-pointer-null? (pffi-struct-get struct-test2 'i)))
-;(assert (lambda (p t) (pffi-pointer-null? p)) (pffi-struct-get struct-test2 'i) #t)
+;(debug (c-null? (pffi-struct-get struct-test2 'i)))
+;(assert (lambda (p t) (c-null? p)) (pffi-struct-get struct-test2 'i) #t)
;(debug (pffi-struct-get struct-test2 'j))
;(assert = (pffi-struct-get struct-test2 'j) 10)
;(debug (pffi-struct-get struct-test2 'k))
@@ -919,10 +927,10 @@
(debug (pffi-list->array 'int test-list1))
(assert equal? (pffi-array->list (pffi-list->array 'int test-list1)) test-list1)
-(define test-array1 (pffi-pointer-allocate (* (pffi-size-of 'int) 3)))
-(pffi-pointer-set! test-array1 'int (* (pffi-size-of 'int) 0) 4)
-(pffi-pointer-set! test-array1 'int (* (pffi-size-of 'int) 1) 5)
-(pffi-pointer-set! test-array1 'int (* (pffi-size-of 'int) 2) 6)
+(define test-array1 (make-c-bytevector (* (c-size-of 'int) 3)))
+(pffi-pointer-set! test-array1 'int (* (c-size-of 'int) 0) 4)
+(pffi-pointer-set! test-array1 'int (* (c-size-of 'int) 1) 5)
+(pffi-pointer-set! test-array1 'int (* (c-size-of 'int) 2) 6)
(debug test-array1)
(debug (pffi-array->list (pffi-pointer->array test-array1 'int 3)))
(define check-list1 (list 4 5 6))
@@ -941,7 +949,7 @@
;; pffi-struct-dereference 1
;(print-header "pffi-struct-dereference 1")
-;(pffi-define-function c-color-check-by-value c-testlib 'color_check_by_value 'int '((struct . color)))
+;(define-c-procedure c-color-check-by-value c-testlib 'color_check_by_value 'int '((struct . color)))
#;(pffi-define-struct make-struct-color 'color '((int8 . r)
(int8 . g)
(int8 . b)
@@ -957,7 +965,7 @@
;(print-header "pffi-struct-dereference 2")
-;(pffi-define-function c-test-check-by-value c-testlib 'test_check_by_value 'int '((struct . test)))
+;(define-c-procedure c-test-check-by-value c-testlib 'test_check_by_value 'int '((struct . test)))
#;(pffi-define-struct make-struct-test-dereference2
'test
'((int8 . a)
@@ -979,11 +987,11 @@
;(debug (pffi-struct-set! struct-test3 'b #\b))
;(debug (pffi-struct-set! struct-test3 'c 3.0))
;(debug (pffi-struct-set! struct-test3 'd #\d))
-;(debug (pffi-struct-set! struct-test3 'e (pffi-pointer-null)))
+;(debug (pffi-struct-set! struct-test3 'e (make-c-null)))
;(debug (pffi-struct-set! struct-test3 'f 6.0))
-;(debug (pffi-struct-set! struct-test3 'g (pffi-string->pointer "foo")))
+;(debug (pffi-struct-set! struct-test3 'g (string->c-bytevector "foo")))
;(debug (pffi-struct-set! struct-test3 'h 8))
-;(debug (pffi-struct-set! struct-test3 'i (pffi-pointer-null)))
+;(debug (pffi-struct-set! struct-test3 'i (make-c-null)))
;(debug (pffi-struct-set! struct-test3 'j 10))
;(debug (pffi-struct-set! struct-test3 'k 11))
;(debug (pffi-struct-set! struct-test3 'l 12))
@@ -1009,12 +1017,12 @@
;(print-header 'pffi-define-callback)
-;(define array (pffi-pointer-allocate (* (pffi-size-of 'int) 3)))
-;(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 0) 3)
-;(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 1) 2)
-;(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 2) 1)
+;(define array (make-c-bytevector (* (c-size-of 'int) 3)))
+;(pffi-pointer-set! array 'int (* (c-size-of 'int) 0) 3)
+;(pffi-pointer-set! array 'int (* (c-size-of 'int) 1) 2)
+;(pffi-pointer-set! array 'int (* (c-size-of 'int) 2) 1)
-;(pffi-define-function qsort libc-stdlib 'qsort 'void '(pointer int int callback))
+;(define-c-procedure qsort libc-stdlib 'qsort 'void '(pointer int int callback))
#;(pffi-define-callback compare
'int
@@ -1028,17 +1036,17 @@
;(write compare)
;(newline)
-#;(define unsorted (list (pffi-pointer-get array 'int (* (pffi-size-of 'int) 0))
- (pffi-pointer-get array 'int (* (pffi-size-of 'int) 1))
- (pffi-pointer-get array 'int (* (pffi-size-of 'int) 2))))
+#;(define unsorted (list (pffi-pointer-get array 'int (* (c-size-of 'int) 0))
+ (pffi-pointer-get array 'int (* (c-size-of 'int) 1))
+ (pffi-pointer-get array 'int (* (c-size-of 'int) 2))))
;(debug unsorted)
;(assert equal? unsorted (list 3 2 1))
-;(qsort array 3 (pffi-size-of 'int) compare)
+;(qsort array 3 (c-size-of 'int) compare)
-#;(define sorted (list (pffi-pointer-get array 'int (* (pffi-size-of 'int) 0))
- (pffi-pointer-get array 'int (* (pffi-size-of 'int) 1))
- (pffi-pointer-get array 'int (* (pffi-size-of 'int) 2))))
+#;(define sorted (list (pffi-pointer-get array 'int (* (c-size-of 'int) 0))
+ (pffi-pointer-get array 'int (* (c-size-of 'int) 1))
+ (pffi-pointer-get array 'int (* (c-size-of 'int) 2))))
;(debug sorted)
;(assert equal? sorted (list 1 2 3))