diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2012-09-14 00:16:48 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2012-09-14 00:16:48 +0300 |
commit | fc9109734ddcf57c5f1faaedfadc432ec6841aa8 (patch) | |
tree | 476ccba6d5a68fea0da94f69783e6284db155371 /gawkapi.c | |
parent | 99290f5ca37cb905f7f1dab9be416b2e2057d243 (diff) | |
download | egawk-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.c | 19 |
1 files changed, 15 insertions, 4 deletions
@@ -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]); |