|
52 | 52 | int32_t uint32_t |
53 | 53 | int64_t uint64_t |
54 | 54 | pointer callback |
55 | | - void |
| 55 | + void boolean |
56 | 56 | ___ |
57 | 57 |
|
58 | 58 | ;; pointer ref |
|
105 | 105 | size-of-float |
106 | 106 | size-of-double |
107 | 107 | size-of-pointer |
| 108 | + size-of-boolean |
108 | 109 | size-of-int8_t |
109 | 110 | size-of-int16_t |
110 | 111 | size-of-int32_t |
|
158 | 159 | (define-ftype int64_t int64) |
159 | 160 | (define-ftype uint64_t uint64) |
160 | 161 | (define-ftype pointer '*) |
| 162 | +(define-ftype boolean int8) ;; use int8 to make the size = 1 |
161 | 163 | (define ___ '___) ;; dummy |
162 | 164 |
|
163 | 165 | (define (open-shared-object path) |
|
175 | 177 | (cond ((ffi-type-descriptor? type) (ffi-type-descriptor-alias type)) |
176 | 178 | (else type))) |
177 | 179 |
|
178 | | -(define (make-c-function lib conv ffi:ret name ffi:arg-types) |
179 | | - (define arg-types (map ->native-type ffi:arg-types)) |
| 180 | +(define (make-c-function lib conv ffi:ret name arg-types) |
180 | 181 | (define ret (->native-type ffi:ret)) |
181 | 182 | (define (s->p s) (b->p (string->utf8 (string-append s "\x0;")))) |
182 | 183 | (define (b->p bv) (bytevector->pointer bv)) |
183 | 184 | (define ptr (lookup-shared-object lib (symbol->string name))) |
184 | 185 | (define (convert-arg type arg) |
185 | | - (case type |
186 | | - ((*) |
187 | | - (cond ((string? arg) (s->p arg)) |
188 | | - ((bytevector? arg) (b->p arg)) |
189 | | - ;; Let Guile complain, if not the proper |
190 | | - ;; one |
191 | | - (else arg))) |
192 | | - (else arg))) |
| 186 | + (cond ((eq? type pointer) |
| 187 | + (cond ((string? arg) (s->p arg)) |
| 188 | + ((bytevector? arg) (b->p arg)) |
| 189 | + ;; Let Guile complain, if not the proper |
| 190 | + ;; one |
| 191 | + (else arg))) |
| 192 | + ((eq? type boolean) |
| 193 | + (unless (boolean? arg) |
| 194 | + (assertion-violation name "Boolean is required" arg)) |
| 195 | + (if arg 1 0)) |
| 196 | + (else arg))) |
193 | 197 | (define (arg->type arg) |
194 | 198 | ;; it's a bit awkward but no other way |
195 | 199 | (cond ((number? arg) |
|
203 | 207 | ((real? arg) double) |
204 | 208 | (else (assertion-violation name "Unsuported number" arg)))) |
205 | 209 | ((or (string? arg) (bytevector? arg) (pointer? arg)) pointer) |
| 210 | + ((boolean? arg) boolean) |
206 | 211 | (else (assertion-violation name "Unsuported type" arg)))) |
207 | | - |
| 212 | + (define (convert-ret type r) |
| 213 | + (cond ((eq? type boolean) (eqv? r 1)) |
| 214 | + (else r))) |
208 | 215 | (cond ((memq ___ arg-types) => |
209 | 216 | (lambda (l) |
210 | 217 | (unless (null? (cdr l)) |
211 | | - (assertion-violation |
212 | | - 'make-c-function |
213 | | - "___ must be the last of argument type" |
214 | | - arg-types)) |
| 218 | + (assertion-violation 'make-c-function |
| 219 | + "___ must be the last of argument type" arg-types)) |
215 | 220 | (let ((required-args (remove (lambda (e) (eq? ___ e)) arg-types))) |
216 | 221 | (lambda args* |
217 | 222 | (let-values (((required rest) |
218 | 223 | (split-at args* (- (length required-args) 1)))) |
219 | 224 | (let* ((real-arg-types (append (drop-right arg-types 1) |
220 | 225 | (map arg->type rest))) |
221 | | - (fp (pointer->procedure ret ptr real-arg-types))) |
222 | | - (apply fp (map convert-arg real-arg-types args*)))))))) |
| 226 | + (fp (pointer->procedure ret ptr |
| 227 | + (map ->native-type real-arg-types)))) |
| 228 | + (convert-ret ffi:ret |
| 229 | + (apply fp (map convert-arg real-arg-types args*))))))))) |
223 | 230 | (else |
224 | | - (let ((fp (pointer->procedure ret ptr arg-types))) |
| 231 | + (let ((fp (pointer->procedure ret ptr (map ->native-type arg-types)))) |
225 | 232 | (lambda args* |
226 | | - (apply fp (map convert-arg arg-types args*))))))) |
| 233 | + (convert-ret ffi:ret |
| 234 | + (apply fp (map convert-arg arg-types args*)))))))) |
227 | 235 |
|
228 | 236 | (define (make-c-callback ret args proc) |
229 | 237 | (procedure->pointer (->native-type ret) proc (map ->native-type args))) |
|
326 | 334 | (define-sizeof int16_t) |
327 | 335 | (define-sizeof int32_t) |
328 | 336 | (define-sizeof int64_t) |
| 337 | +(define-sizeof boolean) |
329 | 338 | ;; for define-deref |
330 | 339 | (define size-of-unsigned-char size-of-char) |
331 | 340 | (define size-of-unsigned-short size-of-short) |
|
0 commit comments