summaryrefslogtreecommitdiff
path: root/extension
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2016-12-05 14:47:51 -0500
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2016-12-05 14:47:51 -0500
commit352af50d54071be81f6be1c4d93bfd791f473755 (patch)
tree72352160201c27fe8e7d465f6e961bc41f71859d /extension
parent16761af5b3cec40f1e341cb33787af33cb2b45c2 (diff)
downloadgawk-352af50d54071be81f6be1c4d93bfd791f473755.tar.gz
Add strnum support to API. Update rwarray extension and test.
Diffstat (limited to 'extension')
-rw-r--r--extension/ChangeLog7
-rw-r--r--extension/rwarray.c38
2 files changed, 41 insertions, 4 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog
index dc0373f4..f826e540 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,10 @@
+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 ad77b68c..5b9fd5de 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)
@@ -213,7 +213,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)
@@ -235,7 +235,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;
@@ -455,7 +470,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);