diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-23 06:23:27 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-23 06:23:27 -0700 |
commit | af052dcb0df9aeb5411ba8b60f1890dd46cc6c35 (patch) | |
tree | 31524cb2d555fc62ebfa09940e9482a8aaf08639 /ffi.h | |
parent | ee064377143aa9cefb503bf0c277929a7ca641a1 (diff) | |
download | txr-af052dcb0df9aeb5411ba8b60f1890dd46cc6c35.tar.gz txr-af052dcb0df9aeb5411ba8b60f1890dd46cc6c35.tar.bz2 txr-af052dcb0df9aeb5411ba8b60f1890dd46cc6c35.zip |
ffi: provide support for unions.
* ffi.c (union_s): New symbol variable.
(ffi_find_memb, ffi_memb_not_found): New static functions.
(ffi_union_in, ffi_union_put, ffi_union_get): New static
functions.
(make_ffi_type_union): New static function.
(ffi_struct_compile): Handle union syntax using
ffi_struct_compile to compile the member definitions to types,
and make_ffi_type_union to produce the type node.
(struct uni): New struct type.
(uni_struct, uni_struct_checked): New static functions.
(union_destroy_op, union_mark_op): New static functions.
(union_ops): New static struct.
(make_union_common, make_union_tft): New static functions.
(union_get_ptr, make_union, union_members, union_get,
union_put, union_in, union_out): New functions.
(ffi_init): Initialize union_s. Register intrinsics
make-union, union-members, union-get, union-put, union-in,
union-out.
* ffi.h (union_s, union_get_ptr, make_union, union_members,
union_get, union_put, union_in, union_out): Declared.
* txr.1: Documented unions.
Diffstat (limited to 'ffi.h')
-rw-r--r-- | ffi.h | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -51,7 +51,7 @@ extern val le_float_s, le_double_s; extern val array_s, zarray_s, carray_s; -extern val struct_s; +extern val struct_s, union_s; extern val str_d_s, wstr_s, wstr_d_s, bstr_s, bstr_d_s; @@ -121,4 +121,11 @@ val unum_carray(val carray); val num_carray(val carray); val put_carray(val carray, val offs, val stream); val fill_carray(val carray, val offs, val stream); +mem_t *union_get_ptr(val uni); +val make_union(val type); +val union_members(val uni); +val union_get(val uni, val memb); +val union_put(val uni, val memb, val newval); +val union_in(val uni, val memb, val memb_obj); +val union_out(val uni, val memb, val memb_obj); void ffi_init(void); |