(define-record inotify wd mask cookie len name)
; this function make record and pass it into hepler function
(define (read-event fd)
(c-read-event (make-inotify) fd))
; map inotify fields to record fields using lowlevel function C_block_item
(define c-read-event
(foreign-safe-lambda* void ((scheme-object res) (int fd))
"struct inotify_event* e;
char buffer[sizeof(*e) + MAX_PATH];
if (read(fd,buffer,sizeof(buffer)) < 0)
C_return(C_SCHEME_FALSE);
C_word* ptr = C_alloc(C_SIZEOF_STRING(e->len));
C_block_item(res,1) = C_fix(e->wd);
C_block_item(res,2) = C_fix(e->mask);
C_block_item(res,3) = C_fix(e->cookie);
C_block_item(res,4) = C_fix(e->len);
C_block_item(res,5) = C_string(&ptr,&e->name,numbytes);
C_return(res);"))
this should work but i worry that uint32 didnt't fit into the fixnum (C_fix stuff)
;; or something like this
(match (file-read fd 1000)
((data size)
(make-inotify wd: (read-uint32 data)
mask: (read-uint32 data)
cookie: (read-uint32 data)
len: (read-uint32 data)
name: (read-string data))))
o_O
06/20/13 23:58:52, Geoffrey <lordgeoff...@optusnet.com.au>:
Hi I am trying to declare of variably sized c struct as a foreign declaration.
The one i am after is:
struct inotify_event { int wd; /* Watch descriptor. */ uint32_t mask; /* Watch mask. */ uint32_t cookie; /* Cookie to synchronize two events. */ uint32_t len; /* Length (including NULs) of name. */ char name __flexarr; /* Name. */ }; Note that name field is variably sized. I believe in C you would allocate a larger block of memory and then cast it to (inotify_event*). By the skills of copy and paste i can do fixed size,and i can do a blob. But not a variable struct. Some help would be appreciated. Thanks_______________________________________________
Chicken-users mailing list
Chicken-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-users
_______________________________________________ Chicken-users mailing list Chicken-users@nongnu.org https://lists.nongnu.org/mailman/listinfo/chicken-users