From 3438b2129cd933e430349a6bd66a1933071c92c2 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Sun, 1 Apr 2012 17:07:45 -0400 Subject: Update ERRNO API. --- extension/rwarray.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 8175c7c0..f4f8cd58 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -115,7 +115,7 @@ do_writea(int nargs) done1: ret = -1; - update_ERRNO(); + update_ERRNO_int(errno); unlink(file->stptr); done0: @@ -297,7 +297,7 @@ do_reada(int nargs) done1: ret = -1; - update_ERRNO(); + update_ERRNO_int(errno); done0: close(fd); -- cgit v1.2.3 From e5353c0f447a8628985722296f57fc02dd2e0063 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 11 May 2012 15:05:35 +0300 Subject: Move to use of bool type, true, false, everywhere. --- extension/rwarray.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index f4f8cd58..fed040fc 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -86,8 +86,8 @@ do_writea(int nargs) lintwarn("writea: called with too many arguments"); /* directory is first arg, array to dump is second */ - file = get_scalar_argument(0, FALSE); - array = get_array_argument(1, FALSE); + file = get_scalar_argument(0, false); + array = get_array_argument(1, false); /* open the file, if error, set ERRNO and return */ (void) force_string(file); @@ -254,8 +254,8 @@ do_reada(int nargs) lintwarn("reada: called with too many arguments"); /* directory is first arg, array to dump is second */ - file = get_scalar_argument(0, FALSE); - array = get_array_argument(1, FALSE); + file = get_scalar_argument(0, false); + array = get_array_argument(1, false); (void) force_string(file); fd = open(file->stptr, O_RDONLY); -- cgit v1.2.3 From 37cd3566b9b74c43d5f11f1cba8dec147a25e474 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Sun, 24 Jun 2012 21:07:22 +0300 Subject: Get rwarray extension working with new API. --- extension/rwarray.c | 469 ++++++++++++++++++++++++++-------------------------- 1 file changed, 236 insertions(+), 233 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index fed040fc..e4ddde3b 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -3,10 +3,11 @@ * * Arnold Robbins * May 2009 + * Redone June 2012 */ /* - * Copyright (C) 2009, 2010, 2011 the Free Software Foundation, Inc. + * Copyright (C) 2009, 2010, 2011, 2012 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -26,76 +27,98 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "awk.h" +#include +#include +#include +#include +#include +#include +#include + #include #include #include -#include +#include "gawkapi.h" #define MAGIC "awkrulz\n" -#define MAJOR 1 +#define MAJOR 3 #define MINOR 0 +static const gawk_api_t *api; /* for convenience macros to work */ +static awk_ext_id_t *ext_id; + int plugin_is_GPL_compatible; -static int write_array(int fd, NODE *array); -static int write_elem(int fd, int index, NODE *item); -static int write_chain(int fd, int index, NODE *item); -static int write_value(int fd, NODE *val); +static awk_bool_t write_array(int fd, awk_array_t array); +static awk_bool_t write_elem(int fd, awk_element_t *element); +static awk_bool_t write_value(int fd, awk_value_t *val); -static int read_array(int fd, NODE *array); -static NODE *read_elem(int fd, int *index, NODE *array); -static NODE *read_value(int fd); +static awk_bool_t read_array(int fd, awk_array_t array); +static awk_bool_t read_elem(int fd, awk_element_t *element); +static awk_bool_t read_value(int fd, awk_value_t *value); /* * Format of array info: * - * MAGIC 8 bytes + * MAGIC 8 bytes * Major version 4 bytes - network order * Minor version 4 bytes - network order * Element count 4 bytes - network order - * Array size 4 bytes - network order * Elements * * For each element: - * Bucket number: 4 bytes - network order - * Hash of index val: 4 bytes - network order * Length of index val: 4 bytes - network order * Index val as characters (N bytes) - * Value type 1 byte (0 = string, 1 = number, 2 = array) + * Value type 4 bytes (0 = string, 1 = number, 2 = array) * IF string: * Length of value 4 bytes * Value as characters (N bytes) - * ELSE + * ELSE IF number: * 8 bytes as native double + * ELSE + * Element count + * Elements + * END IF */ /* do_writea --- write an array */ -static NODE * -do_writea(int nargs) +static awk_value_t * +do_writea(int nargs, awk_value_t *result) { - NODE *file, *array; - int ret; - int fd; + awk_value_t filename, array; + int fd = -1; uint32_t major = MAJOR; uint32_t minor = MINOR; + assert(result != NULL); + make_number(0.0, result); + if (do_lint && nargs > 2) - lintwarn("writea: called with too many arguments"); + lintwarn(ext_id, "writea: called with too many arguments"); + + if (nargs < 2) + goto out; /* directory is first arg, array to dump is second */ - file = get_scalar_argument(0, false); - array = get_array_argument(1, false); + if (! get_argument(0, AWK_STRING, & filename)) { + fprintf(stderr, "do_writea: argument 0 is not a string\n"); + errno = EINVAL; + goto done1; + } - /* open the file, if error, set ERRNO and return */ - (void) force_string(file); - fd = creat(file->stptr, 0600); - if (fd < 0) { + if (! get_argument(1, AWK_ARRAY, & array)) { + fprintf(stderr, "do_writea: argument 1 is not an array\n"); + errno = EINVAL; goto done1; } + /* open the file, if error, set ERRNO and return */ + fd = creat(filename.str_value.str, 0600); + if (fd < 0) + goto done1; + if (write(fd, MAGIC, strlen(MAGIC)) != strlen(MAGIC)) goto done1; @@ -107,356 +130,336 @@ do_writea(int nargs) if (write(fd, & minor, sizeof(minor)) != sizeof(minor)) goto done1; - ret = write_array(fd, array); - if (ret != 0) - goto done1; - ret = 0; - goto done0; + if (write_array(fd, array.array_cookie)) { + make_number(1.0, result); + goto done0; + } done1: - ret = -1; update_ERRNO_int(errno); - unlink(file->stptr); + unlink(filename.str_value.str); done0: close(fd); - - /* Set the return value */ - return make_number((AWKNUM) ret); +out: + return result; } /* write_array --- write out an array or a sub-array */ -static int -write_array(int fd, NODE *array) +static awk_bool_t +write_array(int fd, awk_array_t array) { - int ret; + uint32_t i; uint32_t count; - uint32_t array_sz; - int i; - - count = htonl(array->table_size); - if (write(fd, & count, sizeof(count)) != sizeof(count)) - return -1; + awk_flat_array_t *flat_array; - array_sz = htonl(array->array_size); - if (write(fd, & array_sz, sizeof(array_sz)) != sizeof(array_sz)) - return -1; - - for (i = 0; i < array->array_size; i++) { - ret = write_chain(fd, i, array->var_array[i]); - if (ret != 0) - return ret; + if (! flatten_array(array, & flat_array)) { + printf("write_array: could not flatten array\n"); + return 0; } - return 0; -} + count = htonl(flat_array->count); + if (write(fd, & count, sizeof(count)) != sizeof(count)) + return 0; -/* write_chain --- write out a whole hash chain */ - -/* - * Write elements in the chain in reverse order so that - * when we read the elements back in we can just push them - * onto the front and thus recreate the array as it was. - */ - -static int -write_chain(int fd, int index, NODE *bucket) -{ - int ret; + for (i = 0; i < flat_array->count; i++) { + if (! write_elem(fd, & flat_array->elements[i])) + return 0; + } - if (bucket == NULL) + if (! release_flattened_array(array, flat_array)) { + printf("write_array: could not release flattened array\n"); return 0; + } - ret = write_chain(fd, index, bucket->ahnext); - if (ret != 0) - return ret; - - return write_elem(fd, index, bucket); + return 1; } /* write_elem --- write out a single element */ -static int -write_elem(int fd, int index, NODE *item) +static awk_bool_t +write_elem(int fd, awk_element_t *element) { - uint32_t hashval, indexval_len; - - index = htonl(index); - if (write(fd, & index, sizeof(index)) != sizeof(index)) - return -1; + uint32_t indexval_len; + ssize_t write_count; - hashval = htonl(item->ahcode); - if (write(fd, & hashval, sizeof(hashval)) != sizeof(hashval)) - return -1; - - indexval_len = htonl(item->ahname_len); + indexval_len = htonl(element->index.str_value.len); if (write(fd, & indexval_len, sizeof(indexval_len)) != sizeof(indexval_len)) - return -1; + return 0; - if (write(fd, item->ahname_str, item->ahname_len) != item->ahname_len) - return -1; + if (element->index.str_value.len > 0) { + write_count = write(fd, element->index.str_value.str, + element->index.str_value.len); + if (write_count != (ssize_t) element->index.str_value.len) + return 0; + } - return write_value(fd, item->ahvalue); + return write_value(fd, & element->value); } /* write_value --- write a number or a string or a array */ static int -write_value(int fd, NODE *val) +write_value(int fd, awk_value_t *val) { - int code, len; + uint32_t code, len; - if (val->type == Node_var_array) { + if (val->val_type == AWK_ARRAY) { code = htonl(2); if (write(fd, & code, sizeof(code)) != sizeof(code)) - return -1; - return write_array(fd, val); + return 0; + return write_array(fd, val->array_cookie); } - if ((val->flags & NUMBER) != 0) { + if (val->val_type == AWK_NUMBER) { code = htonl(1); if (write(fd, & code, sizeof(code)) != sizeof(code)) - return -1; + return 0; - if (write(fd, & val->numbr, sizeof(val->numbr)) != sizeof(val->numbr)) - return -1; + if (write(fd, & val->num_value, sizeof(val->num_value)) != sizeof(val->num_value)) + return 0; } else { code = 0; if (write(fd, & code, sizeof(code)) != sizeof(code)) - return -1; + return 0; - len = htonl(val->stlen); + len = htonl(val->str_value.len); if (write(fd, & len, sizeof(len)) != sizeof(len)) - return -1; + return 0; - if (write(fd, val->stptr, val->stlen) != val->stlen) - return -1; + if (write(fd, val->str_value.str, val->str_value.len) + != (ssize_t) val->str_value.len) + return 0; } - return 0; + return 1; } /* do_reada --- read an array */ -static NODE * -do_reada(int nargs) +static awk_value_t * +do_reada(int nargs, awk_value_t *result) { - NODE *file, *array; - int ret; - int fd; + awk_value_t filename, array; + int fd = -1; uint32_t major; uint32_t minor; char magic_buf[30]; + assert(result != NULL); + make_number(0.0, result); + if (do_lint && nargs > 2) - lintwarn("reada: called with too many arguments"); + lintwarn(ext_id, "reada: called with too many arguments"); - /* directory is first arg, array to dump is second */ - file = get_scalar_argument(0, false); - array = get_array_argument(1, false); + if (nargs < 2) + goto out; - (void) force_string(file); - fd = open(file->stptr, O_RDONLY); - if (fd < 0) { + /* directory is first arg, array to read is second */ + if (! get_argument(0, AWK_STRING, & filename)) { + fprintf(stderr, "do_reada: argument 0 is not a string\n"); + errno = EINVAL; goto done1; } + if (! get_argument(1, AWK_ARRAY, & array)) { + fprintf(stderr, "do_reada: argument 1 is not an array\n"); + errno = EINVAL; + goto done1; + } + + fd = open(filename.str_value.str, O_RDONLY); + if (fd < 0) + goto done1; + memset(magic_buf, '\0', sizeof(magic_buf)); if (read(fd, magic_buf, strlen(MAGIC)) != strlen(MAGIC)) { + errno = EBADF; goto done1; } if (strcmp(magic_buf, MAGIC) != 0) { + errno = EBADF; goto done1; } if (read(fd, & major, sizeof(major)) != sizeof(major)) { + errno = EBADF; goto done1; } major = ntohl(major); if (major != MAJOR) { + errno = EBADF; goto done1; } if (read(fd, & minor, sizeof(minor)) != sizeof(minor)) { + /* read() sets errno */ goto done1; } + minor = ntohl(minor); if (minor != MINOR) { + errno = EBADF; goto done1; } - assoc_clear(array, NULL); + if (! clear_array(array.array_cookie)) { + errno = ENOMEM; + printf("do_reada: clear_array failed\n"); + goto done1; + } - ret = read_array(fd, array); - if (ret == 0) + if (read_array(fd, array.array_cookie)) { + make_number(1.0, result); goto done0; + } done1: - ret = -1; update_ERRNO_int(errno); - done0: close(fd); - - /* Set the return value */ - return make_number((AWKNUM) ret); +out: + return result; } /* read_array --- read in an array or sub-array */ -static int -read_array(int fd, NODE *array) +static awk_bool_t +read_array(int fd, awk_array_t array) { - int i; + uint32_t i; uint32_t count; - uint32_t array_sz; - int index; - NODE *new_elem; + awk_element_t new_elem; if (read(fd, & count, sizeof(count)) != sizeof(count)) { - return -1; - } - array->table_size = ntohl(count); - - if (read(fd, & array_sz, sizeof(array_sz)) != sizeof(array_sz)) { - return -1; + return 0; } - array->array_size = ntohl(array_sz); - - /* malloc var_array */ - array->var_array = (NODE **) malloc(array->array_size * sizeof(NODE *)); - memset(array->var_array, '\0', array->array_size * sizeof(NODE *)); - - for (i = 0; i < array->table_size; i++) { - if ((new_elem = read_elem(fd, & index, array)) != NULL) { - new_elem->ahnext = array->var_array[index]; - array->var_array[index] = new_elem; + count = ntohl(count); + + for (i = 0; i < count; i++) { + if (read_elem(fd, & new_elem)) { + /* add to array */ + if (! set_array_element(array, & new_elem)) { + printf("read_array: set_array_element failed\n"); + return 0; + } } else break; } - if (i != array->table_size) - return -1; - return 0; -} + if (i != count) + return 0; + + return 1; +} /* read_elem --- read in a single element */ -static NODE * -read_elem(int fd, int *the_index, NODE *array) +static awk_bool_t +read_elem(int fd, awk_element_t *element) { - uint32_t hashval, indexval_len, index; - NODE *item; - NODE *val; - int ret; + uint32_t index_len; + static char *buffer; + static uint32_t buflen; + ssize_t ret; - *the_index = 0; - - if ((ret = read(fd, & index, sizeof(index))) != sizeof(index)) { - return NULL; + if ((ret = read(fd, & index_len, sizeof(index_len))) != sizeof(index_len)) { + return 0; } - *the_index = index = ntohl(index); + index_len = ntohl(index_len); - getnode(item); - memset(item, 0, sizeof(*item)); - item->type = Node_ahash; - item->flags = MALLOC; + memset(element, 0, sizeof(*element)); - if (read(fd, & hashval, sizeof(hashval)) != sizeof(hashval)) { - return NULL; - } + if (index_len > 0) { + if (buffer == NULL) { + // allocate buffer + emalloc(buffer, char *, index_len, "read_elem"); + buflen = index_len; + } else if (buflen < index_len) { + // reallocate buffer + char *cp = realloc(buffer, index_len); - item->ahcode = ntohl(hashval); + if (cp == NULL) + return 0; - if (read(fd, & indexval_len, sizeof(indexval_len)) != sizeof(indexval_len)) { - return NULL; - } - item->ahname_len = ntohl(indexval_len); + buffer = cp; + buflen = index_len; + } - item->ahname_str = malloc(item->ahname_len + 2); - if (read(fd, item->ahname_str, item->ahname_len) != item->ahname_len) { - return NULL; + if (read(fd, buffer, index_len) != (ssize_t) index_len) { + return 0; + } + make_string(buffer, index_len, & element->index); + } else { + make_string("", 0, & element->index); } - item->ahname_str[item->ahname_len] = '\0'; - item->ahname_ref = 1; - item->ahvalue = val = read_value(fd); - if (val == NULL) { - return NULL; - } - if (val->type == Node_var_array) { - char *aname; - size_t aname_len; - - /* construct the sub-array name */ - aname_len = strlen(array->vname) + item->ahname_len + 4; - emalloc(aname, char *, aname_len + 2, "read_elem"); - sprintf(aname, "%s[\"%.*s\"]", array->vname, (int) item->ahname_len, item->ahname_str); - val->vname = aname; - } + if (! read_value(fd, & element->value)) + return 0; - return item; + return 1; } /* read_value --- read a number or a string */ -static NODE * -read_value(int fd) +static awk_bool_t +read_value(int fd, awk_value_t *value) { - NODE *val; - int code, len; + uint32_t code, len; - getnode(val); - memset(val, 0, sizeof(*val)); - val->type = Node_val; + if (read(fd, & code, sizeof(code)) != sizeof(code)) + return 0; - if (read(fd, & code, sizeof(code)) != sizeof(code)) { - return NULL; - } code = ntohl(code); if (code == 2) { - val->type = Node_var_array; - if (read_array(fd, val) != 0) - return NULL; + awk_array_t array = create_array(); + + if (read_array(fd, array) != 0) + return 0; + + /* hook into value */ + value->val_type = AWK_ARRAY; + value->array_cookie = array; } else if (code == 1) { - if (read(fd, & val->numbr, sizeof(val->numbr)) != sizeof(val->numbr)) { - return NULL; - } + double d; + + if (read(fd, & d, sizeof(d)) != sizeof(d)) + return 0; - val->flags = NUMBER|NUMCUR|MALLOC; + /* hook into value */ + value->val_type = AWK_NUMBER; + value->num_value = d; } else { if (read(fd, & len, sizeof(len)) != sizeof(len)) { - return NULL; + return 0; } - val->stlen = ntohl(len); - val->stptr = malloc(val->stlen + 2); - memset(val->stptr, '\0', val->stlen + 2); - - if (read(fd, val->stptr, val->stlen) != val->stlen) { - return NULL; + len = ntohl(len); + value->val_type = AWK_STRING; + value->str_value.len = len; + value->str_value.str = malloc(len + 2); + memset(value->str_value.str, '\0', len + 2); + + if (read(fd, value->str_value.str, len) != len) { + free(value->str_value.str); + return 0; } - - val->flags = STRING|STRCUR|MALLOC; } - return val; + return 1; } -/* dlload --- load new builtins in this library */ +static awk_ext_func_t func_table[] = { + { "writea", do_writea, 2 }, + { "reada", do_reada, 2 }, +}; -NODE * -dlload(tree, dl) -NODE *tree; -void *dl; -{ - make_builtin("writea", do_writea, 2); - make_builtin("reada", do_reada, 2); - return make_number((AWKNUM) 0); -} +/* define the dl_load function using the boilerplate macro */ + +dl_load_func(func_table, rwarray, "") -- cgit v1.2.3 From 7d37bcd5a8066718b15de8c03725708819389931 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Mon, 9 Jul 2012 21:17:10 +0300 Subject: API: Update set_array_element(). Adjust extensions. --- extension/rwarray.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index e4ddde3b..a63fa3d2 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -344,7 +344,7 @@ read_array(int fd, awk_array_t array) for (i = 0; i < count; i++) { if (read_elem(fd, & new_elem)) { /* add to array */ - if (! set_array_element(array, & new_elem)) { + if (! set_array_element_by_elem(array, & new_elem)) { printf("read_array: set_array_element failed\n"); return 0; } @@ -445,7 +445,7 @@ read_value(int fd, awk_value_t *value) value->str_value.str = malloc(len + 2); memset(value->str_value.str, '\0', len + 2); - if (read(fd, value->str_value.str, len) != len) { + if (read(fd, value->str_value.str, len) != (ssize_t) len) { free(value->str_value.str); return 0; } -- cgit v1.2.3 From 6d1724214a95330b63a6a557f89fb9b40b4a521f Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Wed, 11 Jul 2012 21:26:37 +0300 Subject: API clean up and require strings to be malloced. --- extension/rwarray.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index a63fa3d2..64c501dd 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -394,9 +394,9 @@ read_elem(int fd, awk_element_t *element) if (read(fd, buffer, index_len) != (ssize_t) index_len) { return 0; } - make_string(buffer, index_len, & element->index); + make_const_string(buffer, index_len, & element->index); } else { - make_string("", 0, & element->index); + make_null_string(& element->index); } if (! read_value(fd, & element->value)) -- cgit v1.2.3 From 73533707616e119778993fe18540098239ecbb2e Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Wed, 11 Jul 2012 21:41:54 +0300 Subject: Add ability to call an initialization routine. --- extension/rwarray.c | 1 + 1 file changed, 1 insertion(+) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 64c501dd..8a749498 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -47,6 +47,7 @@ static const gawk_api_t *api; /* for convenience macros to work */ static awk_ext_id_t *ext_id; +static awk_bool_t (*init_func)(void) = NULL; int plugin_is_GPL_compatible; -- cgit v1.2.3 From 7e5b2a94ce3c089c50c5862168d1d917e5febcf4 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Wed, 25 Jul 2012 23:10:35 +0300 Subject: Add translation to the extensions. --- extension/rwarray.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 8a749498..75c735a4 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -41,6 +41,10 @@ #include "gawkapi.h" +#include "gettext.h" +#define _(msgid) gettext(msgid) +#define N_(msgid) msgid + #define MAGIC "awkrulz\n" #define MAJOR 3 #define MINOR 0 @@ -97,20 +101,20 @@ do_writea(int nargs, awk_value_t *result) make_number(0.0, result); if (do_lint && nargs > 2) - lintwarn(ext_id, "writea: called with too many arguments"); + lintwarn(ext_id, _("writea: called with too many arguments")); if (nargs < 2) goto out; /* directory is first arg, array to dump is second */ if (! get_argument(0, AWK_STRING, & filename)) { - fprintf(stderr, "do_writea: argument 0 is not a string\n"); + fprintf(stderr, _("do_writea: argument 0 is not a string\n")); errno = EINVAL; goto done1; } if (! get_argument(1, AWK_ARRAY, & array)) { - fprintf(stderr, "do_writea: argument 1 is not an array\n"); + fprintf(stderr, _("do_writea: argument 1 is not an array\n")); errno = EINVAL; goto done1; } @@ -157,7 +161,7 @@ write_array(int fd, awk_array_t array) awk_flat_array_t *flat_array; if (! flatten_array(array, & flat_array)) { - printf("write_array: could not flatten array\n"); + fprintf(stderr, _("write_array: could not flatten array\n")); return 0; } @@ -171,7 +175,7 @@ write_array(int fd, awk_array_t array) } if (! release_flattened_array(array, flat_array)) { - printf("write_array: could not release flattened array\n"); + fprintf(stderr, _("write_array: could not release flattened array\n")); return 0; } @@ -253,20 +257,20 @@ do_reada(int nargs, awk_value_t *result) make_number(0.0, result); if (do_lint && nargs > 2) - lintwarn(ext_id, "reada: called with too many arguments"); + lintwarn(ext_id, _("reada: called with too many arguments")); if (nargs < 2) goto out; /* directory is first arg, array to read is second */ if (! get_argument(0, AWK_STRING, & filename)) { - fprintf(stderr, "do_reada: argument 0 is not a string\n"); + fprintf(stderr, _("do_reada: argument 0 is not a string\n")); errno = EINVAL; goto done1; } if (! get_argument(1, AWK_ARRAY, & array)) { - fprintf(stderr, "do_reada: argument 1 is not an array\n"); + fprintf(stderr, _("do_reada: argument 1 is not an array\n")); errno = EINVAL; goto done1; } @@ -310,7 +314,7 @@ do_reada(int nargs, awk_value_t *result) if (! clear_array(array.array_cookie)) { errno = ENOMEM; - printf("do_reada: clear_array failed\n"); + fprintf(stderr, _("do_reada: clear_array failed\n")); goto done1; } @@ -346,7 +350,7 @@ read_array(int fd, awk_array_t array) if (read_elem(fd, & new_elem)) { /* add to array */ if (! set_array_element_by_elem(array, & new_elem)) { - printf("read_array: set_array_element failed\n"); + fprintf(stderr, _("read_array: set_array_element failed\n")); return 0; } } else -- cgit v1.2.3 From 8969981b6c3b77527db5dea2b7f7650e3fc5e083 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 31 Jul 2012 22:46:06 +0300 Subject: Rework rwarray.c to use stdio, for cygwin. --- extension/rwarray.c | 103 ++++++++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 51 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 75c735a4..e45a499e 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -55,13 +55,13 @@ static awk_bool_t (*init_func)(void) = NULL; int plugin_is_GPL_compatible; -static awk_bool_t write_array(int fd, awk_array_t array); -static awk_bool_t write_elem(int fd, awk_element_t *element); -static awk_bool_t write_value(int fd, awk_value_t *val); +static awk_bool_t write_array(FILE *fp, awk_array_t array); +static awk_bool_t write_elem(FILE *fp, awk_element_t *element); +static awk_bool_t write_value(FILE *fp, awk_value_t *val); -static awk_bool_t read_array(int fd, awk_array_t array); -static awk_bool_t read_elem(int fd, awk_element_t *element); -static awk_bool_t read_value(int fd, awk_value_t *value); +static awk_bool_t read_array(FILE *fp, awk_array_t array); +static awk_bool_t read_elem(FILE *fp, awk_element_t *element); +static awk_bool_t read_value(FILE *fp, awk_value_t *value); /* * Format of array info: @@ -93,7 +93,7 @@ static awk_value_t * do_writea(int nargs, awk_value_t *result) { awk_value_t filename, array; - int fd = -1; + FILE *fp; uint32_t major = MAJOR; uint32_t minor = MINOR; @@ -120,22 +120,22 @@ do_writea(int nargs, awk_value_t *result) } /* open the file, if error, set ERRNO and return */ - fd = creat(filename.str_value.str, 0600); - if (fd < 0) + fp = fopen(filename.str_value.str, "wb"); + if (fp == NULL) goto done1; - if (write(fd, MAGIC, strlen(MAGIC)) != strlen(MAGIC)) + if (fwrite(MAGIC, 1, strlen(MAGIC), fp) != strlen(MAGIC)) goto done1; major = htonl(major); - if (write(fd, & major, sizeof(major)) != sizeof(major)) + if (fwrite(& major, 1, sizeof(major), fp) != sizeof(major)) goto done1; minor = htonl(minor); - if (write(fd, & minor, sizeof(minor)) != sizeof(minor)) + if (fwrite(& minor, 1, sizeof(minor), fp) != sizeof(minor)) goto done1; - if (write_array(fd, array.array_cookie)) { + if (write_array(fp, array.array_cookie)) { make_number(1.0, result); goto done0; } @@ -145,7 +145,7 @@ done1: unlink(filename.str_value.str); done0: - close(fd); + fclose(fp); out: return result; } @@ -154,7 +154,7 @@ out: /* write_array --- write out an array or a sub-array */ static awk_bool_t -write_array(int fd, awk_array_t array) +write_array(FILE *fp, awk_array_t array) { uint32_t i; uint32_t count; @@ -166,11 +166,11 @@ write_array(int fd, awk_array_t array) } count = htonl(flat_array->count); - if (write(fd, & count, sizeof(count)) != sizeof(count)) + if (fwrite(& count, 1, sizeof(count), fp) != sizeof(count)) return 0; for (i = 0; i < flat_array->count; i++) { - if (! write_elem(fd, & flat_array->elements[i])) + if (! write_elem(fp, & flat_array->elements[i])) return 0; } @@ -185,56 +185,56 @@ write_array(int fd, awk_array_t array) /* write_elem --- write out a single element */ static awk_bool_t -write_elem(int fd, awk_element_t *element) +write_elem(FILE *fp, awk_element_t *element) { uint32_t indexval_len; ssize_t write_count; indexval_len = htonl(element->index.str_value.len); - if (write(fd, & indexval_len, sizeof(indexval_len)) != sizeof(indexval_len)) + if (fwrite(& indexval_len, 1, sizeof(indexval_len), fp) != sizeof(indexval_len)) return 0; if (element->index.str_value.len > 0) { - write_count = write(fd, element->index.str_value.str, - element->index.str_value.len); + write_count = fwrite(element->index.str_value.str, + 1, element->index.str_value.len, fp); if (write_count != (ssize_t) element->index.str_value.len) return 0; } - return write_value(fd, & element->value); + return write_value(fp, & element->value); } /* write_value --- write a number or a string or a array */ static int -write_value(int fd, awk_value_t *val) +write_value(FILE *fp, awk_value_t *val) { uint32_t code, len; if (val->val_type == AWK_ARRAY) { code = htonl(2); - if (write(fd, & code, sizeof(code)) != sizeof(code)) + if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; - return write_array(fd, val->array_cookie); + return write_array(fp, val->array_cookie); } if (val->val_type == AWK_NUMBER) { code = htonl(1); - if (write(fd, & code, sizeof(code)) != sizeof(code)) + if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; - if (write(fd, & val->num_value, sizeof(val->num_value)) != sizeof(val->num_value)) + if (fwrite(& val->num_value, 1, sizeof(val->num_value), fp) != sizeof(val->num_value)) return 0; } else { code = 0; - if (write(fd, & code, sizeof(code)) != sizeof(code)) + if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; len = htonl(val->str_value.len); - if (write(fd, & len, sizeof(len)) != sizeof(len)) + if (fwrite(& len, 1, sizeof(len), fp) != sizeof(len)) return 0; - if (write(fd, val->str_value.str, val->str_value.len) + if (fwrite(val->str_value.str, 1, val->str_value.len, fp) != (ssize_t) val->str_value.len) return 0; } @@ -248,7 +248,7 @@ static awk_value_t * do_reada(int nargs, awk_value_t *result) { awk_value_t filename, array; - int fd = -1; + FILE *fp = NULL; uint32_t major; uint32_t minor; char magic_buf[30]; @@ -275,12 +275,12 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - fd = open(filename.str_value.str, O_RDONLY); - if (fd < 0) + fp = fopen(filename.str_value.str, "rb"); + if (fp == NULL) goto done1; memset(magic_buf, '\0', sizeof(magic_buf)); - if (read(fd, magic_buf, strlen(MAGIC)) != strlen(MAGIC)) { + if (fread(magic_buf, 1, strlen(MAGIC), fp) != strlen(MAGIC)) { errno = EBADF; goto done1; } @@ -290,7 +290,7 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - if (read(fd, & major, sizeof(major)) != sizeof(major)) { + if (fread(& major, 1, sizeof(major), fp) != sizeof(major)) { errno = EBADF; goto done1; } @@ -301,7 +301,7 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - if (read(fd, & minor, sizeof(minor)) != sizeof(minor)) { + if (fread(& minor, 1, sizeof(minor), fp) != sizeof(minor)) { /* read() sets errno */ goto done1; } @@ -318,7 +318,7 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - if (read_array(fd, array.array_cookie)) { + if (read_array(fp, array.array_cookie)) { make_number(1.0, result); goto done0; } @@ -326,7 +326,8 @@ do_reada(int nargs, awk_value_t *result) done1: update_ERRNO_int(errno); done0: - close(fd); + if (fp != NULL) + fclose(fp); out: return result; } @@ -335,19 +336,19 @@ out: /* read_array --- read in an array or sub-array */ static awk_bool_t -read_array(int fd, awk_array_t array) +read_array(FILE *fp, awk_array_t array) { uint32_t i; uint32_t count; awk_element_t new_elem; - if (read(fd, & count, sizeof(count)) != sizeof(count)) { + if (fread(& count, 1, sizeof(count), fp) != sizeof(count)) { return 0; } count = ntohl(count); for (i = 0; i < count; i++) { - if (read_elem(fd, & new_elem)) { + if (read_elem(fp, & new_elem)) { /* add to array */ if (! set_array_element_by_elem(array, & new_elem)) { fprintf(stderr, _("read_array: set_array_element failed\n")); @@ -366,14 +367,14 @@ read_array(int fd, awk_array_t array) /* read_elem --- read in a single element */ static awk_bool_t -read_elem(int fd, awk_element_t *element) +read_elem(FILE *fp, awk_element_t *element) { uint32_t index_len; static char *buffer; static uint32_t buflen; ssize_t ret; - if ((ret = read(fd, & index_len, sizeof(index_len))) != sizeof(index_len)) { + if ((ret = fread(& index_len, 1, sizeof(index_len), fp)) != sizeof(index_len)) { return 0; } index_len = ntohl(index_len); @@ -396,7 +397,7 @@ read_elem(int fd, awk_element_t *element) buflen = index_len; } - if (read(fd, buffer, index_len) != (ssize_t) index_len) { + if (fread(buffer, 1, index_len, fp) != (ssize_t) index_len) { return 0; } make_const_string(buffer, index_len, & element->index); @@ -404,7 +405,7 @@ read_elem(int fd, awk_element_t *element) make_null_string(& element->index); } - if (! read_value(fd, & element->value)) + if (! read_value(fp, & element->value)) return 0; return 1; @@ -413,11 +414,11 @@ read_elem(int fd, awk_element_t *element) /* read_value --- read a number or a string */ static awk_bool_t -read_value(int fd, awk_value_t *value) +read_value(FILE *fp, awk_value_t *value) { uint32_t code, len; - if (read(fd, & code, sizeof(code)) != sizeof(code)) + if (fread(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; code = ntohl(code); @@ -425,7 +426,7 @@ read_value(int fd, awk_value_t *value) if (code == 2) { awk_array_t array = create_array(); - if (read_array(fd, array) != 0) + if (read_array(fp, array) != 0) return 0; /* hook into value */ @@ -434,14 +435,14 @@ read_value(int fd, awk_value_t *value) } else if (code == 1) { double d; - if (read(fd, & d, sizeof(d)) != sizeof(d)) + if (fread(& d, 1, sizeof(d), fp) != sizeof(d)) return 0; /* hook into value */ value->val_type = AWK_NUMBER; value->num_value = d; } else { - if (read(fd, & len, sizeof(len)) != sizeof(len)) { + if (fread(& len, 1, sizeof(len), fp) != sizeof(len)) { return 0; } len = ntohl(len); @@ -450,7 +451,7 @@ read_value(int fd, awk_value_t *value) value->str_value.str = malloc(len + 2); memset(value->str_value.str, '\0', len + 2); - if (read(fd, value->str_value.str, len) != (ssize_t) len) { + if (fread(value->str_value.str, 1, len, fp) != (ssize_t) len) { free(value->str_value.str); return 0; } -- cgit v1.2.3 From 49658bfd0ef5d4efccd210c48560c43bf455ee16 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Wed, 8 Aug 2012 22:51:53 +0300 Subject: Move struct stat into IOBUF_PUBLIC. --- extension/rwarray.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index e45a499e..0eca9779 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -93,7 +93,7 @@ static awk_value_t * do_writea(int nargs, awk_value_t *result) { awk_value_t filename, array; - FILE *fp; + FILE *fp = NULL; uint32_t major = MAJOR; uint32_t minor = MINOR; -- cgit v1.2.3 From 759f2234c9bfa689151277fd2215bc0927cfc9c3 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 24 Aug 2012 13:40:22 +0300 Subject: Add facility to get vesion info from extensions. --- extension/rwarray.c | 1 + 1 file changed, 1 insertion(+) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 0eca9779..371078ed 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -51,6 +51,7 @@ 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 1.0"; static awk_bool_t (*init_func)(void) = NULL; int plugin_is_GPL_compatible; -- cgit v1.2.3 From 0b4ff99fec136012af7a54f179bdf601e55e6274 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Sun, 26 Aug 2012 21:52:12 +0300 Subject: Use config.h properly. Add AC_SYS_LARGEFILE. --- extension/rwarray.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index 371078ed..d8a54fde 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -27,6 +27,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include -- cgit v1.2.3 From 99290f5ca37cb905f7f1dab9be416b2e2057d243 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Thu, 13 Sep 2012 17:27:53 +0300 Subject: z/OS changes from Dave Pitts and Arnold. --- extension/rwarray.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'extension/rwarray.c') diff --git a/extension/rwarray.c b/extension/rwarray.c index d8a54fde..43118282 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -49,6 +49,17 @@ #define _(msgid) gettext(msgid) #define N_(msgid) msgid +#if defined(ZOS_USS) +#include +#define INT32_MAX INT_MAX +#define INT32_MIN INT_MIN +#ifndef __uint32_t +#define __uint32_t 1 +typedef unsigned long uint32_t; +#endif +typedef long int32_t; +#endif /* ZOS_USS */ + #define MAGIC "awkrulz\n" #define MAJOR 3 #define MINOR 0 @@ -388,11 +399,11 @@ read_elem(FILE *fp, awk_element_t *element) if (index_len > 0) { if (buffer == NULL) { - // allocate buffer + /* allocate buffer */ emalloc(buffer, char *, index_len, "read_elem"); buflen = index_len; } else if (buflen < index_len) { - // reallocate buffer + /* reallocate buffer */ char *cp = realloc(buffer, index_len); if (cp == NULL) -- cgit v1.2.3