summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-05-20 16:58:34 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-05-20 16:58:34 -0700
commita7517ded29c1c3bf8a50b2ce690bcfac575db350 (patch)
tree5223e5bde27713fa354f4a07f69c610b8de1e224 /share
parent765548d93ca58734805e2932565398fe31d5a517 (diff)
downloadtxr-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.tl15
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)))