diff options
Diffstat (limited to 'extension/rwarray.c')
-rw-r--r-- | extension/rwarray.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/extension/rwarray.c b/extension/rwarray.c index b62b6de0..186dac0f 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -84,7 +84,7 @@ static awk_bool_t read_value(FILE *fp, awk_value_t *value); * For each element: * Length of index val: 4 bytes - network order * Index val as characters (N bytes) - * Value type 4 bytes (0 = string, 1 = number, 2 = array, 3 = regex) + * Value type 4 bytes (0 = string, 1 = number, 2 = array, 3 = regex, 4 = strnum) * IF string: * Length of value 4 bytes * Value as characters (N bytes) @@ -210,7 +210,7 @@ write_elem(FILE *fp, awk_element_t *element) return write_value(fp, & element->value); } -/* write_value --- write a number or a string or a regex or an array */ +/* write_value --- write a number or a string or a strnum or a regex or an array */ static awk_bool_t write_value(FILE *fp, awk_value_t *val) @@ -232,7 +232,22 @@ write_value(FILE *fp, awk_value_t *val) if (fwrite(& val->num_value, 1, sizeof(val->num_value), fp) != sizeof(val->num_value)) return awk_false; } else { - code = (val->val_type == AWK_STRING ? 0 : 3); + switch (val->val_type) { + case AWK_STRING: + code = htonl(0); + break; + case AWK_STRNUM: + code = htonl(4); + break; + case AWK_REGEX: + code = htonl(3); + break; + default: + /* XXX can this happen? */ + code = htonl(0); + warning(ext_id, _("array value has unknown type %d"), val->val_type); + break; + } if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return awk_false; @@ -449,7 +464,22 @@ read_value(FILE *fp, awk_value_t *value) return awk_false; } len = ntohl(len); - value->val_type = (code == 0 ? AWK_STRING : AWK_REGEX); + switch (code) { + case 0: + value->val_type = AWK_STRING; + break; + case 3: + value->val_type = AWK_REGEX; + break; + case 4: + value->val_type = AWK_STRNUM; + break; + default: + /* this cannot happen! */ + warning(ext_id, _("treating recovered value with unknown type code %d as a string"), code); + value->val_type = AWK_STRING; + break; + } value->str_value.len = len; value->str_value.str = gawk_malloc(len + 1); memset(value->str_value.str, '\0', len + 1); |