aboutsummaryrefslogtreecommitdiffstats
path: root/gawkapi.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2012-09-14 00:16:48 +0300
committerArnold D. Robbins <arnold@skeeve.com>2012-09-14 00:16:48 +0300
commitfc9109734ddcf57c5f1faaedfadc432ec6841aa8 (patch)
tree476ccba6d5a68fea0da94f69783e6284db155371 /gawkapi.c
parent99290f5ca37cb905f7f1dab9be416b2e2057d243 (diff)
downloadegawk-fc9109734ddcf57c5f1faaedfadc432ec6841aa8.tar.gz
egawk-fc9109734ddcf57c5f1faaedfadc432ec6841aa8.tar.bz2
egawk-fc9109734ddcf57c5f1faaedfadc432ec6841aa8.zip
Allow extensions read-only access to built-in vars.
Diffstat (limited to 'gawkapi.c')
-rw-r--r--gawkapi.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/gawkapi.c b/gawkapi.c
index 5d372bbe..dbb8549b 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -489,10 +489,12 @@ api_sym_lookup(awk_ext_id_t id,
if ( name == NULL
|| *name == '\0'
|| result == NULL
- || is_off_limits_var(name) /* most built-in vars not allowed */
|| (node = lookup(name)) == NULL)
return false;
+ if (is_off_limits_var(name)) /* a built-in variable */
+ node->flags |= NO_EXT_SET;
+
return node_to_awk_value(node, result, wanted);
}
@@ -527,7 +529,6 @@ sym_update_real(awk_ext_id_t id,
if ( name == NULL
|| *name == '\0'
- || is_off_limits_var(name) /* most built-in vars not allowed */
|| value == NULL)
return false;
@@ -573,6 +574,12 @@ sym_update_real(awk_ext_id_t id,
* If we get here, then it exists already. Any valid type is
* OK except for AWK_ARRAY.
*/
+ if ( (node->flags & NO_EXT_SET) != 0
+ || is_off_limits_var(name)) { /* most built-in vars not allowed */
+ node->flags |= NO_EXT_SET;
+ return false;
+ }
+
if ( value->val_type != AWK_ARRAY
&& (node->type == Node_var || node->type == Node_var_new)) {
unref(node->var_value);
@@ -618,7 +625,8 @@ api_sym_update_scalar(awk_ext_id_t id,
if (value == NULL
|| node == NULL
- || node->type != Node_var)
+ || node->type != Node_var
+ || (node->flags & NO_EXT_SET) != 0)
return false;
/*
@@ -766,6 +774,7 @@ 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
+ || (array->flags & NO_EXT_SET) != 0
|| index == NULL
|| value == NULL
|| ! valid_subscript_type(index->val_type))
@@ -825,6 +834,7 @@ api_del_array_element(awk_ext_id_t id,
array = (NODE *) a_cookie;
if ( array == NULL
|| array->type != Node_var_array
+ || (array->flags & NO_EXT_SET) != 0
|| index == NULL
|| ! valid_subscript_type(index->val_type))
return false;
@@ -957,7 +967,8 @@ api_release_flattened_array(awk_ext_id_t id,
/* free index nodes */
for (i = j = 0, k = 2 * array->table_size; i < k; i += 2, j++) {
/* Delete items flagged for delete. */
- if ((data->elements[j].flags & AWK_ELEMENT_DELETE) != 0) {
+ if ( (data->elements[j].flags & AWK_ELEMENT_DELETE) != 0
+ && (array->flags & NO_EXT_SET) == 0) {
remove_element(array, list[i]);
}
unref(list[i]);