Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
}
Beispiel #4
0
/*
@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;
}