On 2006-maj-10, at 17:19, Frank Goenninger wrote:
typedef unsigned long   tcflag_t;
typedef unsigned char   cc_t;
typedef long            speed_t;        /* XXX should be unsigned long */

struct termios {
        tcflag_t        c_iflag;        /* input flags */
        tcflag_t        c_oflag;        /* output flags */
        tcflag_t        c_cflag;        /* control flags */
        tcflag_t        c_lflag;        /* local flags */
        cc_t            c_cc[NCCS];     /* control chars */
        speed_t         c_ispeed;       /* input speed */
        speed_t         c_ospeed;       /* output speed */
};
>
with NCCS being #define'd to 20.

CFFI> (defctype tcflag :unsigned-long)
TCFLAG
CFFI> (defctype cc :unsigned-char)
CC
CFFI> (defctype speed :long)
SPEED
CFFI> (defcstruct termios
        (iflag tcflag)
        (oflag tcflag)
        (cflag tcflag)
        (lflag tcflag)
        (cc cc :count 20)
        (ispeed speed)
        (ospeed speed))
TERMIOS
CFFI> (foreign-type-size 'termios)
44
CFFI> (foreign-alloc 'termios)
#.(SB-SYS:INT-SAP #X00600450) ; pointer to 44 newly allocated bytes
CFFI>


I need to allocate space for this struct and therefore want to know its size ... As I don't need the struct itself I thought about calculating the size but I figure there's the problem of getting all the padding to count to the size...

The size depends on the target platform. Different combinations of CPUs/OSs have different rules for struct alignment and different sizes for types, so your best bet is to define the struct anyway.

--
Luís Oliveira
http://student.dei.uc.pt/~lmoliv/


_______________________________________________
cffi-devel mailing list
cffi-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel

Reply via email to