aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--extension/ChangeLog4
-rw-r--r--extension/testext.c2
-rw-r--r--gawkapi.c22
-rw-r--r--gawkapi.h5
5 files changed, 35 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index a5856cac..dd143a87 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}
diff --git a/gawkapi.c b/gawkapi.c
index f57f4f58..b616fbfc 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -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);
}
/*
diff --git a/gawkapi.h b/gawkapi.h
index ca06cea3..7fdd7634 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -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))