On Tue, Oct 21, 2008 at 09:20:30AM +1100, konrad Zielinski wrote: > THe interesting thing will be handling C structs. As almost every > interesting C API makes heavy use of them.
Well, you know, I don't want to discuss such things prematurely. But as you insist ... ;-) Consulting my last year's notes, I think I had something like the following in mind: There is a function (native "fun" "lib" <ret> <val> ..) Actually, I don't like the name 'native'. Would prefer something shorter. Perhaps just 'c' or 'C'? "fun" is the name of a symbol in the library "lib". It is located with dlopen() and dlsym() as before. <ret> and the <val>s specify the return value, followed by the arguments. These structures are interpreted by 'native', building up appropriate data structures. C structures are defined as nested lists. I thought of the following primitive types: A address B byte C char I int L long D double NIL void An uninitialized character array of 8 characters would be (C . 8) while an array of 8 zero characters is (C 0 0 0 0 0 0 0 0) That is, an atomic CDR is a size spec, while a list contains one or more initializers. A structure struct { int i[2]; double d; char c[32]; }; would be written as ((I . 2) D (C . 32)) A function call to allocate four of these structures: (setq Stat '((I . 2) D (C . 32)) Ptr (native "malloc" "libc.so" A (I (* 4 (sizeof Stat)))) ) So 'native' knows that it has to return a pointer 'A', and to pass a single integer with the value (* 4 (sizeof Stat)) to 'malloc'. 'sizeof' is system dependent, knowing of the sizes of individual primitive types. Then we have a function 'struct' which takes a structure specification and a memory pointer, and either stores an s-expression in memory (if a third argument is given), or builds an s-expression from memory (if not): (struct Stat Ptr '((3 4) 123000 "test")) (struct Stat Ptr) -> ((3 4) 123000 "test") That all I have at the momen. Cheers, - Alex -- UNSUBSCRIBE: mailto:[EMAIL PROTECTED]