diff options
Diffstat (limited to 'extension')
-rw-r--r-- | extension/ChangeLog | 7 | ||||
-rw-r--r-- | extension/rwarray.c | 38 |
2 files changed, 41 insertions, 4 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog index bf7d3fa4..9c647f05 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -41,6 +41,13 @@ * testext.c: Ditto. * time.c: Ditto. +2016-12-05 Andrew J. Schorr <aschorr@telemetry-investments.com> + + * rwarray.c: Adjust to read and write strnum values. + (write_value): When writing a string value, code should use htonl. + There are now 3 string types: string, strnum, and regex. + (read_value): Support 3 string types: string, strnum, and regex. + 2016-11-30 Arnold D. Robbins <arnold@skeeve.com> * rwarray.c: Restore read comparion of major and minor versions 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); |