diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-05-20 16:58:34 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-05-20 16:58:34 -0700 |
commit | a7517ded29c1c3bf8a50b2ce690bcfac575db350 (patch) | |
tree | 5223e5bde27713fa354f4a07f69c610b8de1e224 /share | |
parent | 765548d93ca58734805e2932565398fe31d5a517 (diff) | |
download | txr-a7517ded29c1c3bf8a50b2ce690bcfac575db350.tar.gz txr-a7517ded29c1c3bf8a50b2ce690bcfac575db350.tar.bz2 txr-a7517ded29c1c3bf8a50b2ce690bcfac575db350.zip |
ffi: new macro, deffi-var.
* lisplib.c (ffi_set_entries): Autload entry for "deffi-var".
* share/txr/stdlib/ffi.tl (deffi-var): New macro.
* txr.1: Documented.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/ffi.tl | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/share/txr/stdlib/ffi.tl b/share/txr/stdlib/ffi.tl index ce497d17..69a19a1e 100644 --- a/share/txr/stdlib/ffi.tl +++ b/share/txr/stdlib/ffi.tl @@ -96,6 +96,21 @@ (defmacro deffi-cb-unsafe (:form f name rettype argtypes) (sys:deffi-cb-expander f name rettype argtypes nil nil)) +(defmacro deffi-var (:form f name var-expr type) + (let ((var-ref (cond + ((stringp var-expr) + ^(dlsym-checked sys:ffi-lib ,var-expr)) + ((consp var-expr) + (mac-param-bind f (sym ver) var-expr + ^(dlvsym-checked sys:ffi-lib ,sym ,ver))) + (t var-expr))) + (type-sym (gensym "type-")) + (var-sym (gensym "var-"))) + ^(progn + (defvarl ,type-sym (ffi ,type)) + (defvarl ,var-sym (carray-cptr ,var-ref ,type-sym 1)) + (defsymacro ,name (carray-ref ,var-sym 0))))) + (defmacro sizeof (type) (ffi-size (ffi-type-compile type))) |