summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xChangeLog15
-rw-r--r--array.c30
-rw-r--r--awk.h2
-rw-r--r--debug.c12
-rw-r--r--field.c20
-rw-r--r--gawkapi.c9
-rw-r--r--interpret.h9
-rw-r--r--main.c64
-rw-r--r--mpfr.c10
-rw-r--r--str_array.c2
-rw-r--r--symbol.c7
11 files changed, 72 insertions, 108 deletions
diff --git a/ChangeLog b/ChangeLog
index 0de3b7af..d7d1471e 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2019-01-15 Arnold D. Robbins <arnold@skeeve.com>
+
+ * array.c (asort_actual): Use assoc_set in 2 places.
+ * awk.h (assoc_set): Improve leading comment.
+ * debug.c (do_set_var): Use assoc_set in 2 places.
+ * field.c (set_element, update_PROCINFO_str, update_PROCINFO_num):
+ Use assoc_set in each.
+ * gawkapi.c (api_set_array_element): Use assoc_set.
+ * interpret.h (r_interpret): Use assoc_set.
+ * main.c (init_args, load_environ, load_procinfo_argv):
+ Use assoc_set in each.
+ * mpfr.c (do_mpfr_intdiv): Use assoc_set in 2 places.
+ * str_array.c (str_lookup): Fix leading comment.
+ * symbol.c (install): Use assoc_set.
+
2019-01-15 Andrew J. Schorr <aschorr@telemetry-investments.com>
* builtin.c (do_match, do_intdiv): Remove unused `sub' and `lhs'
diff --git a/array.c b/array.c
index 34b7076a..2cc76743 100644
--- a/array.c
+++ b/array.c
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 1986, 1988, 1989, 1991-2014, 2016, 2018,
+ * Copyright (C) 1986, 1988, 1989, 1991-2014, 2016, 2018, 2019,
* the Free Software Foundation, Inc.
*
* This file is part of GAWK, the GNU implementation of the
@@ -796,7 +796,7 @@ asort_actual(int nargs, sort_context_t ctxt)
{
NODE *array, *dest = NULL, *result;
NODE *r, *subs, *s;
- NODE **list = NULL, **ptr, **lhs;
+ NODE **list = NULL, **ptr;
unsigned long num_elems, i;
const char *sort_str;
char save;
@@ -884,12 +884,7 @@ asort_actual(int nargs, sort_context_t ctxt)
for (i = 1, ptr = list; i <= num_elems; i++, ptr += 2) {
subs = make_number(i);
- lhs = assoc_lookup(result, subs);
- unref(*lhs);
- *lhs = *ptr;
- if (result->astore != NULL)
- (*result->astore)(result, subs);
- unref(subs);
+ assoc_set(result, subs, *ptr);
}
} else {
/* We want the values of the source array. */
@@ -904,11 +899,11 @@ asort_actual(int nargs, sort_context_t ctxt)
/* value node */
r = *ptr++;
- if (r->type == Node_val) {
- lhs = assoc_lookup(result, subs);
- unref(*lhs);
- *lhs = dupnode(r);
- } else {
+ NODE *value;
+
+ if (r->type == Node_val)
+ value = dupnode(r);
+ else {
NODE *arr;
arr = make_array();
subs = force_string(subs);
@@ -917,13 +912,10 @@ asort_actual(int nargs, sort_context_t ctxt)
subs->stptr = NULL;
subs->flags &= ~STRCUR;
arr->parent_array = array; /* actual parent, not the temporary one. */
- lhs = assoc_lookup(result, subs);
- unref(*lhs);
- *lhs = assoc_copy(r, arr);
+
+ value = assoc_copy(r, arr);
}
- if (result->astore != NULL)
- (*result->astore)(result, subs);
- unref(subs);
+ assoc_set(result, subs, value);
}
}
diff --git a/awk.h b/awk.h
index d14eae20..378b935f 100644
--- a/awk.h
+++ b/awk.h
@@ -2024,7 +2024,7 @@ make_number_node(unsigned int flags)
return r;
}
-/* assoc_set -- set an element in an array */
+/* assoc_set -- set an element in an array. Does unref(sub)! */
static inline void
assoc_set(NODE *array, NODE *sub, NODE *value)
diff --git a/debug.c b/debug.c
index f8aa6adf..f36a3270 100644
--- a/debug.c
+++ b/debug.c
@@ -1250,6 +1250,7 @@ do_set_var(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
{
NODE *subs, *value;
int count = arg->a_count;
+ NODE *newval;
assert(count > 0);
name = arg->a_string;
@@ -1268,11 +1269,10 @@ do_set_var(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
else {
arg = arg->next;
val = arg->a_node;
- lhs = assoc_lookup(r, subs);
- unref(*lhs);
- *lhs = dupnode(val);
+ newval = dupnode(val);
+ assoc_set(r, dupnode(subs), newval);
fprintf(out_fp, "%s[\"%.*s\"] = ", name, (int) subs->stlen, subs->stptr);
- valinfo(*lhs, fprintf, out_fp);
+ valinfo(newval, fprintf, out_fp);
}
} else {
if (value == NULL) {
@@ -1280,9 +1280,7 @@ do_set_var(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
array = make_array();
array->vname = estrdup(subs->stptr, subs->stlen);
array->parent_array = r;
- lhs = assoc_lookup(r, subs);
- unref(*lhs);
- *lhs = array;
+ assoc_set(r, dupnode(subs), array);
r = array;
} else if (value->type != Node_var_array) {
d_error(_("attempt to use scalar `%s[\"%.*s\"]' as array"),
diff --git a/field.c b/field.c
index ccf47df1..d8bb52b7 100644
--- a/field.c
+++ b/field.c
@@ -949,18 +949,12 @@ static void
set_element(long num, char *s, long len, NODE *n)
{
NODE *it;
- NODE **lhs;
NODE *sub;
it = make_string(s, len);
it->flags |= USER_INPUT;
sub = make_number((AWKNUM) (num));
- lhs = assoc_lookup(n, sub);
- unref(*lhs);
- *lhs = it;
- if (n->astore != NULL)
- (*n->astore)(n, sub);
- unref(sub);
+ assoc_set(n, sub, it);
}
/* do_split --- implement split(), semantics are same as for field splitting */
@@ -1412,16 +1406,12 @@ current_field_sep_str()
void
update_PROCINFO_str(const char *subscript, const char *str)
{
- NODE **aptr;
NODE *tmp;
if (PROCINFO_node == NULL)
return;
tmp = make_string(subscript, strlen(subscript));
- aptr = assoc_lookup(PROCINFO_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(str, strlen(str));
+ assoc_set(PROCINFO_node, tmp, make_string(str, strlen(str)));
}
/* update_PROCINFO_num --- update PROCINFO[sub] with numeric value */
@@ -1429,16 +1419,12 @@ update_PROCINFO_str(const char *subscript, const char *str)
void
update_PROCINFO_num(const char *subscript, AWKNUM val)
{
- NODE **aptr;
NODE *tmp;
if (PROCINFO_node == NULL)
return;
tmp = make_string(subscript, strlen(subscript));
- aptr = assoc_lookup(PROCINFO_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_number(val);
+ assoc_set(PROCINFO_node, tmp, make_number(val));
}
/* set_FPAT --- handle an assignment to FPAT */
diff --git a/gawkapi.c b/gawkapi.c
index 3227d55f..c76c7b53 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -1046,7 +1046,6 @@ api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
NODE *array = (NODE *)a_cookie;
NODE *tmp;
NODE *elem;
- NODE **aptr;
/* don't check for index len zero, null str is ok as index */
if ( array == NULL
@@ -1058,17 +1057,13 @@ api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
return awk_false;
tmp = awk_value_to_node(index);
- aptr = assoc_lookup(array, tmp);
- unref(*aptr);
- elem = *aptr = awk_value_to_node(value);
+ elem = awk_value_to_node(value);
if (elem->type == Node_var_array) {
elem->parent_array = array;
elem->vname = estrdup(index->str_value.str,
index->str_value.len);
}
- if (array->astore != NULL)
- (*array->astore)(array, tmp);
- unref(tmp);
+ assoc_set(array, tmp, elem);
return awk_true;
}
diff --git a/interpret.h b/interpret.h
index 82329e85..53abadcb 100644
--- a/interpret.h
+++ b/interpret.h
@@ -303,22 +303,15 @@ uninitialized_scalar:
if (r == NULL) {
r = make_array();
r->parent_array = t1;
- lhs = assoc_lookup(t1, t2);
- unref(*lhs);
- *lhs = r;
t2 = force_string(t2);
r->vname = estrdup(t2->stptr, t2->stlen); /* the subscript in parent array */
-
- /* execute post-assignment routine if any */
- if (t1->astore != NULL)
- (*t1->astore)(t1, t2);
+ assoc_set(t1, t2, r);
} else if (r->type != Node_var_array) {
t2 = force_string(t2);
fatal(_("attempt to use scalar `%s[\"%.*s\"]' as an array"),
array_vname(t1), (int) t2->stlen, t2->stptr);
}
- DEREF(t2);
PUSH(r);
break;
diff --git a/main.c b/main.c
index 03a96f30..878e8086 100644
--- a/main.c
+++ b/main.c
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 1986, 1988, 1989, 1991-2018 the Free Software Foundation, Inc.
+ * Copyright (C) 1986, 1988, 1989, 1991-2019 the Free Software Foundation, Inc.
*
* This file is part of GAWK, the GNU implementation of the
* AWK Programming Language.
@@ -745,23 +745,19 @@ static void
init_args(int argc0, int argc, const char *argv0, char **argv)
{
int i, j;
- NODE **aptr;
- NODE *tmp;
+ NODE *sub, *val;
ARGV_node = install_symbol(estrdup("ARGV", 4), Node_var_array);
- tmp = make_number(0.0);
- aptr = assoc_lookup(ARGV_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(argv0, strlen(argv0));
- (*aptr)->flags |= USER_INPUT;
+ sub = make_number(0.0);
+ val = make_string(argv0, strlen(argv0));
+ val->flags |= USER_INPUT;
+ assoc_set(ARGV_node, sub, val);
+
for (i = argc0, j = 1; i < argc; i++, j++) {
- tmp = make_number((AWKNUM) j);
- aptr = assoc_lookup(ARGV_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(argv[i], strlen(argv[i]));
- (*aptr)->flags |= USER_INPUT;
+ sub = make_number((AWKNUM) j);
+ val = make_string(argv[i], strlen(argv[i]));
+ val->flags |= USER_INPUT;
+ assoc_set(ARGV_node, sub, val);
}
ARGC_node = install_symbol(estrdup("ARGC", 4), Node_var);
@@ -890,9 +886,8 @@ load_environ()
extern char **environ;
#endif
char *var, *val;
- NODE **aptr;
int i;
- NODE *tmp;
+ NODE *sub, *newval;
static bool been_here = false;
if (been_here)
@@ -910,12 +905,10 @@ load_environ()
*val++ = '\0';
else
val = nullstr;
- tmp = make_string(var, strlen(var));
- aptr = assoc_lookup(ENVIRON_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(val, strlen(val));
- (*aptr)->flags |= USER_INPUT;
+ sub = make_string(var, strlen(var));
+ newval = make_string(val, strlen(val));
+ newval->flags |= USER_INPUT;
+ assoc_set(ENVIRON_node, sub, newval);
/* restore '=' so that system() gets a valid environment */
if (val != nullstr)
@@ -939,31 +932,32 @@ load_environ()
return ENVIRON_node;
}
+/* load_procinfo_argv --- populate PROCINFO["argv"] */
+
static void
load_procinfo_argv()
{
- NODE *tmp;
- NODE **aptr;
+ NODE *sub;
+ NODE *val;
NODE *argv_array;
int i;
- tmp = make_string("argv", 4);
- aptr = assoc_lookup(PROCINFO_node, tmp);
- unref(tmp);
- unref(*aptr);
+ // build the sub-array first
getnode(argv_array);
memset(argv_array, '\0', sizeof(NODE)); /* valgrind wants this */
null_array(argv_array);
- *aptr = argv_array;
argv_array->parent_array = PROCINFO_node;
argv_array->vname = estrdup("argv", 4);
for (i = 0; d_argv[i] != NULL; i++) {
- tmp = make_number(i);
- aptr = assoc_lookup(argv_array, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(d_argv[i], strlen(d_argv[i]));
+ sub = make_number(i);
+ val = make_string(d_argv[i], strlen(d_argv[i]));
+ assoc_set(argv_array, sub, val);
}
+
+ // hook it into PROCINFO
+ sub = make_string("argv", 4);
+ assoc_set(PROCINFO_node, sub, argv_array);
+
}
/* load_procinfo --- populate the PROCINFO array */
diff --git a/mpfr.c b/mpfr.c
index c3ba2a6a..e1712863 100644
--- a/mpfr.c
+++ b/mpfr.c
@@ -1262,16 +1262,10 @@ do_mpfr_intdiv(int nargs)
unref(denominator);
sub = make_string("quotient", 8);
- lhs = assoc_lookup(result, sub);
- unref(*lhs);
- *lhs = quotient;
- unref(sub);
+ assoc_set(result, sub, quotient);
sub = make_string("remainder", 9);
- lhs = assoc_lookup(result, sub);
- unref(*lhs);
- *lhs = remainder;
- unref(sub);
+ assoc_set(result, sub, remainder);
return make_number((AWKNUM) 0.0);
}
diff --git a/str_array.c b/str_array.c
index 2fdd1bf2..85e554b8 100644
--- a/str_array.c
+++ b/str_array.c
@@ -121,7 +121,7 @@ str_array_init(NODE *symbol ATTRIBUTE_UNUSED, NODE *subs ATTRIBUTE_UNUSED)
/*
- * assoc_lookup:
+ * str_lookup:
* Find SYMBOL[SUBS] in the assoc array. Install it with value "" if it
* isn't there. Returns a pointer ala get_lhs to where its value is stored.
*
diff --git a/symbol.c b/symbol.c
index fc598da5..94d66fe8 100644
--- a/symbol.c
+++ b/symbol.c
@@ -307,7 +307,6 @@ static NODE *
install(const char *name, NODE *parm, NODETYPE type)
{
NODE *r;
- NODE **aptr;
NODE *table;
NODE *n_name;
NODE *prev;
@@ -353,14 +352,12 @@ install(const char *name, NODE *parm, NODETYPE type)
goto simple;
r->dup_ent = prev->dup_ent;
prev->dup_ent = r;
+ unref(n_name);
} else {
simple:
/* the simple case */
- aptr = assoc_lookup(table, n_name);
- unref(*aptr);
- *aptr = r;
+ assoc_set(table, n_name, r);
}
- unref(n_name);
if (install_func)
(*install_func)(r);