summaryrefslogtreecommitdiffstats
path: root/ffi.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-23 06:23:27 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-23 06:23:27 -0700
commitaf052dcb0df9aeb5411ba8b60f1890dd46cc6c35 (patch)
tree31524cb2d555fc62ebfa09940e9482a8aaf08639 /ffi.h
parentee064377143aa9cefb503bf0c277929a7ca641a1 (diff)
downloadtxr-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.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/ffi.h b/ffi.h
index ee09ebf5..34aca3c6 100644
--- a/ffi.h
+++ b/ffi.h
@@ -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);