diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | extension/ChangeLog | 4 | ||||
-rw-r--r-- | extension/testext.c | 2 | ||||
-rw-r--r-- | gawkapi.c | 22 | ||||
-rw-r--r-- | gawkapi.h | 5 |
5 files changed, 35 insertions, 5 deletions
@@ -1,3 +1,10 @@ +2012-06-18 Arnold D. Robbins <arnold@skeeve.com> + + * gawkapi.h (get_array_element): Restore `wanted' paramater. + * gawkapi.c (api_sym_update): Handle case where variable exists already. + (api_get_array_element): Restore `wanted' paramater and pass it + on to node_to_awk_value. + 2012-06-17 Arnold D. Robbins <arnold@skeeve.com> API Work: diff --git a/extension/ChangeLog b/extension/ChangeLog index 2a62ff70..4315086a 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,3 +1,7 @@ +2012-06-18 Arnold D. Robbins <arnold@skeeve.com> + + * testext.c (test_array_elem): Add AWK_UNDEFINED for `wanted'. + 2012-06-17 Arnold D. Robbins <arnold@skeeve.com> * filefuncs.c (do_chdir, do_stat): Add assert(result != NULL). diff --git a/extension/testext.c b/extension/testext.c index 2a542954..743a1c2f 100644 --- a/extension/testext.c +++ b/extension/testext.c @@ -239,7 +239,7 @@ test_array_elem(int nargs, awk_value_t *result) printf("test_array_elem: get_argument 1 (index) failed\n"); goto out; } - if (! get_array_element(array.array_cookie, & index, & value)) { + if (! get_array_element(array.array_cookie, & index, AWK_UNDEFINED, & value)) { printf("test_array_elem: get_array_element failed\n"); goto out; } @@ -405,8 +405,25 @@ api_sym_update(awk_ext_id_t id, const char *name, awk_value_t *value) unref(node->var_value); node->var_value = awk_value_to_node(value); } + return true; + } + + /* if we get here, then it exists already */ + switch (value->val_type) { + case AWK_STRING: + case AWK_NUMBER: + if (node->type == Node_var || node->type == Node_var_new) { + unref(node->var_value); + node->var_value = awk_value_to_node(value); + } else { + return false; + } + break; + + case AWK_ARRAY: + case AWK_UNDEFINED: + return false; /* not allowed */ } - /* FIXME: Handle case where it exists already */ return true; } @@ -420,6 +437,7 @@ static awk_bool_t api_get_array_element(awk_ext_id_t id, awk_array_t a_cookie, const awk_value_t *const index, + awk_valtype_t wanted, awk_value_t *result) { NODE *array = (NODE *) a_cookie; @@ -441,7 +459,7 @@ api_get_array_element(awk_ext_id_t id, if (aptr == NULL) return false; - return node_to_awk_value(*aptr, result, AWK_UNDEFINED); + return node_to_awk_value(*aptr, result, wanted); } /* @@ -289,6 +289,7 @@ typedef struct gawk_api { awk_bool_t (*get_array_element)(awk_ext_id_t id, awk_array_t a_cookie, const awk_value_t *const index, + awk_valtype_t wanted, awk_value_t *result); /* @@ -368,8 +369,8 @@ typedef struct gawk_api { #define sym_update(name, value) \ (api->sym_update(ext_id, name, value)) -#define get_array_element(array, index, result) \ - (api->get_array_element(ext_id, array, index, result)) +#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)) |