summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-05-10 20:33:13 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-05-10 20:33:13 -0700
commite24b6bf661cb815a1ae1ccd20fb705a6231a8584 (patch)
treeb357bc1514f8c04d38698849daec577594a1adcb /ffi.c
parentb829bb25d84940ee1d04d6e4983bb06d29091a29 (diff)
downloadtxr-e24b6bf661cb815a1ae1ccd20fb705a6231a8584.tar.gz
txr-e24b6bf661cb815a1ae1ccd20fb705a6231a8584.tar.bz2
txr-e24b6bf661cb815a1ae1ccd20fb705a6231a8584.zip
ffi: reduce char array code repetition.
* ffi.c (ffi_char_array_get, ffi_wchar_array_get, ffi_bchar_array_get): New static functions. (ffi_array_in, ffi_array_get): Replace common code with calls to code moved out into functons.
Diffstat (limited to 'ffi.c')
-rw-r--r--ffi.c123
1 files changed, 53 insertions, 70 deletions
diff --git a/ffi.c b/ffi.c
index 97b8e935..cbd0e7d8 100644
--- a/ffi.c
+++ b/ffi.c
@@ -995,6 +995,53 @@ static val ffi_struct_get(struct txr_ffi_type *tft, mem_t *src, val self)
return strct;
}
+static val ffi_char_array_get(struct txr_ffi_type *tft, mem_t *src,
+ cnum nelem)
+{
+ if (nelem == 0) {
+ return null_string;
+ } else {
+ const char *chptr = coerce(const char *, src);
+ if (tft->null_term) {
+ return string_utf8(chptr);
+ } else {
+ wchar_t *wch = utf8_dup_from_buf(chptr, nelem);
+ return string_own(wch);
+ }
+ }
+}
+
+static val ffi_wchar_array_get(struct txr_ffi_type *tft, mem_t *src,
+ cnum nelem)
+{
+ if (nelem == 0) {
+ return null_string;
+ } else {
+ const wchar_t *wchptr = coerce(const wchar_t *, src);
+
+ if (tft->null_term) {
+ return string(wchptr);
+ } else {
+ val ustr = mkustring(num_fast(nelem));
+ return init_str(ustr, wchptr);
+ }
+ }
+}
+
+static val ffi_bchar_array_get(struct txr_ffi_type *tft, mem_t *src,
+ cnum nelem)
+{
+ if (nelem == 0) {
+ return null_string;
+ } else {
+ const unsigned char *chptr = coerce(const unsigned char *, src);
+ if (tft->null_term)
+ return string_8bit(chptr);
+ else
+ return string_8bit_size(chptr, nelem);
+ }
+}
+
static val ffi_array_in(struct txr_ffi_type *tft, int copy, mem_t *src,
val vec, val self)
{
@@ -1002,48 +1049,13 @@ static val ffi_array_in(struct txr_ffi_type *tft, int copy, mem_t *src,
cnum nelem = if3(tft->is_varray, c_num(length(vec)), tft->nelem);
if (tft->char_conv) {
- val str;
-
- if (nelem == 0) {
- str = null_string;
- } else {
- const char *chptr = coerce(const char *, src);
- if (tft->null_term) {
- str = string_utf8(chptr);
- } else {
- wchar_t *wch = utf8_dup_from_buf(chptr, nelem);
- str = string_own(wch);
- }
- }
+ val str = ffi_char_array_get(tft, src, nelem);
vec = if3(vec, replace(vec, str, zero, t), str);
} else if (tft->wchar_conv) {
- val str;
-
- if (nelem == 0) {
- str = null_string;
- } else {
- const wchar_t *wchptr = coerce(const wchar_t *, src);
-
- if (tft->null_term) {
- str = string(wchptr);
- } else {
- val ustr = mkustring(num_fast(nelem));
- str = init_str(ustr, wchptr);
- }
- }
+ val str = ffi_wchar_array_get(tft, src, nelem);
vec = if3(vec, replace(vec, str, zero, t), str);
} else if (tft->bchar_conv) {
- val str;
-
- if (nelem == 0) {
- str = null_string;
- } else {
- const unsigned char *chptr = coerce(const unsigned char *, src);
- if (tft->null_term)
- str = string_8bit(chptr);
- else
- str = string_8bit_size(chptr, nelem);
- }
+ val str = ffi_bchar_array_get(tft, src, nelem);
vec = if3(vec, replace(vec, str, zero, t), str);
} else {
ucnum offs = 0;
@@ -1124,40 +1136,11 @@ static val ffi_array_get(struct txr_ffi_type *tft, mem_t *src, val self)
cnum nelem = tft->nelem;
if (tft->char_conv) {
- if (nelem == 0) {
- return null_string;
- } else {
- const char *chptr = coerce(const char *, src);
- if (tft->null_term) {
- return string_utf8(chptr);
- } else {
- wchar_t *wch = utf8_dup_from_buf(chptr, tft->nelem);
- return string_own(wch);
- }
- }
+ return ffi_char_array_get(tft, src, nelem);
} else if (tft->wchar_conv) {
- if (nelem == 0) {
- return null_string;
- } else {
- const wchar_t *wchptr = coerce(const wchar_t *, src);
-
- if (tft->null_term) {
- return string(wchptr);
- } else {
- val ustr = mkustring(num_fast(nelem));
- return init_str(ustr, wchptr);
- }
- }
+ return ffi_wchar_array_get(tft, src, nelem);
} else if (tft->bchar_conv) {
- if (nelem == 0) {
- return null_string;
- } else {
- const unsigned char *chptr = coerce(const unsigned char *, src);
- if (tft->null_term)
- return string_8bit(chptr);
- else
- return string_8bit_size(chptr, nelem);
- }
+ return ffi_bchar_array_get(tft, src, nelem);
} else {
cnum znelem = if3(tft->null_term && nelem > 0, nelem - 1, nelem);
val vec = vector(num_fast(znelem), nil);