aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--extension/ChangeLog10
-rw-r--r--extension/filefuncs.c11
-rw-r--r--extension/fork.c11
-rw-r--r--extension/rwarray.c4
-rw-r--r--extension/testext.c37
-rw-r--r--gawkapi.c17
-rw-r--r--gawkapi.h10
8 files changed, 57 insertions, 50 deletions
diff --git a/ChangeLog b/ChangeLog
index e8d904e4..861f410b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-07-08 Arnold D. Robbins <arnold@skeeve.com>
+
+ * gawkapi.h (set_array_element): Use index + value instead
+ of element structure. Matches get_array_element.
+ (set_array_element_by_elem): New macro to use an element.
+ * gawkapi.c (api_set_array_element): Make the necessary adjustments.
+
2012-07-04 Arnold D. Robbins <arnold@skeeve.com>
* awkgram.y (tokentab): Remove limit on number of arguments
diff --git a/extension/ChangeLog b/extension/ChangeLog
index a0cc713d..40224589 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,13 @@
+2012-07-08 Arnold D. Robbins <arnold@skeeve.com>
+
+ * filefuncs.c (array_set): Adjust for change in set_array_element API.
+ * fork.c (array_set_numeric): Ditto.
+ * rwarray.c (read_array): Use set_array_element_by_elem.
+ (read_value): Add a cast to silence a compiler warning.
+ * testext.c (test_array_elem): Adjust for change in set_array_element
+ API.
+ (fill_in_array): Ditto. Change parameter name to new_array.
+
2012-06-29 Arnold D. Robbins <arnold@skeeve.com>
* ordchr.c (do_ord, do_chr): Improve argument checking and
diff --git a/extension/filefuncs.c b/extension/filefuncs.c
index d4e1b57c..32a3cee6 100644
--- a/extension/filefuncs.c
+++ b/extension/filefuncs.c
@@ -211,15 +211,12 @@ read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
static void
array_set(awk_array_t array, const char *sub, awk_value_t *value)
{
- awk_element_t element;
- awk_value_t tmp;
-
- memset(& element, 0, sizeof(element));
+ awk_value_t index;
- element.index = *make_string(sub, strlen(sub), & tmp);
- element.value = *value;
+ set_array_element(array,
+ make_string(sub, strlen(sub), & index),
+ value);
- set_array_element(array, & element);
}
/* array_set_numeric --- set an array element with a number */
diff --git a/extension/fork.c b/extension/fork.c
index 58089d55..efad17eb 100644
--- a/extension/fork.c
+++ b/extension/fork.c
@@ -50,15 +50,12 @@ int plugin_is_GPL_compatible;
static void
array_set_numeric(awk_array_t array, const char *sub, double num)
{
- awk_element_t element;
- awk_value_t tmp;
+ awk_value_t index, value;
- memset(& element, 0, sizeof(element));
+ set_array_element(array,
+ make_string(sub, strlen(sub), & index),
+ make_number(num, & value));
- element.index = *make_string(sub, strlen(sub), & tmp);
- make_number(num, &element.value);
-
- set_array_element(array, & element);
}
/* do_fork --- provide dynamically loaded fork() builtin for gawk */
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;
}
diff --git a/extension/testext.c b/extension/testext.c
index e3975b27..e54055cc 100644
--- a/extension/testext.c
+++ b/extension/testext.c
@@ -335,9 +335,7 @@ static awk_value_t *
test_array_elem(int nargs, awk_value_t *result)
{
awk_value_t array, index, value;
- awk_element_t element;
- memset(& element, 0, sizeof(element));
make_number(0.0, result); /* default return until full success */
assert(result != NULL);
@@ -366,9 +364,8 @@ test_array_elem(int nargs, awk_value_t *result)
valrep2str(& value));
/* change the element - "3" */
- element.index = index;
- (void) make_number(42.0, & element.value);
- if (! set_array_element(array.array_cookie, & element)) {
+ (void) make_number(42.0, & value);
+ if (! set_array_element(array.array_cookie, & index, & value)) {
printf("test_array_elem: set_array_element failed\n");
goto out;
}
@@ -382,18 +379,16 @@ test_array_elem(int nargs, awk_value_t *result)
/* add a new element - "7" */
(void) make_string("7", 1, & index);
- element.index = index;
- (void) make_string("seven", 5, & element.value);
- if (! set_array_element(array.array_cookie, & element)) {
+ (void) make_string("seven", 5, & value);
+ if (! set_array_element(array.array_cookie, & index, & value)) {
printf("test_array_elem: set_array_element failed\n");
goto out;
}
/* add a subarray */
(void) make_string("subarray", 8, & index);
- element.index = index;
- fill_in_array(& element.value);
- if (! set_array_element(array.array_cookie, & element)) {
+ fill_in_array(& value);
+ if (! set_array_element(array.array_cookie, & index, & value)) {
printf("test_array_elem: set_array_element (subarray) failed\n");
goto out;
}
@@ -486,33 +481,29 @@ out:
/* fill_in_array --- fill in a new array */
static void
-fill_in_array(awk_value_t *value)
+fill_in_array(awk_value_t *new_array)
{
- awk_element_t element;
awk_array_t a_cookie;
- awk_value_t index;
+ awk_value_t index, value;
a_cookie = create_array();
(void) make_string("hello", 5, & index);
- element.index = index;
- (void) make_string("world", 5, & element.value);
- if (! set_array_element(a_cookie, & element)) {
+ (void) make_string("world", 5, & value);
+ if (! set_array_element(a_cookie, & index, & value)) {
printf("fill_in_array:%d: set_array_element failed\n", __LINE__);
return;
}
(void) make_string("answer", 6, & index);
- element.index = index;
- (void) make_number(42.0, & element.value);
- if (! set_array_element(a_cookie, & element)) {
+ (void) make_number(42.0, & value);
+ if (! set_array_element(a_cookie, & index, & value)) {
printf("fill_in_array:%d: set_array_element failed\n", __LINE__);
return;
}
- value->val_type = AWK_ARRAY;
- value->array_cookie = a_cookie;
-
+ new_array->val_type = AWK_ARRAY;
+ new_array->array_cookie = a_cookie;
}
/* create_new_array --- create a named array */
diff --git a/gawkapi.c b/gawkapi.c
index 0a00be69..ad82f6fa 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -524,7 +524,8 @@ api_get_array_element(awk_ext_id_t id,
*/
static awk_bool_t
api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
- awk_element_t *element)
+ const awk_value_t *const index,
+ const awk_value_t *const value)
{
NODE *array = (NODE *)a_cookie;
NODE *tmp;
@@ -534,20 +535,20 @@ api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
/* don't check for index len zero, null str is ok as index */
if ( array == NULL
|| array->type != Node_var_array
- || element == NULL
- || element->index.str_value.str == NULL)
+ || index == NULL
+ || value == NULL
+ || index->str_value.str == NULL)
return false;
- tmp = make_string(element->index.str_value.str,
- element->index.str_value.len);
+ tmp = make_string(index->str_value.str, index->str_value.len);
aptr = assoc_lookup(array, tmp);
unref(tmp);
unref(*aptr);
- elem = *aptr = awk_value_to_node(& element->value);
+ elem = *aptr = awk_value_to_node(value);
if (elem->type == Node_var_array) {
elem->parent_array = array;
- elem->vname = estrdup(element->index.str_value.str,
- element->index.str_value.len);
+ elem->vname = estrdup(index->str_value.str,
+ index->str_value.len);
make_aname(elem);
}
diff --git a/gawkapi.h b/gawkapi.h
index 10f1e0c3..5be5ea08 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -316,7 +316,8 @@ typedef struct gawk_api {
* element->index and element->value.
*/
awk_bool_t (*set_array_element)(awk_ext_id_t id, awk_array_t a_cookie,
- awk_element_t *element);
+ const awk_value_t *const index,
+ const awk_value_t *const value);
/*
* Remove the element with the given index.
@@ -391,8 +392,11 @@ typedef struct gawk_api {
#define get_array_element(array, index, wanted, result) \
(api->get_array_element(ext_id, array, index, wanted, result))
-#define set_array_element(array, element) \
- (api->set_array_element(ext_id, array, element))
+#define set_array_element(array, index, value) \
+ (api->set_array_element(ext_id, array, index, value))
+
+#define set_array_element_by_elem(array, elem) \
+ (set_array_element(array, & (elem)->index, & (elem)->value))
#define del_array_element(array, index) \
(api->del_array_element(ext_id, array, index))