diff options
-rw-r--r-- | extension/ChangeLog | 5 | ||||
-rw-r--r-- | extension/rwarray.c | 40 | ||||
-rw-r--r-- | test/ChangeLog | 1 | ||||
-rw-r--r-- | test/rwarray.awk | 11 |
4 files changed, 50 insertions, 7 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog index cf580649..986a8358 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,3 +1,8 @@ +2021-03-30 Arnold D. Robbins <arnold@skeeve.com> + + * rwarray.c (write_value): Add support for writing boolean values. + (read_value): Ditto. + 2021-03-29 Arnold D. Robbins <arnold@skeeve.com> * testext.c (var_test): Fix a comment. Update copyright year. diff --git a/extension/rwarray.c b/extension/rwarray.c index 45f9c734..a534a5a4 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -8,7 +8,7 @@ */ /* - * Copyright (C) 2009-2014, 2017, 2018, 2020 the Free Software Foundation, Inc. + * Copyright (C) 2009-2014, 2017, 2018, 2020, 2021 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -36,6 +36,7 @@ #include <assert.h> #include <errno.h> #include <fcntl.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @@ -249,6 +250,9 @@ write_value(FILE *fp, awk_value_t *val) case AWK_UNDEFINED: code = htonl(5); break; + case AWK_BOOL: + code = htonl(6); + break; default: /* XXX can this happen? */ code = htonl(0); @@ -258,13 +262,25 @@ write_value(FILE *fp, awk_value_t *val) if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return awk_false; - len = htonl(val->str_value.len); - if (fwrite(& len, 1, sizeof(len), fp) != sizeof(len)) - return awk_false; + if (code == ntohl(6)) { + len = (val->bool_value == awk_true ? 4 : 5); + len = htonl(len); + const char *s = (val->bool_value == awk_true ? "TRUE" : "FALSE"); - if (fwrite(val->str_value.str, 1, val->str_value.len, fp) - != (ssize_t) val->str_value.len) - return awk_false; + if (fwrite(& len, 1, sizeof(len), fp) != sizeof(len)) + return awk_false; + + if (fwrite(s, 1, strlen(s), fp) != (ssize_t) strlen(s)) + return awk_false; + } else { + len = htonl(val->str_value.len); + if (fwrite(& len, 1, sizeof(len), fp) != sizeof(len)) + return awk_false; + + if (fwrite(val->str_value.str, 1, val->str_value.len, fp) + != (ssize_t) val->str_value.len) + return awk_false; + } } return awk_true; @@ -484,6 +500,9 @@ read_value(FILE *fp, awk_value_t *value) case 5: value->val_type = AWK_UNDEFINED; break; + case 6: + value->val_type = AWK_BOOL; + break; default: /* this cannot happen! */ warning(ext_id, _("treating recovered value with unknown type code %d as a string"), code); @@ -498,6 +517,13 @@ read_value(FILE *fp, awk_value_t *value) return awk_false; } value->str_value.str[len] = '\0'; + value->str_value.len = len; + if (code == 6) { + /* bool type */ + bool val = (strcmp(value->str_value.str, "TRUE") == 0); + gawk_free(value->str_value.str); + value->bool_value = val ? awk_true : awk_false; + } } return awk_true; diff --git a/test/ChangeLog b/test/ChangeLog index 0212e1ff..a65ff619 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -2,6 +2,7 @@ * Makefile.am (EXTRA_DIST): asortbool, new test. * asortbool.awk, asortbool.ok: New files. + * rwarray.awk: Add test of saving/restoring bool values. 2021-03-08 Arnold D. Robbins <arnold@skeeve.com> diff --git a/test/rwarray.awk b/test/rwarray.awk index 86a4b589..831f17c3 100644 --- a/test/rwarray.awk +++ b/test/rwarray.awk @@ -11,6 +11,9 @@ BEGIN { split("-2.4", f) dict[strnum_sub] = f[1] + bool_sub = "bool-sub" + dict[bool_sub] = bool(1) + n = asorti(dict, dictindices) for (i = 1; i <= n; i++) printf("dict[%s] = %s\n", dictindices[i], dict[dictindices[i]]) > "orig.out" @@ -51,4 +54,12 @@ BEGIN { if (typeof(dict[strnum_sub]) != "strnum") printf("dict[\"%s\"] should be strnum, is %s\n", strnum_sub, typeof(dict[strnum_sub])); + + if (typeof(dict[bool_sub]) != "bool") + printf("dict[\"%s\"] should be bool, is %s\n", + bool_sub, typeof(dict[bool_sub])); + + if ((dict[bool_sub] "") != "TRUE") + printf("dict[\"%s\"] should be TRUE, is %s\n", + bool_sub, dict[bool_sub]); } |