Thanks db05.

So far i think the best technique is to use the SDL egg (which i think Mario pointed me at) as a reference. I believe it basically creates a blob and casts to the struct so the fields can be accessed.

Honestly at the moment, simply writing it in C looks more intelligible.

Geoff.

On 22/06/13 07:05, db05 wrote:
One possible solution read a whole object into predefined record

(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 <[email protected] <mailto:[email protected]>>:

    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
    [email protected]
    https://lists.nongnu.org/mailman/listinfo/chicken-users


_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to