diff options
Diffstat (limited to 'extension/rwarray.c')
-rw-r--r-- | extension/rwarray.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/extension/rwarray.c b/extension/rwarray.c index 9a8d15e9..9a8c1e4a 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -37,6 +37,7 @@ #include <assert.h> #include <errno.h> #include <fcntl.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @@ -63,11 +64,11 @@ #define MAGIC "awkrulz\n" #define MAJOR 4 -#define MINOR 0 +#define MINOR 1 static const gawk_api_t *api; /* for convenience macros to work */ static awk_ext_id_t ext_id; -static const char *ext_version = "rwarray extension: version 2.0"; +static const char *ext_version = "rwarray extension: version 2.1"; static awk_bool_t (*init_func)(void) = NULL; int plugin_is_GPL_compatible; @@ -113,6 +114,7 @@ static awk_bool_t read_number(FILE *fp, awk_value_t *value, uint32_t code); #define VT_ARRAY 5 #define VT_REGEX 6 #define VT_STRNUM 7 +#define VT_BOOL 8 #define VT_UNDEFINED 20 /* do_writea --- write an array */ @@ -258,6 +260,9 @@ write_value(FILE *fp, awk_value_t *val) case AWK_REGEX: code = htonl(VT_REGEX); break; + case AWK_BOOL: + code = htonl(VT_BOOL); + break; case AWK_UNDEFINED: code = htonl(VT_UNDEFINED); break; @@ -267,17 +272,29 @@ write_value(FILE *fp, awk_value_t *val) 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; - len = htonl(val->str_value.len); - if (fwrite(& len, 1, sizeof(len), fp) != sizeof(len)) - return awk_false; + if (code == ntohl(VT_BOOL)) { + 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; } @@ -540,6 +557,9 @@ read_value(FILE *fp, awk_value_t *value) case VT_UNDEFINED: value->val_type = AWK_UNDEFINED; break; + case VT_BOOL: + 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); @@ -554,6 +574,15 @@ read_value(FILE *fp, awk_value_t *value) return awk_false; } value->str_value.str[len] = '\0'; + value->str_value.len = len; + + if (code == VT_BOOL) { + bool val = (strcmp(value->str_value.str, "TRUE") == 0); + + gawk_free(value->str_value.str); + value->str_value.str = NULL; + value->bool_value = val ? awk_true : awk_false; + } } return awk_true; |