static awk_value_t * test_array_size(int nargs, awk_value_t *result) { awk_value_t value; size_t count = 0; assert(result != NULL); make_number(0.0, result); if (nargs != 1) { printf("test_array_size: nargs not right (%d should be 1)\n", nargs); goto out; } /* get element count and print it; should match length(array) from awk script */ if (! get_argument(0, AWK_ARRAY, & value)) { printf("test_array_size: get_argument failed\n"); goto out; } if (! get_element_count(value.array_cookie, & count)) { printf("test_array_size: get_element_count failed\n"); goto out; } printf("test_array_size: incoming size is %lu\n", (unsigned long) count); /* clear array - length(array) should then go to zero in script */ if (! clear_array(value.array_cookie)) { printf("test_array_size: clear_array failed\n"); goto out; } make_number(1.0, result); out: return result; }
shape_type(const std::vector<size_t>& shape, const output_type& otype) : m_shape{shape} , m_otype{otype} { m_byte_size = static_cast<size_t>(m_otype.get_size() * get_element_count()); }
shape_type(const std::vector<size_t>& shape, const output_type& otype) : _shape{shape}, _otype{otype} { _byte_size = static_cast<size_t> (_otype.size * get_element_count()); }
static awk_value_t * try_modify_environ(int nargs, awk_value_t *result) { awk_value_t value, index, newvalue; awk_flat_array_t *flat_array; awk_array_t environ_array; size_t count; int i; assert(result != NULL); make_number(0.0, result); if (nargs != 0) { printf("try_modify_environ: nargs not right (%d should be 0)\n", nargs); goto out; } /* get ENVIRON array */ if (sym_lookup("ENVIRON", AWK_ARRAY, & value)) printf("try_modify_environ: sym_lookup of ENVIRON passed\n"); else { printf("try_modify_environ: sym_lookup of ENVIRON failed\n"); goto out; } environ_array = value.array_cookie; if (! get_element_count(environ_array, & count)) { printf("try_modify_environ: get_element_count failed\n"); goto out; } /* setting an array element should fail */ (void) make_const_string("testext2", 8, & index); (void) make_const_string("a value", 7, & value); if (set_array_element(environ_array, & index, & newvalue)) { printf("try_modify_environ: set_array_element of ENVIRON passed\n"); } else { printf("try_modify_environ: set_array_element of ENVIRON failed\n"); gawk_free(index.str_value.str); gawk_free(value.str_value.str); } if (! flatten_array(environ_array, & flat_array)) { printf("try_modify_environ: could not flatten array\n"); goto out; } if (flat_array->count != count) { printf("try_modify_environ: flat_array->count (%lu) != count (%lu)\n", (unsigned long) flat_array->count, (unsigned long) count); goto out; } for (i = 0; i < flat_array->count; i++) { /* don't print */ /* 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("testext", flat_array->elements[i].index.str_value.str) == 0) { flat_array->elements[i].flags |= AWK_ELEMENT_DELETE; printf("try_modify_environ: marking element \"%s\" for deletion\n", flat_array->elements[i].index.str_value.str); } } if (! release_flattened_array(environ_array, flat_array)) { printf("try_modify_environ: could not release flattened array\n"); goto out; } make_number(1.0, result); out: return result; }
/* @load "testext" BEGIN { n = split("blacky rusty sophie raincloud lucky", pets) printf("pets has %d elements\n", length(pets)) 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_and_delete(int nargs, awk_value_t *result) { awk_value_t value, value2, value3; awk_flat_array_t *flat_array; size_t count; char *name; int i; assert(result != NULL); make_number(0.0, result); if (nargs != 2) { printf("dump_array_and_delete: nargs not right (%d should be 2)\n", nargs); goto out; } /* get argument named array as flat array and print it */ if (get_argument(0, AWK_STRING, & value)) { name = value.str_value.str; if (sym_lookup(name, AWK_ARRAY, & value2)) printf("dump_array_and_delete: sym_lookup of %s passed\n", name); else { printf("dump_array_and_delete: sym_lookup of %s failed\n", name); goto out; } } else { printf("dump_array_and_delete: get_argument(0) failed\n"); goto out; } if (! get_element_count(value2.array_cookie, & count)) { printf("dump_array_and_delete: get_element_count failed\n"); goto out; } printf("dump_array_and_delete: incoming size is %lu\n", (unsigned long) count); if (! flatten_array(value2.array_cookie, & flat_array)) { printf("dump_array_and_delete: could not flatten array\n"); goto out; } if (flat_array->count != count) { 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_and_delete: could not release flattened array\n"); goto out; } make_number(1.0, result); out: return result; }