diff options
Diffstat (limited to 'builtin.c')
-rw-r--r-- | builtin.c | 58 |
1 files changed, 20 insertions, 38 deletions
@@ -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); @@ -4071,13 +4038,24 @@ do_typeof(int nargs) NODE *arg; char *res = NULL; bool deref = true; + NODE *dbg; + if (nargs == 2) { /* 2nd optional arg for debugging */ + dbg = POP_PARAM(); + if (dbg->type != Node_var_array) + fatal(_("typeof: second argument is not an array")); + assoc_clear(dbg); + } + else + dbg = NULL; arg = POP(); switch (arg->type) { case Node_var_array: /* Node_var_array is never UPREF'ed */ res = "array"; deref = false; + 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)) { @@ -4106,6 +4084,10 @@ do_typeof(int nargs) } break; } + if (dbg) { + const char *s = flags2str(arg->flags); + assoc_set(dbg, make_string("flags", 5), make_string(s, strlen(s))); + } break; case Node_var_new: res = "untyped"; |