From fe7822cb29e00d202d69b83b32eee2ed54167bee Mon Sep 17 00:00:00 2001 From: retropikzel Date: Wed, 12 Mar 2025 15:52:31 +0200 Subject: [PATCH] Improving documentation --- Makefile | 18 +- README.md | 136 ++-- documentation/R7RS-PFFI.html | 980 ++++++++++++++++++++++++++++ documentation/R7RS-PFFI.pdf | Bin 0 -> 63017 bytes templates/css/pdf-documentation.css | 2 + templates/documentation.html | 18 + 6 files changed, 1115 insertions(+), 39 deletions(-) create mode 100644 documentation/R7RS-PFFI.html create mode 100644 documentation/R7RS-PFFI.pdf create mode 100644 templates/css/pdf-documentation.css create mode 100644 templates/documentation.html diff --git a/Makefile b/Makefile index 0cacdd7..1c2a799 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,23 @@ -.PHONY=libtest.o libtest.so libtest.a +.PHONY=libtest.o libtest.so libtest.a documentation CC=gcc DOCKER=docker run -it -v ${PWD}:/workdir DOCKER_INIT=cd /workdir && make clean && all: chibi gauche libtest.so libtest.o libtest.a +# apt-get install pandoc weasyprint +docs: + mkdir -p documentation + pandoc --standalone \ + --template templates/documentation.html README.md \ + > documentation/R7RS-PFFI.html + #pandoc -s --pdf-engine=weasyprint -o documentation/R7RS-PFFI.pdf README.md + pandoc -t html5 \ + --pdf-engine=weasyprint \ + --css templates/css/pdf-documentation.css \ + -o documentation/R7RS-PFFI.pdf \ + README.md + chibi: chibi-ffi src/chibi/pffi.stub ${CC} -g3 -o retropikzel/pffi/chibi-pffi.so \ @@ -46,7 +59,8 @@ test-compile-library: libtest.so libtest.a libtest.o SCHEME=${SCHEME} compile-r7rs-library retropikzel/pffi.sld test-compile: test-compile-library - SCHEME=${SCHEME} CFLAGS="-I./include" LDFLAGS="-ltest" compile-r7rs -I . test.scm && ./test + SCHEME=${SCHEME} CFLAGS="-I./include -L." LDFLAGS="-ltest libtest.o" compile-r7rs -I . test.scm + ./test test-compile-docker: libtest.so libtest.a docker build -f dockerfiles/test . --build-arg SCHEME=${SCHEME} --tag=pffi-${SCHEME} diff --git a/README.md b/README.md index 9b1cc65..9dc52c1 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ -# Portable Foreign Function Interface for R7RS schemes +--- +title: Portable Foreign Function Interface for R7RS Documentation +--- -Foreign function interface that is supported on multiple R7RS Sceheme implementations. +# Portable Foreign Function Interface for R7RS -Any help in form of constructive advice and bug reports are appreciated. +Portable foreign function interface for R7RS. It is portable in the sense that +it supports multiple implementations, as opposed to being portable by +conforming to some specification. [Project](https://todo.sr.ht/~retropikzel/r7rs-pffi) @@ -14,44 +18,55 @@ Any help in form of constructive advice and bug reports are appreciated. ## Table of contents + + +
## Goals + - Support only R7RS implementations - Same interface on all implementations @@ -60,6 +75,7 @@ Any help in form of constructive advice and bug reports are appreciated. - Stability and being boring after 1.0.0 is reached ## Non goals + - To have every possible FFI feature - Compiling of used library C code at any point @@ -67,6 +83,7 @@ Any help in form of constructive advice and bug reports are appreciated. - The pffi library itself may require compilation on installation ## Status + Currently the interface of the library is in okay shape. It propably will not change much but no guarantees are being made just yet. @@ -76,16 +93,20 @@ different stage. As a whole it is still in **alpha** stage. That said the interf changing anymore and some implementations are in **beta**. ### Current caveats + - No way to pass structs by value - Most implementations are missing callback support ## Implementation table + ### Beta + + | | pffi-init | pffi-size-of | pffi-shared-object-auto-load | pffi-shared-object-load | pffi-pointer-null | pffi-pointer-null? | pffi-pointer-allocate | pffi-pointer-address | pffi-pointer? | pffi-pointer-free | pffi-pointer-set! | pffi-pointer-get | pffi-string->pointer | pffi-pointer->string | pffi-struct-make | pffi-struct-pointer | pffi-struct-offset-get | pffi-struct-get | pffi-struct-set! | pffi-define | pffi-define-callback | -|--------------|-----------|--------------|------------------------------|-------------------------|-------------------|--------------------|-----------------------|----------------------|---------------|-------------------|-------------------|------------------|----------------------|----------------------|------------------|---------------------|------------------------|-----------------|------------------|-------------|----------------------| +|--------------|:---------:|:------------:|:----------------------------:|:-----------------------:|:-----------------:|:------------------:|:---------------------:|:--------------------:|:-------------:|:-----------------:|:-----------------:|:----------------:|:--------------------:|:--------------------:|:----------------:|:-------------------:|:----------------------:|:---------------:|:----------------:|:-----------:|:--------------------:| | Chibi | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | X | | | Gauche | X | X | X | X | X | X | X | | X | X | X | X | X | X | X | X | X | X | X | X | | | Guile | X | X | X | X | X | X | X | | X | X | X | X | X | X | X | X | X | X | X | X | X | @@ -93,10 +114,12 @@ changing anymore and some implementations are in **beta**. | Racket | X | X | X | X | X | X | X | | X | X | X | X | X | X | X | X | X | X | X | X | X | | Saggittarius | X | X | X | X | X | X | X | | X | X | X | X | X | X | X | X | X | X | X | X | X | + ### Alpha + | | pffi-init | pffi-size-of | pffi-shared-object-auto-load | pffi-shared-object-load | pffi-pointer-null | pffi-pointer-null? | pffi-pointer-allocate | pffi-pointer-address | pffi-pointer? | pffi-pointer-free | pffi-pointer-set! | pffi-pointer-get | pffi-string->pointer | pffi-pointer->string | pffi-struct-make | pffi-struct-pointer | pffi-struct-offset-get | pffi-struct-get | pffi-struct-set! | pffi-define | pffi-define-callback | -|--------------|-----------|--------------|------------------------------|-------------------------|-------------------|--------------------|-----------------------|----------------------|---------------|-------------------|-------------------|------------------|----------------------|----------------------|------------------|---------------------|------------------------|-----------------|------------------|-------------|----------------------| +|--------------|:---------:|:------------:|:----------------------------:|:-----------------------:|:-----------------:|:------------------:|:---------------------:|:--------------------:|:-------------:|:-----------------:|:-----------------:|:----------------:|:--------------------:|:--------------------:|:----------------:|:-------------------:|:----------------------:|:---------------:|:----------------:|:-----------:|:--------------------:| | Chicken-5 | X | X | X | X | X | X | X | | X | X | X | X | X | X | X | X | X | X | X | X | X | | Cyclone | X | X | X | X | X | X | X | | X | X | X | X | X | X | X | X | X | X | X | X | | | Gambit | X | X | | | | | | X | | | | | | | X | X | X | X | X | | | @@ -109,6 +132,7 @@ changing anymore and some implementations are in **beta**. | Ypsilon | | | | | | | | | | | | | | | X | X | X | X | X | | | ### Not started + - [LIPS](https://lips.js.org/) - Will work on nodejs by using some C FFI library from npm @@ -130,6 +154,7 @@ changing anymore and some implementations are in **beta**. - Need to study the implementation more ### Other + - [s7](https://scheme.fail://ccrma.stanford.edu/software/snd/snd/s7.html) - Propably does not need FFI as it is embeddable only @@ -137,10 +162,13 @@ changing anymore and some implementations are in **beta**. - Desires no C interop, I can respect that ## Documentation + -### Usage +### Usage + -#### Chibi +#### Chibi + Needs libffi-dev, on Debina/Ubuntu/Mint install with: @@ -151,19 +179,22 @@ Build with: chibi-ffi retropikzel/r7rs-pffi/r7rs-pffi-chibi.stub gcc -o retropikzel/r7rs-pffi/r7rs-pffi-chibi.so -fPIC -shared retropikzel/r7rs-pffi/r7rs-pffi-chibi.c -lchibi-scheme -lffi -#### Chicken +#### Chicken + Needs [r7rs egg](https://wiki.call-cc.org/eggref/5/r7rs), install with: chicken-install r7rs -#### Racket +#### Racket + Needs [racket-r7rs](https://github.com/lexi-lambda/racket-r7rs), install with: raco pkg install --auto r7rs -#### Kawa +#### Kawa + Kawa Needs at least Java version 22 @@ -175,8 +206,10 @@ Needs jvm flags: - --enable-native-access=ALL-UNNAMED ### Reference + #### Types + Types are given as symbols, for example 'int8 or 'pointer. @@ -203,23 +236,28 @@ Types are given as symbols, for example 'int8 or 'pointer. - Callback function #### Procedures and macros + Some of these are procedures and some macros, it might also change implementation to implementation. ##### **pffi-init** + Always call this first, on most implementation it does nothing but some implementations might need initialisation run. ##### **pffi-size-of** object -> number + Returns the size of the pffi-struct, pffi-enum or pffi-type. ##### **pffi-align-of** type -> number + Returns the align of the type. ##### **pffi-shared-object-auto-load** headers shared-object-name [options] -> object + Load given shared object automatically searching many predefined paths. @@ -249,6 +287,7 @@ Example: ##### **pffi-shared-object-load** headers path [options] + It is recommended to use the pffi-shared-object-auto-load instead of this directly. @@ -268,26 +307,37 @@ Options: - List of different versions of library to try, for example (list ".0" ".1") ##### **pffi-pointer-null** -> pointer + Returns a new NULL pointer. ##### **pffi-pointer-null?** pointer -> boolean + Returns #t if given pointer is null pointer, #f otherwise. ##### **pffi-pointer-allocate** size -> pointer + Returns newly allocated pointer of given size. +##### **pffi-pointer-address** pointer -> number + + +Returns the address of given pointer as number. + ##### **pffi-pointer?** object -> boolean + Returns #t if given object is pointer, #f otherwise. ##### **pffi-pointer-free** pointer + Frees given pointer. ##### **pffi-pointer-set!** pointer type offset value + Sets the value on a pointer on given offset. For example: @@ -297,6 +347,7 @@ Sets the value on a pointer on given offset. For example: Would set the offset of 64, on pointer p to value 100. ##### **pffi-pointer-get** pointer type offset -> object + Gets the value from a pointer on given offset. For example: @@ -306,14 +357,17 @@ Gets the value from a pointer on given offset. For example: > 100 ##### **pffi-string->pointer** string -> pointer + Makes pointer out of a given string. ##### **pffi-pointer->string** pointer -> string + Makes string out of a given pointer. ##### **pffi-struct-make** c-type members . pointer -> pffi-struct + Creates a new pffi-struct and allocates pointer for it. The members argument is a list of member names and types. For example: @@ -324,6 +378,7 @@ names and types. For example: C-type argument can be symbol or a string. ##### **pffi-struct-pointer** pffi-struct -> pointer + Returns the pointer that holds the struct content. You need to use this when passing a struct as a pointer to foreign functions. @@ -332,19 +387,23 @@ a pointer to foreign functions. (pffi-struct-pointer s) ##### **pffi-struct-offset-get** member-name -> number + Returns the offset of a struct member with given name. ##### **pffi-struct-get** pffi-struct member-name -> object + Returns the value of the givens struct member. ##### **pffi-struct-set!** pffi-struct member-name value + Sets the value of the givens struct member. It is up to you to make sure that the type of value is correct. ##### **pffi-define** scheme-name shared-object c-name return-type argument-types + Defines a new foreign function to be used from Scheme code. For example: @@ -356,6 +415,7 @@ Defines a new foreign function to be used from Scheme code. For example: (c-puts "Message brought to you by FFI!") ##### **pffi-define-callback** scheme-name return-type argument-types procedure + Defines a new Sceme function to be used as callback to C code. For example: @@ -395,3 +455,5 @@ Defines a new Sceme function to be used as callback to C code. For example: (display array) (newline) ;> (1 2 3) + +
diff --git a/documentation/R7RS-PFFI.html b/documentation/R7RS-PFFI.html new file mode 100644 index 0000000..b8a7187 --- /dev/null +++ b/documentation/R7RS-PFFI.html @@ -0,0 +1,980 @@ + + + + + + Portable Foreign Function Interface for R7RS +Documentation + + + +

Portable + Foreign Function Interface for R7RS

+

Portable foreign function interface for R7RS. It is portable + in the sense that it supports multiple implementations, as + opposed to being portable by conforming to some + specification.

+

Project

+

Issue + trackers

+

Maling + lists

+

Jenkins

+

Table of contents

+ +
+

Goals

+

+ +

Non goals

+

+ +

Status

+

+

Currently the interface of the library is in okay shape. It + propably will not change much but no guarantees are being made + just yet.

+

Due to supporting many different Scheme implementations, + different parts of this software are in different stage. As a + whole it is still in alpha stage. That said the + interface should not be changing anymore and some + implementations are in beta.

+

Current caveats

+

+ +

Implementation table

+

+

Beta

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pffi-initpffi-size-ofpffi-shared-object-auto-loadpffi-shared-object-loadpffi-pointer-nullpffi-pointer-null?pffi-pointer-allocatepffi-pointer-addresspffi-pointer?pffi-pointer-freepffi-pointer-set!pffi-pointer-getpffi-string->pointerpffi-pointer->stringpffi-struct-makepffi-struct-pointerpffi-struct-offset-getpffi-struct-getpffi-struct-set!pffi-definepffi-define-callback
ChibiXXXXXXXXXXXXXXXXXXXX
GaucheXXXXXXXXXXXXXXXXXXX
GuileXXXXXXXXXXXXXXXXXXXX
KawaXXXXXXXXXXXXXXXXXXXX
RacketXXXXXXXXXXXXXXXXXXXX
SaggittariusXXXXXXXXXXXXXXXXXXXX
+

Alpha

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pffi-initpffi-size-ofpffi-shared-object-auto-loadpffi-shared-object-loadpffi-pointer-nullpffi-pointer-null?pffi-pointer-allocatepffi-pointer-addresspffi-pointer?pffi-pointer-freepffi-pointer-set!pffi-pointer-getpffi-string->pointerpffi-pointer->stringpffi-struct-makepffi-struct-pointerpffi-struct-offset-getpffi-struct-getpffi-struct-set!pffi-definepffi-define-callback
Chicken-5XXXXXXXXXXXXXXXXXXXX
CycloneXXXXXXXXXXXXXXXXXXX
GambitXXXXXXXX
GerbilXXXXXX
LarcenyXXXXXX
MoshXXXXXXXXXXXXXXXXXXXX
SkintXXXXXX
StklosXXXXXXXXXXXXXX
tr7XXXXX
YpsilonXXXXX
+

Not started

+

+ +

Other

+

+ +

Documentation

+

+

Usage

+

+

Chibi

+

+

Needs libffi-dev, on Debina/Ubuntu/Mint install with:

+
apt install libffi-dev
+

Build with:

+
chibi-ffi retropikzel/r7rs-pffi/r7rs-pffi-chibi.stub
+gcc -o retropikzel/r7rs-pffi/r7rs-pffi-chibi.so -fPIC -shared retropikzel/r7rs-pffi/r7rs-pffi-chibi.c -lchibi-scheme -lffi
+

Chicken

+

+

Needs r7rs + egg, install with:

+
chicken-install r7rs
+

Racket

+

+

Needs racket-r7rs, + install with:

+
raco pkg install --auto r7rs
+

Kawa

+

+

Kawa Needs at least Java version 22

+

Needs jvm flags:

+ +

Reference

+

+

Types

+

+

Types are given as symbols, for example ’int8 or + ’pointer.

+ +

Procedures and macros

+

+

Some of these are procedures and some macros, it might also + change implementation to implementation.

+
pffi-init
+

+

Always call this first, on most implementation it does + nothing but some implementations might need initialisation + run.

+
pffi-size-of + object -> number
+

+

Returns the size of the pffi-struct, pffi-enum or + pffi-type.

+
pffi-align-of + type -> number
+

+

Returns the align of the type.

+
pffi-shared-object-auto-load + headers shared-object-name [options] -> object
+

+

Load given shared object automatically searching many + predefined paths.

+

Takes as argument a list of C headers, these are for the + compiler ones. And an shared-object name, used by the dynamic + FFI’s. The name of the shared object should not contain suffix + like .so or .dll. Nor should it contain any prefix like + “lib”.

+

Additional options argument can be provided, theys should be + a pair with a keyword. The options are:

+ +

Example:

+
(define libc-stdlib
+  (cond-expand
+    (windows (pffi-shared-object-auto-load (list "stdlib.h") "ucrtbase"))
+    (else (pffi-shared-object-auto-load (list "stdlib.h")
+                                        "c"
+                                        '(additional-versions . ("6"))
+                                        '(additional-search-paths . ("."))))))
+
pffi-shared-object-load + headers path [options]
+

+

It is recommended to use the pffi-shared-object-auto-load + instead of this directly.

+

Headers is a list of strings needed to be included, for + example

+
(list "curl/curl.h")
+

Path is the full path of the shared object without any “lib” + prefix or “.so/.dll” suffix. For example:

+
"curl"
+

Options:

+ +
pffi-pointer-null + -> pointer
+

+

Returns a new NULL pointer.

+
pffi-pointer-null? + pointer -> boolean
+

+

Returns #t if given pointer is null pointer, #f + otherwise.

+
pffi-pointer-allocate + size -> pointer
+

+

Returns newly allocated pointer of given size.

+
pffi-pointer-address + pointer -> number
+

+

Returns the address of given pointer as number.

+
pffi-pointer? + object -> boolean
+

+

Returns #t if given object is pointer, #f otherwise.

+
pffi-pointer-free + pointer
+

+

Frees given pointer.

+
pffi-pointer-set! + pointer type offset value
+

+

Sets the value on a pointer on given offset. For example:

+
(define p (pffi-pointer-allocate 128))
+(pffi-pointer-set! p 'int 64 100)
+

Would set the offset of 64, on pointer p to value 100.

+
pffi-pointer-get + pointer type offset -> object
+

+

Gets the value from a pointer on given offset. For + example:

+
(define p (pffi-pointer-allocate 128))
+(pffi-pointer-set! p 'int 64 100)
+(pffi-pointer-get p 'int 64)
+> 100
+
pffi-string->pointer + string -> pointer
+

+

Makes pointer out of a given string.

+
pffi-pointer->string + pointer -> string
+

+

Makes string out of a given pointer.

+
pffi-struct-make + c-type members . pointer -> pffi-struct
+

+

Creates a new pffi-struct and allocates pointer for it. The + members argument is a list of member names and types. For + example:

+
(define color (pffi-struct-make 'color '((int8 . r) (int8 . g) (int8 . b) (int8 .a ))))
+(define test (pffi-struct-make "struct test" '((int8 . r) (int8 . g) (int8 . b) (int8 .a ))))
+

C-type argument can be symbol or a string.

+
pffi-struct-pointer + pffi-struct -> pointer
+

+

Returns the pointer that holds the struct content. You need + to use this when passing a struct as a pointer to foreign + functions.

+
(define s (pffi-struct-make 'test '((int . r) (int . g) (int . b))))
+(pffi-struct-pointer s)
+
pffi-struct-offset-get + member-name -> number
+

+

Returns the offset of a struct member with given name.

+
pffi-struct-get + pffi-struct member-name -> object
+

+

Returns the value of the givens struct member.

+
pffi-struct-set! + pffi-struct member-name value
+

+

Sets the value of the givens struct member. It is up to you + to make sure that the type of value is correct.

+
pffi-define + scheme-name shared-object c-name return-type argument-types
+

+

Defines a new foreign function to be used from Scheme code. + For example:

+
(define libc-stdlib
+    (cond-expand
+        (windows (pffi-shared-object-auto-load (list "stdlib.h") (list) "ucrtbase" (list "")))
+        (else (pffi-shared-object-auto-load (list "stdlib.h") (list) "c" (list "" "6")))))
+(pffi-define c-puts libc-stdlib 'puts 'int (list 'pointer))
+(c-puts "Message brought to you by FFI!")
+
pffi-define-callback + scheme-name return-type argument-types procedure
+

+

Defines a new Sceme function to be used as callback to C + code. For example:

+
; Load the shared library
+(define libc-stdlib
+    (cond-expand
+        (windows (pffi-shared-object-auto-load (list "stdlib.h") (list) "ucrtbase" (list "")))
+        (else (pffi-shared-object-auto-load (list "stdlib.h") (list) "c" (list "" "6")))))
+
+; Define C function that takes a callback
+(pffi-define qsort libc-stdlib 'qsort 'void (list 'pointer 'int 'int 'callback))
+
+; Define our callback
+(pffi-define-callback compare
+                      'int
+                      (list 'pointer 'pointer)
+                      (lambda (pointer-a pointer-b)
+                        (let ((a (pffi-pointer-get pointer-a 'int 0))
+                              (b (pffi-pointer-get pointer-b 'int 0)))
+                          (cond ((> a b) 1)
+                                ((= a b) 0)
+                                ((< a b) -1)))))
+
+; Create new array of ints to be sorted
+(define array (pffi-pointer-allocate (* (pffi-size-of 'int) 3)))
+(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 0) 3)
+(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 1) 2)
+(pffi-pointer-set! array 'int (* (pffi-size-of 'int) 2) 1)
+
+(display array)
+(newline)
+;> (3 2 1)
+
+; Sort the array
+(qsort array 3 (pffi-size-of 'int) compare)
+
+(display array)
+(newline)
+;> (1 2 3)
+
+ + diff --git a/documentation/R7RS-PFFI.pdf b/documentation/R7RS-PFFI.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0e0b6e00c2b5782dbc275186a40fbd114a295db8 GIT binary patch literal 63017 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 + + + + + $title$ + + + + $body$ + +