static awk_bool_t write_array(int fd, awk_array_t array) { uint32_t i; uint32_t count; awk_flat_array_t *flat_array; if (! flatten_array(array, & flat_array)) { fprintf(stderr, _("write_array: could not flatten array\n")); return awk_false; } count = htonl(flat_array->count); if (write(fd, & count, sizeof(count)) != sizeof(count)) return awk_false; for (i = 0; i < flat_array->count; i++) { if (! write_elem(fd, & flat_array->elements[i])) return awk_false; } if (! release_flattened_array(array, flat_array)) { fprintf(stderr, _("write_array: could not release flattened array\n")); return awk_false; } return awk_true; }
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; }
static awk_value_t * do_fts(int nargs, awk_value_t *result) { awk_value_t pathlist, flagval, dest; awk_flat_array_t *path_array = NULL; char **pathvector = NULL; FTS *heirarchy; int flags; size_t i, count; int ret = -1; static const int mask = ( FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOCHDIR | FTS_PHYSICAL | FTS_SEEDOT | FTS_XDEV); assert(result != NULL); fts_errors = 0; /* ensure a fresh start */ if (do_lint && nargs != 3) lintwarn(ext_id, _("fts: called with incorrect number of arguments, expecting 3")); if (! get_argument(0, AWK_ARRAY, & pathlist)) { warning(ext_id, _("fts: bad first parameter")); update_ERRNO_int(EINVAL); goto out; } if (! get_argument(1, AWK_NUMBER, & flagval)) { warning(ext_id, _("fts: bad second parameter")); update_ERRNO_int(EINVAL); goto out; } if (! get_argument(2, AWK_ARRAY, & dest)) { warning(ext_id, _("fts: bad third parameter")); update_ERRNO_int(EINVAL); goto out; } /* flatten pathlist */ if (! flatten_array(pathlist.array_cookie, & path_array)) { warning(ext_id, _("fts: could not flatten array\n")); goto out; } /* check the flags first, before the array flattening */ /* get flags */ flags = flagval.num_value; /* enforce physical or logical but not both, and not no_stat */ if ((flags & (FTS_PHYSICAL|FTS_LOGICAL)) == 0 || (flags & (FTS_PHYSICAL|FTS_LOGICAL)) == (FTS_PHYSICAL|FTS_LOGICAL)) { update_ERRNO_int(EINVAL); goto out; } if ((flags & FTS_NOSTAT) != 0) { flags &= ~FTS_NOSTAT; if (do_lint) lintwarn(ext_id, _("fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah.")); } flags &= mask; /* turn off anything else */ /* make pathvector */ count = path_array->count + 1; emalloc(pathvector, char **, count * sizeof(char *), "do_fts"); memset(pathvector, 0, count * sizeof(char *)); /* fill it in */ count--; /* ignore final NULL at end of vector */ for (i = 0; i < count; i++) pathvector[i] = path_array->elements[i].value.str_value.str; /* clear dest array */ if (! clear_array(dest.array_cookie)) { warning(ext_id, _("fts: clear_array failed\n")); goto out; } /* let's do it! */ if ((heirarchy = fts_open(pathvector, flags, NULL)) != NULL) { process(heirarchy, dest.array_cookie, (flags & FTS_SEEDOT) != 0); fts_close(heirarchy); if (fts_errors == 0) ret = 0; } else update_ERRNO_int(errno); out: if (pathvector != NULL) free(pathvector); if (path_array != NULL) (void) release_flattened_array(pathlist.array_cookie, path_array); return make_number(ret, 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; }