diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-05 06:21:52 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-05 06:21:52 -0700 |
commit | 936e52d347430fe6f60de29f8cfce44435d5094e (patch) | |
tree | e938d6f6b71e226829bfff30513ea80fe5884af0 /ffi.c | |
parent | e539fbc2af3bd4a5bd4ca3d9b567862005509aa1 (diff) | |
download | txr-936e52d347430fe6f60de29f8cfce44435d5094e.tar.gz txr-936e52d347430fe6f60de29f8cfce44435d5094e.tar.bz2 txr-936e52d347430fe6f60de29f8cfce44435d5094e.zip |
ffi: handle endian types as return values.
* ffi.c (ffi_be_i16_rput, ffi_be_i16_rget, ffi_be_u16_rput,
ffi_be_u16_rget, ffi_be_i32_rput, ffi_be_i32_rget,
ffi_be_u32_rput, ffi_be_u32_rget, ffi_le_i16_rput,
ffi_le_i16_rget, ffi_le_u16_rput, ffi_le_u16_rget,
ffi_le_i32_rput, ffi_le_i32_rget, ffi_le_u32_rput,
ffi_le_u32_rget): New static functions, on big endian.
(ffi_init_types): Wire in these functions for their
corresponding types, on big endian.
Diffstat (limited to 'ffi.c')
-rw-r--r-- | ffi.c | 128 |
1 files changed, 120 insertions, 8 deletions
@@ -1562,6 +1562,102 @@ static val ffi_wchar_rget(struct txr_ffi_type *tft, mem_t *src, val self) return chr(c); } +static void ffi_be_i16_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 6); + ffi_be_i16_put(tft, n, dst + 6, self); +} + +static val ffi_be_i16_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_be_i16_get(tft, src + 6, self); +} + +static void ffi_be_u16_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 6); + ffi_be_u16_put(tft, n, dst + 6, self); +} + +static val ffi_be_u16_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_be_u16_get(tft, src + 6, self); +} + +static void ffi_be_i32_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 4); + ffi_be_i32_put(tft, n, dst + 4, self); +} + +static val ffi_be_i32_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_be_i32_get(tft, src + 4, self); +} + +static void ffi_be_u32_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 4); + ffi_be_u32_put(tft, n, dst + 4, self); +} + +static val ffi_be_u32_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_be_u32_get(tft, src + 4, self); +} + +static void ffi_le_i16_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 6); + ffi_le_i16_put(tft, n, dst + 6, self); +} + +static val ffi_le_i16_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_le_i16_get(tft, src + 6, self); +} + +static void ffi_le_u16_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 6); + ffi_le_u16_put(tft, n, dst + 6, self); +} + +static val ffi_le_u16_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_le_u16_get(tft, src + 6, self); +} + +static void ffi_le_i32_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 4); + ffi_le_i32_put(tft, n, dst + 4, self); +} + +static val ffi_le_i32_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_le_i32_get(tft, src + 4, self); +} + +static void ffi_le_u32_rput(struct txr_ffi_type *tft, val n, mem_t *dst, + val self) +{ + memset(dst, 0, 4); + ffi_le_u32_put(tft, n, dst + 4, self); +} + +static val ffi_le_u32_rget(struct txr_ffi_type *tft, mem_t *src, val self) +{ + return ffi_le_u32_get(tft, src + 4, self); +} + #endif static void ffi_cptr_put(struct txr_ffi_type *tft, val n, mem_t *dst, @@ -3214,25 +3310,33 @@ static void ffi_init_types(void) alignof (u16_t), &ffi_type_uint16, ffi_be_u16_put, - ffi_be_u16_get, 0, 0)); + ffi_be_u16_get, + ifbe(ffi_be_u16_rput), + ifbe(ffi_be_u16_rget))); ffi_typedef(be_int16_s, make_ffi_type_builtin(be_int16_s, integer_s, sizeof (i16_t), alignof (i16_t), &ffi_type_sint16, ffi_be_i16_put, - ffi_be_i16_get, 0, 0)); + ffi_be_i16_get, + ifbe(ffi_be_i16_rput), + ifbe(ffi_be_i16_rget))); ffi_typedef(be_uint32_s, make_ffi_type_builtin(be_uint32_s, integer_s, sizeof (u32_t), alignof (u32_t), &ffi_type_uint32, ffi_be_u32_put, - ffi_be_u32_get, 0, 0)); + ffi_be_u32_get, + ifbe(ffi_be_u32_rput), + ifbe(ffi_be_u32_rget))); ffi_typedef(be_int32_s, make_ffi_type_builtin(be_int32_s, integer_s, sizeof (i32_t), alignof (i32_t), &ffi_type_sint32, ffi_be_i32_put, - ffi_be_i32_get, 0, 0)); + ffi_be_i32_get, + ifbe(ffi_be_i32_rput), + ifbe(ffi_be_i32_rget))); ffi_typedef(be_uint64_s, make_ffi_type_builtin(be_uint64_s, integer_s, sizeof (u64_t), alignof (u64_t), @@ -3262,25 +3366,33 @@ static void ffi_init_types(void) alignof (u16_t), &ffi_type_uint16, ffi_le_u16_put, - ffi_le_u16_get, 0, 0)); + ffi_le_u16_get, + ifbe(ffi_le_u16_rput), + ifbe(ffi_le_u16_rget))); ffi_typedef(le_int16_s, make_ffi_type_builtin(le_int16_s, integer_s, sizeof (i16_t), alignof (i16_t), &ffi_type_sint16, ffi_le_i16_put, - ffi_le_i16_get, 0, 0)); + ffi_le_i16_get, + ifbe(ffi_le_i16_rput), + ifbe(ffi_le_i16_rget))); ffi_typedef(le_uint32_s, make_ffi_type_builtin(le_uint32_s, integer_s, sizeof (u32_t), alignof (u32_t), &ffi_type_uint32, ffi_le_u32_put, - ffi_le_u32_get, 0, 0)); + ffi_le_u32_get, + ifbe(ffi_le_u32_rput), + ifbe(ffi_le_u32_rget))); ffi_typedef(le_int32_s, make_ffi_type_builtin(le_int32_s, integer_s, sizeof (i32_t), alignof (i32_t), &ffi_type_sint32, ffi_le_i32_put, - ffi_le_i32_get, 0, 0)); + ffi_le_i32_get, + ifbe(ffi_le_i32_rput), + ifbe(ffi_le_i32_rget))); ffi_typedef(le_uint64_s, make_ffi_type_builtin(le_uint64_s, integer_s, sizeof (u64_t), alignof (u64_t), |