Skip to content

Commit 92c446e

Browse files
committed
Adding convenient form for define-foreign-variable
1 parent c5dc312 commit 92c446e

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ PFFI is a portable foreign function interface for R6RS Scheme implementations.
2020
- `define-type-alias` is introduced, similar usage as `typedef` in C.
2121
- `boolean` support for Scheme boolean.
2222
- Supporting array foreign variable.
23+
- Supporting `(* type)` pointer form for foreign variable.
2324
- Empty struct, i.e. `(define-foreign-struct foo)`, is supported
2425

2526
## Example
@@ -85,6 +86,7 @@ Callback object may not be released automatically so it is user's responsibilty
8586
to make sure to release it.
8687

8788
#### [Macro] `define-foreign-variable` _shared-object_ _type_ _symbol-name_ [_scheme-name_]
89+
#### [Macro] `define-foreign-variable` _shared-object_ (* _type_) _symbol-name_ [_scheme-name_]
8890
#### [Macro] `define-foreign-variable` _shared-object_ (array _type_) _symbol-name_ [_scheme-name_]
8991

9092
Lookup foreign variable _symbol-name_ from given _shared-object_ and binds it
@@ -100,7 +102,9 @@ procedure.
100102
The bound variable is settable, thus `set!` syntax can change the value
101103
if it's allowed.
102104

103-
If the second form is used, then the it creates an reference to an array
105+
If the second form is a readable form of specifying `pointer` as type.
106+
107+
If the third form is used, then the it creates an reference to an array
104108
pointer, and the _scheme-name_ will be a macro of 3 patterns:
105109

106110
`_scheme-name_`: to return the raw pointer of the array.

src/pffi/variable.sls

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,14 @@
4646
(string->symbol
4747
(string-map (lambda (c) (if (char=? c #\_) #\- c))
4848
(string-downcase (symbol->string (syntax->datum name))))))
49-
(syntax-case x (array)
49+
(syntax-case x (* array)
5050
((k lib type name)
5151
(with-syntax ((scheme-name
5252
(datum->syntax #'k (->scheme-name #'name))))
5353
#'(k lib type name scheme-name)))
54+
((k lib (* type) name scheme-name)
55+
(identifier? #'type)
56+
#'(k lib pointer name scheme-name))
5457
((k lib type name scheme-name)
5558
(identifier? #'type)
5659
#'(begin
@@ -61,6 +64,7 @@
6164
(identifier-syntax
6265
(_ (pointer-ref dummy 0))
6366
((set! _ e) (pointer-set! dummy 0 e))))))
67+
6468
((k lib (array type) name scheme-name)
6569
(identifier? #'type)
6670
#'(begin

tests/functions.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,18 @@ void free_st_values(struct st2 *st)
102102
}
103103

104104
/* for boolean test */
105-
int is_even(int n) {
105+
int is_even(int n)
106+
{
106107
return n % 2 == 0;
107108
}
108109

109-
int is_odd(int n) {
110+
int is_odd(int n)
111+
{
110112
return n % 2 != 0;
111113
}
112114

113-
int check_dispatch(int n, int check_even) {
115+
int check_dispatch(int n, int check_even)
116+
{
114117
if (check_even) {
115118
return is_even(n);
116119
} else {
@@ -125,4 +128,13 @@ int * get_int_array() {
125128
return int_array;
126129
}
127130

131+
extern int * int_pointer;
132+
static int int_value = 100;
133+
int * int_pointer = &int_value;
134+
135+
int initial_int_pointer_value()
136+
{
137+
return int_value;
138+
}
139+
128140
/* TODO more */

tests/test.scm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,4 +387,14 @@
387387
(define-foreign-struct ok)
388388
(test-equal "size of empty struct" 0 size-of-ok))
389389

390+
;; pointer variable
391+
(let ()
392+
(define-foreign-variable test-lib (* int) int_pointer)
393+
394+
(let ((value ((foreign-procedure test-lib int initial_int_pointer_value ()))))
395+
(test-assert "pointer value" (pointer? int-pointer))
396+
(test-assert "pointer vs actual value (1)" (not (equal? value int-pointer)))
397+
398+
(test-equal "pointer value (1)" value (pointer-ref-c-int int-pointer 0))))
399+
390400
(test-end)

0 commit comments

Comments
 (0)