diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-05-04 20:11:25 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-05-04 20:11:25 -0700 |
commit | 7246e3eff36f290b207b203c40f90850ddd031e8 (patch) | |
tree | 164e37604c974fd49c3412580839bf82b20e86fd /ffi.c | |
parent | 5810e55fb63872657f2e5598313684f5341b382a (diff) | |
download | txr-7246e3eff36f290b207b203c40f90850ddd031e8.tar.gz txr-7246e3eff36f290b207b203c40f90850ddd031e8.tar.bz2 txr-7246e3eff36f290b207b203c40f90850ddd031e8.zip |
ffi: implement bchar type.
bchar is like uchar, except that in the decode direction,
it produces character objects rather than integers.
* ffi.c (bchar_s): New symbol variable.
(ffi_bchar_get): New static function.
(ffi_init_types): Register bchar type.
(ffi_init): Initialize bchar_s.
* ffi.h (bchar_s): Declared.
Diffstat (limited to 'ffi.c')
-rw-r--r-- | ffi.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -62,7 +62,7 @@ val uint16_s, int16_s; val uint32_s, int32_s; val uint64_s, int64_s; -val char_s, uchar_s, wchar_s; +val char_s, uchar_s, bchar_s, wchar_s; val short_s, ushort_s; val int_s, uint_s; val long_s, ulong_s; @@ -394,6 +394,11 @@ static val ffi_uchar_get(struct txr_ffi_type *tft, mem_t *src, val self) return num_fast(*src); } +static val ffi_bchar_get(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return chr(*src); +} + static void ffi_short_put(struct txr_ffi_type *tft, val n, mem_t *dst, val self) { @@ -1378,6 +1383,9 @@ static void ffi_init_types(void) ffi_uchar_put, ffi_uchar_get)); ffi_typedef(char_s, make_ffi_type_builtin(char_s, integer_s, 1, ffi_char, ffi_char_put, ffi_char_get)); + ffi_typedef(bchar_s, make_ffi_type_builtin(bchar_s, char_s, + sizeof (char), &ffi_type_uchar, + ffi_uchar_put, ffi_bchar_get)); ffi_typedef(wchar_s, make_ffi_type_builtin(wchar_s, char_s, sizeof (wchar_t), &ffi_type_wchar, ffi_wchar_put, ffi_wchar_get)); @@ -1778,6 +1786,7 @@ void ffi_init(void) int64_s = intern(lit("int64"), user_package); char_s = intern(lit("char"), user_package); uchar_s = intern(lit("uchar"), user_package); + bchar_s = intern(lit("bchar"), user_package); wchar_s = intern(lit("wchar"), user_package); short_s = intern(lit("short"), user_package); ushort_s = intern(lit("ushort"), user_package); |