diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-03-21 06:16:43 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-03-21 06:16:43 -0700 |
commit | af8b7db50fcc3ed34bfe1136d1664d59e89ba1a9 (patch) | |
tree | 14a7981e70ecc67f165e848dd4e3d0a7349d8671 /ffi.c | |
parent | 3ce67812ebbbb8c0a82d77a72f565cda40bdec73 (diff) | |
download | txr-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.c | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -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); |