aboutsummaryrefslogtreecommitdiffstats
path: root/extension/testext.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2012-06-19 20:54:19 +0300
committerArnold D. Robbins <arnold@skeeve.com>2012-06-19 20:54:19 +0300
commitfd3c1195711270a001d860770098b8c0d9118c10 (patch)
treec5e0539da1f8f826b3f17839e6186d800b8f13c7 /extension/testext.c
parent3a40be8a79f9d4e4bb205cca4eb15b1ee811f60c (diff)
downloadegawk-fd3c1195711270a001d860770098b8c0d9118c10.tar.gz
egawk-fd3c1195711270a001d860770098b8c0d9118c10.tar.bz2
egawk-fd3c1195711270a001d860770098b8c0d9118c10.zip
Delete marked elements from flattened array.
Diffstat (limited to 'extension/testext.c')
-rw-r--r--extension/testext.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/extension/testext.c b/extension/testext.c
index f5e16ba1..0a7594aa 100644
--- a/extension/testext.c
+++ b/extension/testext.c
@@ -84,25 +84,29 @@ valrep2str(const awk_value_t *value)
BEGIN {
n = split("blacky rusty sophie raincloud lucky", pets)
printf "pets has %d elements\n", length(pets)
- ret = dump_array("pets")
- printf "dump_array(pets) returned %d\n", ret
+ ret = dump_array_and_delete("pets", "3")
+ printf "dump_array_and_delete(pets) returned %d\n", ret
+ if ("3" in pets)
+ printf("dump_array_and_delete() did NOT remove index \"3\"!\n")
+ else
+ printf("dump_array_and_delete() did remove index \"3\"!\n")
print ""
}
*/
static awk_value_t *
-dump_array(int nargs, awk_value_t *result)
+dump_array_and_delete(int nargs, awk_value_t *result)
{
- awk_value_t value, value2;
+ awk_value_t value, value2, value3;
awk_flat_array_t *flat_array;
size_t count;
- int i;
char *name;
+ int i;
assert(result != NULL);
make_number(0.0, result);
- if (nargs != 1) {
- printf("dump_array: nargs not right (%d should be 1)\n", nargs);
+ if (nargs != 2) {
+ printf("dump_array_and_delete: nargs not right (%d should be 2)\n", nargs);
goto out;
}
@@ -110,45 +114,56 @@ dump_array(int nargs, awk_value_t *result)
if (get_argument(0, AWK_STRING, & value)) {
name = value.str_value.str;
if (sym_lookup(name, AWK_ARRAY, & value2))
- printf("dump_array: sym_lookup of %s passed\n", name);
+ printf("dump_array_and_delete: sym_lookup of %s passed\n", name);
else {
- printf("dump_array: sym_lookup of %s failed\n", name);
+ printf("dump_array_and_delete: sym_lookup of %s failed\n", name);
goto out;
}
} else {
- printf("dump_array: get_argument(0) failed\n");
+ printf("dump_array_and_delete: get_argument(0) failed\n");
goto out;
}
if (! get_element_count(value2.array_cookie, & count)) {
- printf("dump_array: get_element_count failed\n");
+ printf("dump_array_and_delete: get_element_count failed\n");
goto out;
}
- printf("dump_array: incoming size is %lu\n", (unsigned long) count);
+ printf("dump_array_and_delete: incoming size is %lu\n", (unsigned long) count);
if (! flatten_array(value2.array_cookie, & flat_array)) {
- printf("dump_array: could not flatten array\n");
+ printf("dump_array_and_delete: could not flatten array\n");
goto out;
}
if (flat_array->count != count) {
- printf("dump_array: flat_array->count (%lu) != count (%lu)\n",
+ printf("dump_array_and_delete: flat_array->count (%lu) != count (%lu)\n",
(unsigned long) flat_array->count,
(unsigned long) count);
goto out;
}
+ if (! get_argument(1, AWK_STRING, & value3)) {
+ printf("dump_array_and_delete: get_argument(1) failed\n");
+ goto out;
+ }
+
for (i = 0; i < flat_array->count; i++) {
printf("\t%s[\"%.*s\"] = %s\n",
name,
(int) flat_array->elements[i].index.str_value.len,
flat_array->elements[i].index.str_value.str,
valrep2str(& flat_array->elements[i].value));
+
+ if (strcmp(value3.str_value.str, flat_array->elements[i].index.str_value.str) == 0) {
+ flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
+ printf("dump_array_and_delete: marking element \"%s\" for deletion\n",
+ flat_array->elements[i].index.str_value.str);
+ }
}
if (! release_flattened_array(value2.array_cookie, flat_array)) {
- printf("dump_array: could not release flattened array\n");
+ printf("dump_array_and_delete: could not release flattened array\n");
goto out;
}
@@ -504,7 +519,7 @@ static void at_exit2(void *data, int exit_status)
}
static awk_ext_func_t func_table[] = {
- { "dump_array", dump_array, 1 },
+ { "dump_array_and_delete", dump_array_and_delete, 2 },
{ "var_test", var_test, 1 },
{ "test_errno", test_errno, 0 },
{ "test_array_size", test_array_size, 1 },