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 vals 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]