diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-03-12 21:32:13 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-03-12 21:32:13 +0100 |
| commit | f9782ffc451a99fcd7ab54b05500dbf94e687066 (patch) | |
| tree | e54a6604b9c1f093b710843d151755c80576a709 | |
| parent | c6ba9979782309491d7922f8ad205469e6549303 (diff) | |
| download | busybox-w32-f9782ffc451a99fcd7ab54b05500dbf94e687066.tar.gz busybox-w32-f9782ffc451a99fcd7ab54b05500dbf94e687066.tar.bz2 busybox-w32-f9782ffc451a99fcd7ab54b05500dbf94e687066.zip | |
awk: code shrink
function old new delta
evaluate 3550 3487 -63
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | editors/awk.c | 72 |
1 files changed, 39 insertions, 33 deletions
diff --git a/editors/awk.c b/editors/awk.c index c8e78a16c..30c6b88ef 100644 --- a/editors/awk.c +++ b/editors/awk.c | |||
| @@ -2302,19 +2302,7 @@ static var *evaluate(node *op, var *res) | |||
| 2302 | #define seed (G.evaluate__seed) | 2302 | #define seed (G.evaluate__seed) |
| 2303 | #define sreg (G.evaluate__sreg) | 2303 | #define sreg (G.evaluate__sreg) |
| 2304 | 2304 | ||
| 2305 | node *op1; | ||
| 2306 | var *v1; | 2305 | var *v1; |
| 2307 | struct { | ||
| 2308 | var *v; | ||
| 2309 | const char *s; | ||
| 2310 | } L = L; /* for compiler */ | ||
| 2311 | struct { | ||
| 2312 | var *v; | ||
| 2313 | const char *s; | ||
| 2314 | } R = R; | ||
| 2315 | double L_d = L_d; | ||
| 2316 | uint32_t opinfo; | ||
| 2317 | int opn; | ||
| 2318 | 2306 | ||
| 2319 | if (!op) | 2307 | if (!op) |
| 2320 | return setvar_s(res, NULL); | 2308 | return setvar_s(res, NULL); |
| @@ -2322,12 +2310,25 @@ static var *evaluate(node *op, var *res) | |||
| 2322 | v1 = nvalloc(2); | 2310 | v1 = nvalloc(2); |
| 2323 | 2311 | ||
| 2324 | while (op) { | 2312 | while (op) { |
| 2313 | struct { | ||
| 2314 | var *v; | ||
| 2315 | const char *s; | ||
| 2316 | } L = L; /* for compiler */ | ||
| 2317 | struct { | ||
| 2318 | var *v; | ||
| 2319 | const char *s; | ||
| 2320 | } R = R; | ||
| 2321 | double L_d = L_d; | ||
| 2322 | uint32_t opinfo; | ||
| 2323 | int opn; | ||
| 2324 | node *op1; | ||
| 2325 | |||
| 2325 | opinfo = op->info; | 2326 | opinfo = op->info; |
| 2326 | opn = (opinfo & OPNMASK); | 2327 | opn = (opinfo & OPNMASK); |
| 2327 | g_lineno = op->lineno; | 2328 | g_lineno = op->lineno; |
| 2329 | op1 = op->l.n; | ||
| 2328 | 2330 | ||
| 2329 | /* execute inevitable things */ | 2331 | /* execute inevitable things */ |
| 2330 | op1 = op->l.n; | ||
| 2331 | if (opinfo & OF_RES1) | 2332 | if (opinfo & OF_RES1) |
| 2332 | L.v = evaluate(op1, v1); | 2333 | L.v = evaluate(op1, v1); |
| 2333 | if (opinfo & OF_RES2) | 2334 | if (opinfo & OF_RES2) |
| @@ -2429,20 +2430,23 @@ static var *evaluate(node *op, var *res) | |||
| 2429 | 2430 | ||
| 2430 | case XC( OC_DELETE ): { | 2431 | case XC( OC_DELETE ): { |
| 2431 | uint32_t info = op1->info & OPCLSMASK; | 2432 | uint32_t info = op1->info & OPCLSMASK; |
| 2433 | var *v; | ||
| 2434 | |||
| 2432 | if (info == OC_VAR) { | 2435 | if (info == OC_VAR) { |
| 2433 | R.v = op1->l.v; | 2436 | v = op1->l.v; |
| 2434 | } else if (info == OC_FNARG) { | 2437 | } else if (info == OC_FNARG) { |
| 2435 | R.v = &fnargs[op1->l.aidx]; | 2438 | v = &fnargs[op1->l.aidx]; |
| 2436 | } else { | 2439 | } else { |
| 2437 | syntax_error(EMSG_NOT_ARRAY); | 2440 | syntax_error(EMSG_NOT_ARRAY); |
| 2438 | } | 2441 | } |
| 2439 | 2442 | ||
| 2440 | if (op1->r.n) { | 2443 | if (op1->r.n) { |
| 2444 | const char *s; | ||
| 2441 | clrvar(L.v); | 2445 | clrvar(L.v); |
| 2442 | L.s = getvar_s(evaluate(op1->r.n, v1)); | 2446 | s = getvar_s(evaluate(op1->r.n, v1)); |
| 2443 | hash_remove(iamarray(R.v), L.s); | 2447 | hash_remove(iamarray(v), s); |
| 2444 | } else { | 2448 | } else { |
| 2445 | clear_array(iamarray(R.v)); | 2449 | clear_array(iamarray(v)); |
| 2446 | } | 2450 | } |
| 2447 | break; | 2451 | break; |
| 2448 | } | 2452 | } |
| @@ -2520,30 +2524,32 @@ static var *evaluate(node *op, var *res) | |||
| 2520 | break; | 2524 | break; |
| 2521 | 2525 | ||
| 2522 | case XC( OC_FUNC ): { | 2526 | case XC( OC_FUNC ): { |
| 2523 | var *v; | 2527 | var *vbeg, *v; |
| 2528 | const char *sv_progname; | ||
| 2524 | 2529 | ||
| 2525 | if (!op->r.f->body.first) | 2530 | if (!op->r.f->body.first) |
| 2526 | syntax_error(EMSG_UNDEF_FUNC); | 2531 | syntax_error(EMSG_UNDEF_FUNC); |
| 2527 | 2532 | ||
| 2528 | v = R.v = nvalloc(op->r.f->nargs + 1); | 2533 | vbeg = v = nvalloc(op->r.f->nargs + 1); |
| 2529 | while (op1) { | 2534 | while (op1) { |
| 2530 | L.v = evaluate(nextarg(&op1), v1); | 2535 | var *arg = evaluate(nextarg(&op1), v1); |
| 2531 | copyvar(R.v, L.v); | 2536 | copyvar(v, arg); |
| 2532 | R.v->type |= VF_CHILD; | 2537 | v->type |= VF_CHILD; |
| 2533 | R.v->x.parent = L.v; | 2538 | v->x.parent = arg; |
| 2534 | if (++R.v - v >= op->r.f->nargs) | 2539 | if (++v - vbeg >= op->r.f->nargs) |
| 2535 | break; | 2540 | break; |
| 2536 | } | 2541 | } |
| 2537 | 2542 | ||
| 2538 | R.v = fnargs; | 2543 | v = fnargs; |
| 2539 | fnargs = v; | 2544 | fnargs = vbeg; |
| 2545 | sv_progname = g_progname; | ||
| 2540 | 2546 | ||
| 2541 | L.s = g_progname; | ||
| 2542 | res = evaluate(op->r.f->body.first, res); | 2547 | res = evaluate(op->r.f->body.first, res); |
| 2543 | g_progname = L.s; | ||
| 2544 | 2548 | ||
| 2549 | g_progname = sv_progname; | ||
| 2545 | nvfree(fnargs); | 2550 | nvfree(fnargs); |
| 2546 | fnargs = R.v; | 2551 | fnargs = v; |
| 2552 | |||
| 2547 | break; | 2553 | break; |
| 2548 | } | 2554 | } |
| 2549 | 2555 | ||
| @@ -2790,9 +2796,9 @@ static var *evaluate(node *op, var *res) | |||
| 2790 | if (is_numeric(L.v) && is_numeric(R.v)) { | 2796 | if (is_numeric(L.v) && is_numeric(R.v)) { |
| 2791 | Ld = getvar_i(L.v) - getvar_i(R.v); | 2797 | Ld = getvar_i(L.v) - getvar_i(R.v); |
| 2792 | } else { | 2798 | } else { |
| 2793 | L.s = getvar_s(L.v); | 2799 | const char *l = getvar_s(L.v); |
| 2794 | R.s = getvar_s(R.v); | 2800 | const char *r = getvar_s(R.v); |
| 2795 | Ld = icase ? strcasecmp(L.s, R.s) : strcmp(L.s, R.s); | 2801 | Ld = icase ? strcasecmp(l, r) : strcmp(l, r); |
| 2796 | } | 2802 | } |
| 2797 | switch (opn & 0xfe) { | 2803 | switch (opn & 0xfe) { |
| 2798 | case 0: | 2804 | case 0: |
