Updating readme
This commit is contained in:
parent
607c8a3b84
commit
13f6c9241e
218
README.md
218
README.md
|
|
@ -168,27 +168,201 @@ initialisation run.
|
||||||
|
|
||||||
#### pffi-size-of
|
#### pffi-size-of
|
||||||
|
|
||||||
**pffi-size-of** type
|
**pffi-size-of** type -> number
|
||||||
|
|
||||||
|
Returns the size of the type.
|
||||||
|
|
||||||
|
|
||||||
pffi-align-of
|
#### pffi-align-of
|
||||||
pffi-shared-object-auto-load
|
|
||||||
pffi-shared-object-load
|
**pffi-align-of** type -> number
|
||||||
pffi-pointer-null
|
|
||||||
pffi-pointer-null?
|
Returns the align of the type.
|
||||||
pffi-pointer-allocate
|
|
||||||
pffi-pointer?
|
#### pffi-shared-object-auto-load
|
||||||
pffi-pointer-free
|
|
||||||
pffi-pointer-set!
|
TODO
|
||||||
pffi-pointer-get
|
|
||||||
pffi-string->pointer
|
#### pffi-shared-object-load
|
||||||
pffi-pointer->string
|
|
||||||
pffi-struct-make
|
**pffi-shared-object-load** headers path
|
||||||
pffi-struct-size
|
|
||||||
pffi-struct-pointer
|
It is recommended to use the pffi-shared-object-auto-load instead of this
|
||||||
pffi-struct-offset-get
|
directly.
|
||||||
pffi-struct-offset-get
|
|
||||||
pffi-struct-get
|
Headers is a list of strings needed to be included, for example
|
||||||
pffi-struct-set!
|
|
||||||
pffi-define
|
(list "curl/curl.h")
|
||||||
pffi-define-callback
|
|
||||||
|
Path is the full path of the shared object without any "lib" prefix or ".so/.dll" suffix. For example:
|
||||||
|
|
||||||
|
"curl"
|
||||||
|
|
||||||
|
### pffi-pointer-null
|
||||||
|
|
||||||
|
**pffi-pointer-null** -> pointer
|
||||||
|
|
||||||
|
Returns a new NULL pointer.
|
||||||
|
|
||||||
|
#### pffi-pointer-null?
|
||||||
|
|
||||||
|
**pffi-pointer-null?** pointer -> boolean
|
||||||
|
|
||||||
|
Returns #t if given pointer is null pointer, #f otherwise.
|
||||||
|
|
||||||
|
### pffi-pointer-allocate
|
||||||
|
|
||||||
|
**pffi-pointer-allocate** size -> pointer
|
||||||
|
|
||||||
|
Returns newly allocated pointer of given size.
|
||||||
|
|
||||||
|
### pffi-pointer?
|
||||||
|
|
||||||
|
**pffi-pointer?** object -> boolean
|
||||||
|
|
||||||
|
Returns #t if given object is pointer, #f otherwise.
|
||||||
|
|
||||||
|
|
||||||
|
### pffi-pointer-free
|
||||||
|
|
||||||
|
**pffi-pointer-free** pointer
|
||||||
|
|
||||||
|
Frees given pointer.
|
||||||
|
|
||||||
|
### pffi-pointer-set!
|
||||||
|
|
||||||
|
**pffi-pointer-set!** pointer type offset value
|
||||||
|
|
||||||
|
Sets the value on a pointer on given offset. For example:
|
||||||
|
|
||||||
|
(define p (pffi-pointer-allocate 128))
|
||||||
|
(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 (pffi-pointer-allocate 128))
|
||||||
|
(pffi-pointer-set! p 'int 64 100)
|
||||||
|
(pffi-pointer-get p 'int 64)
|
||||||
|
> 100
|
||||||
|
|
||||||
|
### pffi-string->pointer
|
||||||
|
|
||||||
|
**pffi-string->pointer** string -> pointer
|
||||||
|
|
||||||
|
Makes pointer out of a given string.
|
||||||
|
|
||||||
|
### pffi-pointer->string
|
||||||
|
|
||||||
|
**pffi-pointer->string** pointer -> string
|
||||||
|
|
||||||
|
Makes string out of a given pointer.
|
||||||
|
|
||||||
|
### pffi-struct-make
|
||||||
|
|
||||||
|
**pffi-struct-make** name 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 s (pffi-struct-make 'test '((int . r) (int . g) (int . b))))
|
||||||
|
|
||||||
|
### pffi-struct-size
|
||||||
|
|
||||||
|
**pffi-struct-size** pffi-struct -> number
|
||||||
|
|
||||||
|
Returns the size of a given pffi-struct. For example:
|
||||||
|
|
||||||
|
(define s (pffi-struct-make 'test '((int . r) (int . g) (int . b))))
|
||||||
|
(pffi-struct-size s)
|
||||||
|
> 12
|
||||||
|
|
||||||
|
### 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-define
|
||||||
|
|
||||||
|
**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
|
||||||
|
|
||||||
|
**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)
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
pffi-struct-size
|
pffi-struct-size
|
||||||
pffi-struct-pointer
|
pffi-struct-pointer
|
||||||
pffi-struct-offset-get
|
pffi-struct-offset-get
|
||||||
pffi-struct-offset-get
|
|
||||||
pffi-struct-get
|
pffi-struct-get
|
||||||
pffi-struct-set!
|
pffi-struct-set!
|
||||||
pffi-define
|
pffi-define
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue