diff --git a/' b/' deleted file mode 100644 index d3d4b11..0000000 --- a/' +++ /dev/null @@ -1,213 +0,0 @@ -(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-pointer)) - ((eq? type 'string) (size-of-pointer)) - ((eq? type 'struct) (size-of-pointer)) - ((eq? type 'callback) (size-of-pointer)) - ((eq? type 'void) 0) - (else #f)))) - -(define pffi-shared-object-load - (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))) - 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? - (lambda (object) - (or (equal? object #f) ; False can be null pointer - (pointer? object)))) - -(define pffi-pointer-allocate - (lambda (size) - (pointer-allocate size))) - -(define pffi-pointer-address - (lambda (pointer) - (pointer-address pointer))) - -(define pffi-pointer-free - (lambda (pointer) - (pointer-free pointer))) - -(define pffi-pointer-set! - (lambda (pointer type offset value) - (cond ((equal? type 'int8) (pointer-set-c-int8_t! pointer offset value)) - ((equal? type 'uint8) (pointer-set-c-uint8_t! pointer offset value)) - ((equal? type 'int16) (pointer-set-c-int16_t! pointer offset value)) - ((equal? type 'uint16) (pointer-set-c-uint16_t! pointer offset value)) - ((equal? type 'int32) (pointer-set-c-int32_t! pointer offset value)) - ((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 (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)) - ((equal? type 'unsigned-int) (pointer-set-c-unsigned-int! pointer offset value)) - ((equal? type 'long) (pointer-set-c-long! pointer offset value)) - ((equal? type 'unsigned-long) (pointer-set-c-unsigned-long! pointer offset value)) - ((equal? type 'float) (pointer-set-c-float! pointer offset value)) - ((equal? type 'double) (pointer-set-c-double! pointer offset value)) - ((equal? type 'void) (pointer-set-c-pointer! pointer offset value)) - ((equal? type 'pointer) (pointer-set-c-pointer! pointer offset value))))) - -(define pffi-pointer-get - (lambda (pointer type offset) - (cond ((equal? type 'int8) (pointer-ref-c-int8_t pointer offset)) - ((equal? type 'uint8) (pointer-ref-c-uint8_t pointer offset)) - ((equal? type 'int16) (pointer-ref-c-int16_t pointer offset)) - ((equal? type 'uint16) (pointer-ref-c-uint16_t pointer offset)) - ((equal? type 'int32) (pointer-ref-c-int32_t pointer offset)) - ((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) (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)) - ((equal? type 'unsigned-int) (pointer-ref-c-unsigned-int pointer offset)) - ((equal? type 'long) (pointer-ref-c-long pointer offset)) - ((equal? type 'unsigned-long) (pointer-ref-c-unsigned-long pointer offset)) - ((equal? type 'float) (pointer-ref-c-float pointer offset)) - ((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))))) - -#;(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) - ((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) '(maybe-null void*)) - ((equal? type 'string) 'string) - ((equal? type 'void) 'void) - ((equal? type 'callback) '(maybe-null void*)) - (else (error "pffi-type->native-type -- No such pffi type" type))))) - -;; pffi-define-function - -(define pffi-type->libffi-type - (lambda (type) - (cond ((equal? type 'int8) (get-ffi-type-int8)) - ((equal? type 'uint8) (get-ffi-type-uint8)) - ((equal? type 'int16) (get-ffi-type-int16)) - ((equal? type 'uint16) (get-ffi-type-uint16)) - ((equal? type 'int32) (get-ffi-type-int32)) - ((equal? type 'uint32) (get-ffi-type-uint32)) - ((equal? type 'int64) (get-ffi-type-int64)) - ((equal? type 'uint64) (get-ffi-type-uint64)) - ((equal? type 'char) (get-ffi-type-char)) - ((equal? type 'unsigned-char) (get-ffi-type-uchar)) - ((equal? type 'bool) (get-ffi-type-int8)) - ((equal? type 'short) (get-ffi-type-short)) - ((equal? type 'unsigned-short) (get-ffi-type-ushort)) - ((equal? type 'int) (get-ffi-type-int)) - ((equal? type 'unsigned-int) (get-ffi-type-uint)) - ((equal? type 'long) (get-ffi-type-long)) - ((equal? type 'unsigned-long) (get-ffi-type-ulong)) - ((equal? type 'float) (get-ffi-type-float)) - ((equal? type 'double) (get-ffi-type-double)) - ((equal? type 'void) (get-ffi-type-void)) - ((equal? type 'pointer) (get-ffi-type-pointer)) - ((equal? type 'callback) (get-ffi-type-pointer))))) - -(define argument->pointer - (lambda (value type) - (cond ((procedure? value) (scheme-procedure-to-pointer value)) - (else (let ((pointer (pffi-pointer-allocate (size-of-type type)))) - (pffi-pointer-set! pointer type 0 value) - pointer))))) - -(define make-c-function - (lambda (shared-object c-name return-type argument-types) - (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))) - (lambda arguments - (let ((return-value (pffi-pointer-allocate - (if (equal? return-type 'void) - 0 - (size-of-type return-type))))) - (internal-ffi-call (length argument-types) - (pffi-type->libffi-type return-type) - (map pffi-type->libffi-type argument-types) - c-function - return-value - (map argument->pointer - arguments - argument-types)) - (cond ((not (equal? return-type 'void)) - (pffi-pointer-get return-value return-type 0)))))))) - -(define-syntax pffi-define-function - (syntax-rules () - ((_ scheme-name shared-object c-name return-type argument-types) - (define scheme-name - (make-c-function shared-object - (symbol->string c-name) - return-type - argument-types))))) - -(define make-c-callback - (lambda (return-type argument-types procedure) - (scheme-procedure-to-pointer procedure))) - -(define-syntax pffi-define-callback - (syntax-rules () - ((_ scheme-name return-type argument-types procedure) - (define scheme-name - (make-c-callback return-type 'argument-types procedure))))) diff --git a/ODL_README.md b/OLD_README.md similarity index 100% rename from ODL_README.md rename to OLD_README.md diff --git a/README.md b/README.md index f898551..5f0263c 100644 --- a/README.md +++ b/README.md @@ -13,33 +13,48 @@ The new readme is a work in progress. ## Implementation table -## Primitives +## Primitives 1 -| | c-size-of | c-bytevector-u8-set! |c-bytevector-u8-ref | define-c-library | c-bytevector? | define-c-procedure | define-c-callback | -|------------------|:------------:|:------------------- :|-------------------:|:-------------------:|:-------------:|:-------------------:|:-----------------:| -| Chibi | X | X |X | X | X | X | | -| **Chicken** | X | X |X | X | X | X | X | -| Gauche | X | X |X | X | X | X | | -| **Guile** | X | X |X | X | X | X | X | -| Kawa | X | X |X | X | X | X | | -| **Mosh** | X | X |X | X | X | X | X | -| **Racket** | X | X |X | X | X | X | X | -| **Saggittarius** | X | X |X | X | X | X | X | -| Stklos | X | X |X | X | X | X | | -| **Ypsilon** | X | X |X | X | X | X | X | +| | c-size-of | c-bytevector-u8-set! |c-bytevector-u8-ref | define-c-library | c-bytevector? | define-c-procedure | +|------------------|:------------:|:------------------- :|-------------------:|:-------------------:|:-------------:|:-------------------:| +| **Chibi** | X | X |X | X | X | X | +| **Chicken** | X | X |X | X | X | X | +| **Gauche** | X | X |X | X | X | X | +| **Guile** | X | X |X | X | X | X | +| **Kawa** | X | X |X | X | X | X | +| **Mosh** | X | X |X | X | X | X | +| **Racket** | X | X |X | X | X | X | +| **Saggittarius** | X | X |X | X | X | X | +| **Stklos** | X | X |X | X | X | X | +| **Ypsilon** | X | X |X | X | X | X | + +## Primitives 2 + +| | define-c-callback | +|------------------|:-----------------:| +| Chibi | | +| **Chicken** | X | +| Gauche | | +| **Guile** | X | +| Kawa | | +| **Mosh** | X | +| **Racket** | X | +| **Saggittarius** | X | +| Stklos | | +| **Ypsilon** | X | ## Test files pass -| | primitives.scm | addressof.scm | -|------------------|:--------------:|:-------------:| -| Chibi | | | -| **Chicken** | X | X | -| Gauche | | | -| **Guile** | X | X | -| Kawa | | | -| Mosh | X | | -| Racket | X | | -| **Saggittarius** | X | X | -| Stklos | | X | -| Ypsilon | X | | +| | primitives.scm | addressof.scm | callback.scm | +|------------------|:--------------:|:-------------:|-------------:| +| Chibi | X | X | | +| **Chicken** | X | X | X | +| Gauche | X | X | | +| **Guile** | X | X | X | +| Kawa | X | X | | +| Mosh | X | X | | +| Racket | X | | | +| **Saggittarius** | X | X | X | +| Stklos | X | X | | +| Ypsilon | X | X | | diff --git a/foreign/c.sld b/foreign/c.sld index 4447c9f..1e80871 100644 --- a/foreign/c.sld +++ b/foreign/c.sld @@ -66,7 +66,10 @@ (scheme process-context) (system foreign) (system foreign-library) - (only (guile) include-from-path))) + (only (guile) include-from-path) + (only (rnrs bytevectors) + bytevector-uint-set! + bytevector-uint-ref))) (kawa (import (scheme base) (scheme write) @@ -133,12 +136,15 @@ (scheme process-context) (only (stklos) %make-callback + make-external-function allocate-bytes free-bytes cpointer? cpointer-null? cpointer-data cpointer-data-set! + ;c-bytevector-s8-set! + ;c-bytevector-s8-set! pointer-set-c-int8_t! pointer-ref-c-int8_t pointer-set-c-uint8_t! @@ -178,6 +184,9 @@ void?)) (export ; calculate-struct-size-and-offsets ;struct-make + get-environment-variable + file-exists? + make-external-function foreign-c:string-split c-bytevector-pointer-set! c-bytevector-pointer-ref)) @@ -204,39 +213,41 @@ define-c-procedure define-c-callback c-bytevector? + c-bytevector-u8-set! c-bytevector-u8-ref + c-bytevector-pointer-set! + c-bytevector-pointer-ref ;; c-bytevector native-endianness ;; TODO Docs for all of these - c-bytevector->address - address->c-bytevector - c-bytevector-s8-set! - c-bytevector-s8-ref - c-bytevector-u8-set! + ;c-bytevector->address + ;address->c-bytevector + ;c-bytevector-s8-set! + ;c-bytevector-s8-ref c-bytevector-s16-set! - c-bytevector-s16-native-set! c-bytevector-s16-ref + c-bytevector-s16-native-set! c-bytevector-s16-native-ref c-bytevector-u16-set! - c-bytevector-u16-native-set! c-bytevector-u16-ref + c-bytevector-u16-native-set! c-bytevector-u16-native-ref c-bytevector-s32-set! - c-bytevector-s32-native-set! c-bytevector-s32-ref + c-bytevector-s32-native-set! c-bytevector-s32-native-ref c-bytevector-u32-set! - c-bytevector-u32-native-set! c-bytevector-u32-ref + c-bytevector-u32-native-set! c-bytevector-u32-native-ref c-bytevector-s64-set! - c-bytevector-s64-native-set! c-bytevector-s64-ref + c-bytevector-s64-native-set! c-bytevector-s64-native-ref c-bytevector-u64-set! - c-bytevector-u64-native-set! c-bytevector-u64-ref + c-bytevector-u64-native-set! c-bytevector-u64-native-ref c-bytevector-sint-set! c-bytevector-sint-ref @@ -290,8 +301,10 @@ ;define-c-variable (?) ) (cond-expand - (chicken-6 (include-relative "c/types.scm")) - (else (include "c/types.scm"))) + (chicken-6 (include-relative "c/types.scm") + (include-relative "c/c-bytevector-get.scm")) + (else (include "c/types.scm") + (include "c/c-bytevector-get.scm"))) (cond-expand (chibi (include "c/primitives/chibi.scm")) (chicken-5 (export foreign-declare @@ -301,7 +314,7 @@ (chicken-6 (include-relative "c/primitives/chicken.scm")) ;(cyclone (include "c/primitives/cyclone.scm")) ;(gambit (include "c/primitives/gambit.scm")) - (gauche (include "c/primitives/gauche.scm")) + (gauche (include "c/primitives/gauche/define-c-procedure.scm")) ;(gerbil (include "c/primitives/gerbil.scm")) (guile (include "c/primitives/guile.scm")) (kawa (include "c/primitives/kawa.scm")) diff --git a/foreign/c/c-bytevector-get.scm b/foreign/c/c-bytevector-get.scm new file mode 100644 index 0000000..1db5409 --- /dev/null +++ b/foreign/c/c-bytevector-get.scm @@ -0,0 +1,24 @@ +(define c-bytevector-get + (lambda (pointer type offset) + (cond ((equal? type 'int8) (c-bytevector-s8-ref pointer offset)) + ((equal? type 'uint8) (c-bytevector-u8-ref pointer offset)) + ((equal? type 'int16) (c-bytevector-s16-ref pointer offset)) + ((equal? type 'uint16) (c-bytevector-u16-ref pointer offset)) + ((equal? type 'int32) (c-bytevector-s32-ref pointer offset)) + ((equal? type 'uint32) (c-bytevector-u32-ref pointer offset)) + ((equal? type 'int64) (c-bytevector-s64-ref pointer offset)) + ((equal? type 'uint64) (c-bytevector-u64-ref pointer offset)) + ((equal? type 'char) (integer->char (c-bytevector-s8-ref pointer offset))) + ((equal? type 'unsigned-char) (integer->char (c-bytevector-u8-ref pointer offset))) + ((equal? type 'short) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'short))) + ((equal? type 'unsigned-short) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'unsigned-short))) + ((equal? type 'int) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'int))) + ((equal? type 'unsigned-int) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'unsigned-int))) + ((equal? type 'long) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'long))) + ((equal? type 'unsigned-long) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'unsigned-long))) + ((equal? type 'float) (c-bytevector-ieee-single-native-ref pointer offset)) + ((equal? type 'double) (c-bytevector-ieee-double-native-ref pointer offset)) + ((equal? type 'pointer) (c-bytevector-pointer-ref pointer offset)) + ((not (equal? type 'void)) (error "No such foreign type" type)) + ;; Return unspecified on purpose if type is void + ))) diff --git a/foreign/c/pointer.scm b/foreign/c/pointer.scm index 40f3e87..7e0e45d 100644 --- a/foreign/c/pointer.scm +++ b/foreign/c/pointer.scm @@ -11,8 +11,8 @@ (define-c-procedure c-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-memset-address libc 'memset 'pointer '(uint64 uint8 int)) -(define-c-procedure c-printf libc 'printf 'int '(pointer pointer)) +;(define-c-procedure c-memset-address libc 'memset 'pointer '(uint64 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)) @@ -86,15 +86,15 @@ (= (c-memset-pointer->address pointer 0 0) 0) #f))))) -(define c-bytevector->address +#;(define c-bytevector->address (lambda (c-bytevector) (c-memset-pointer->address c-bytevector 0 0))) -(define address->c-bytevector +#;(define address->c-bytevector (lambda (address) (c-memset-address->pointer address 0 0))) -(define c-bytevector-pointer-set! +#;(define c-bytevector-pointer-set! (lambda (c-bytevector k pointer) (c-bytevector-uint-set! c-bytevector 0 @@ -102,7 +102,7 @@ (native-endianness) (c-size-of 'pointer)))) -(define c-bytevector-pointer-ref +#;(define c-bytevector-pointer-ref (lambda (c-bytevector k) (address->c-bytevector (c-bytevector-uint-ref c-bytevector 0 @@ -116,6 +116,7 @@ ((_ input-pointer thunk) (let ((address-pointer (make-c-bytevector (c-size-of 'pointer)))) (c-bytevector-pointer-set! address-pointer 0 input-pointer) - (apply thunk (list address-pointer)) - (set! input-pointer (c-bytevector-pointer-ref address-pointer 0)) - (c-free address-pointer))))))) + (let ((result (apply thunk (list address-pointer)))) + (set! input-pointer (c-bytevector-pointer-ref address-pointer 0)) + (c-free address-pointer) + result))))))) diff --git a/foreign/c/primitives/chibi.scm b/foreign/c/primitives/chibi.scm index 84d6698..61595dd 100644 --- a/foreign/c/primitives/chibi.scm +++ b/foreign/c/primitives/chibi.scm @@ -39,10 +39,10 @@ (lambda (pointer) (pointer-free pointer))) -(define c-bytevector-u8-set! pointer-set-c-uint8_t!) -(define c-bytevector-u8-ref pointer-ref-c-uint8_t) +;(define c-bytevector-u8-set! pointer-set-c-uint8_t!) +;(define c-bytevector-u8-ref pointer-ref-c-uint8_t) -(define pointer-set! +#;(define pointer-set! (lambda (pointer type offset value) (cond ((equal? type 'int8) (pointer-set-c-int8_t! pointer offset value)) ((equal? type 'uint8) (pointer-set-c-uint8_t! pointer offset value)) @@ -64,7 +64,7 @@ ((equal? type 'void) (pointer-set-c-pointer! pointer offset value)) ((equal? type 'pointer) (pointer-set-c-pointer! pointer offset value))))) -(define pointer-get +#;(define pointer-get (lambda (pointer type offset) (cond ((equal? type 'int8) (pointer-ref-c-int8_t pointer offset)) ((equal? type 'uint8) (pointer-ref-c-uint8_t pointer offset)) @@ -186,8 +186,7 @@ c-function (c-size-of return-type) arguments))) - (when (not (equal? return-type 'void)) - (pointer-get return-pointer return-type 0))))))) + (c-bytevector-get return-pointer return-type 0)))))) (define-syntax define-c-procedure (syntax-rules () diff --git a/foreign/c/primitives/chibi/foreign-c.stub b/foreign/c/primitives/chibi/foreign-c.stub index ba537dd..3ba5371 100644 --- a/foreign/c/primitives/chibi/foreign-c.stub +++ b/foreign/c/primitives/chibi/foreign-c.stub @@ -53,189 +53,195 @@ (define-c (maybe-null pointer void*) dlopen (string int)) (define-c (maybe-null pointer void*) dlerror ()) -(c-declare "void* pointer_null() { return NULL; }") -(define-c (pointer void*) (pointer-null pointer_null) ()) +;(c-declare "void* pointer_null() { return NULL; }") +;(define-c (pointer void*) (pointer-null pointer_null) ()) -(c-declare "int is_pointer_null(void* pointer) { if(pointer == NULL) { return 1; } else { return 0; }; }") -(define-c bool (is-pointer-null is_pointer_null) ((maybe-null pointer void*))) +;(c-declare "int is_pointer_null(void* pointer) { if(pointer == NULL) { return 1; } else { return 0; }; }") +;(define-c bool (is-pointer-null is_pointer_null) ((maybe-null pointer void*))) -(c-declare "void* pointer_allocate(int size) { return malloc(size); }") -(define-c (maybe-null pointer void*) (pointer-allocate pointer_allocate) (int)) +;(c-declare "void* pointer_allocate(int size) { return malloc(size); }") +;(define-c (maybe-null pointer void*) (pointer-allocate pointer_allocate) (int)) -(c-declare "sexp is_pointer(struct sexp_struct* object) { - if(sexp_cpointerp(object)) { - return SEXP_TRUE; - } else { - return SEXP_FALSE; - } - }") +(c-declare "sexp is_pointer(struct sexp_struct* object) { if(sexp_cpointerp(object)) { return SEXP_TRUE; } else { return SEXP_FALSE; } }") (define-c sexp (pointer? is_pointer) (sexp)) -(c-declare "void* pointer_address(struct sexp_struct* pointer) { +(c-declare "void c_bytevector_u8_set(void* pointer, int offset, uint8_t value) { *(uint8_t*)((char*)pointer + offset) = value; }") +(define-c void (c-bytevector-u8-set! c_bytevector_u8_set) ((pointer void*) int uint8_t)) + +(c-declare "int8_t c_bytevector_u8_ref (void* pointer, int offset) { return *(int8_t*)((char*)pointer + offset); }") +(define-c int8_t (c-bytevector-u8-ref c_bytevector_u8_ref) ((pointer void*) int)) + +(c-declare "void c_bytevector_pointer_set (void* pointer, int offset, void* value) { char* p = (char*)pointer + offset; *(char**)p = value; }") +(define-c void (c-bytevector-pointer-set! c_bytevector_pointer_set) ((pointer void*) int (maybe-null pointer void*))) + +(c-declare "void* c_bytevector_pointer_ref (void* pointer, int offset) { char* p = (char*)pointer + offset; return *(char**)p; }") +(define-c (maybe-null pointer void*) (c-bytevector-pointer-ref c_bytevector_pointer_ref) ((pointer void*) int)) + +#;(c-declare "void* pointer_address(struct sexp_struct* pointer) { return &sexp_cpointer_value(pointer); }") -(define-c (maybe-null pointer void*) (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*))) +;(c-declare "void pointer_free(void* pointer) { free(pointer); }") +;(define-c void (pointer-free pointer_free) ((maybe-null pointer void*))) ;; pointer-set! -(c-declare "void pointer_set_c_int8_t(void* pointer, int offset, int8_t value) { *(int8_t*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-int8_t! pointer_set_c_int8_t) ((pointer void*) int int8_t)) -(c-declare "void pointer_set_c_uint8_t(void* pointer, int offset, uint8_t value) { *(uint8_t*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-uint8_t! pointer_set_c_uint8_t) ((pointer void*) int uint8_t)) - -(c-declare "void pointer_set_c_int16_t(void* pointer, int offset, int16_t value) { *(int16_t*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-int16_t! pointer_set_c_int16_t) ((pointer void*) int int16_t)) -(c-declare "void pointer_set_c_uint16_t(void* pointer, int offset, uint16_t value) { *(uint16_t*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-uint16_t! pointer_set_c_uint16_t) ((pointer void*) int uint16_t)) - -(c-declare "void pointer_set_c_int32_t(void* pointer, int offset, int32_t value) { *(int32_t*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-int32_t! pointer_set_c_int32_t) ((pointer void*) int int32_t)) -(c-declare "void pointer_set_c_uint32_t(void* pointer, int offset, uint32_t value) { *(uint32_t*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-uint32_t! pointer_set_c_uint32_t) ((pointer void*) int uint32_t)) - -(c-declare "void pointer_set_c_int64_t(void* pointer, int offset, int64_t value) { *(int64_t*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-int64_t! pointer_set_c_int64_t) ((pointer void*) int int64_t)) -(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, 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)) - -(c-declare "void pointer_set_c_short(void* pointer, int offset, short value) { *(short*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-short! pointer_set_c_short) ((pointer void*) int short)) -(c-declare "void pointer_set_c_unsigned_short(void* pointer, int offset, unsigned short value) { *(unsigned short*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-unsigned-short! pointer_set_c_unsigned_short) ((pointer void*) int unsigned-short)) - -(c-declare "void pointer_set_c_int(void* pointer, int offset, int value) { *(int*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-int! pointer_set_c_int) ((pointer void*) int int)) -(c-declare "void pointer_set_c_unsigned_int(void* pointer, int offset, unsigned int value) { *(unsigned int*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-unsigned-int! pointer_set_c_unsigned_int) ((pointer void*) int unsigned-int)) - -(c-declare "void pointer_set_c_long(void* pointer, int offset, long value) { *(long*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-long! pointer_set_c_long) ((pointer void*) int long)) -(c-declare "void pointer_set_c_unsigned_long(void* pointer, int offset, unsigned long value) { *(unsigned long*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-unsigned-long! pointer_set_c_unsigned_long) ((pointer void*) int unsigned-long)) - -(c-declare "void pointer_set_c_float(void* pointer, int offset, float value) { *(float*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-float! pointer_set_c_float) ((pointer void*) int float)) - -(c-declare "void pointer_set_c_double(void* pointer, int offset, double value) { *(double*)((char*)pointer + offset) = value; }") -(define-c void (pointer-set-c-double! pointer_set_c_double) ((pointer void*) int double)) - -(c-declare "void pointer_set_c_pointer(void* pointer, int offset, void* value) { char* p = (char*)pointer + offset; *(char**)p = value; }") -(define-c void (pointer-set-c-pointer! pointer_set_c_pointer) ((pointer void*) int (maybe-null pointer void*))) - -;; pointer-get -(c-declare "int8_t pointer_ref_c_int8_t(void* pointer, int offset) { return *(int8_t*)((char*)pointer + offset); }") -(define-c int8_t (pointer-ref-c-int8_t pointer_ref_c_int8_t) ((pointer void*) int)) -(c-declare "uint8_t pointer_ref_c_uint8_t(void* pointer, int offset) { return *(uint8_t*)((char*)pointer + offset); }") -(define-c uint8_t (pointer-ref-c-uint8_t pointer_ref_c_uint8_t) ((pointer void*) int)) - -(c-declare "int16_t pointer_ref_c_int16_t(void* pointer, int offset) { return *(int16_t*)((char*)pointer + offset); }") -(define-c int16_t (pointer-ref-c-int16_t pointer_ref_c_int16_t) ((pointer void*) int)) -(c-declare "uint16_t pointer_ref_c_uint16_t(void* pointer, int offset) { return *(uint16_t*)((char*)pointer + offset); }") -(define-c uint16_t (pointer-ref-c-uint16_t pointer_ref_c_uint16_t) ((pointer void*) int)) - -(c-declare "int32_t pointer_ref_c_int32_t(void* pointer, int offset) { return *(int32_t*)((char*)pointer + offset); }") -(define-c int32_t (pointer-ref-c-int32_t pointer_ref_c_int32_t) ((pointer void*) int)) -(c-declare "uint32_t pointer_ref_c_uint32_t(void* pointer, int offset) { return *(uint32_t*)((char*)pointer + offset); }") -(define-c uint32_t (pointer-ref-c-uint32_t pointer_ref_c_uint32_t) ((pointer void*) int)) - -(c-declare "int64_t pointer_ref_c_int64_t(void* pointer, int offset) { return *(int64_t*)((char*)pointer + offset); }") -(define-c int64_t (pointer-ref-c-int64_t pointer_ref_c_int64_t) ((pointer void*) int)) -(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 "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)) - -(c-declare "short pointer_ref_c_short(void* pointer, int offset) { return *(short*)((char*)pointer + offset); }") -(define-c short (pointer-ref-c-short pointer_ref_c_short) ((pointer void*) int)) -(c-declare "unsigned short pointer_ref_c_unsigned_short(void* pointer, int offset) { return *(unsigned short*)((char*)pointer + offset); }") -(define-c unsigned-short (pointer-ref-c-unsigned-short pointer_ref_c_unsigned_short) ((pointer void*) int)) - -(c-declare "int pointer_ref_c_int(void* pointer, int offset) { return *(int*)((char*)pointer + offset); }") -(define-c int (pointer-ref-c-int pointer_ref_c_int) ((pointer void*) int)) -(c-declare "unsigned int pointer_ref_c_unsigned_int(void* pointer, int offset) { return *(unsigned int*)((char*)pointer + offset); }") -(define-c unsigned-int (pointer-ref-c-unsigned-int pointer_ref_c_unsigned_int) ((pointer void*) int)) - -(c-declare "long pointer_ref_c_long(void* pointer, int offset) { return *(long*)((char*)pointer + offset); }") -(define-c long (pointer-ref-c-long pointer_ref_c_long) ((pointer void*) long)) -(c-declare "unsigned long pointer_ref_c_unsigned_long(void* pointer, int offset) { return *(unsigned long*)((char*)pointer + offset); }") -(define-c unsigned-long (pointer-ref-c-unsigned-long pointer_ref_c_unsigned_long) ((pointer void*) int)) - -(c-declare "float pointer_ref_c_float(void* pointer, int offset) { return *(float*)((char*)pointer + offset); }") -(define-c float (pointer-ref-c-float pointer_ref_c_float) ((pointer void*) int)) - -(c-declare "double pointer_ref_c_double(void* pointer, int offset) { return *(double*)((char*)pointer + offset); }") -(define-c double (pointer-ref-c-double pointer_ref_c_double) ((pointer void*) int)) - -(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)) +;(c-declare "void pointer_set_c_int8_t(void* pointer, int offset, int8_t value) { *(int8_t*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-int8_t! pointer_set_c_int8_t) ((pointer void*) int int8_t)) +;(c-declare "void pointer_set_c_uint8_t(void* pointer, int offset, uint8_t value) { *(uint8_t*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-uint8_t! pointer_set_c_uint8_t) ((pointer void*) int uint8_t)) +; +;(c-declare "void pointer_set_c_int16_t(void* pointer, int offset, int16_t value) { *(int16_t*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-int16_t! pointer_set_c_int16_t) ((pointer void*) int int16_t)) +;(c-declare "void pointer_set_c_uint16_t(void* pointer, int offset, uint16_t value) { *(uint16_t*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-uint16_t! pointer_set_c_uint16_t) ((pointer void*) int uint16_t)) +; +;(c-declare "void pointer_set_c_int32_t(void* pointer, int offset, int32_t value) { *(int32_t*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-int32_t! pointer_set_c_int32_t) ((pointer void*) int int32_t)) +;(c-declare "void pointer_set_c_uint32_t(void* pointer, int offset, uint32_t value) { *(uint32_t*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-uint32_t! pointer_set_c_uint32_t) ((pointer void*) int uint32_t)) +; +;(c-declare "void pointer_set_c_int64_t(void* pointer, int offset, int64_t value) { *(int64_t*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-int64_t! pointer_set_c_int64_t) ((pointer void*) int int64_t)) +;(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, 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)) +; +;(c-declare "void pointer_set_c_short(void* pointer, int offset, short value) { *(short*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-short! pointer_set_c_short) ((pointer void*) int short)) +;(c-declare "void pointer_set_c_unsigned_short(void* pointer, int offset, unsigned short value) { *(unsigned short*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-unsigned-short! pointer_set_c_unsigned_short) ((pointer void*) int unsigned-short)) +; +;(c-declare "void pointer_set_c_int(void* pointer, int offset, int value) { *(int*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-int! pointer_set_c_int) ((pointer void*) int int)) +;(c-declare "void pointer_set_c_unsigned_int(void* pointer, int offset, unsigned int value) { *(unsigned int*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-unsigned-int! pointer_set_c_unsigned_int) ((pointer void*) int unsigned-int)) +; +;(c-declare "void pointer_set_c_long(void* pointer, int offset, long value) { *(long*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-long! pointer_set_c_long) ((pointer void*) int long)) +;(c-declare "void pointer_set_c_unsigned_long(void* pointer, int offset, unsigned long value) { *(unsigned long*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-unsigned-long! pointer_set_c_unsigned_long) ((pointer void*) int unsigned-long)) +; +;(c-declare "void pointer_set_c_float(void* pointer, int offset, float value) { *(float*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-float! pointer_set_c_float) ((pointer void*) int float)) +; +;(c-declare "void pointer_set_c_double(void* pointer, int offset, double value) { *(double*)((char*)pointer + offset) = value; }") +;(define-c void (pointer-set-c-double! pointer_set_c_double) ((pointer void*) int double)) +; +;(c-declare "void pointer_set_c_pointer(void* pointer, int offset, void* value) { char* p = (char*)pointer + offset; *(char**)p = value; }") +;(define-c void (pointer-set-c-pointer! pointer_set_c_pointer) ((pointer void*) int (maybe-null pointer void*))) +; +;;; pointer-get +;(c-declare "int8_t pointer_ref_c_int8_t(void* pointer, int offset) { return *(int8_t*)((char*)pointer + offset); }") +;(define-c int8_t (pointer-ref-c-int8_t pointer_ref_c_int8_t) ((pointer void*) int)) +;(c-declare "uint8_t pointer_ref_c_uint8_t(void* pointer, int offset) { return *(uint8_t*)((char*)pointer + offset); }") +;(define-c uint8_t (pointer-ref-c-uint8_t pointer_ref_c_uint8_t) ((pointer void*) int)) +; +;(c-declare "int16_t pointer_ref_c_int16_t(void* pointer, int offset) { return *(int16_t*)((char*)pointer + offset); }") +;(define-c int16_t (pointer-ref-c-int16_t pointer_ref_c_int16_t) ((pointer void*) int)) +;(c-declare "uint16_t pointer_ref_c_uint16_t(void* pointer, int offset) { return *(uint16_t*)((char*)pointer + offset); }") +;(define-c uint16_t (pointer-ref-c-uint16_t pointer_ref_c_uint16_t) ((pointer void*) int)) +; +;(c-declare "int32_t pointer_ref_c_int32_t(void* pointer, int offset) { return *(int32_t*)((char*)pointer + offset); }") +;(define-c int32_t (pointer-ref-c-int32_t pointer_ref_c_int32_t) ((pointer void*) int)) +;(c-declare "uint32_t pointer_ref_c_uint32_t(void* pointer, int offset) { return *(uint32_t*)((char*)pointer + offset); }") +;(define-c uint32_t (pointer-ref-c-uint32_t pointer_ref_c_uint32_t) ((pointer void*) int)) +; +;(c-declare "int64_t pointer_ref_c_int64_t(void* pointer, int offset) { return *(int64_t*)((char*)pointer + offset); }") +;(define-c int64_t (pointer-ref-c-int64_t pointer_ref_c_int64_t) ((pointer void*) int)) +;(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 "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)) +; +;(c-declare "short pointer_ref_c_short(void* pointer, int offset) { return *(short*)((char*)pointer + offset); }") +;(define-c short (pointer-ref-c-short pointer_ref_c_short) ((pointer void*) int)) +;(c-declare "unsigned short pointer_ref_c_unsigned_short(void* pointer, int offset) { return *(unsigned short*)((char*)pointer + offset); }") +;(define-c unsigned-short (pointer-ref-c-unsigned-short pointer_ref_c_unsigned_short) ((pointer void*) int)) +; +;(c-declare "int pointer_ref_c_int(void* pointer, int offset) { return *(int*)((char*)pointer + offset); }") +;(define-c int (pointer-ref-c-int pointer_ref_c_int) ((pointer void*) int)) +;(c-declare "unsigned int pointer_ref_c_unsigned_int(void* pointer, int offset) { return *(unsigned int*)((char*)pointer + offset); }") +;(define-c unsigned-int (pointer-ref-c-unsigned-int pointer_ref_c_unsigned_int) ((pointer void*) int)) +; +;(c-declare "long pointer_ref_c_long(void* pointer, int offset) { return *(long*)((char*)pointer + offset); }") +;(define-c long (pointer-ref-c-long pointer_ref_c_long) ((pointer void*) long)) +;(c-declare "unsigned long pointer_ref_c_unsigned_long(void* pointer, int offset) { return *(unsigned long*)((char*)pointer + offset); }") +;(define-c unsigned-long (pointer-ref-c-unsigned-long pointer_ref_c_unsigned_long) ((pointer void*) int)) +; +;(c-declare "float pointer_ref_c_float(void* pointer, int offset) { return *(float*)((char*)pointer + offset); }") +;(define-c float (pointer-ref-c-float pointer_ref_c_float) ((pointer void*) int)) +; +;(c-declare "double pointer_ref_c_double(void* pointer, int offset) { return *(double*)((char*)pointer + offset); }") +;(define-c double (pointer-ref-c-double pointer_ref_c_double) ((pointer void*) int)) +; +;(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)) ;; define-c-procedure (c-declare "ffi_cif cif;") (define-c (pointer void*) dlsym ((maybe-null pointer void*) string)) -(c-declare "void* get_ffi_type_int8() { return &ffi_type_sint8; }") -(define-c (pointer void*) (get-ffi-type-int8 get_ffi_type_int8) ()) -(c-declare "void* get_ffi_type_uint8() { return &ffi_type_uint8; }") -(define-c (pointer void*) (get-ffi-type-uint8 get_ffi_type_uint8) ()) - -(c-declare "void* get_ffi_type_int16() { return &ffi_type_sint16; }") -(define-c (pointer void*) (get-ffi-type-int16 get_ffi_type_int16) ()) -(c-declare "void* get_ffi_type_uint16() { return &ffi_type_uint16; }") -(define-c (pointer void*) (get-ffi-type-uint16 get_ffi_type_uint16) ()) - -(c-declare "void* get_ffi_type_int32() { return &ffi_type_sint32; }") -(define-c (pointer void*) (get-ffi-type-int32 get_ffi_type_int32) ()) -(c-declare "void* get_ffi_type_uint32() { return &ffi_type_uint32; }") -(define-c (pointer void*) (get-ffi-type-uint32 get_ffi_type_uint32) ()) - -(c-declare "void* get_ffi_type_int64() { return &ffi_type_sint64; }") -(define-c (pointer void*) (get-ffi-type-int64 get_ffi_type_int64) ()) -(c-declare "void* get_ffi_type_uint64() { return &ffi_type_uint64; }") -(define-c (pointer void*) (get-ffi-type-uint64 get_ffi_type_uint64) ()) - -(c-declare "void* get_ffi_type_char() { return &ffi_type_schar; }") -(define-c (pointer void*) (get-ffi-type-char get_ffi_type_char) ()) -(c-declare "void* get_ffi_type_uchar() { return &ffi_type_uchar; }") -(define-c (pointer void*) (get-ffi-type-uchar get_ffi_type_uchar) ()) - -(c-declare "void* get_ffi_type_short() { return &ffi_type_sshort; }") -(define-c (pointer void*) (get-ffi-type-short get_ffi_type_short) ()) -(c-declare "void* get_ffi_type_ushort() { return &ffi_type_ushort; }") -(define-c (pointer void*) (get-ffi-type-ushort get_ffi_type_ushort) ()) - -(c-declare "void* get_ffi_type_int() { return &ffi_type_sint; }") -(define-c (pointer void*) (get-ffi-type-int get_ffi_type_int) ()) -(c-declare "void* get_ffi_type_uint() { return &ffi_type_uint; }") -(define-c (pointer void*) (get-ffi-type-uint get_ffi_type_uint) ()) - -(c-declare "void* get_ffi_type_long() { return &ffi_type_slong; }") -(define-c (pointer void*) (get-ffi-type-long get_ffi_type_long) ()) - -(c-declare "void* get_ffi_type_ulong() { return &ffi_type_ulong; }") -(define-c (pointer void*) (get-ffi-type-ulong get_ffi_type_ulong) ()) - -(c-declare "void* get_ffi_type_float() { return &ffi_type_float; }") -(define-c (pointer void*) (get-ffi-type-float get_ffi_type_float) ()) - -(c-declare "void* get_ffi_type_double() { return &ffi_type_double; }") -(define-c (pointer void*) (get-ffi-type-double get_ffi_type_double) ()) - -(c-declare "void* get_ffi_type_void() { return &ffi_type_void; }") -(define-c (pointer void*) (get-ffi-type-void get_ffi_type_void) ()) - -(c-declare "void* get_ffi_type_pointer() { return &ffi_type_pointer; }") -(define-c (pointer void*) (get-ffi-type-pointer get_ffi_type_pointer) ()) +;(c-declare "void* get_ffi_type_int8() { return &ffi_type_sint8; }") +;(define-c (pointer void*) (get-ffi-type-int8 get_ffi_type_int8) ()) +;(c-declare "void* get_ffi_type_uint8() { return &ffi_type_uint8; }") +;(define-c (pointer void*) (get-ffi-type-uint8 get_ffi_type_uint8) ()) +; +;(c-declare "void* get_ffi_type_int16() { return &ffi_type_sint16; }") +;(define-c (pointer void*) (get-ffi-type-int16 get_ffi_type_int16) ()) +;(c-declare "void* get_ffi_type_uint16() { return &ffi_type_uint16; }") +;(define-c (pointer void*) (get-ffi-type-uint16 get_ffi_type_uint16) ()) +; +;(c-declare "void* get_ffi_type_int32() { return &ffi_type_sint32; }") +;(define-c (pointer void*) (get-ffi-type-int32 get_ffi_type_int32) ()) +;(c-declare "void* get_ffi_type_uint32() { return &ffi_type_uint32; }") +;(define-c (pointer void*) (get-ffi-type-uint32 get_ffi_type_uint32) ()) +; +;(c-declare "void* get_ffi_type_int64() { return &ffi_type_sint64; }") +;(define-c (pointer void*) (get-ffi-type-int64 get_ffi_type_int64) ()) +;(c-declare "void* get_ffi_type_uint64() { return &ffi_type_uint64; }") +;(define-c (pointer void*) (get-ffi-type-uint64 get_ffi_type_uint64) ()) +; +;(c-declare "void* get_ffi_type_char() { return &ffi_type_schar; }") +;(define-c (pointer void*) (get-ffi-type-char get_ffi_type_char) ()) +;(c-declare "void* get_ffi_type_uchar() { return &ffi_type_uchar; }") +;(define-c (pointer void*) (get-ffi-type-uchar get_ffi_type_uchar) ()) +; +;(c-declare "void* get_ffi_type_short() { return &ffi_type_sshort; }") +;(define-c (pointer void*) (get-ffi-type-short get_ffi_type_short) ()) +;(c-declare "void* get_ffi_type_ushort() { return &ffi_type_ushort; }") +;(define-c (pointer void*) (get-ffi-type-ushort get_ffi_type_ushort) ()) +; +;(c-declare "void* get_ffi_type_int() { return &ffi_type_sint; }") +;(define-c (pointer void*) (get-ffi-type-int get_ffi_type_int) ()) +;(c-declare "void* get_ffi_type_uint() { return &ffi_type_uint; }") +;(define-c (pointer void*) (get-ffi-type-uint get_ffi_type_uint) ()) +; +;(c-declare "void* get_ffi_type_long() { return &ffi_type_slong; }") +;(define-c (pointer void*) (get-ffi-type-long get_ffi_type_long) ()) +; +;(c-declare "void* get_ffi_type_ulong() { return &ffi_type_ulong; }") +;(define-c (pointer void*) (get-ffi-type-ulong get_ffi_type_ulong) ()) +; +;(c-declare "void* get_ffi_type_float() { return &ffi_type_float; }") +;(define-c (pointer void*) (get-ffi-type-float get_ffi_type_float) ()) +; +;(c-declare "void* get_ffi_type_double() { return &ffi_type_double; }") +;(define-c (pointer void*) (get-ffi-type-double get_ffi_type_double) ()) +; +;(c-declare "void* get_ffi_type_void() { return &ffi_type_void; }") +;(define-c (pointer void*) (get-ffi-type-void get_ffi_type_void) ()) +; +;(c-declare "void* get_ffi_type_pointer() { return &ffi_type_pointer; }") +;(define-c (pointer void*) (get-ffi-type-pointer get_ffi_type_pointer) ()) (define-c-const int (FFI-OK "FFI_OK")) #;(c-declare @@ -254,49 +260,124 @@ struct sexp_struct* avalues[]) { ffi_type* c_atypes[nargs]; - void* temps[nargs]; void* c_avalues[nargs]; + int8_t vals1[nargs]; + uint8_t vals2[nargs]; + int16_t vals3[nargs]; + uint16_t vals4[nargs]; + int32_t vals5[nargs]; + uint32_t vals6[nargs]; + int64_t vals7[nargs]; + uint64_t vals8[nargs]; + char vals9[nargs]; + unsigned char vals10[nargs]; + short vals11[nargs]; + unsigned short vals12[nargs]; + int vals13[nargs]; + unsigned int vals14[nargs]; + long vals15[nargs]; + unsigned long vals16[nargs]; + float vals17[nargs]; + double vals18[nargs]; + void* vals20[nargs]; + for(int i = 0; i < nargs; i++) { void* arg = NULL; switch(atypes[i]) { - //case 1: c_atypes[i] = &ffi_type_sint8; arg = sexp_sint_value(avalues[i]); break; + case 1: + c_atypes[i] = &ffi_type_sint8; + vals1[i] = (int8_t)sexp_sint_value(avalues[i]); + c_avalues[i] = &vals1[i]; + break; case 2: c_atypes[i] = &ffi_type_uint8; - temps[i] = sexp_uint_value(avalues[i]); - c_avalues[i] = &temps[i]; + vals2[i] = (uint8_t)sexp_uint_value(avalues[i]); + c_avalues[i] = &vals2[i]; + break; + case 3: + c_atypes[i] = &ffi_type_sint16; + vals3[i] = (int16_t)sexp_sint_value(avalues[i]); + c_avalues[i] = &vals3[i]; + break; + case 4: + c_atypes[i] = &ffi_type_uint16; + vals4[i] = (uint16_t)sexp_uint_value(avalues[i]); + c_avalues[i] = &vals4[i]; + break; + case 5: + c_atypes[i] = &ffi_type_sint32; + vals5[i] = (int32_t)sexp_sint_value(avalues[i]); + c_avalues[i] = &vals5[i]; + break; + case 6: + c_atypes[i] = &ffi_type_uint32; + vals6[i] = (int64_t)sexp_uint_value(avalues[i]); + c_avalues[i] = &vals6[i]; + break; + case 7: + c_atypes[i] = &ffi_type_sint64; + vals7[i] = (int64_t) sexp_sint_value(avalues[i]); + c_avalues[i] = &vals7[i]; break; - //case 3: c_atypes[i] = &ffi_type_sint16; arg = sexp_sint_value(avalues[i]); break; - //case 4: c_atypes[i] = &ffi_type_uint16; arg = sexp_uint_value(avalues[i]); break; - //case 5: c_atypes[i] = &ffi_type_sint32; arg = sexp_sint_value(avalues[i]); break; - //case 6: c_atypes[i] = &ffi_type_uint32; arg = sexp_uint_value(avalues[i]); break; - //case 7: c_atypes[i] = &ffi_type_sint64; arg = sexp_sint_value(avalues[i]); break; case 8: c_atypes[i] = &ffi_type_uint64; - temps[i] = sexp_uint_value(avalues[i]); - c_avalues[i] = &temps[i]; + vals8[i] = (uint64_t)sexp_uint_value(avalues[i]); + c_avalues[i] = &vals8[i]; + break; + case 9: + c_atypes[i] = &ffi_type_schar; + vals9[i] = (char)sexp_sint_value(avalues[i]); + c_avalues[i] = &vals9[i]; + break; + case 10: + c_atypes[i] = &ffi_type_uchar; + vals10[i] = (unsigned char)sexp_uint_value(avalues[i]); + break; + case 11: + c_atypes[i] = &ffi_type_sshort; + vals11[i] = (short)sexp_sint_value(avalues[i]); + break; + case 12: + c_atypes[i] = &ffi_type_ushort; + vals12[i] = (unsigned short)sexp_uint_value(avalues[i]); break; - //case 9: c_atypes[i] = &ffi_type_schar; arg = sexp_sint_value(avalues[i]); break; - //case 10: c_atypes[i] = &ffi_type_uchar; arg = sexp_uint_value(avalues[i]); break; - //case 11: c_atypes[i] = &ffi_type_sshort; arg = sexp_sint_value(avalues[i]); break; - //case 12: c_atypes[i] = &ffi_type_ushort; arg = sexp_uint_value(avalues[i]); break; case 13: c_atypes[i] = &ffi_type_sint; - temps[i] = sexp_sint_value(avalues[i]); - c_avalues[i] = &temps[i]; + vals13[i] = (int)sexp_sint_value(avalues[i]); + c_avalues[i] = &vals13[i]; + break; + case 14: + c_atypes[i] = &ffi_type_uint; + vals14[i] = (unsigned int)sexp_uint_value(avalues[i]); + c_avalues[i] = &vals14[i]; + break; + case 15: + c_atypes[i] = &ffi_type_slong; + vals15[i] = (long)sexp_sint_value(avalues[i]); + c_avalues[i] = &vals15[i]; + break; + case 16: + c_atypes[i] = &ffi_type_ulong; + vals16[i] = (unsigned long)sexp_uint_value(avalues[i]); + c_avalues[i] = &vals16[i]; + break; + case 17: + c_atypes[i] = &ffi_type_float; + vals17[i] = (float)sexp_flonum_value(avalues[i]); + break; + case 18: + c_atypes[i] = &ffi_type_double; + vals18[i] = (double)sexp_flonum_value(avalues[i]); + break; + case 19: + c_atypes[i] = &ffi_type_void; + arg = NULL; break; - //case 14: c_atypes[i] = &ffi_type_uint; arg = sexp_uint_value(avalues[i]); break; - //case 15: c_atypes[i] = &ffi_type_slong; arg = sexp_sint_value(avalues[i]); break; - //case 16: c_atypes[i] = &ffi_type_ulong; arg = sexp_uint_value(avalues[i]); break; - // FIXME - //case 17: c_atypes[i] = &ffi_type_float; arg = sexp_flonum_value(avalues[i]); break; - // FIXME - //case 18: c_atypes[i] = &ffi_type_double; arg = sexp_flonum_value(avalues[i]); break; - //case 19: c_atypes[i] = &ffi_type_void; arg = NULL; break; case 20: c_atypes[i] = &ffi_type_pointer; - c_avalues[i] = &sexp_cpointer_value(avalues[i]); - //printf(\"Pointer value: %s\\n\", sexp_cpointer_maybe_null_value(avalues[i])); + vals20[i] = sexp_cpointer_value(avalues[i]); + c_avalues[i] = &vals20[i]; break; default: printf(\"Undefined argument type integer: %i, index: %i\\n\", atypes[i], i); diff --git a/foreign/c/primitives/chicken.scm b/foreign/c/primitives/chicken.scm index 2443093..f4a17bd 100644 --- a/foreign/c/primitives/chicken.scm +++ b/foreign/c/primitives/chicken.scm @@ -173,6 +173,14 @@ (lambda (c-bytevector k byte) (pointer-u8-set! (pointer+ c-bytevector k) byte))) +(define c-bytevector-pointer-ref + (lambda (c-bytevector k) + (address->pointer (pointer-u64-ref (pointer+ c-bytevector k))))) + +(define c-bytevector-pointer-set! + (lambda (c-bytevector k pointer) + (pointer-u64-set! (pointer+ c-bytevector k) (pointer->address pointer)))) + #;(define pffi-pointer-set! (lambda (pointer type offset value) (cond diff --git a/foreign/c/primitives/gauche.scm b/foreign/c/primitives/gauche.scm index a10e4c4..3dcfc2c 100644 --- a/foreign/c/primitives/gauche.scm +++ b/foreign/c/primitives/gauche.scm @@ -3,6 +3,8 @@ shared-object-load c-bytevector-u8-set! c-bytevector-u8-ref + c-bytevector-pointer-set! + c-bytevector-pointer-ref ;pointer-null ;pointer-null? ;make-c-bytevector @@ -11,39 +13,16 @@ c-free ;pointer-set! ;pointer-get - define-c-procedure - define-c-callback)) + ;define-c-procedure + define-c-callback + dlerror + dlsym + internal-ffi-call + )) (select-module foreign.c.primitives.gauche) (dynamic-load "foreign/c/lib/gauche") -;; FIXME This is copied from types.scm -(define type->libffi-type-number - (lambda (type) - (cond ((equal? type 'int8) 1) - ((equal? type 'uint8) 2) - ((equal? type 'int16) 3) - ((equal? type 'uint16) 4) - ((equal? type 'int32) 5) - ((equal? type 'uint32) 6) - ((equal? type 'int64) 7) - ((equal? type 'uint64) 8) - ((equal? type 'char) 9) - ((equal? type 'unsigned-char) 10) - ((equal? type 'short) 11) - ((equal? type 'unsigned-short) 12) - ((equal? type 'int) 13) - ((equal? type 'unsigned-int) 14) - ((equal? type 'long) 15) - ((equal? type 'unsigned-long) 16) - ((equal? type 'float) 17) - ((equal? type 'double) 18) - ((equal? type 'void) 19) - ((equal? type 'pointer) 20) - ((equal? type 'pointer-address) 21) - ((equal? type 'callback) 22) - (else (error "Undefined type" type))))) - (define size-of-type (lambda (type) (cond @@ -87,8 +66,10 @@ (define c-bytevector-u8-set! pointer-set-uint8!) (define c-bytevector-u8-ref pointer-get-uint8) +(define c-bytevector-pointer-set! pointer-set-pointer!) +(define c-bytevector-pointer-ref pointer-get-pointer) -(define pointer-set! +#;(define pointer-set! (lambda (pointer type offset value) (cond ((equal? type 'int8) (pointer-set-int8! pointer offset value)) ((equal? type 'uint8) (pointer-set-uint8! pointer offset value)) @@ -110,7 +91,7 @@ ((equal? type 'void) (pointer-set-pointer! pointer offset value)) ((equal? type 'pointer) (pointer-set-pointer! pointer offset value))))) -(define pointer-get +#;(define pointer-get (lambda (pointer type offset) (cond ((equal? type 'int8) (pointer-get-int8 pointer offset)) ((equal? type 'uint8) (pointer-get-uint8 pointer offset)) @@ -189,40 +170,6 @@ (pointer-set! pointer type 0 value) pointer))))) -(define make-c-function - (lambda (shared-object c-name return-type argument-types) - (dlerror) ;; Clean all previous errors - (let ((c-function (dlsym shared-object c-name)) - (maybe-dlerror (dlerror))) - (lambda arguments - (display "Calling: ") - (write c-name) - (newline) - (let ((return-pointer (internal-ffi-call (length argument-types) - (type->libffi-type-number return-type) - (map type->libffi-type-number argument-types) - c-function - (size-of-type return-type) - arguments))) - (cond ((equal? return-type 'pointer) - (display "SCM return value: ") - (write return-pointer) - (newline) - return-pointer) - ((not (equal? return-type 'void)) - (display "SCM return value: ") - (write (pointer-get return-pointer return-type 0)) - (newline) - (pointer-get return-pointer return-type 0)))))))) - -(define-syntax define-c-procedure - (syntax-rules () - ((_ scheme-name shared-object c-name return-type argument-types) - (define scheme-name - (make-c-function shared-object - (symbol->string c-name) - return-type - argument-types))))) (define make-c-callback (lambda (return-type argument-types procedure) diff --git a/foreign/c/primitives/gauche/define-c-procedure.scm b/foreign/c/primitives/gauche/define-c-procedure.scm new file mode 100644 index 0000000..685aadb --- /dev/null +++ b/foreign/c/primitives/gauche/define-c-procedure.scm @@ -0,0 +1,25 @@ +;;;; This file is dependent on content of other files added trough (include...) +;;;; And that's why it is separated + +(define make-c-function + (lambda (shared-object c-name return-type argument-types) + (dlerror) ;; Clean all previous errors + (let ((c-function (dlsym shared-object c-name)) + (maybe-dlerror (dlerror))) + (lambda arguments + (let ((return-pointer (internal-ffi-call (length argument-types) + (type->libffi-type-number return-type) + (map type->libffi-type-number argument-types) + c-function + (size-of-type return-type) + arguments))) + (c-bytevector-get return-pointer return-type 0)))))) + +(define-syntax define-c-procedure + (syntax-rules () + ((_ scheme-name shared-object c-name return-type argument-types) + (define scheme-name + (make-c-function shared-object + (symbol->string c-name) + return-type + argument-types))))) diff --git a/foreign/c/primitives/gauche/gauchelib.scm b/foreign/c/primitives/gauche/gauchelib.scm index 306b243..8e5fdc1 100644 --- a/foreign/c/primitives/gauche/gauchelib.scm +++ b/foreign/c/primitives/gauche/gauchelib.scm @@ -24,51 +24,51 @@ (define-cproc size-of-pointer () size_of_pointer) (define-cproc size-of-void () size_of_void) (define-cproc shared-object-load (path:: options) shared_object_load) - (define-cproc pointer-null () pointer_null) - (define-cproc pointer-null? (pointer) is_pointer_null) - (define-cproc pointer-allocate (size::) pointer_allocate) - (define-cproc pointer-address (object) pointer_address) + ;(define-cproc pointer-null () pointer_null) + ;(define-cproc pointer-null? (pointer) is_pointer_null) + ;(define-cproc pointer-allocate (size::) pointer_allocate) + ;(define-cproc pointer-address (object) pointer_address) (define-cproc pointer? (pointer) is_pointer) - (define-cproc pointer-free (pointer) pointer_free) + ;(define-cproc pointer-free (pointer) pointer_free) - (define-cproc pointer-set-int8! (pointer offset:: value::) pointer_set_int8) + ;(define-cproc pointer-set-int8! (pointer offset:: value::) pointer_set_int8) (define-cproc pointer-set-uint8! (pointer offset:: value::) pointer_set_uint8) - (define-cproc pointer-set-int16! (pointer offset:: value::) pointer_set_int16) - (define-cproc pointer-set-uint16! (pointer offset:: value::) pointer_set_uint16) - (define-cproc pointer-set-int32! (pointer offset:: value::) pointer_set_int32) - (define-cproc pointer-set-uint32! (pointer offset:: value::) pointer_set_uint32) - (define-cproc pointer-set-int64! (pointer offset:: value::) pointer_set_int64) - (define-cproc pointer-set-uint64! (pointer offset:: value::) pointer_set_uint64) - (define-cproc pointer-set-char! (pointer offset:: value::) pointer_set_char) - (define-cproc pointer-set-unsigned-char! (pointer offset:: value::) pointer_set_unsigned_char) - (define-cproc pointer-set-short! (pointer offset:: value::) pointer_set_short) - (define-cproc pointer-set-unsigned-short! (pointer offset:: value::) pointer_set_unsigned_short) - (define-cproc pointer-set-int! (pointer offset:: value::) pointer_set_int) - (define-cproc pointer-set-unsigned-int! (pointer offset:: value::) pointer_set_unsigned_int) - (define-cproc pointer-set-long! (pointer offset:: value::) pointer_set_long) - (define-cproc pointer-set-unsigned-long! (pointer offset:: value::) pointer_set_unsigned_long) - (define-cproc pointer-set-float! (pointer offset:: value::) pointer_set_float) - (define-cproc pointer-set-double! (pointer offset:: value::) pointer_set_double) + ;(define-cproc pointer-set-int16! (pointer offset:: value::) pointer_set_int16) + ;(define-cproc pointer-set-uint16! (pointer offset:: value::) pointer_set_uint16) + ;(define-cproc pointer-set-int32! (pointer offset:: value::) pointer_set_int32) + ;(define-cproc pointer-set-uint32! (pointer offset:: value::) pointer_set_uint32) + ;(define-cproc pointer-set-int64! (pointer offset:: value::) pointer_set_int64) + ;(define-cproc pointer-set-uint64! (pointer offset:: value::) pointer_set_uint64) + ;(define-cproc pointer-set-char! (pointer offset:: value::) pointer_set_char) + ;(define-cproc pointer-set-unsigned-char! (pointer offset:: value::) pointer_set_unsigned_char) + ;(define-cproc pointer-set-short! (pointer offset:: value::) pointer_set_short) + ;(define-cproc pointer-set-unsigned-short! (pointer offset:: value::) pointer_set_unsigned_short) + ;(define-cproc pointer-set-int! (pointer offset:: value::) pointer_set_int) + ;(define-cproc pointer-set-unsigned-int! (pointer offset:: value::) pointer_set_unsigned_int) + ;(define-cproc pointer-set-long! (pointer offset:: value::) pointer_set_long) + ;(define-cproc pointer-set-unsigned-long! (pointer offset:: value::) pointer_set_unsigned_long) + ;(define-cproc pointer-set-float! (pointer offset:: value::) pointer_set_float) + ;(define-cproc pointer-set-double! (pointer offset:: value::) pointer_set_double) (define-cproc pointer-set-pointer! (pointer offset:: value) pointer_set_pointer) - (define-cproc pointer-get-int8 (pointer offset::) pointer_get_int8) + ;(define-cproc pointer-get-int8 (pointer offset::) pointer_get_int8) (define-cproc pointer-get-uint8 (pointer offset::) pointer_get_uint8) - (define-cproc pointer-get-int16 (pointer offset::) pointer_get_int16) - (define-cproc pointer-get-uint16 (pointer offset::) pointer_get_uint16) - (define-cproc pointer-get-int32 (pointer offset::) pointer_get_int32) - (define-cproc pointer-get-uint32 (pointer offset::) pointer_get_uint32) - (define-cproc pointer-get-int64 (pointer offset::) pointer_get_int64) - (define-cproc pointer-get-uint64 (pointer offset::) pointer_get_uint64) - (define-cproc pointer-get-char (pointer offset::) pointer_get_char) - (define-cproc pointer-get-unsigned-char (pointer offset::) pointer_get_unsigned_char) - (define-cproc pointer-get-short (pointer offset::) pointer_get_short) - (define-cproc pointer-get-unsigned-short (pointer offset::) pointer_get_unsigned_short) - (define-cproc pointer-get-int (pointer offset::) pointer_get_int) - (define-cproc pointer-get-unsigned-int (pointer offset::) pointer_get_unsigned_int) - (define-cproc pointer-get-long (pointer offset::) pointer_get_long) - (define-cproc pointer-get-unsigned-long (pointer offset::) pointer_get_unsigned_long) - (define-cproc pointer-get-float (pointer offset::) pointer_get_float) - (define-cproc pointer-get-double (pointer offset::) pointer_get_double) + ;(define-cproc pointer-get-int16 (pointer offset::) pointer_get_int16) + ;(define-cproc pointer-get-uint16 (pointer offset::) pointer_get_uint16) + ;(define-cproc pointer-get-int32 (pointer offset::) pointer_get_int32) + ;(define-cproc pointer-get-uint32 (pointer offset::) pointer_get_uint32) + ;(define-cproc pointer-get-int64 (pointer offset::) pointer_get_int64) + ;(define-cproc pointer-get-uint64 (pointer offset::) pointer_get_uint64) + ;(define-cproc pointer-get-char (pointer offset::) pointer_get_char) + ;(define-cproc pointer-get-unsigned-char (pointer offset::) pointer_get_unsigned_char) + ;(define-cproc pointer-get-short (pointer offset::) pointer_get_short) + ;(define-cproc pointer-get-unsigned-short (pointer offset::) pointer_get_unsigned_short) + ;(define-cproc pointer-get-int (pointer offset::) pointer_get_int) + ;(define-cproc pointer-get-unsigned-int (pointer offset::) pointer_get_unsigned_int) + ;(define-cproc pointer-get-long (pointer offset::) pointer_get_long) + ;(define-cproc pointer-get-unsigned-long (pointer offset::) pointer_get_unsigned_long) + ;(define-cproc pointer-get-float (pointer offset::) pointer_get_float) + ;(define-cproc pointer-get-double (pointer offset::) pointer_get_double) (define-cproc pointer-get-pointer (pointer offset::) pointer_get_pointer) (define-cproc dlerror () internal_dlerror) @@ -76,26 +76,26 @@ (define-cproc internal-ffi-call (nargs rtype atypes fn rvalue avalues) internal_ffi_call) (define-cproc scheme-procedure-to-pointer (procedure) scheme_procedure_to_pointer) - (define-cproc get-ffi-type-int8 () get_ffi_type_int8) - (define-cproc get-ffi-type-uint8 () get_ffi_type_uint8) - (define-cproc get-ffi-type-int16 () get_ffi_type_int16) - (define-cproc get-ffi-type-uint16 () get_ffi_type_uint16) - (define-cproc get-ffi-type-int32 () get_ffi_type_int32) - (define-cproc get-ffi-type-uint32 () get_ffi_type_uint32) - (define-cproc get-ffi-type-int64 () get_ffi_type_int64) - (define-cproc get-ffi-type-uint64 () get_ffi_type_uint64) - (define-cproc get-ffi-type-char () get_ffi_type_char) - (define-cproc get-ffi-type-unsigned-char () get_ffi_type_unsigned_char) - (define-cproc get-ffi-type-short () get_ffi_type_short) - (define-cproc get-ffi-type-unsigned-short () get_ffi_type_unsigned_short) - (define-cproc get-ffi-type-int () get_ffi_type_int) - (define-cproc get-ffi-type-unsigned-int () get_ffi_type_unsigned_int) - (define-cproc get-ffi-type-long () get_ffi_type_long) - (define-cproc get-ffi-type-unsigned-long () get_ffi_type_unsigned_long) - (define-cproc get-ffi-type-float () get_ffi_type_float) - (define-cproc get-ffi-type-double () get_ffi_type_double) - (define-cproc get-ffi-type-void() get_ffi_type_void) - (define-cproc get-ffi-type-pointer () get_ffi_type_pointer) + ;(define-cproc get-ffi-type-int8 () get_ffi_type_int8) + ;(define-cproc get-ffi-type-uint8 () get_ffi_type_uint8) + ;(define-cproc get-ffi-type-int16 () get_ffi_type_int16) + ;(define-cproc get-ffi-type-uint16 () get_ffi_type_uint16) + ;(define-cproc get-ffi-type-int32 () get_ffi_type_int32) + ;(define-cproc get-ffi-type-uint32 () get_ffi_type_uint32) + ;(define-cproc get-ffi-type-int64 () get_ffi_type_int64) + ;(define-cproc get-ffi-type-uint64 () get_ffi_type_uint64) + ;(define-cproc get-ffi-type-char () get_ffi_type_char) + ;(define-cproc get-ffi-type-unsigned-char () get_ffi_type_unsigned_char) + ;(define-cproc get-ffi-type-short () get_ffi_type_short) + ;(define-cproc get-ffi-type-unsigned-short () get_ffi_type_unsigned_short) + ;(define-cproc get-ffi-type-int () get_ffi_type_int) + ;(define-cproc get-ffi-type-unsigned-int () get_ffi_type_unsigned_int) + ;(define-cproc get-ffi-type-long () get_ffi_type_long) + ;(define-cproc get-ffi-type-unsigned-long () get_ffi_type_unsigned_long) + ;(define-cproc get-ffi-type-float () get_ffi_type_float) + ;(define-cproc get-ffi-type-double () get_ffi_type_double) + ;(define-cproc get-ffi-type-void() get_ffi_type_void) + ;(define-cproc get-ffi-type-pointer () get_ffi_type_pointer) ;(define-cproc procedure-to-pointer (procedure) procedure_to_pointer) ) diff --git a/foreign/c/primitives/guile.scm b/foreign/c/primitives/guile.scm index 4c07537..797ac0e 100644 --- a/foreign/c/primitives/guile.scm +++ b/foreign/c/primitives/guile.scm @@ -66,46 +66,61 @@ (let ((p (pointer->bytevector c-bytevector (+ k 100)))) (bytevector-u8-ref p k)))) -(define pointer-set! - (lambda (pointer type offset value) - (let ((p (pointer->bytevector pointer (+ offset 100)))) - (cond ((equal? type 'int8) (bytevector-s8-set! p offset value)) - ((equal? type 'uint8) (bytevector-u8-set! p offset value)) - ((equal? type 'int16) (bytevector-s16-set! p offset value (native-endianness))) - ((equal? type 'uint16) (bytevector-u16-set! p offset value (native-endianness))) - ((equal? type 'int32) (bytevector-s32-set! p offset value (native-endianness))) - ((equal? type 'uint32) (bytevector-u32-set! p offset value (native-endianness))) - ((equal? type 'int64) (bytevector-s64-set! p offset value (native-endianness))) - ((equal? type 'uint64) (bytevector-u64-set! p offset value (native-endianness))) - ((equal? type 'char) (bytevector-s8-set! p offset (char->integer value))) - ((equal? type 'short) (bytevector-s8-set! p offset value)) - ((equal? type 'unsigned-short) (bytevector-u8-set! p offset value)) - ((equal? type 'int) (bytevector-sint-set! p offset value (native-endianness) (size-of-type type))) - ((equal? type 'unsigned-int) (bytevector-uint-set! p offset value (native-endianness) (size-of-type type))) - ((equal? type 'long) (bytevector-s64-set! p offset value (native-endianness))) - ((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))))))) +(define c-bytevector-pointer-set! + (lambda (c-bytevector k pointer) + (c-bytevector-uint-set! c-bytevector + k + (pointer-address pointer) + (native-endianness) + (size-of-type 'pointer)))) -(define pointer-get - (lambda (pointer type offset) - (let ((p (pointer->bytevector pointer (+ offset 100)))) - (cond ((equal? type 'int8) (bytevector-s8-ref p offset)) - ((equal? type 'uint8) (bytevector-u8-ref p offset)) - ((equal? type 'int16) (bytevector-s16-ref p offset (native-endianness))) - ((equal? type 'uint16) (bytevector-u16-ref p offset (native-endianness))) - ((equal? type 'int32) (bytevector-s32-ref p offset (native-endianness))) - ((equal? type 'uint32) (bytevector-u32-ref p offset (native-endianness))) - ((equal? type 'int64) (bytevector-s64-ref p offset (native-endianness))) - ((equal? type 'uint64) (bytevector-u64-ref p offset (native-endianness))) - ((equal? type 'char) (integer->char (bytevector-s8-ref p offset))) - ((equal? type 'short) (bytevector-s8-ref p offset)) - ((equal? type 'unsigned-short) (bytevector-u8-ref p offset)) - ((equal? type 'int) (bytevector-sint-ref p offset (native-endianness) (size-of-type type))) - ((equal? type 'unsigned-int) (bytevector-uint-ref p offset (native-endianness) (size-of-type type))) - ((equal? type 'long) (bytevector-s64-ref p offset (native-endianness))) - ((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)))))))) +(define c-bytevector-pointer-ref + (lambda (c-bytevector k) + (make-pointer (c-bytevector-uint-ref c-bytevector + k + (native-endianness) + (size-of-type 'pointer))))) + +#;(define pointer-set! +(lambda (pointer type offset value) + (let ((p (pointer->bytevector pointer (+ offset 100)))) + (cond ((equal? type 'int8) (bytevector-s8-set! p offset value)) + ((equal? type 'uint8) (bytevector-u8-set! p offset value)) + ((equal? type 'int16) (bytevector-s16-set! p offset value (native-endianness))) + ((equal? type 'uint16) (bytevector-u16-set! p offset value (native-endianness))) + ((equal? type 'int32) (bytevector-s32-set! p offset value (native-endianness))) + ((equal? type 'uint32) (bytevector-u32-set! p offset value (native-endianness))) + ((equal? type 'int64) (bytevector-s64-set! p offset value (native-endianness))) + ((equal? type 'uint64) (bytevector-u64-set! p offset value (native-endianness))) + ((equal? type 'char) (bytevector-s8-set! p offset (char->integer value))) + ((equal? type 'short) (bytevector-s8-set! p offset value)) + ((equal? type 'unsigned-short) (bytevector-u8-set! p offset value)) + ((equal? type 'int) (bytevector-sint-set! p offset value (native-endianness) (size-of-type type))) + ((equal? type 'unsigned-int) (bytevector-uint-set! p offset value (native-endianness) (size-of-type type))) + ((equal? type 'long) (bytevector-s64-set! p offset value (native-endianness))) + ((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))))))) + +#;(define pointer-get +(lambda (pointer type offset) + (let ((p (pointer->bytevector pointer (+ offset 100)))) + (cond ((equal? type 'int8) (bytevector-s8-ref p offset)) + ((equal? type 'uint8) (bytevector-u8-ref p offset)) + ((equal? type 'int16) (bytevector-s16-ref p offset (native-endianness))) + ((equal? type 'uint16) (bytevector-u16-ref p offset (native-endianness))) + ((equal? type 'int32) (bytevector-s32-ref p offset (native-endianness))) + ((equal? type 'uint32) (bytevector-u32-ref p offset (native-endianness))) + ((equal? type 'int64) (bytevector-s64-ref p offset (native-endianness))) + ((equal? type 'uint64) (bytevector-u64-ref p offset (native-endianness))) + ((equal? type 'char) (integer->char (bytevector-s8-ref p offset))) + ((equal? type 'short) (bytevector-s8-ref p offset)) + ((equal? type 'unsigned-short) (bytevector-u8-ref p offset)) + ((equal? type 'int) (bytevector-sint-ref p offset (native-endianness) (size-of-type type))) + ((equal? type 'unsigned-int) (bytevector-uint-ref p offset (native-endianness) (size-of-type type))) + ((equal? type 'long) (bytevector-s64-ref p offset (native-endianness))) + ((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)))))))) diff --git a/foreign/c/primitives/kawa.scm b/foreign/c/primitives/kawa.scm index a7c5046..844fd84 100644 --- a/foreign/c/primitives/kawa.scm +++ b/foreign/c/primitives/kawa.scm @@ -170,25 +170,21 @@ u8-value-layout k))) -(define pointer-set! - (lambda (pointer type offset value) - (invoke (invoke pointer 'reinterpret (static-field java.lang.Integer 'MAX_VALUE)) +(define pointer-value-layout (invoke (static-field java.lang.foreign.ValueLayout 'ADDRESS) 'withByteAlignment 8)) +(define c-bytevector-pointer-set! + (lambda (c-bytevector k pointer) + (invoke (invoke c-bytevector 'reinterpret (static-field java.lang.Integer 'MAX_VALUE)) 'set - (type->native-type type) - offset - (if (equal? type 'char) - (char->integer value) - value)))) + pointer-value-layout + k + pointer))) -(define pointer-get - (lambda (pointer type offset) - (let ((r (invoke (invoke pointer 'reinterpret (static-field java.lang.Integer 'MAX_VALUE)) - 'get - (type->native-type type) - offset))) - (if (equal? type 'char) - (integer->char r) - r)))) +(define c-bytevector-pointer-ref + (lambda (c-bytevector k) + (invoke (invoke c-bytevector 'reinterpret (static-field java.lang.Integer 'MAX_VALUE)) + 'get + pointer-value-layout + k))) #;(define-syntax call-with-address-of-c-bytevector (syntax-rules () diff --git a/foreign/c/primitives/mosh.scm b/foreign/c/primitives/mosh.scm index 8b0374e..1fcbfbb 100644 --- a/foreign/c/primitives/mosh.scm +++ b/foreign/c/primitives/mosh.scm @@ -33,6 +33,8 @@ (define c-bytevector-u8-set! pointer-set-c-uint8!) (define c-bytevector-u8-ref pointer-ref-c-uint8) +(define c-bytevector-pointer-set! pointer-set-c-pointer!) +(define c-bytevector-pointer-ref pointer-ref-c-pointer) #;(define pointer-set! (lambda (pointer type offset value) diff --git a/foreign/c/primitives/racket.scm b/foreign/c/primitives/racket.scm index 5702333..d611518 100644 --- a/foreign/c/primitives/racket.scm +++ b/foreign/c/primitives/racket.scm @@ -65,25 +65,13 @@ (lambda (c-bytevector k) (ptr-ref c-bytevector _uint8 'abs k))) -#;(define pointer-set! - (lambda (pointer type offset value) - (ptr-set! pointer - (type->native-type type) - 'abs - offset - (if (equal? type 'char) - (char->integer value) - value)))) +(define c-bytevector-pointer-set! + (lambda (c-bytevector k pointer) + (ptr-set! c-bytevector _pointer 'abs k pointer))) -#;(define pointer-get - (lambda (pointer type offset) - (let ((r (ptr-ref pointer - (type->native-type type) - 'abs - offset))) - (if (equal? type 'char) - (integer->char r) - r)))) +(define c-bytevector-pointer-ref + (lambda (c-bytevector k) + (ptr-ref c-bytevector _pointer 'abs k))) #;(define-syntax call-with-address-of-c-bytevector (syntax-rules () diff --git a/foreign/c/primitives/sagittarius.scm b/foreign/c/primitives/sagittarius.scm index e4bc019..78704a9 100644 --- a/foreign/c/primitives/sagittarius.scm +++ b/foreign/c/primitives/sagittarius.scm @@ -75,8 +75,10 @@ (define c-bytevector-u8-set! pointer-set-c-uint8_t!) (define c-bytevector-u8-ref pointer-ref-c-uint8_t) +(define c-bytevector-pointer-set! pointer-set-c-pointer!) +(define c-bytevector-pointer-ref pointer-ref-c-pointer) -(define pointer-set! +#;(define pointer-set! (lambda (pointer type offset value) (cond ((equal? type 'int8) (pointer-set-c-int8_t! pointer offset value)) ((equal? type 'uint8) (pointer-set-c-uint8_t! pointer offset value)) @@ -98,7 +100,7 @@ ((equal? type 'void) (pointer-set-c-pointer! pointer offset value)) ((equal? type 'pointer) (pointer-set-c-pointer! pointer offset value))))) -(define pointer-get +#;(define pointer-get (lambda (pointer type offset) (cond ((equal? type 'int8) (pointer-ref-c-int8_t pointer offset)) ((equal? type 'uint8) (pointer-ref-c-uint8_t pointer offset)) diff --git a/foreign/c/primitives/stklos.scm b/foreign/c/primitives/stklos.scm index af444b8..6037a3b 100644 --- a/foreign/c/primitives/stklos.scm +++ b/foreign/c/primitives/stklos.scm @@ -97,8 +97,10 @@ (define c-bytevector-u8-set! pointer-set-c-uint8_t!) (define c-bytevector-u8-ref pointer-ref-c-uint8_t) +(define c-bytevector-pointer-set! pointer-set-c-pointer!) +(define c-bytevector-pointer-ref pointer-ref-c-pointer) -(define pffi-pointer-set! +#;(define pffi-pointer-set! (lambda (pointer type offset value) (cond ((equal? type 'int8) (pointer-set-c-int8_t! pointer offset value)) ((equal? type 'uint8) (pointer-set-c-uint8_t! pointer offset value)) @@ -120,7 +122,7 @@ ((equal? type 'void) (pointer-set-c-pointer! pointer offset value)) ((equal? type 'pointer) (pointer-set-c-pointer! pointer offset value))))) -(define pffi-pointer-get +#;(define pffi-pointer-get (lambda (pointer type offset) (cond ((equal? type 'int8) (pointer-ref-c-int8_t pointer offset)) ((equal? type 'uint8) (pointer-ref-c-uint8_t pointer offset)) diff --git a/foreign/c/primitives/ypsilon.scm b/foreign/c/primitives/ypsilon.scm index 97c8fc9..b7c904c 100644 --- a/foreign/c/primitives/ypsilon.scm +++ b/foreign/c/primitives/ypsilon.scm @@ -40,8 +40,16 @@ (bytevector-c-int8-ref (make-bytevector-mapping (+ c-bytevector k) (c-size-of 'uint8)) 0))) +(define c-bytevector-pointer-set! + (lambda (c-bytevector k pointer) + (let ((bv (make-bytevector-mapping (+ c-bytevector k) (c-size-of 'pointer)))) + (bytevector-c-void*-set! bv 0 pointer)))) +(define c-bytevector-pointer-ref + (lambda (c-bytevector k) + (let ((bv (make-bytevector-mapping (+ c-bytevector k) (c-size-of 'pointer)))) + (bytevector-c-void*-ref bv 0)))) -(define pointer-set! +#;(define pointer-set! (lambda (pointer type offset value) (let ((bv (make-bytevector-mapping (+ pointer offset) (c-size-of type)))) (cond ((equal? type 'int8) (bytevector-c-int8-set! bv 0 value)) @@ -64,7 +72,7 @@ ((equal? type 'void) (bytevector-c-void*-set! bv 0 value)) ((equal? type 'pointer) (bytevector-c-void*-set! bv 0 value)))))) -(define pointer-get +#;(define pointer-get (lambda (pointer type offset) (let ((bv (make-bytevector-mapping (+ pointer offset) (c-size-of type)))) (cond ((equal? type 'int8) (bytevector-c-int8-ref bv 0)) diff --git a/tests/addressof.scm b/tests/addressof.scm index f404979..966be34 100644 --- a/tests/addressof.scm +++ b/tests/addressof.scm @@ -88,8 +88,6 @@ '(pointer pointer)) (define input-pointer (make-c-bytevector (c-size-of 'int))) -(debug (c-bytevector->address input-pointer)) -(assert equal? (number? (c-bytevector->address input-pointer)) #t) (c-bytevector-s32-native-set! input-pointer 0 100) (assert equal? (= (c-bytevector-s32-native-ref input-pointer 0) 100) #t) (debug (c-bytevector-s32-native-ref input-pointer 0)) diff --git a/tests/callback.scm b/tests/callback.scm new file mode 100644 index 0000000..92f1344 --- /dev/null +++ b/tests/callback.scm @@ -0,0 +1,128 @@ +(import (scheme base) + (scheme write) + (scheme char) + (scheme file) + (scheme process-context) + (foreign c)) + +;; util +(define header-count 1) + +(define print-header + (lambda (title) + (set-tag title) + (display "=========================================") + (newline) + (display header-count) + (display " ") + (display title) + (newline) + (display "=========================================") + (newline) + (set! header-count (+ header-count 1)))) + +(define count 0) +(define assert-tag 'none) + +(define set-tag + (lambda (tag) + (set! assert-tag tag) + (set! count 0))) + +(cond-expand + (gambit + (define assert + (lambda (check value-a value-b) + (let ((result (apply check (list value-a value-b)))) + (set! count (+ count 1)) + (if (not result) (display "FAIL ") (display "PASS ")) + (display "[") + (display assert-tag) + (display " - ") + (display count) + (display "]") + (display ": ") + (write (list 'check 'value-a 'value-b)) + (newline) + (when (not result) (exit 1)))))) + (else + (define-syntax assert + (syntax-rules () + ((_ check value-a value-b) + (let ((result (apply check (list value-a value-b)))) + (set! count (+ count 1)) + (if (not result) (display "FAIL ") (display "PASS ")) + (display "[") + (display assert-tag) + (display " - ") + (display count) + (display "]") + (display ": ") + (write (list 'check 'value-a 'value-b)) + (newline) + (when (not result) (exit 1)))))))) + +(define-syntax debug + (syntax-rules () + ((_ value) + (begin + (display 'value) + (display ": ") + (write value) + (newline))))) + + +;; define-c-library + +(print-header 'define-c-library) + +(cond-expand + (windows (define-c-library libc + '("stdio.h" "string.h") + "ucrtbase" + '((additional-versions ("0" "6"))))) + (else (define-c-library libc + '("stdio.h" "string.h") + "c" + '((additional-versions ("0" "6")))))) + +(debug libc) + +;; define-c-callback + +(print-header 'define-c-callback) + +(define array (make-c-bytevector (* (c-size-of 'int) 3))) +(c-bytevector-s32-native-set! array (* (c-size-of 'int) 0) 3) +(c-bytevector-s32-native-set! array (* (c-size-of 'int) 1) 2) +(c-bytevector-s32-native-set! array (* (c-size-of 'int) 2) 1) + +(define-c-procedure qsort libc 'qsort 'void '(pointer int int callback)) + +(define-c-callback compare + 'int + '(pointer pointer) + (lambda (pointer-a pointer-b) + (let ((a (c-bytevector-s32-native-ref pointer-a 0)) + (b (c-bytevector-s32-native-ref pointer-b 0))) + (cond ((> a b) 1) + ((= a b) 0) + ((< a b) -1))))) +(write compare) +(newline) + +(define unsorted (list (c-bytevector-s32-native-ref array (* (c-size-of 'int) 0)) + (c-bytevector-s32-native-ref array (* (c-size-of 'int) 1)) + (c-bytevector-s32-native-ref array (* (c-size-of 'int) 2)))) +(debug unsorted) +(assert equal? unsorted (list 3 2 1)) + +(qsort array 3 (c-size-of 'int) compare) + +(define sorted (list (c-bytevector-s32-native-ref array (* (c-size-of 'int) 0)) + (c-bytevector-s32-native-ref array (* (c-size-of 'int) 1)) + (c-bytevector-s32-native-ref array (* (c-size-of 'int) 2)))) +(debug sorted) +(assert equal? sorted (list 1 2 3)) + +(exit 0) diff --git a/tests/primitives.scm b/tests/primitives.scm index 679fa8e..b237dbd 100644 --- a/tests/primitives.scm +++ b/tests/primitives.scm @@ -279,6 +279,19 @@ (debug (c-bytevector-u8-ref u8-pointer 0)) (assert equal? (= (c-bytevector-u8-ref u8-pointer 0) 42) #t) +;; c-bytevector-pointer-set! and c-bytevector-pointer-ref +(print-header "c-bytevector-pointer-set! and c-bytevector-pointer-ref") + +(define p-pointer (make-c-bytevector (c-size-of 'pointer))) +(debug p-pointer) +(debug (c-bytevector? p-pointer)) +(assert equal? (c-bytevector? p-pointer) #t) +(c-bytevector-pointer-set! p-pointer 0 u8-pointer) +(debug p-pointer) +(debug (c-bytevector-pointer-ref p-pointer 0)) +(debug (c-bytevector-u8-ref (c-bytevector-pointer-ref p-pointer 0) 0)) +(assert equal? (= (c-bytevector-u8-ref (c-bytevector-pointer-ref p-pointer 0) 0) 42) #t) + ;; string->-utf8 c-utf8->string (print-header "string->c-utf8 c-utf8->string") (for-each @@ -333,41 +346,4 @@ (lambda () (read-line))) "Hello world") #t) -;; define-c-callback - -(print-header 'define-c-callback) - -(define array (make-c-bytevector (* (c-size-of 'int) 3))) -(c-bytevector-s32-native-set! array (* (c-size-of 'int) 0) 3) -(c-bytevector-s32-native-set! array (* (c-size-of 'int) 1) 2) -(c-bytevector-s32-native-set! array (* (c-size-of 'int) 2) 1) - -(define-c-procedure qsort libc 'qsort 'void '(pointer int int callback)) - -(define-c-callback compare - 'int - '(pointer pointer) - (lambda (pointer-a pointer-b) - (let ((a (c-bytevector-s32-native-ref pointer-a 0)) - (b (c-bytevector-s32-native-ref pointer-b 0))) - (cond ((> a b) 1) - ((= a b) 0) - ((< a b) -1))))) -(write compare) -(newline) - -(define unsorted (list (c-bytevector-s32-native-ref array (* (c-size-of 'int) 0)) - (c-bytevector-s32-native-ref array (* (c-size-of 'int) 1)) - (c-bytevector-s32-native-ref array (* (c-size-of 'int) 2)))) -(debug unsorted) -(assert equal? unsorted (list 3 2 1)) - -(qsort array 3 (c-size-of 'int) compare) - -(define sorted (list (c-bytevector-s32-native-ref array (* (c-size-of 'int) 0)) - (c-bytevector-s32-native-ref array (* (c-size-of 'int) 1)) - (c-bytevector-s32-native-ref array (* (c-size-of 'int) 2)))) -(debug sorted) -(assert equal? sorted (list 1 2 3)) - (exit 0)