aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xChangeLog18
-rw-r--r--awk.h15
-rw-r--r--builtin.c62
3 files changed, 41 insertions, 54 deletions
diff --git a/ChangeLog b/ChangeLog
index 2c3a932c..0de3b7af 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2019-01-15 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * builtin.c (do_match, do_intdiv): Remove unused `sub' and `lhs'
+ variables, since assoc_set is now doing all of the work.
+
+2019-01-15 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * awk.h (assoc_set): Move the definition lower down because it
+ needs to be after unref is declared.
+ * builtin.c (do_match): Use assoc_set in 3 places.
+ (do_intdiv): Use assoc_set in 2 places.
+ (do_typeof): Use assoc_set in 2 places.
+
+2019-01-14 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * awk.h (assoc_set): Add new inline function to set an array element
+ to eliminate code duplication and reduce the chance of memory leaks.
+
2019-01-14 Andrew J. Schorr <aschorr@telemetry-investments.com>
* builtin.c (do_typeof): Fix memory leak when populating the
diff --git a/awk.h b/awk.h
index bac788b3..d14eae20 100644
--- a/awk.h
+++ b/awk.h
@@ -1362,6 +1362,7 @@ extern int fatal_tag_valid;
/* assoc_remove --- remove an index from symbol[] */
#define assoc_remove(a, s) ((a)->aremove(a, s) != NULL)
+
/* ------------- Function prototypes or defs (as appropriate) ------------- */
/* array.c */
typedef enum { SORTED_IN = 1, ASORT, ASORTI } sort_context_t;
@@ -2023,6 +2024,20 @@ make_number_node(unsigned int flags)
return r;
}
+/* assoc_set -- set an element in an array */
+
+static inline void
+assoc_set(NODE *array, NODE *sub, NODE *value)
+{
+
+ NODE **lhs = assoc_lookup(array, sub);
+ unref(*lhs);
+ *lhs = value;
+ if (array->astore != NULL)
+ (*array->astore)(array, sub);
+ unref(sub);
+}
+
/*
* str_terminate_f, str_terminate, str_restore: function and macros to
* reduce chances of typos when terminating and restoring strings.
diff --git a/builtin.c b/builtin.c
index 9a64dde0..491a96b3 100644
--- a/builtin.c
+++ b/builtin.c
@@ -2706,8 +2706,6 @@ do_match(int nargs)
if ((s = SUBPATSTART(rp, t1->stptr, ii)) != -1) {
size_t subpat_start;
size_t subpat_len;
- NODE **lhs;
- NODE *sub;
start = t1->stptr + s;
subpat_start = s;
@@ -2719,15 +2717,7 @@ do_match(int nargs)
it = make_string(start, len);
it->flags |= USER_INPUT;
-
- sub = make_number((AWKNUM) (ii));
- lhs = assoc_lookup(dest, sub);
- unref(*lhs);
- *lhs = it;
- /* execute post-assignment routine if any */
- if (dest->astore != NULL)
- (*dest->astore)(dest, sub);
- unref(sub);
+ assoc_set(dest, make_number((AWKNUM) (ii)), it);;
sprintf(buff, "%d", ii);
ilen = strlen(buff);
@@ -2745,14 +2735,7 @@ do_match(int nargs)
slen = ilen + subseplen + 5;
- it = make_number((AWKNUM) subpat_start + 1);
- sub = make_string(buf, slen);
- lhs = assoc_lookup(dest, sub);
- unref(*lhs);
- *lhs = it;
- if (dest->astore != NULL)
- (*dest->astore)(dest, sub);
- unref(sub);
+ assoc_set(dest, make_string(buf, slen), make_number((AWKNUM) subpat_start + 1));
memcpy(buf, buff, ilen);
memcpy(buf + ilen, subsepstr, subseplen);
@@ -2760,14 +2743,7 @@ do_match(int nargs)
slen = ilen + subseplen + 6;
- it = make_number((AWKNUM) subpat_len);
- sub = make_string(buf, slen);
- lhs = assoc_lookup(dest, sub);
- unref(*lhs);
- *lhs = it;
- if (dest->astore != NULL)
- (*dest->astore)(dest, sub);
- unref(sub);
+ assoc_set(dest, make_string(buf, slen), make_number((AWKNUM) subpat_len));
}
}
@@ -4006,7 +3982,6 @@ do_intdiv(int nargs)
{
NODE *numerator, *denominator, *result;
double num, denom, quotient, remainder;
- NODE *sub, **lhs;
result = POP_PARAM();
if (result->type != Node_var_array)
@@ -4044,17 +4019,9 @@ do_intdiv(int nargs)
#endif /* ! HAVE_FMOD */
remainder = double_to_int(remainder);
- sub = make_string("quotient", 8);
- lhs = assoc_lookup(result, sub);
- unref(*lhs);
- *lhs = make_number((AWKNUM) quotient);
- unref(sub);
+ assoc_set(result, make_string("quotient", 8), make_number((AWKNUM) quotient));
- sub = make_string("remainder", 9);
- lhs = assoc_lookup(result, sub);
- unref(*lhs);
- *lhs = make_number((AWKNUM) remainder);
- unref(sub);
+ assoc_set(result, make_string("remainder", 9), make_number((AWKNUM) remainder));
DEREF(denominator);
DEREF(numerator);
@@ -4087,15 +4054,8 @@ do_typeof(int nargs)
/* Node_var_array is never UPREF'ed */
res = "array";
deref = false;
- if (dbg) {
- NODE *sub = make_string("array_type", 10);
- NODE **lhs = assoc_lookup(dbg, sub);
- unref(*lhs);
- *lhs = make_string(arg->array_funcs->name, strlen(arg->array_funcs->name));
- if (dbg->astore != NULL)
- (*dbg->astore)(dbg, sub);
- unref(sub);
- }
+ if (dbg)
+ assoc_set(dbg, make_string("array_type", 10), make_string(arg->array_funcs->name, strlen(arg->array_funcs->name)));
break;
case Node_val:
switch (fixtype(arg)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) {
@@ -4126,13 +4086,7 @@ do_typeof(int nargs)
}
if (dbg) {
const char *s = flags2str(arg->flags);
- NODE *sub = make_string("flags", 5);
- NODE **lhs = assoc_lookup(dbg, sub);
- unref(*lhs);
- *lhs = make_string(s, strlen(s));
- if (dbg->astore != NULL)
- (*dbg->astore)(dbg, sub);
- unref(sub);
+ assoc_set(dbg, make_string("flags", 5), make_string(s, strlen(s)));
}
break;
case Node_var_new: