diff --git a/Makefile b/Makefile index 64b13b7..837dc3b 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,13 @@ +CC=gcc + +CHIBI=chibi-scheme -A . +test-chibi-podman-amd64: + podman run --arch=amd64 -it -v ${PWD}:/workdir schemers/chicken bash -c "cd /workdir && ${CHIBI} test.scm" + test-chibi: - chibi-scheme test.scm + chibi-ffi retropikzel/r7rs-pffi/chibi.stub + ${CC} -o retropikzel/r7rs-pffi/chibi.so -fPIC -shared retropikzel/r7rs-pffi/chibi.c -lchibi-scheme -lffi + ${CHIBI} test.scm CHICKEN=csc -X r7rs -R r7rs CHICKEN_LIB=csc -X r7rs -R r7rs -include-path ./retropikzel -s -J diff --git a/README.md b/README.md index 6afb6e0..68fd18f 100644 --- a/README.md +++ b/README.md @@ -57,21 +57,33 @@ guarantees are being made just yet. ### Work in progress - [Cyclone](https://justinethier.github.io/cyclone/) - - No callbacks implemented yet + - TODO + - pffi-define-callback + - pffi-pointer-address + - pffi-pointer-dereference +- [STKlos](https://stklos.net/) - [Kawa](https://www.gnu.org/software/kawa/index.html) - - No callbacks implemented yet + - TODO + - pffi-define-callback + - pffi-pointer-address + - pffi-pointer-dereference +- [STKlos](https://stklos.net/) - Needs at least java version 22 - Needs jvm flags: - --add-exports java.base/jdk.internal.foreign.abi=ALL-UNNAMED - --add-exports java.base/jdk.internal.foreign.layout=ALL-UNNAMED - --add-exports java.base/jdk.internal.foreign=ALL-UNNAMED - --enable-native-access=ALL-UNNAMED -- [Gambit](https://gambitscheme.org) +- [STKlos](https://stklos.net/) - [Mosh](https://mosh.monaos.org) + - TODO + - pffi-pointer-address + - pffi-pointer-dereference - [STKlos](https://stklos.net/) ### Design/exploration +- [Gambit](https://gambitscheme.org) - [LIPS](https://lips.js.org/) - Will work on nodejs by using some Javascript FFI - Javascript side needs design diff --git a/retropikzel/r7rs-pffi.sld b/retropikzel/r7rs-pffi.sld index 2ed9560..43d00bb 100644 --- a/retropikzel/r7rs-pffi.sld +++ b/retropikzel/r7rs-pffi.sld @@ -6,7 +6,10 @@ (scheme write) (scheme char) (scheme file) - (scheme process-context))) + (scheme process-context) + (chibi ast) + (chibi)) + (include-shared "r7rs-pffi/chibi")) (chicken (import (scheme base) (scheme write) diff --git a/retropikzel/r7rs-pffi/chibi.scm b/retropikzel/r7rs-pffi/chibi.scm index ec960ad..4ac89f1 100644 --- a/retropikzel/r7rs-pffi/chibi.scm +++ b/retropikzel/r7rs-pffi/chibi.scm @@ -1,5 +1,191 @@ (define pffi-init (lambda () #t)) +;(write (get-ffi-type-int)) +;(newline) +;(exit) + (define pffi-size-of (lambda (type) - (cond ((equal? type 'int8) 1)))) + (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)) + (else (error "Can not get size of unknown type" type))))) + +(define pffi-shared-object-load + (lambda (headers path) + (dlopen path RTLD-NOW))) + +(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) + (string=? (type-name (type-of object)) "Cpointer"))) + +(define pffi-pointer-allocate + (lambda (size) + (pointer-allocate size))) + +(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 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) (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 + +(define pffi-type->libffi-type + (lambda (type) + (cond + ;((equal? type 'int8_t) ffi_type_sint8) + ;((equal? type 'uint8_t) ffi_type_uint8) + ;((equal? type 'int16_t) ffi_type_sint16) + ;((equal? type 'uint16_t) ffi_type_uint16) + ;((equal? type 'int32_t) ffi_type_sint32) + ;((equal? type 'uint32_t) ffi_type_uint32) + ;((equal? type 'int64_t) ffi_type_sint64) + ;((equal? type 'uint64_t) ffi_type_uint64) + ;((equal? type 'bool) ffi_type_sint8) + ;((equal? type 'short) ffi_type_sint16) + ;((equal? type 'unsigned-short) ffi_type_uint16) + ((equal? type 'int) (get-ffi-type-int)) + ;((equal? type 'unsigned-int) ffi_type_uint32) + ;((equal? type 'long) ffi_type_long) + ;((equal? type 'unsigned-long) ffi_type_uint32) + ;((equal? type 'float) ffi_type_float) + ;((equal? type 'double) ffi_type_double) + ;((equal? type 'void) ffi_type_void) + ((equal? type 'pointer) (get-ffi-type-pointer)) + ;((equal? type 'callback) ffi_type_pointer) + ))) + +(define make-c-function + (lambda (shared-object return-type c-name args) + (let ((func (dlsym shared-object c-name))) + (display "HERE: ") + (write args) + (newline) + (write (length args)) + (newline) + (write (pffi-type->libffi-type return-type)) + (newline) + (write (map + (lambda (item) + (display "ITEM: ") + (write item) + (newline)) + args)) + (newline) + (internal-ffi-prep-cif (length args) + return-type + args + ) + func + + ))) + +(define-syntax pffi-define + (syntax-rules () + ((pffi-define scheme-name shared-object c-name return-type argument-types) + (define scheme-name + (make-c-function shared-object + (pffi-type->libffi-type return-type) + (symbol->string c-name) + (map pffi-type->libffi-type argument-types)))))) diff --git a/retropikzel/r7rs-pffi/chibi.stub b/retropikzel/r7rs-pffi/chibi.stub index 8551f88..e01019f 100644 --- a/retropikzel/r7rs-pffi/chibi.stub +++ b/retropikzel/r7rs-pffi/chibi.stub @@ -1 +1,200 @@ +; vim: ft=scheme + (c-system-include "stdint.h") +(c-system-include "dlfcn.h") +(c-system-include "ffi.h") + +;; pffi-size-of +(c-declare " + int size_of_int8_t() { return sizeof(int8_t); } + int size_of_uint8_t() { return sizeof(uint8_t); } + int size_of_int16_t() { return sizeof(int16_t); } + int size_of_uint16_t() { return sizeof(uint16_t); } + int size_of_int32_t() { return sizeof(int32_t); } + int size_of_uint32_t() { return sizeof(uint32_t); } + int size_of_int64_t() { return sizeof(int64_t); } + int size_of_uint64_t() { return sizeof(uint64_t); } + int size_of_char() { return sizeof(char); } + int size_of_unsigned_char() { return sizeof(unsigned char); } + int size_of_short() { return sizeof(short); } + int size_of_unsigned_short() { return sizeof(unsigned short); } + int size_of_int() { return sizeof(int); } + int size_of_unsigned_int() { return sizeof(unsigned int); } + int size_of_long() { return sizeof(long); } + int size_of_unsigned_long() { return sizeof(unsigned long); } + int size_of_float() { return sizeof(float); } + int size_of_double() { return sizeof(double); } + int size_of_pointer() { return sizeof(void*); } +") + +(define-c int (size-of-int8_t size_of_int8_t) ()) +(define-c int (size-of-uint8_t size_of_uint8_t) ()) +(define-c int (size-of-int16_t size_of_int16_t) ()) +(define-c int (size-of-uint16_t size_of_uint16_t) ()) +(define-c int (size-of-int32_t size_of_int32_t) ()) +(define-c int (size-of-uint32_t size_of_uint32_t) ()) +(define-c int (size-of-int64_t size_of_int64_t) ()) +(define-c int (size-of-uint64_t size_of_uint64_t) ()) +(define-c int (size-of-char size_of_char) ()) +(define-c int (size-of-unsigned-char size_of_unsigned_char) ()) +(define-c int (size-of-short size_of_short) ()) +(define-c int (size-of-unsigned-short size_of_unsigned_short) ()) +(define-c int (size-of-int size_of_int) ()) +(define-c int (size-of-unsigned-int size_of_unsigned_int) ()) +(define-c int (size-of-long size_of_long) ()) +(define-c int (size-of-unsigned-long size_of_unsigned_long) ()) +(define-c int (size-of-float size_of_float) ()) +(define-c int (size-of-double size_of_double) ()) +(define-c int (size-of-pointer size_of_pointer) ()) + +;; pffi-shape-object-load +(define-c-const int (RTLD-NOW "RTLD_NOW")) +(define-c (maybe-null void*) dlopen (string int)) + +(c-declare "void* pointer_null() { return NULL; }") +(define-c (maybe-null 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 void*))) + +(c-declare "void* pointer_allocate(int size) { return malloc(size); }") +(define-c (maybe-null void*) (pointer-allocate pointer_allocate) (int)) + +(c-declare "void pointer_free(void* pointer) { free(pointer); }") +(define-c void (pointer-free pointer_free) ((maybe-null void*))) + +;; pffi-pointer-set! +(c-declare "void pointer_set_c_int8_t(void* pointer, int offset, int8_t value) { int8_t* p = (int8_t*)pointer; p[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* p = (uint8_t*)pointer; p[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* p = (int16_t*)pointer; p[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* p = (uint16_t*)pointer; p[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* p = (int32_t*)pointer; p[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* p = (uint32_t*)pointer; p[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* p = (int64_t*)pointer; p[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* p = (uint64_t*)pointer; p[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* p = (char*)pointer; p[offset] = value; }") +(define-c void (pointer-set-c-char! pointer_set_c_char) ((pointer void*) int char)) +(c-declare "void pointer_set_c_unsigned_char(void* pointer, int offset, unsigned char value) { unsigned char* p = (unsigned char*)pointer; p[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* p = (short*)pointer; p[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) { short* p = (unsigned short*)pointer; p[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* p = (int*)pointer; p[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) { int* p = (unsigned int*)pointer; p[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* p = (long*)pointer; p[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) { long* p = (unsigned long*)pointer; p[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* p = (float*)pointer; p[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* p = (double*)pointer; p[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) { void* p = &pointer + offset; p = value; }") +(define-c void (pointer-set-c-pointer! pointer_set_c_pointer) ((pointer void*) int (maybe-null void*))) + +;; pffi-pointer-get +(c-declare "int8_t pointer_ref_c_int8_t(void* pointer, int offset) { int8_t* p = (int8_t*)pointer; return p[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) { uint8_t* p = (uint8_t*)pointer; return p[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) { int16_t* p = (int16_t*)pointer; return p[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) { uint16_t* p = (uint16_t*)pointer; return p[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) { int32_t* p = (int32_t*)pointer; return p[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) { uint32_t* p = (uint32_t*)pointer; return p[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) { int64_t* p = (int64_t*)pointer; return p[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) { uint64_t* p = (uint64_t*)pointer; return p[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) { char* p = (char*)pointer; return p[offset]; }") +(define-c char (pointer-ref-c-char pointer_ref_c_char) ((pointer void*) int)) +(c-declare "unsigned char pointer_ref_c_unsigned_char(void* pointer, int offset) { unsigned char* p = (unsigned char*)pointer; return p[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) { short* p = (short*)pointer; return p[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) { unsigned short* p = (unsigned short*)pointer; return p[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) { int* p = (int*)pointer; return p[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) { unsigned int* p = (unsigned int*)pointer; return p[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) { long* p = (long*)pointer; return p[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) { unsigned long* p = (unsigned long*)pointer; return p[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) { float* p = (float*)pointer; return p[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) { double* p = (double*)pointer; return p[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) { void* p = &pointer + offset; return p;}") +(define-c (maybe-null 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 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 void*))) + +;; pffi-define + +(c-declare "ffi_cif cif;") +(define-c (maybe-null void*) dlsym ((maybe-null void*) string)) + + +;(define-c-type ffi_status) +;(define-c-type ffi_cif) +;(define-c-type ffi_type) +;(define-c-type ffi_status) + +;(c-declare "ffi_type* test1() { ffi_type* p = malloc(sizeof(ffi_type_sint32)); p->size = &ffi_type_sint32->size; return p; }") +;(define-c ffi_type test1 ()) +(c-declare "ffi_type* get_ffi_type_int() { ffi_type* p = malloc(sizeof(ffi_type)); return p; }") +(define-c void* (get-ffi-type-int get_ffi_type_int) ()) + +(c-declare "ffi_type* get_ffi_type_pointer() { ffi_type* p = malloc(sizeof(ffi_type)); return p; }") +(define-c void* (get-ffi-type-pointer get_ffi_type_pointer) ()) + +(c-declare + "int internal_ffi_prep_cif(unsigned int nargs, void* rtype, void** atypes) { + return ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, (ffi_type*)rtype, (ffi_type**)atypes); + }") +(define-c int (internal-ffi-prep-cif internal_ffi_prep_cif) (unsigned-int (pointer void*) (array void*))) + + + diff --git a/retropikzel/r7rs-pffi/libffi.scm b/retropikzel/r7rs-pffi/libffi.scm new file mode 100644 index 0000000..139597f --- /dev/null +++ b/retropikzel/r7rs-pffi/libffi.scm @@ -0,0 +1,2 @@ + + diff --git a/test.scm b/test.scm index 24708cf..fa462f4 100644 --- a/test.scm +++ b/test.scm @@ -225,6 +225,7 @@ (pffi-pointer-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") @@ -265,6 +266,7 @@ (pffi-pointer-set! set-pointer 'float offset 1.5) (debug (pffi-pointer-get set-pointer 'float offset)) (assert = (pffi-pointer-get set-pointer 'float offset) 1.5) + (pffi-pointer-set! set-pointer 'double offset 1.5) (debug (pffi-pointer-get set-pointer 'double offset)) (assert = (pffi-pointer-get set-pointer 'double offset) 1.5) @@ -347,6 +349,7 @@ (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-define (print-header 'pffi-define) @@ -354,6 +357,7 @@ (pffi-define atoi libc-stdlib 'atoi 'int (list 'pointer)) (assert = (atoi (pffi-string->pointer "100")) 100) +#| ;; pffi-define-callback (print-header 'pffi-define-callback) @@ -390,4 +394,5 @@ (pffi-pointer-get array 'int (* (pffi-size-of 'int) 2)))) (newline) +|# (exit 0)