aboutsummaryrefslogtreecommitdiffstats
path: root/extension/rwarray.c
diff options
context:
space:
mode:
Diffstat (limited to 'extension/rwarray.c')
-rw-r--r--extension/rwarray.c45
1 files changed, 37 insertions, 8 deletions
diff --git a/extension/rwarray.c b/extension/rwarray.c
index 59d6b0f7..532a8da1 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;
}
@@ -559,6 +576,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);
@@ -573,6 +593,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;