Hi,
Version with conversion to/from string:
(define (_string/locale/len n) ; n - bytes, not characters
(make-ctype (make-array-type _byte n)
;->C
(lambda (in)
(cond
[(not in)
(make-bytes n)]
[(string? in)
(define bs (string->bytes/locale in))
(cond
[((bytes-length bs) . >= . n) ; len+1 > n
(error '_string/locale/len "string is too
long\n~v" in)]
[else
(define out (make-bytes n))
(bytes-copy! out 0 bs)
out])]
[else
(error '_string/locale/len "expected string? or #f,
got ~v" in)]))
;->racket
(lambda (in)
(define bs (make-sized-byte-string in n))
(define len
(for/fold ([acc 0])
([b (in-bytes bs)]
[pos (in-naturals)]
#:final (zero? b))
pos))
(define sub-bs (subbytes bs 0 len))
(bytes->string/locale sub-bs))))
I would use this:
(define camera-text-size (* 32 1024))
(define-cstruct _CameraText ([value (_string/locale/len camera-text-size)]))
For passing as a parameter to 'gp_camera_get_about':
(define cam-text (make-CameraText #f))
13.11.2014 20:00, Bartosz Przygoda пишет:
Hello,
I'm trying to make racket bindings for libgphoto2. Its API uses CameraText
struct for outputting strings, which just wraps char array.
My first attempt was:
(define _Camera-ptr (_cpointer 'Camera))
(define _CameraText-ptr (_cpointer 'CameraText))
(define-gphoto gp_camera_get_about
(_fun _Camera-ptr (v : _CameraText-ptr) _GPContext-ptr
-> _int))
But this was giving me segfaults (not to mention the pointer here is opaque
and there are no getter functions in API).
Later on I've stumbled across
https://github.com/dyoo/ffi-tutorial/blob/master/ffi/tutorial/examples/struct-with-array/struct-with-array.rkt
so I've tried this:
(define _Camera-ptr (_cpointer 'Camera))
(define camera-text-size (* 32 1024))
(define-cstruct _CameraText ([text (_bytes/len (camera-text-size))]))
(define-gphoto gp_camera_get_about
(_fun _Camera-ptr (v : _CameraText-pointer) _GPContext-ptr
-> _int))
(Where bytes/len is helper taken from that example)
How can I initialize this struct to mimic C CameraText txt;? Is there some
better way to handle char arrays (and converting them to strings) than
_byte array? Or should I go with something like (but this was segfaulting
as well):
(define-cstruct _CameraText ([text _string]))
____________________
Racket Users list:
http://lists.racket-lang.org/users
____________________
Racket Users list:
http://lists.racket-lang.org/users