From 41c6097470c82319a472c1cfc0e40c337acf5798 Mon Sep 17 00:00:00 2001 From: retropikzel Date: Sat, 3 May 2025 05:47:20 +0300 Subject: [PATCH] Updated documentation --- README.md | 47 ++- VERSION | 1 + documentation/R7RS-PFFI.html | 797 ----------------------------------- documentation/R7RS-PFFI.pdf | Bin 73144 -> 0 bytes documentation/foreign-c.html | 325 ++++++++++++++ documentation/foreign-c.pdf | Bin 0 -> 24119 bytes 6 files changed, 371 insertions(+), 799 deletions(-) create mode 100644 VERSION delete mode 100644 documentation/R7RS-PFFI.html delete mode 100644 documentation/R7RS-PFFI.pdf create mode 100644 documentation/foreign-c.html create mode 100644 documentation/foreign-c.pdf diff --git a/README.md b/README.md index c19dc14..c349e42 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ being portable by conforming to some specification. The new readme is a work in progress. -## Implementation table +## Implementation support tables ### Primitives 1 @@ -58,16 +58,59 @@ The new readme is a work in progress. | Stklos | X | X | | | Ypsilon | X | X | | +### Installation + +Either download the latest release from +[releases page](https://git.sr.ht/~retropikzel/foreign-c/refs) or git clone +, preferably with a tag, and copy the "foreign" directory to your library +directory. + +As an example assuming you have a project and your libraries live in directory +called snow in it: + + git clone https://git.sr.ht/~retropikzel/foreign-c --branch LATEST_VERSION + mkdir -p snow + cp -r foreign-c/foreign snow/ + make -C snow/foreign/c + +With most implementations the make command does not compile anything. When that +is the case it will say "Nothing to build on SCHEME\_IMPLEMENTATION\_NAME." ## Documentation +### Types + +Types are given as symbols, for example 'int8 or 'pointer. + +- int8 +- uint8 +- int16 +- uint16 +- int32 +- uint32 +- int64 +- uint64 +- char +- unsigned-char +- short +- unsigned-short +- int +- unsigned-int +- long +- unsigned-long +- float +- double +- pointer +- callback + - Callback function + ### Primitives (**c-type-size** _type_) Returns the size of given C type. -(define-c-library) +(**define-c-library** _scheme-name_ _headers_ _object-name_ _options_) define-c-procedure define-c-callback c-bytevector? diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..78bc1ab --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.10.0 diff --git a/documentation/R7RS-PFFI.html b/documentation/R7RS-PFFI.html deleted file mode 100644 index 9c712d3..0000000 --- a/documentation/R7RS-PFFI.html +++ /dev/null @@ -1,797 +0,0 @@ - - - - - Portable Foreign Function Interface for R7RS -Documentation - 0.6.0 - - - -

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

-

-
    -
  • Support only R7RS implementations
  • -
  • Same interface on all implementations -
      -
    • Some things that are procedures on one implementation are - macros on other, but they must behave the same
    • -
  • -
  • Stability and being boring after 1.0.0 is reached
  • -
-

Non goals

-

-
    -
  • Compiling of used library C code at any point -
      -
    • That is no stubs, no C code generated by the library and so - on
    • -
    • The pffi library itself may require compilation on - installation
    • -
  • -
-

Status

-

-

In alpha.

-

Current caveats

-

-
    -
  • No way to pass structs by value
  • -
  • Most implementations are missing callback support
  • -
  • Always pass arguments to pffi functions/macros as ’(1 2 3) - and not (list 1 2 3)
  • -
  • Always pass pffi-define-callback procedure as lambda in - place
  • -
  • No support for variadic function arguments -
      -
    • Can be partially worked around by defining multiple versions - of same function with different number of arguments
    • -
  • -
-

Roadmap

-

For roadmap to 1.0.0 see issues

-

Feature mplementation - table

-

-

Primitives

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c-size-ofdefine-c-libraryc-bytevector?pffi-pointer-set!pffi-pointer-getdefine-c-procedurepffi-define-callback
ChibiXXXXXX
ChickenXXXXXXX
CycloneXXXXXX
GambitX
GaucheXXXXXX
Gerbil
GuileXXXXXXX
KawaXXXXXXX
Larceny
MoshXXXXXXX
RacketXXXXXXX
SaggittariusXXXXXXX
Skint
StklosXXX
tr7
YpsilonXXXXXXX
-

Built upon

-

-

These features are built upon the primitives and if - primitives are implemented and work, they should work too.

-
    -
  • make-c-bytevector
  • -
  • make-c-null
  • -
  • c-null?
  • -
  • pffi-pointer-address
  • -
  • c-free
  • -
  • pffi-pointer->string
  • -
  • pffi-string->pointer
  • -
  • pffi-struct-make
  • -
  • pffi-struct-pointer
  • -
  • pffi-struct-offset-get
  • -
  • pffi-struct-get
  • -
  • pffi-struct-set!
  • -
  • pffi-array-allocate
  • -
  • pffi-array?
  • -
  • pffi-pointer->array
  • -
  • pffi-array-get
  • -
  • pffi-array-set!
  • -
  • pffi-list->array
  • -
  • pffi-array->list
  • -
-

Not started

-

-
    -
  • LIPS -
      -
    • Will work on nodejs by using some C FFI library from - npm
    • -
    • Javascript side needs design
    • -
  • -
  • Biwascheme -
      -
    • Will work on nodejs by using some C FFI library from - npm
    • -
    • Javascript side needs design
    • -
  • -
  • MIT-Scheme -
      -
    • Need to study the implementation more
    • -
  • -
  • Airship -
      -
    • Need to study the implementation more
    • -
  • -
  • Other gambit targets -
      -
    • Gambit compiles to different targets other than C too, for - example Javascript. It would be cool and interesting to see if - this FFI could also support some of those
    • -
    • When LIPS and Biwascheme Javascript side is done then Gambit - should be done too
    • -
  • -
  • s48-r7rs -
      -
    • Need to study the implementation more
    • -
  • -
  • prescheme -
      -
    • Need to study the implementation more
    • -
  • -
-

Other

-

-
    -
  • s7 -
      -
    • Propably does not need FFI as it is embeddable only
    • -
  • -
  • Loko -
      -
    • Desires no C interop, I can respect that
    • -
  • -
-

Documentation

-

-

Dependencies

-

-

Some implementations have extra dependencies/requirements - beyond just the library.

-

Chibi

-

-

Building depends on libffi.

-

Debian/Ubuntu/Mint install with:

-
apt install libffi-dev
-

Chicken

-

-

Chicken needs r7rs egg installed. Install it with:

-
chicken-install r7rs
-

Gauche

-

-

Building depends on libffi.

-

Debian/Ubuntu/Mint install with:

-
apt install libffi-dev
-

Racket

-

-

Needs racket-r7rs, - install with:

-
raco pkg install --auto r7rs
-

Kawa

-

-

Kawa Needs at least Java version 22 these flags before any - other arguments:

-
    -
  • -J–add-exports=java.base/jdk.internal.foreign.abi=ALL-UNNAMED
  • -
  • -J–add-exports=java.base/jdk.internal.foreign.layout=ALL-UNNAMED
  • -
  • -J–add-exports=java.base/jdk.internal.foreign=ALL-UNNAMED
  • -
  • -J–enable-native-access=ALL-UNNAMED
  • -
-

If you are running kawa.jar with plain java then give same - arguments to java without the -J prefix.

-

Installation

-

-

Since the project is under active development is best to - clone it from git,

-

Project local

-

-

Linux

-

Assuming you - have a project and your libraries live in directory called snow - in it:

-
git clone https://git.sr.ht/~retropikzel/r7rs-pffi
-mkdir -p snow
-cp -r r7rs-pffi/retropikzel snow/
-cd snow/retropikzel/pffi
-make <SCHEME>
-

Windows

-

-

There is no build scripts yet for Windows, that said many - implementations work without compiling anything. If you run this - and it says “There is notching to build for SCHEME” then you - should be good to go.

-

System global

-

-

Still work in progress.

-

Reference

-

-

Types

-

-

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

-
    -
  • int8
  • -
  • uint8
  • -
  • int16
  • -
  • uint16
  • -
  • int32
  • -
  • uint32
  • -
  • int64
  • -
  • uint64
  • -
  • char
  • -
  • unsigned-char
  • -
  • short
  • -
  • unsigned-short
  • -
  • int
  • -
  • unsigned-int
  • -
  • long
  • -
  • unsigned-long
  • -
  • float
  • -
  • double
  • -
  • pointer
  • -
  • callback -
      -
    • Callback function
    • -
  • -
-

Types

-

-

Environment variables

-

-

Setting environment variables like this on Windows works for - this library:

-
set "PFFI_LOAD_PATH=C:\Program Files (x86)/foo/bar"
-

PFFI_LOAD_PATH

-

-

To add more paths to where pffi looks for libraries set - PFFI_LOAD_PATH to paths separated by ; on windows, and : on - other operating systems.

-

Procedures and macros

-

-

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

-

pffi-init

-

-

pffi-init

-

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

-

c-size-of

-

-

c-size-of object -> number

-

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

-

pffi-align-of

-

-

pffi-align-of type -> number

-

Returns the align of the type.

-

define-c-library

-

-

define-c-library headers shared-object-name - [options] -> object

-

Load given shared object automatically searching many - predefined paths.

-

Takes as argument a list of C headers, these are for the - 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:

-
    -
  • additional-versions -
      -
    • Search for additional versions of shared object, given - shared object “c” and additional versions “6” “7” on linux the - files “libc”, “libc.6”, “libc.7” are searched for.
    • -
    • Can be either numbers or strings
    • -
  • -
  • additional-paths -
      -
    • Give additional paths to search shared objects for
    • -
  • -
-

Example:

-
(cond-expand
-  (windows (define-c-library libc-stdlib
-                                '("stdlib.h")
-                                "ucrtbase"
-                                '((additional-versions ("0" "6"))
-                                  (additiona-paths (".")))))
-  (else (define-c-library libc-stdlib
-                             (list "stdlib.h")
-                             "c"
-                             '((additional-versions ("0" "6"))
-                               (additiona-paths ("."))))))
-

Notes

-
    -
  • Do not cond-expand inside the arguments, that might lead to - problems on some implementations.
  • -
  • Do not store options in variables, that might lead to - problems on some implementations.
  • -
  • Do pass the headers using quote -
      -
    • As ’(… and not (list…
    • -
  • -
  • Do pass the options using quote -
      -
    • As ’(… and not (list…
    • -
  • -
-

make-c-null

-

-

make-c-null -> pointer

-

Returns a new NULL pointer.

-

c-null?

-

-

c-null? pointer -> boolean

-

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

-

make-c-bytevector

-

-

make-c-bytevector size -> pointer

-

Returns newly allocated pointer of given size.

-

pffi-pointer-address

-

-

pffi-pointer-address pointer -> - pointer

-

Returns the address of given pointer inside a pointer. This - is used when passing pointers to pointers to foreign procedures. - This is similar to the c’s &. One important - difference is that after you have passed a pointer to - the procedure you must get value from it back to the pointer - which address you are passing. Example:

-
(define input-pointer (make-c-bytevector <needed size>))
-(define input-pointer-address (pffi-pointer-address input-pointer))
-(<foreign-procedure-that takes &pointer as argument> input-pointer-address)
-(set! input-pointer (pffi-pointer-get input-pointer-address 'pointer 0))
-

c-bytevector?

-

-

c-bytevector? object -> boolean

-

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

-

c-free

-

-

c-free pointer

-

Frees given pointer.

-

pffi-pointer-set!

-

-

pffi-pointer-set! pointer type offset - value

-

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

-
(define p (make-c-bytevector 128))
-(pffi-pointer-set! p 'int 64 100)
-

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

-

pffi-pointer-get

-

-

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

-

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

-
(define p (make-c-bytevector 128))
-(pffi-pointer-set! p 'int 64 100)
-(pffi-pointer-get p 'int 64)
-> 100
-

string->c-bytevector

-

-

string->c-bytevector string -> - pointer

-

Makes pointer out of a given string.

-

c-bytevector->string

-

-

c-bytevector->sring pointer -> - string

-

Makes string out of a given pointer.

-

pffi-struct-make

-

-

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 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

-

-

pffi-struct-offset-get member-name -> - number

-

Returns the offset of a struct member with given name.

-

pffi-struct-get

-

-

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

-

Returns the value of the givens struct member.

-

pffi-struct-set!

-

-

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-array-allocate

-

-

pffi-array-allocate type size

-

Allocates pointer array of given type and size.

-

pffi-array-pointer

-

-

pffi-array-pointer array

-

Returns the pointer of the array.

-

pffi-array?

-

-

pffi-array? object

-

Returns #t of given object is array, #f otherwise.

-

pffi-pointer->array

-

-

pffi-pointer->array pointer type size

-

Converts given pointer to an array of giben type and - size.

-

pffi-array-get

-

-

pffi-array-get array index

-

Returns the value of given index from given array.

-

pffi-array-set!

-

-

pffi-array-set! array index value

-

Sets the given value of given index in given array.

-

pffi-list->array

-

-

pffi-list->array type list

-

Converts given list into C array of given type.

-

pffi-array->list

-

-

pffi-array->list type list length

-

Converts given C array into list of given type and - length.

-

define-c-procedure

-

-

define-c-procedure scheme-name shared-object - c-name return-type argument-types

-

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

-
(cond-expand
-    (windows (define-c-library libc-stdlib '("stdlib.h") "ucrtbase" '("")))
-    (else (define-c-library libc-stdlib '("stdlib.h")  "c" '("" "6"))))
-(define-c-procedure c-puts libc-stdlib 'puts 'int '(pointer))
-(c-puts "Message brought to you by FFI!")
-

pffi-define-callback

-

-

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
-(cond-expand
-    (windows (define-c-library libc-stdlib '("stdlib.h") "ucrtbase" '()))
-    (else (define-c-library '("stdlib.h") "c" '("" "6"))))
-
-; Define C function that takes a callback
-(define-c-procedure qsort libc-stdlib 'qsort 'void '(pointer int int callback))
-
-; Define our callback
-(pffi-define-callback compare
-                      'int
-                      '(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 (make-c-bytevector (* (c-size-of 'int) 3)))
-(pffi-pointer-set! array 'int (* (c-size-of 'int) 0) 3)
-(pffi-pointer-set! array 'int (* (c-size-of 'int) 1) 2)
-(pffi-pointer-set! array 'int (* (c-size-of 'int) 2) 1)
-
-(display array)
-(newline)
-;> (3 2 1)
-
-; Sort the array
-(qsort array 3 (c-size-of 'int) compare)
-
-(display array)
-(newline)
-;> (1 2 3)
-
- - diff --git a/documentation/R7RS-PFFI.pdf b/documentation/R7RS-PFFI.pdf deleted file mode 100644 index 2ac5fa0bbb5735f5d2f8e63e0d88c1abdd9782ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73144 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 VFqpb`ghwzCbY=8tV@nf-{{ftN67K*2 diff --git a/documentation/foreign-c.html b/documentation/foreign-c.html new file mode 100644 index 0000000..e307073 --- /dev/null +++ b/documentation/foreign-c.html @@ -0,0 +1,325 @@ + + + + + (foreign c) a portable foreign function interface for +R7RS - 0.10.0 + + + +

(foreign c)

+

(foreign c) is a C foreign function interface (FFI) library + for R7RS. It is portable in the sense that it supports multiple + implementations, as opposed to being portable by conforming to + some specification.

+

The new readme is a work in progress.

+

Implementation table

+

Primitives 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
c-size-ofc-bytevector-u8-set!c-bytevector-u8-refdefine-c-libraryc-bytevector?define-c-procedure
ChibiXXXXXX
ChickenXXXXXX
GaucheXXXXXX
GuileXXXXXX
KawaXXXXXX
MoshXXXXXX
RacketXXXXXX
SaggittariusXXXXXX
StklosXXXXXX
YpsilonXXXXXX
+

Primitives 2

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
define-c-callback
Chibi
ChickenX
Gauche
GuileX
Kawa
MoshX
RacketX
SaggittariusX
Stklos
YpsilonX
+

Test files pass

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
primitives.scmaddressof.scmcallback.scm
ChibiXX
ChickenXXX
GaucheXX
GuileXXX
KawaXX
MoshXX
RacketX
SaggittariusXXX
StklosXX
YpsilonXX
+

Documentation

+

Types

+

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

+
    +
  • int8
  • +
  • uint8
  • +
  • int16
  • +
  • uint16
  • +
  • int32
  • +
  • uint32
  • +
  • int64
  • +
  • uint64
  • +
  • char
  • +
  • unsigned-char
  • +
  • short
  • +
  • unsigned-short
  • +
  • int
  • +
  • unsigned-int
  • +
  • long
  • +
  • unsigned-long
  • +
  • float
  • +
  • double
  • +
  • pointer
  • +
  • callback +
      +
    • Callback function
    • +
  • +
+

Primitives

+

(c-type-size type)

+

Returns the size of given C type.

+

(define-c-library scheme-name + headers object-name options) + 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

+

make-c-bytevector make-c-null c-null? c-free + native-endianness c-bytevector-s8-set! c-bytevector-s8-ref + c-bytevector-s16-set! c-bytevector-s16-ref + c-bytevector-s16-native-set! c-bytevector-s16-native-ref + c-bytevector-u16-set! c-bytevector-u16-ref + c-bytevector-u16-native-set! c-bytevector-u16-native-ref + c-bytevector-s32-set! c-bytevector-s32-ref + c-bytevector-s32-native-set! c-bytevector-s32-native-ref + c-bytevector-u32-set! c-bytevector-u32-ref + c-bytevector-u32-native-set! c-bytevector-u32-native-ref + c-bytevector-s64-set! c-bytevector-s64-ref + c-bytevector-s64-native-set! c-bytevector-s64-native-ref + c-bytevector-u64-set! c-bytevector-u64-ref + c-bytevector-u64-native-set! c-bytevector-u64-native-ref + c-bytevector-sint-set! c-bytevector-sint-ref + c-bytevector-uint-set! c-bytevector-uint-ref + c-bytevector-ieee-single-set! + c-bytevector-ieee-single-native-set! + c-bytevector-ieee-single-ref c-bytevector-ieee-single-native-ref + c-bytevector-ieee-double-set! + c-bytevector-ieee-double-native-set! + c-bytevector-ieee-double-ref c-bytevector-ieee-double-native-ref + bytevector->c-bytevector c-bytevector->bytevector + call-with-address-of

+

string->c-utf8 c-utf8->string

+ + diff --git a/documentation/foreign-c.pdf b/documentation/foreign-c.pdf new file mode 100644 index 0000000000000000000000000000000000000000..171e0a559de0c65979489cddf7f7dad352da8074 GIT binary patch literal 24119 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 literal 0 HcmV?d00001