diff options
author | Jim Meyering <jim@meyering.net> | 2001-08-18 20:23:01 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2001-08-18 20:23:01 +0000 |
commit | 2dce4a36d9d8bde9ae57ac2d277f637fbe388582 (patch) | |
tree | 869a1e4a810f5fe68431baca55f1e0b469ff214a /src | |
parent | 69683b305dbcd4491ce58c2787fd4d18dd8f61c1 (diff) | |
download | coreutils-2dce4a36d9d8bde9ae57ac2d277f637fbe388582.tar.xz |
Code cleanup to avoid tricky macros and old-style function declarations.
(cmpf, less_than, less_equal, equal, not_equal, greater_equal,
greater_than, arithf, arithdivf, plus, minus, multiply, divide, mod):
Remove.
(eval4, eval3, eval2): Rewrite to avoid the need for the above macros
and functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/expr.c | 106 |
1 files changed, 44 insertions, 62 deletions
diff --git a/src/expr.c b/src/expr.c index 31966629b..98f8ee49b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1,5 +1,5 @@ /* expr -- evaluate expressions. - Copyright (C) 86, 1991-1997, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 86, 1991-1997, 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -368,61 +368,6 @@ nomoreargs (void) return *args == 0; } -/* The comparison operator handling functions. */ - -#define cmpf(name, rel) \ -static \ -int name (l, r) VALUE *l; VALUE *r; \ -{ \ - if (isstring (l) || isstring (r)) \ - { \ - tostring (l); \ - tostring (r); \ - return strcmp (l->u.s, r->u.s) rel 0; \ - } \ - else \ - return l->u.i rel r->u.i; \ -} - cmpf (less_than, <) - cmpf (less_equal, <=) - cmpf (equal, ==) - cmpf (not_equal, !=) - cmpf (greater_equal, >=) - cmpf (greater_than, >) - -#undef cmpf - -/* The arithmetic operator handling functions. */ - -#define arithf(name, op) \ -static intmax_t \ -name (l, r) VALUE *l; VALUE *r; \ -{ \ - if (!toarith (l) || !toarith (r)) \ - error (2, 0, _("non-numeric argument")); \ - return l->u.i op r->u.i; \ -} - -#define arithdivf(name, op) \ -static intmax_t \ -name (l, r) VALUE *l; VALUE *r; \ -{ \ - if (!toarith (l) || !toarith (r)) \ - error (2, 0, _("non-numeric argument")); \ - if (r->u.i == 0) \ - error (2, 0, _("division by zero")); \ - return l->u.i op r->u.i; \ -} - - arithf (plus, +) - arithf (minus, -) - arithf (multiply, *) - arithdivf (divide, /) - arithdivf (mod, %) - -#undef arithf -#undef arithdivf - #ifdef EVAL_TRACE /* Print evaluation trace and args remaining. */ @@ -649,7 +594,7 @@ eval4 (void) { VALUE *l; VALUE *r; - intmax_t (*fxn) (); + enum { multiply, divide, mod } fxn; intmax_t val; #ifdef EVAL_TRACE @@ -668,7 +613,16 @@ eval4 (void) return l; args++; r = eval5 (); - val = (*fxn) (l, r); + if (!toarith (l) || !toarith (r)) + error (2, 0, _("non-numeric argument")); + if (fxn == multiply) + val = l->u.i * r->u.i; + else + { + if (r->u.i == 0) + error (2, 0, _("division by zero")); + val = fxn == divide ? l->u.i / r->u.i : l->u.i % r->u.i; + } freev (l); freev (r); l = int_value (val); @@ -682,7 +636,7 @@ eval3 (void) { VALUE *l; VALUE *r; - intmax_t (*fxn) (); + enum { plus, minus } fxn; intmax_t val; #ifdef EVAL_TRACE @@ -699,7 +653,9 @@ eval3 (void) return l; args++; r = eval4 (); - val = (*fxn) (l, r); + if (!toarith (l) || !toarith (r)) + error (2, 0, _("non-numeric argument")); + val = fxn == plus ? l->u.i + r->u.i : l->u.i - r->u.i; freev (l); freev (r); l = int_value (val); @@ -713,8 +669,13 @@ eval2 (void) { VALUE *l; VALUE *r; - int (*fxn) (); + enum + { + less_than, less_equal, equal, not_equal, greater_equal, greater_than + } fxn; int val; + intmax_t lval; + intmax_t rval; #ifdef EVAL_TRACE trace ("eval2"); @@ -740,7 +701,28 @@ eval2 (void) r = eval3 (); toarith (l); toarith (r); - val = (*fxn) (l, r); + if (isstring (l) || isstring (r)) + { + tostring (l); + tostring (r); + lval = strcoll (l->u.s, r->u.s); + rval = 0; + } + else + { + lval = l->u.i; + rval = r->u.i; + } + switch (fxn) + { + case less_than: val = (lval < rval); break; + case less_equal: val = (lval <= rval); break; + case equal: val = (lval == rval); break; + case not_equal: val = (lval != rval); break; + case greater_equal: val = (lval >= rval); break; + case greater_than: val = (lval > rval); break; + default: abort (); + } freev (l); freev (r); l = int_value (val); |