Patch-ID: bash32-011
[bash.git] / expr.c
blob418f48d0ec8736701926a4c94320c3da9300df30
1 /* expr.c -- arithmetic expression evaluation. */
3 /* Copyright (C) 1990-2004 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 Bash is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
22 All arithmetic is done as intmax_t integers with no checking for overflow
23 (though division by 0 is caught and flagged as an error).
25 The following operators are handled, grouped into a set of levels in
26 order of decreasing precedence.
28 "id++", "id--" [post-increment and post-decrement]
29 "++id", "--id" [pre-increment and pre-decrement]
30 "-", "+" [(unary operators)]
31 "!", "~"
32 "**" [(exponentiation)]
33 "*", "/", "%"
34 "+", "-"
35 "<<", ">>"
36 "<=", ">=", "<", ">"
37 "==", "!="
38 "&"
39 "^"
40 "|"
41 "&&"
42 "||"
43 "expr ? expr : expr"
44 "=", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|="
45 , [comma]
47 (Note that most of these operators have special meaning to bash, and an
48 entire expression should be quoted, e.g. "a=$a+1" or "a=a+1" to ensure
49 that it is passed intact to the evaluator when using `let'. When using
50 the $[] or $(( )) forms, the text between the `[' and `]' or `((' and `))'
51 is treated as if in double quotes.)
53 Sub-expressions within parentheses have a precedence level greater than
54 all of the above levels and are evaluated first. Within a single prece-
55 dence group, evaluation is left-to-right, except for the arithmetic
56 assignment operator (`='), which is evaluated right-to-left (as in C).
58 The expression evaluator returns the value of the expression (assignment
59 statements have as a value what is returned by the RHS). The `let'
60 builtin, on the other hand, returns 0 if the last expression evaluates to
61 a non-zero, and 1 otherwise.
63 Implementation is a recursive-descent parser.
65 Chet Ramey
66 chet@ins.CWRU.Edu
69 #include "config.h"
71 #include <stdio.h>
72 #include "bashansi.h"
74 #if defined (HAVE_UNISTD_H)
75 # ifdef _MINIX
76 # include <sys/types.h>
77 # endif
78 # include <unistd.h>
79 #endif
81 #include "chartypes.h"
82 #include "bashintl.h"
84 #include "shell.h"
86 /* Because of the $((...)) construct, expressions may include newlines.
87 Here is a macro which accepts newlines, tabs and spaces as whitespace. */
88 #define cr_whitespace(c) (whitespace(c) || ((c) == '\n'))
90 /* Size be which the expression stack grows when neccessary. */
91 #define EXPR_STACK_GROW_SIZE 10
93 /* Maximum amount of recursion allowed. This prevents a non-integer
94 variable such as "num=num+2" from infinitely adding to itself when
95 "let num=num+2" is given. */
96 #define MAX_EXPR_RECURSION_LEVEL 1024
98 /* The Tokens. Singing "The Lion Sleeps Tonight". */
100 #define EQEQ 1 /* "==" */
101 #define NEQ 2 /* "!=" */
102 #define LEQ 3 /* "<=" */
103 #define GEQ 4 /* ">=" */
104 #define STR 5 /* string */
105 #define NUM 6 /* number */
106 #define LAND 7 /* "&&" Logical AND */
107 #define LOR 8 /* "||" Logical OR */
108 #define LSH 9 /* "<<" Left SHift */
109 #define RSH 10 /* ">>" Right SHift */
110 #define OP_ASSIGN 11 /* op= expassign as in Posix.2 */
111 #define COND 12 /* exp1 ? exp2 : exp3 */
112 #define POWER 13 /* exp1**exp2 */
113 #define PREINC 14 /* ++var */
114 #define PREDEC 15 /* --var */
115 #define POSTINC 16 /* var++ */
116 #define POSTDEC 17 /* var-- */
117 #define EQ '='
118 #define GT '>'
119 #define LT '<'
120 #define PLUS '+'
121 #define MINUS '-'
122 #define MUL '*'
123 #define DIV '/'
124 #define MOD '%'
125 #define NOT '!'
126 #define LPAR '('
127 #define RPAR ')'
128 #define BAND '&' /* Bitwise AND */
129 #define BOR '|' /* Bitwise OR. */
130 #define BXOR '^' /* Bitwise eXclusive OR. */
131 #define BNOT '~' /* Bitwise NOT; Two's complement. */
132 #define QUES '?'
133 #define COL ':'
134 #define COMMA ','
136 /* This should be the function corresponding to the operator with the
137 highest precedence. */
138 #define EXP_HIGHEST expcomma
140 static char *expression; /* The current expression */
141 static char *tp; /* token lexical position */
142 static char *lasttp; /* pointer to last token position */
143 static int curtok; /* the current token */
144 static int lasttok; /* the previous token */
145 static int assigntok; /* the OP in OP= */
146 static char *tokstr; /* current token string */
147 static intmax_t tokval; /* current token value */
148 static int noeval; /* set to 1 if no assignment to be done */
149 static procenv_t evalbuf;
151 static int _is_arithop __P((int));
152 static void readtok __P((void)); /* lexical analyzer */
154 static intmax_t expr_streval __P((char *, int));
155 static intmax_t strlong __P((char *));
156 static void evalerror __P((char *));
158 static void pushexp __P((void));
159 static void popexp __P((void));
160 static void expr_unwind __P((void));
161 static void expr_bind_variable __P((char *, char *));
163 static intmax_t subexpr __P((char *));
165 static intmax_t expcomma __P((void));
166 static intmax_t expassign __P((void));
167 static intmax_t expcond __P((void));
168 static intmax_t explor __P((void));
169 static intmax_t expland __P((void));
170 static intmax_t expbor __P((void));
171 static intmax_t expbxor __P((void));
172 static intmax_t expband __P((void));
173 static intmax_t exp5 __P((void));
174 static intmax_t exp4 __P((void));
175 static intmax_t expshift __P((void));
176 static intmax_t exp3 __P((void));
177 static intmax_t exp2 __P((void));
178 static intmax_t exppower __P((void));
179 static intmax_t exp1 __P((void));
180 static intmax_t exp0 __P((void));
182 /* A structure defining a single expression context. */
183 typedef struct {
184 int curtok, lasttok;
185 char *expression, *tp, *lasttp;
186 intmax_t tokval;
187 char *tokstr;
188 int noeval;
189 } EXPR_CONTEXT;
191 #ifdef INCLUDE_UNUSED
192 /* Not used yet. */
193 typedef struct {
194 char *tokstr;
195 intmax_t tokval;
196 } LVALUE;
197 #endif
199 /* Global var which contains the stack of expression contexts. */
200 static EXPR_CONTEXT **expr_stack;
201 static int expr_depth; /* Location in the stack. */
202 static int expr_stack_size; /* Number of slots already allocated. */
204 extern char *this_command_name;
205 extern int unbound_vars_is_error;
207 #if defined (ARRAY_VARS)
208 extern char *bash_badsub_errmsg;
209 #endif
211 #define SAVETOK(X) \
212 do { \
213 (X)->curtok = curtok; \
214 (X)->lasttok = lasttok; \
215 (X)->tp = tp; \
216 (X)->lasttp = lasttp; \
217 (X)->tokval = tokval; \
218 (X)->tokstr = tokstr; \
219 (X)->noeval = noeval; \
220 } while (0)
222 #define RESTORETOK(X) \
223 do { \
224 curtok = (X)->curtok; \
225 lasttok = (X)->lasttok; \
226 tp = (X)->tp; \
227 lasttp = (X)->lasttp; \
228 tokval = (X)->tokval; \
229 tokstr = (X)->tokstr; \
230 noeval = (X)->noeval; \
231 } while (0)
233 /* Push and save away the contents of the globals describing the
234 current expression context. */
235 static void
236 pushexp ()
238 EXPR_CONTEXT *context;
240 if (expr_depth >= MAX_EXPR_RECURSION_LEVEL)
241 evalerror (_("expression recursion level exceeded"));
243 if (expr_depth >= expr_stack_size)
245 expr_stack_size += EXPR_STACK_GROW_SIZE;
246 expr_stack = (EXPR_CONTEXT **)xrealloc (expr_stack, expr_stack_size * sizeof (EXPR_CONTEXT *));
249 context = (EXPR_CONTEXT *)xmalloc (sizeof (EXPR_CONTEXT));
251 context->expression = expression;
252 SAVETOK(context);
254 expr_stack[expr_depth++] = context;
257 /* Pop the the contents of the expression context stack into the
258 globals describing the current expression context. */
259 static void
260 popexp ()
262 EXPR_CONTEXT *context;
264 if (expr_depth == 0)
265 evalerror (_("recursion stack underflow"));
267 context = expr_stack[--expr_depth];
269 expression = context->expression;
270 RESTORETOK (context);
272 free (context);
275 static void
276 expr_unwind ()
278 while (--expr_depth > 0)
280 if (expr_stack[expr_depth]->tokstr)
281 free (expr_stack[expr_depth]->tokstr);
283 if (expr_stack[expr_depth]->expression)
284 free (expr_stack[expr_depth]->expression);
286 free (expr_stack[expr_depth]);
288 free (expr_stack[expr_depth]); /* free the allocated EXPR_CONTEXT */
291 static void
292 expr_bind_variable (lhs, rhs)
293 char *lhs, *rhs;
295 (void)bind_int_variable (lhs, rhs);
296 stupidly_hack_special_variables (lhs);
299 /* Evaluate EXPR, and return the arithmetic result. If VALIDP is
300 non-null, a zero is stored into the location to which it points
301 if the expression is invalid, non-zero otherwise. If a non-zero
302 value is returned in *VALIDP, the return value of evalexp() may
303 be used.
305 The `while' loop after the longjmp is caught relies on the above
306 implementation of pushexp and popexp leaving in expr_stack[0] the
307 values that the variables had when the program started. That is,
308 the first things saved are the initial values of the variables that
309 were assigned at program startup or by the compiler. Therefore, it is
310 safe to let the loop terminate when expr_depth == 0, without freeing up
311 any of the expr_depth[0] stuff. */
312 intmax_t
313 evalexp (expr, validp)
314 char *expr;
315 int *validp;
317 intmax_t val;
318 int c;
319 procenv_t oevalbuf;
321 val = 0;
323 FASTCOPY (evalbuf, oevalbuf, sizeof (evalbuf));
325 c = setjmp (evalbuf);
327 if (c)
329 FREE (tokstr);
330 FREE (expression);
331 tokstr = expression = (char *)NULL;
333 expr_unwind ();
335 if (validp)
336 *validp = 0;
337 return (0);
340 val = subexpr (expr);
342 if (validp)
343 *validp = 1;
345 FASTCOPY (oevalbuf, evalbuf, sizeof (evalbuf));
347 return (val);
350 static intmax_t
351 subexpr (expr)
352 char *expr;
354 intmax_t val;
355 char *p;
357 for (p = expr; p && *p && cr_whitespace (*p); p++)
360 if (p == NULL || *p == '\0')
361 return (0);
363 pushexp ();
364 curtok = lasttok = 0;
365 expression = savestring (expr);
366 tp = expression;
368 tokstr = (char *)NULL;
369 tokval = 0;
371 readtok ();
373 val = EXP_HIGHEST ();
375 if (curtok != 0)
376 evalerror (_("syntax error in expression"));
378 FREE (tokstr);
379 FREE (expression);
381 popexp ();
383 return val;
386 static intmax_t
387 expcomma ()
389 register intmax_t value;
391 value = expassign ();
392 while (curtok == COMMA)
394 readtok ();
395 value = expassign ();
398 return value;
401 static intmax_t
402 expassign ()
404 register intmax_t value;
405 char *lhs, *rhs;
407 value = expcond ();
408 if (curtok == EQ || curtok == OP_ASSIGN)
410 int special, op;
411 intmax_t lvalue;
413 special = curtok == OP_ASSIGN;
415 if (lasttok != STR)
416 evalerror (_("attempted assignment to non-variable"));
418 if (special)
420 op = assigntok; /* a OP= b */
421 lvalue = value;
424 lhs = savestring (tokstr);
425 readtok ();
426 value = expassign ();
428 if (special)
430 switch (op)
432 case MUL:
433 lvalue *= value;
434 break;
435 case DIV:
436 if (value == 0)
437 evalerror (_("division by 0"));
438 lvalue /= value;
439 break;
440 case MOD:
441 if (value == 0)
442 evalerror (_("division by 0"));
443 lvalue %= value;
444 break;
445 case PLUS:
446 lvalue += value;
447 break;
448 case MINUS:
449 lvalue -= value;
450 break;
451 case LSH:
452 lvalue <<= value;
453 break;
454 case RSH:
455 lvalue >>= value;
456 break;
457 case BAND:
458 lvalue &= value;
459 break;
460 case BOR:
461 lvalue |= value;
462 break;
463 case BXOR:
464 lvalue ^= value;
465 break;
466 default:
467 free (lhs);
468 evalerror (_("bug: bad expassign token"));
469 break;
471 value = lvalue;
474 rhs = itos (value);
475 if (noeval == 0)
476 expr_bind_variable (lhs, rhs);
477 free (rhs);
478 free (lhs);
479 FREE (tokstr);
480 tokstr = (char *)NULL; /* For freeing on errors. */
482 return (value);
485 /* Conditional expression (expr?expr:expr) */
486 static intmax_t
487 expcond ()
489 intmax_t cval, val1, val2, rval;
490 int set_noeval;
492 set_noeval = 0;
493 rval = cval = explor ();
494 if (curtok == QUES) /* found conditional expr */
496 readtok ();
497 if (curtok == 0 || curtok == COL)
498 evalerror (_("expression expected"));
499 if (cval == 0)
501 set_noeval = 1;
502 noeval++;
505 val1 = EXP_HIGHEST ();
507 if (set_noeval)
508 noeval--;
509 if (curtok != COL)
510 evalerror (_("`:' expected for conditional expression"));
511 readtok ();
512 if (curtok == 0)
513 evalerror (_("expression expected"));
514 set_noeval = 0;
515 if (cval)
517 set_noeval = 1;
518 noeval++;
520 val2 = explor ();
521 if (set_noeval)
522 noeval--;
523 rval = cval ? val1 : val2;
524 lasttok = COND;
526 return rval;
529 /* Logical OR. */
530 static intmax_t
531 explor ()
533 register intmax_t val1, val2;
534 int set_noeval;
536 val1 = expland ();
538 while (curtok == LOR)
540 set_noeval = 0;
541 if (val1 != 0)
543 noeval++;
544 set_noeval = 1;
546 readtok ();
547 val2 = expland ();
548 if (set_noeval)
549 noeval--;
550 val1 = val1 || val2;
551 lasttok = LOR;
554 return (val1);
557 /* Logical AND. */
558 static intmax_t
559 expland ()
561 register intmax_t val1, val2;
562 int set_noeval;
564 val1 = expbor ();
566 while (curtok == LAND)
568 set_noeval = 0;
569 if (val1 == 0)
571 set_noeval = 1;
572 noeval++;
574 readtok ();
575 val2 = expbor ();
576 if (set_noeval)
577 noeval--;
578 val1 = val1 && val2;
579 lasttok = LAND;
582 return (val1);
585 /* Bitwise OR. */
586 static intmax_t
587 expbor ()
589 register intmax_t val1, val2;
591 val1 = expbxor ();
593 while (curtok == BOR)
595 readtok ();
596 val2 = expbxor ();
597 val1 = val1 | val2;
600 return (val1);
603 /* Bitwise XOR. */
604 static intmax_t
605 expbxor ()
607 register intmax_t val1, val2;
609 val1 = expband ();
611 while (curtok == BXOR)
613 readtok ();
614 val2 = expband ();
615 val1 = val1 ^ val2;
618 return (val1);
621 /* Bitwise AND. */
622 static intmax_t
623 expband ()
625 register intmax_t val1, val2;
627 val1 = exp5 ();
629 while (curtok == BAND)
631 readtok ();
632 val2 = exp5 ();
633 val1 = val1 & val2;
636 return (val1);
639 static intmax_t
640 exp5 ()
642 register intmax_t val1, val2;
644 val1 = exp4 ();
646 while ((curtok == EQEQ) || (curtok == NEQ))
648 int op = curtok;
650 readtok ();
651 val2 = exp4 ();
652 if (op == EQEQ)
653 val1 = (val1 == val2);
654 else if (op == NEQ)
655 val1 = (val1 != val2);
657 return (val1);
660 static intmax_t
661 exp4 ()
663 register intmax_t val1, val2;
665 val1 = expshift ();
666 while ((curtok == LEQ) ||
667 (curtok == GEQ) ||
668 (curtok == LT) ||
669 (curtok == GT))
671 int op = curtok;
673 readtok ();
674 val2 = expshift ();
676 if (op == LEQ)
677 val1 = val1 <= val2;
678 else if (op == GEQ)
679 val1 = val1 >= val2;
680 else if (op == LT)
681 val1 = val1 < val2;
682 else /* (op == GT) */
683 val1 = val1 > val2;
685 return (val1);
688 /* Left and right shifts. */
689 static intmax_t
690 expshift ()
692 register intmax_t val1, val2;
694 val1 = exp3 ();
696 while ((curtok == LSH) || (curtok == RSH))
698 int op = curtok;
700 readtok ();
701 val2 = exp3 ();
703 if (op == LSH)
704 val1 = val1 << val2;
705 else
706 val1 = val1 >> val2;
709 return (val1);
712 static intmax_t
713 exp3 ()
715 register intmax_t val1, val2;
717 val1 = exp2 ();
719 while ((curtok == PLUS) || (curtok == MINUS))
721 int op = curtok;
723 readtok ();
724 val2 = exp2 ();
726 if (op == PLUS)
727 val1 += val2;
728 else if (op == MINUS)
729 val1 -= val2;
731 return (val1);
734 static intmax_t
735 exp2 ()
737 register intmax_t val1, val2;
739 val1 = exppower ();
741 while ((curtok == MUL) ||
742 (curtok == DIV) ||
743 (curtok == MOD))
745 int op = curtok;
747 readtok ();
749 val2 = exppower ();
751 if (((op == DIV) || (op == MOD)) && (val2 == 0))
752 evalerror (_("division by 0"));
754 if (op == MUL)
755 val1 *= val2;
756 else if (op == DIV)
757 val1 /= val2;
758 else if (op == MOD)
759 val1 %= val2;
761 return (val1);
764 static intmax_t
765 exppower ()
767 register intmax_t val1, val2, c;
769 val1 = exp1 ();
770 while (curtok == POWER)
772 readtok ();
773 val2 = exppower (); /* exponentiation is right-associative */
774 if (val2 == 0)
775 return (1);
776 if (val2 < 0)
777 evalerror (_("exponent less than 0"));
778 for (c = 1; val2--; c *= val1)
780 val1 = c;
782 return (val1);
785 static intmax_t
786 exp1 ()
788 register intmax_t val;
790 if (curtok == NOT)
792 readtok ();
793 val = !exp1 ();
795 else if (curtok == BNOT)
797 readtok ();
798 val = ~exp1 ();
800 else
801 val = exp0 ();
803 return (val);
806 static intmax_t
807 exp0 ()
809 register intmax_t val = 0, v2;
810 char *vincdec;
811 int stok;
812 EXPR_CONTEXT ec;
814 /* XXX - might need additional logic here to decide whether or not
815 pre-increment or pre-decrement is legal at this point. */
816 if (curtok == PREINC || curtok == PREDEC)
818 stok = lasttok = curtok;
819 readtok ();
820 if (curtok != STR)
821 /* readtok() catches this */
822 evalerror (_("identifier expected after pre-increment or pre-decrement"));
824 v2 = tokval + ((stok == PREINC) ? 1 : -1);
825 vincdec = itos (v2);
826 if (noeval == 0)
827 expr_bind_variable (tokstr, vincdec);
828 free (vincdec);
829 val = v2;
831 curtok = NUM; /* make sure --x=7 is flagged as an error */
832 readtok ();
834 else if (curtok == MINUS)
836 readtok ();
837 val = - exp0 ();
839 else if (curtok == PLUS)
841 readtok ();
842 val = exp0 ();
844 else if (curtok == LPAR)
846 readtok ();
847 val = EXP_HIGHEST ();
849 if (curtok != RPAR) /* ( */
850 evalerror (_("missing `)'"));
852 /* Skip over closing paren. */
853 readtok ();
855 else if ((curtok == NUM) || (curtok == STR))
857 val = tokval;
858 if (curtok == STR)
860 SAVETOK (&ec);
861 tokstr = (char *)NULL; /* keep it from being freed */
862 noeval = 1;
863 readtok ();
864 stok = curtok;
866 /* post-increment or post-decrement */
867 if (stok == POSTINC || stok == POSTDEC)
869 /* restore certain portions of EC */
870 tokstr = ec.tokstr;
871 noeval = ec.noeval;
872 lasttok = STR; /* ec.curtok */
874 v2 = val + ((stok == POSTINC) ? 1 : -1);
875 vincdec = itos (v2);
876 if (noeval == 0)
877 expr_bind_variable (tokstr, vincdec);
878 free (vincdec);
879 curtok = NUM; /* make sure x++=7 is flagged as an error */
881 else
883 if (stok == STR) /* free new tokstr before old one is restored */
884 FREE (tokstr);
885 RESTORETOK (&ec);
890 readtok ();
892 else
893 evalerror (_("syntax error: operand expected"));
895 return (val);
898 static intmax_t
899 expr_streval (tok, e)
900 char *tok;
901 int e;
903 SHELL_VAR *v;
904 char *value;
905 intmax_t tval;
907 /* [[[[[ */
908 #if defined (ARRAY_VARS)
909 v = (e == ']') ? array_variable_part (tok, (char **)0, (int *)0) : find_variable (tok);
910 #else
911 v = find_variable (tok);
912 #endif
914 if ((v == 0 || invisible_p (v)) && unbound_vars_is_error)
916 #if defined (ARRAY_VARS)
917 value = (e == ']') ? array_variable_name (tok, (char **)0, (int *)0) : tok;
918 #else
919 value = tok;
920 #endif
922 err_unboundvar (value);
924 #if defined (ARRAY_VARS)
925 if (e == ']')
926 FREE (value); /* array_variable_name returns new memory */
927 #endif
929 if (interactive_shell)
931 expr_unwind ();
932 jump_to_top_level (DISCARD);
934 else
935 jump_to_top_level (FORCE_EOF);
938 #if defined (ARRAY_VARS)
939 /* Second argument of 0 to get_array_value means that we don't allow
940 references like array[@]. In this case, get_array_value is just
941 like get_variable_value in that it does not return newly-allocated
942 memory or quote the results. */
943 value = (e == ']') ? get_array_value (tok, 0, (int *)NULL) : get_variable_value (v);
944 #else
945 value = get_variable_value (v);
946 #endif
948 tval = (value && *value) ? subexpr (value) : 0;
950 return (tval);
953 static int
954 _is_multiop (c)
955 int c;
957 switch (c)
959 case EQEQ:
960 case NEQ:
961 case LEQ:
962 case GEQ:
963 case LAND:
964 case LOR:
965 case LSH:
966 case RSH:
967 case OP_ASSIGN:
968 case COND:
969 case POWER:
970 case PREINC:
971 case PREDEC:
972 case POSTINC:
973 case POSTDEC:
974 return 1;
975 default:
976 return 0;
980 static int
981 _is_arithop (c)
982 int c;
984 switch (c)
986 case EQ:
987 case GT:
988 case LT:
989 case PLUS:
990 case MINUS:
991 case MUL:
992 case DIV:
993 case MOD:
994 case NOT:
995 case LPAR:
996 case RPAR:
997 case BAND:
998 case BOR:
999 case BXOR:
1000 case BNOT:
1001 return 1; /* operator tokens */
1002 case QUES:
1003 case COL:
1004 case COMMA:
1005 return 1; /* questionable */
1006 default:
1007 return 0; /* anything else is invalid */
1011 /* Lexical analyzer/token reader for the expression evaluator. Reads the
1012 next token and puts its value into curtok, while advancing past it.
1013 Updates value of tp. May also set tokval (for number) or tokstr (for
1014 string). */
1015 static void
1016 readtok ()
1018 register char *cp, *xp;
1019 register unsigned char c, c1;
1020 register int e;
1022 /* Skip leading whitespace. */
1023 cp = tp;
1024 c = e = 0;
1025 while (cp && (c = *cp) && (cr_whitespace (c)))
1026 cp++;
1028 if (c)
1029 cp++;
1031 lasttp = tp = cp - 1;
1033 if (c == '\0')
1035 lasttok = curtok;
1036 curtok = 0;
1037 tp = cp;
1038 return;
1041 if (legal_variable_starter (c))
1043 /* variable names not preceded with a dollar sign are shell variables. */
1044 char *savecp;
1045 EXPR_CONTEXT ec;
1046 int peektok;
1048 while (legal_variable_char (c))
1049 c = *cp++;
1051 c = *--cp;
1053 #if defined (ARRAY_VARS)
1054 if (c == '[')
1056 e = skipsubscript (cp, 0);
1057 if (cp[e] == ']')
1059 cp += e + 1;
1060 c = *cp;
1061 e = ']';
1063 else
1064 evalerror (bash_badsub_errmsg);
1066 #endif /* ARRAY_VARS */
1068 *cp = '\0';
1069 FREE (tokstr);
1070 tokstr = savestring (tp);
1071 *cp = c;
1073 SAVETOK (&ec);
1074 tokstr = (char *)NULL; /* keep it from being freed */
1075 tp = savecp = cp;
1076 noeval = 1;
1077 curtok = STR;
1078 readtok ();
1079 peektok = curtok;
1080 if (peektok == STR) /* free new tokstr before old one is restored */
1081 FREE (tokstr);
1082 RESTORETOK (&ec);
1083 cp = savecp;
1085 /* The tests for PREINC and PREDEC aren't strictly correct, but they
1086 preserve old behavior if a construct like --x=9 is given. */
1087 if (lasttok == PREINC || lasttok == PREDEC || peektok != EQ)
1088 tokval = expr_streval (tokstr, e);
1089 else
1090 tokval = 0;
1092 lasttok = curtok;
1093 curtok = STR;
1095 else if (DIGIT(c))
1097 while (ISALNUM (c) || c == '#' || c == '@' || c == '_')
1098 c = *cp++;
1100 c = *--cp;
1101 *cp = '\0';
1103 tokval = strlong (tp);
1104 *cp = c;
1105 lasttok = curtok;
1106 curtok = NUM;
1108 else
1110 c1 = *cp++;
1111 if ((c == EQ) && (c1 == EQ))
1112 c = EQEQ;
1113 else if ((c == NOT) && (c1 == EQ))
1114 c = NEQ;
1115 else if ((c == GT) && (c1 == EQ))
1116 c = GEQ;
1117 else if ((c == LT) && (c1 == EQ))
1118 c = LEQ;
1119 else if ((c == LT) && (c1 == LT))
1121 if (*cp == '=') /* a <<= b */
1123 assigntok = LSH;
1124 c = OP_ASSIGN;
1125 cp++;
1127 else
1128 c = LSH;
1130 else if ((c == GT) && (c1 == GT))
1132 if (*cp == '=')
1134 assigntok = RSH; /* a >>= b */
1135 c = OP_ASSIGN;
1136 cp++;
1138 else
1139 c = RSH;
1141 else if ((c == BAND) && (c1 == BAND))
1142 c = LAND;
1143 else if ((c == BOR) && (c1 == BOR))
1144 c = LOR;
1145 else if ((c == '*') && (c1 == '*'))
1146 c = POWER;
1147 else if ((c == '-' || c == '+') && c1 == c && curtok == STR)
1148 c = (c == '-') ? POSTDEC : POSTINC;
1149 else if ((c == '-' || c == '+') && c1 == c)
1151 /* Quickly scan forward to see if this is followed by optional
1152 whitespace and an identifier. */
1153 xp = cp;
1154 while (xp && *xp && cr_whitespace (*xp))
1155 xp++;
1156 if (legal_variable_starter ((unsigned char)*xp))
1157 c = (c == '-') ? PREDEC : PREINC;
1158 else
1159 cp--; /* not preinc or predec, so unget the character */
1161 else if (c1 == EQ && member (c, "*/%+-&^|"))
1163 assigntok = c; /* a OP= b */
1164 c = OP_ASSIGN;
1166 else if (_is_arithop (c) == 0)
1168 cp--;
1169 /* use curtok, since it hasn't been copied to lasttok yet */
1170 if (curtok == 0 || _is_arithop (curtok) || _is_multiop (curtok))
1171 evalerror (_("syntax error: operand expected"));
1172 else
1173 evalerror (_("syntax error: invalid arithmetic operator"));
1175 else
1176 cp--; /* `unget' the character */
1178 /* Should check here to make sure that the current character is one
1179 of the recognized operators and flag an error if not. Could create
1180 a character map the first time through and check it on subsequent
1181 calls. */
1182 lasttok = curtok;
1183 curtok = c;
1185 tp = cp;
1188 static void
1189 evalerror (msg)
1190 char *msg;
1192 char *name, *t;
1194 name = this_command_name;
1195 for (t = expression; whitespace (*t); t++)
1197 internal_error ("%s%s%s: %s (error token is \"%s\")",
1198 name ? name : "", name ? ": " : "", t,
1199 msg, (lasttp && *lasttp) ? lasttp : "");
1200 longjmp (evalbuf, 1);
1203 /* Convert a string to an intmax_t integer, with an arbitrary base.
1204 0nnn -> base 8
1205 0[Xx]nn -> base 16
1206 Anything else: [base#]number (this is implemented to match ksh93)
1208 Base may be >=2 and <=64. If base is <= 36, the numbers are drawn
1209 from [0-9][a-zA-Z], and lowercase and uppercase letters may be used
1210 interchangably. If base is > 36 and <= 64, the numbers are drawn
1211 from [0-9][a-z][A-Z]_@ (a = 10, z = 35, A = 36, Z = 61, @ = 62, _ = 63 --
1212 you get the picture). */
1214 static intmax_t
1215 strlong (num)
1216 char *num;
1218 register char *s;
1219 register unsigned char c;
1220 int base, foundbase;
1221 intmax_t val;
1223 s = num;
1225 base = 10;
1226 foundbase = 0;
1227 if (*s == '0')
1229 s++;
1231 if (*s == '\0')
1232 return 0;
1234 /* Base 16? */
1235 if (*s == 'x' || *s == 'X')
1237 base = 16;
1238 s++;
1240 else
1241 base = 8;
1242 foundbase++;
1245 val = 0;
1246 for (c = *s++; c; c = *s++)
1248 if (c == '#')
1250 if (foundbase)
1251 evalerror (_("invalid number"));
1253 /* Illegal base specifications raise an evaluation error. */
1254 if (val < 2 || val > 64)
1255 evalerror (_("invalid arithmetic base"));
1257 base = val;
1258 val = 0;
1259 foundbase++;
1261 else if (ISALNUM(c) || (c == '_') || (c == '@'))
1263 if (DIGIT(c))
1264 c = TODIGIT(c);
1265 else if (c >= 'a' && c <= 'z')
1266 c -= 'a' - 10;
1267 else if (c >= 'A' && c <= 'Z')
1268 c -= 'A' - ((base <= 36) ? 10 : 36);
1269 else if (c == '@')
1270 c = 62;
1271 else if (c == '_')
1272 c = 63;
1274 if (c >= base)
1275 evalerror (_("value too great for base"));
1277 val = (val * base) + c;
1279 else
1280 break;
1283 return (val);
1286 #if defined (EXPR_TEST)
1287 void *
1288 xmalloc (n)
1289 int n;
1291 return (malloc (n));
1294 void *
1295 xrealloc (s, n)
1296 char *s;
1297 int n;
1299 return (realloc (s, n));
1302 SHELL_VAR *find_variable () { return 0;}
1303 SHELL_VAR *bind_variable () { return 0; }
1305 char *get_string_value () { return 0; }
1307 procenv_t top_level;
1309 main (argc, argv)
1310 int argc;
1311 char **argv;
1313 register int i;
1314 intmax_t v;
1315 int expok;
1317 if (setjmp (top_level))
1318 exit (0);
1320 for (i = 1; i < argc; i++)
1322 v = evalexp (argv[i], &expok);
1323 if (expok == 0)
1324 fprintf (stderr, "%s: expression error\n", argv[i]);
1325 else
1326 printf ("'%s' -> %ld\n", argv[i], v);
1328 exit (0);
1332 builtin_error (format, arg1, arg2, arg3, arg4, arg5)
1333 char *format;
1335 fprintf (stderr, "expr: ");
1336 fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
1337 fprintf (stderr, "\n");
1338 return 0;
1341 char *
1342 itos (n)
1343 intmax_t n;
1345 return ("42");
1348 #endif /* EXPR_TEST */