summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-27 06:56:58 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-27 06:56:58 -0700
commit4d47909dbe082a6a8313f888290543cb0765b969 (patch)
treee452bf485ae61bcd48e129b8fefee62932ffcb82 /ffi.c
parent52870f75e9423ae12ac9b3254e4097520c20af86 (diff)
downloadtxr-4d47909dbe082a6a8313f888290543cb0765b969.tar.gz
txr-4d47909dbe082a6a8313f888290543cb0765b969.tar.bz2
txr-4d47909dbe082a6a8313f888290543cb0765b969.zip
ffi: new enumed type operator: enums with base type.
* ffi.c (enumed_s): New symbol variable. (ffi_type_compile): New case for enumed type op. (ffi_init): Initialize enumed_s. * ffi.h (enumed_s): Declared. * txr.1: enumed documented.
Diffstat (limited to 'ffi.c')
-rw-r--r--ffi.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/ffi.c b/ffi.c
index ca8ab24b..c4f5bcd1 100644
--- a/ffi.c
+++ b/ffi.c
@@ -123,7 +123,7 @@ val closure_s;
val sbit_s, ubit_s, bit_s;
-val enum_s;
+val enum_s, enumed_s;
val align_s;
@@ -3487,6 +3487,17 @@ val ffi_type_compile(val syntax)
lit("~a: enum name ~s must be bindable symbol or nil"),
self, name, nao);
return make_ffi_type_enum(xsyntax, enums, ffi_type_lookup(int_s), self);
+ } else if (sym == enumed_s) {
+ val base_type_syntax = cadr(syntax);
+ val name = caddr(syntax);
+ val enums = cdddr(syntax);
+ val xsyntax = list(enumed_s, base_type_syntax, name, nao);
+ val base_type = ffi_type_compile(base_type_syntax);
+ if (name && !bindable(name))
+ uw_throwf(error_s,
+ lit("~a: enum name ~s must be bindable symbol or nil"),
+ self, name, nao);
+ return make_ffi_type_enum(xsyntax, enums, base_type, self);
} else if (sym == align_s) {
val align = ffi_eval_expr(cadr(syntax), nil, nil);
ucnum al = c_num(align);
@@ -5339,6 +5350,7 @@ void ffi_init(void)
ubit_s = intern(lit("ubit"), user_package);
bit_s = intern(lit("bit"), user_package);
enum_s = intern(lit("enum"), user_package);
+ enumed_s = intern(lit("enumed"), user_package);
align_s = intern(lit("align"), user_package);
bool_s = intern(lit("bool"), user_package);
ffi_type_s = intern(lit("ffi-type"), user_package);