summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ffi.c128
1 files changed, 120 insertions, 8 deletions
diff --git a/ffi.c b/ffi.c
index c93c1165..e80e0e60 100644
--- a/ffi.c
+++ b/ffi.c
@@ -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),