summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-03-21 06:16:43 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-03-21 06:16:43 -0700
commitaf8b7db50fcc3ed34bfe1136d1664d59e89ba1a9 (patch)
tree14a7981e70ecc67f165e848dd4e3d0a7349d8671 /ffi.c
parent3ce67812ebbbb8c0a82d77a72f565cda40bdec73 (diff)
downloadtxr-af8b7db50fcc3ed34bfe1136d1664d59e89ba1a9.tar.gz
txr-af8b7db50fcc3ed34bfe1136d1664d59e89ba1a9.tar.bz2
txr-af8b7db50fcc3ed34bfe1136d1664d59e89ba1a9.zip
New FFI types str-s, bstr-s and wstr-s.
These types actually make it possible to receive a string by pointer from a C function, without trying to free it. It is now possible to write a FFI wrapper for strtol or wcstol, which is done in the new test case. * ffi.c (str_s_s, bstr_s_s, wstr_s_s): New symbol variables. (ffi_init_types): Register the types str-s, bstr-s and wstr-s. (ffi_init): Intern the new symbols. * tests/017/str-s.tl: New file. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'ffi.c')
-rw-r--r--ffi.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/ffi.c b/ffi.c
index 268a7a46..2bb52d29 100644
--- a/ffi.c
+++ b/ffi.c
@@ -135,7 +135,7 @@ val array_s, zarray_s, carray_s;
val union_s;
-val str_d_s, wstr_s, wstr_d_s, bstr_s, bstr_d_s;
+val str_d_s, str_s_s, wstr_s, wstr_d_s, wstr_s_s, bstr_s, bstr_d_s, bstr_s_s;
val buf_d_s;
@@ -4614,6 +4614,26 @@ static void ffi_init_types(void)
ffi_bstr_put, ffi_bstr_d_get,
0, 0));
+ ffi_typedef(str_s_s, make_ffi_type_builtin(str_s_s, str_s, FFI_KIND_PTR,
+ sizeof (mem_t *),
+ alignof (mem_t *),
+ &ffi_type_pointer,
+ ffi_ptr_out_null_put, ffi_str_get,
+ 0, 0));
+
+ ffi_typedef(wstr_s_s, make_ffi_type_builtin(wstr_s_s, str_s, FFI_KIND_PTR,
+ sizeof (mem_t *),
+ alignof (mem_t *),
+ &ffi_type_pointer,
+ ffi_ptr_out_null_put, ffi_wstr_get,
+ 0, 0));
+
+ ffi_typedef(bstr_s_s, make_ffi_type_builtin(bstr_s_s, str_s, FFI_KIND_PTR,
+ sizeof (mem_t *),
+ alignof (mem_t *),
+ &ffi_type_pointer,
+ ffi_ptr_out_null_put, ffi_bstr_get,
+ 0, 0));
{
val iter;
@@ -6772,10 +6792,13 @@ void ffi_init(void)
carray_s = intern(lit("carray"), user_package);
union_s = intern(lit("union"), user_package);
str_d_s = intern(lit("str-d"), user_package);
+ str_s_s = intern(lit("str-s"), user_package);
wstr_s = intern(lit("wstr"), user_package);
wstr_d_s = intern(lit("wstr-d"), user_package);
+ wstr_s_s = intern(lit("wstr-s"), user_package);
bstr_s = intern(lit("bstr"), user_package);
bstr_d_s = intern(lit("bstr-d"), user_package);
+ bstr_s_s = intern(lit("bstr-s"), user_package);
buf_d_s = intern(lit("buf-d"), user_package);
ptr_in_s = intern(lit("ptr-in"), user_package);
ptr_out_s = intern(lit("ptr-out"), user_package);