c-struct
| Definition: |
struct identifier "<c-string>" end struct |
| Description: |
For interfacing to C, the field definitions should be defined using a single C string, usually triple-quoted, copied verbatim from eg MSDN or some .h file.
Note that embedded TCHAR[] and similar fields are not handled by struct’s use of cffi.e. The field definitions may contain comments, however they
must be C-style, ie/eg // comment or /* comment */, not -- comment.
This allows similar mechanisms for creation and dot-notation access of fields, however passing the final structure to a C function now needs to use the struct_mem() routine, but is otherwise unchanged. |
| pwa/p2js: | Not supported. |
| Example: |
struct rect """
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
"""
end struct
rect q = new({10,10,350,200}),
r = new()
r.left = 10 --\ equivalent to using the
r.top = 10 -- } {10,10,350,200} above
r.right = 350 -- } and/or m = allocate(16)
r.bottom = 200 --/ & poke4(m+0/4/8/12,..).
-- then eg c_proc(xFillRect,{hDC,struct_mem(r|q)|m,hBrush})
The above definition of RECT was originally copied completely unaltered from http://msdn.microsoft.com/en-us/library/dd162897. Using a C string allows you to specify byte/char/uchar/short/ushort/int/uint/long/ulong/long long, etc as well as things like unions and nested [C] structs, without the tedious and error-prone manual conversion to machine_word()-specific offsets and sizes, however the actual routine call remains via c_func() or c_proc(), although you can also still use define_cffi_func() and define_cffi_proc(). Typically I would expect any interface to C routines to be written once in a separate re-usable library component and pretty much never looked at again (sort of like a few things in builtins and Other Libraries, not that any use c-structs yet), that is rather than scattered thoughout the source code of an application (or several). As such, the slightly-nicer syntax for accessing fields is probably not really all that helpful, in hindsight, although it has long been a fairly regular request. |
| Implementation: | As per struct, which goes on to use the pre-existing cffi. |