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)
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)]
32 "**" [(exponentiation)]
44 "=", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|="
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.
74 #if defined (HAVE_UNISTD_H)
76 # include <sys/types.h>
81 #include "chartypes.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-- */
128 #define BAND '&' /* Bitwise AND */
129 #define BOR '|' /* Bitwise OR. */
130 #define BXOR '^' /* Bitwise eXclusive OR. */
131 #define BNOT '~' /* Bitwise NOT; Two's complement. */
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. */
185 char *expression, *tp, *lasttp;
191 #ifdef INCLUDE_UNUSED
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;
213 (X)->curtok = curtok; \
214 (X)->lasttok = lasttok; \
216 (X)->lasttp = lasttp; \
217 (X)->tokval = tokval; \
218 (X)->tokstr = tokstr; \
219 (X)->noeval = noeval; \
222 #define RESTORETOK(X) \
224 curtok = (X)->curtok; \
225 lasttok = (X)->lasttok; \
227 lasttp = (X)->lasttp; \
228 tokval = (X)->tokval; \
229 tokstr = (X)->tokstr; \
230 noeval = (X)->noeval; \
233 /* Push and save away the contents of the globals describing the
234 current expression context. */
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;
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. */
262 EXPR_CONTEXT *context;
265 evalerror (_("recursion stack underflow"));
267 context = expr_stack[--expr_depth];
269 expression = context->expression;
270 RESTORETOK (context);
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 */
290 noeval = 0; /* XXX */
294 expr_bind_variable (lhs, rhs)
297 (void)bind_int_variable (lhs, rhs);
298 stupidly_hack_special_variables (lhs);
301 /* Evaluate EXPR, and return the arithmetic result. If VALIDP is
302 non-null, a zero is stored into the location to which it points
303 if the expression is invalid, non-zero otherwise. If a non-zero
304 value is returned in *VALIDP, the return value of evalexp() may
307 The `while' loop after the longjmp is caught relies on the above
308 implementation of pushexp and popexp leaving in expr_stack[0] the
309 values that the variables had when the program started. That is,
310 the first things saved are the initial values of the variables that
311 were assigned at program startup or by the compiler. Therefore, it is
312 safe to let the loop terminate when expr_depth == 0, without freeing up
313 any of the expr_depth[0] stuff. */
315 evalexp (expr, validp)
326 FASTCOPY (evalbuf, oevalbuf, sizeof (evalbuf));
328 c = setjmp (evalbuf);
334 tokstr = expression = (char *)NULL;
343 val = subexpr (expr);
348 FASTCOPY (oevalbuf, evalbuf, sizeof (evalbuf));
360 for (p = expr; p && *p && cr_whitespace (*p); p++)
363 if (p == NULL || *p == '\0')
367 curtok = lasttok = 0;
368 expression = savestring (expr);
371 tokstr = (char *)NULL;
376 val = EXP_HIGHEST ();
379 evalerror (_("syntax error in expression"));
392 register intmax_t value;
394 value = expassign ();
395 while (curtok == COMMA)
398 value = expassign ();
407 register intmax_t value;
411 if (curtok == EQ || curtok == OP_ASSIGN)
416 special = curtok == OP_ASSIGN;
419 evalerror (_("attempted assignment to non-variable"));
423 op = assigntok; /* a OP= b */
427 lhs = savestring (tokstr);
429 value = expassign ();
440 evalerror (_("division by 0"));
445 evalerror (_("division by 0"));
471 evalerror (_("bug: bad expassign token"));
479 expr_bind_variable (lhs, rhs);
483 tokstr = (char *)NULL; /* For freeing on errors. */
488 /* Conditional expression (expr?expr:expr) */
492 intmax_t cval, val1, val2, rval;
496 rval = cval = explor ();
497 if (curtok == QUES) /* found conditional expr */
500 if (curtok == 0 || curtok == COL)
501 evalerror (_("expression expected"));
508 val1 = EXP_HIGHEST ();
513 evalerror (_("`:' expected for conditional expression"));
516 evalerror (_("expression expected"));
527 rval = cval ? val1 : val2;
537 register intmax_t val1, val2;
542 while (curtok == LOR)
565 register intmax_t val1, val2;
570 while (curtok == LAND)
593 register intmax_t val1, val2;
597 while (curtok == BOR)
611 register intmax_t val1, val2;
615 while (curtok == BXOR)
629 register intmax_t val1, val2;
633 while (curtok == BAND)
646 register intmax_t val1, val2;
650 while ((curtok == EQEQ) || (curtok == NEQ))
657 val1 = (val1 == val2);
659 val1 = (val1 != val2);
667 register intmax_t val1, val2;
670 while ((curtok == LEQ) ||
686 else /* (op == GT) */
692 /* Left and right shifts. */
696 register intmax_t val1, val2;
700 while ((curtok == LSH) || (curtok == RSH))
719 register intmax_t val1, val2;
723 while ((curtok == PLUS) || (curtok == MINUS))
732 else if (op == MINUS)
741 register intmax_t val1, val2;
745 while ((curtok == MUL) ||
755 if (((op == DIV) || (op == MOD)) && (val2 == 0))
756 evalerror (_("division by 0"));
771 register intmax_t val1, val2, c;
774 while (curtok == POWER)
777 val2 = exppower (); /* exponentiation is right-associative */
781 evalerror (_("exponent less than 0"));
782 for (c = 1; val2--; c *= val1)
792 register intmax_t val;
799 else if (curtok == BNOT)
813 register intmax_t val = 0, v2;
818 /* XXX - might need additional logic here to decide whether or not
819 pre-increment or pre-decrement is legal at this point. */
820 if (curtok == PREINC || curtok == PREDEC)
822 stok = lasttok = curtok;
825 /* readtok() catches this */
826 evalerror (_("identifier expected after pre-increment or pre-decrement"));
828 v2 = tokval + ((stok == PREINC) ? 1 : -1);
831 expr_bind_variable (tokstr, vincdec);
835 curtok = NUM; /* make sure --x=7 is flagged as an error */
838 else if (curtok == MINUS)
843 else if (curtok == PLUS)
848 else if (curtok == LPAR)
851 val = EXP_HIGHEST ();
853 if (curtok != RPAR) /* ( */
854 evalerror (_("missing `)'"));
856 /* Skip over closing paren. */
859 else if ((curtok == NUM) || (curtok == STR))
865 tokstr = (char *)NULL; /* keep it from being freed */
870 /* post-increment or post-decrement */
871 if (stok == POSTINC || stok == POSTDEC)
873 /* restore certain portions of EC */
876 lasttok = STR; /* ec.curtok */
878 v2 = val + ((stok == POSTINC) ? 1 : -1);
881 expr_bind_variable (tokstr, vincdec);
883 curtok = NUM; /* make sure x++=7 is flagged as an error */
887 if (stok == STR) /* free new tokstr before old one is restored */
897 evalerror (_("syntax error: operand expected"));
903 expr_streval (tok, e)
912 #if defined (ARRAY_VARS)
913 v = (e == ']') ? array_variable_part (tok, (char **)0, (int *)0) : find_variable (tok);
915 v = find_variable (tok);
918 if ((v == 0 || invisible_p (v)) && unbound_vars_is_error)
920 #if defined (ARRAY_VARS)
921 value = (e == ']') ? array_variable_name (tok, (char **)0, (int *)0) : tok;
926 err_unboundvar (value);
928 #if defined (ARRAY_VARS)
930 FREE (value); /* array_variable_name returns new memory */
933 if (interactive_shell)
936 top_level_cleanup ();
937 jump_to_top_level (DISCARD);
940 jump_to_top_level (FORCE_EOF);
943 #if defined (ARRAY_VARS)
944 /* Second argument of 0 to get_array_value means that we don't allow
945 references like array[@]. In this case, get_array_value is just
946 like get_variable_value in that it does not return newly-allocated
947 memory or quote the results. */
948 value = (e == ']') ? get_array_value (tok, 0, (int *)NULL) : get_variable_value (v);
950 value = get_variable_value (v);
953 tval = (value && *value) ? subexpr (value) : 0;
1006 return 1; /* operator tokens */
1010 return 1; /* questionable */
1012 return 0; /* anything else is invalid */
1016 /* Lexical analyzer/token reader for the expression evaluator. Reads the
1017 next token and puts its value into curtok, while advancing past it.
1018 Updates value of tp. May also set tokval (for number) or tokstr (for
1023 register char *cp, *xp;
1024 register unsigned char c, c1;
1027 /* Skip leading whitespace. */
1030 while (cp && (c = *cp) && (cr_whitespace (c)))
1036 lasttp = tp = cp - 1;
1046 if (legal_variable_starter (c))
1048 /* variable names not preceded with a dollar sign are shell variables. */
1053 while (legal_variable_char (c))
1058 #if defined (ARRAY_VARS)
1061 e = skipsubscript (cp, 0);
1069 evalerror (bash_badsub_errmsg);
1071 #endif /* ARRAY_VARS */
1075 tokstr = savestring (tp);
1079 tokstr = (char *)NULL; /* keep it from being freed */
1085 if (peektok == STR) /* free new tokstr before old one is restored */
1090 /* The tests for PREINC and PREDEC aren't strictly correct, but they
1091 preserve old behavior if a construct like --x=9 is given. */
1092 if (lasttok == PREINC || lasttok == PREDEC || peektok != EQ)
1093 tokval = expr_streval (tokstr, e);
1102 while (ISALNUM (c) || c == '#' || c == '@' || c == '_')
1108 tokval = strlong (tp);
1116 if ((c == EQ) && (c1 == EQ))
1118 else if ((c == NOT) && (c1 == EQ))
1120 else if ((c == GT) && (c1 == EQ))
1122 else if ((c == LT) && (c1 == EQ))
1124 else if ((c == LT) && (c1 == LT))
1126 if (*cp == '=') /* a <<= b */
1135 else if ((c == GT) && (c1 == GT))
1139 assigntok = RSH; /* a >>= b */
1146 else if ((c == BAND) && (c1 == BAND))
1148 else if ((c == BOR) && (c1 == BOR))
1150 else if ((c == '*') && (c1 == '*'))
1152 else if ((c == '-' || c == '+') && c1 == c && curtok == STR)
1153 c = (c == '-') ? POSTDEC : POSTINC;
1154 else if ((c == '-' || c == '+') && c1 == c)
1156 /* Quickly scan forward to see if this is followed by optional
1157 whitespace and an identifier. */
1159 while (xp && *xp && cr_whitespace (*xp))
1161 if (legal_variable_starter ((unsigned char)*xp))
1162 c = (c == '-') ? PREDEC : PREINC;
1164 cp--; /* not preinc or predec, so unget the character */
1166 else if (c1 == EQ && member (c, "*/%+-&^|"))
1168 assigntok = c; /* a OP= b */
1171 else if (_is_arithop (c) == 0)
1174 /* use curtok, since it hasn't been copied to lasttok yet */
1175 if (curtok == 0 || _is_arithop (curtok) || _is_multiop (curtok))
1176 evalerror (_("syntax error: operand expected"));
1178 evalerror (_("syntax error: invalid arithmetic operator"));
1181 cp--; /* `unget' the character */
1183 /* Should check here to make sure that the current character is one
1184 of the recognized operators and flag an error if not. Could create
1185 a character map the first time through and check it on subsequent
1199 name = this_command_name;
1200 for (t = expression; whitespace (*t); t++)
1202 internal_error ("%s%s%s: %s (error token is \"%s\")",
1203 name ? name : "", name ? ": " : "", t,
1204 msg, (lasttp && *lasttp) ? lasttp : "");
1205 longjmp (evalbuf, 1);
1208 /* Convert a string to an intmax_t integer, with an arbitrary base.
1211 Anything else: [base#]number (this is implemented to match ksh93)
1213 Base may be >=2 and <=64. If base is <= 36, the numbers are drawn
1214 from [0-9][a-zA-Z], and lowercase and uppercase letters may be used
1215 interchangably. If base is > 36 and <= 64, the numbers are drawn
1216 from [0-9][a-z][A-Z]_@ (a = 10, z = 35, A = 36, Z = 61, @ = 62, _ = 63 --
1217 you get the picture). */
1224 register unsigned char c;
1225 int base, foundbase;
1240 if (*s == 'x' || *s == 'X')
1251 for (c = *s++; c; c = *s++)
1256 evalerror (_("invalid number"));
1258 /* Illegal base specifications raise an evaluation error. */
1259 if (val < 2 || val > 64)
1260 evalerror (_("invalid arithmetic base"));
1266 else if (ISALNUM(c) || (c == '_') || (c == '@'))
1270 else if (c >= 'a' && c <= 'z')
1272 else if (c >= 'A' && c <= 'Z')
1273 c -= 'A' - ((base <= 36) ? 10 : 36);
1280 evalerror (_("value too great for base"));
1282 val = (val * base) + c;
1291 #if defined (EXPR_TEST)
1296 return (malloc (n));
1304 return (realloc (s, n));
1307 SHELL_VAR *find_variable () { return 0;}
1308 SHELL_VAR *bind_variable () { return 0; }
1310 char *get_string_value () { return 0; }
1312 procenv_t top_level;
1322 if (setjmp (top_level))
1325 for (i = 1; i < argc; i++)
1327 v = evalexp (argv[i], &expok);
1329 fprintf (stderr, "%s: expression error\n", argv[i]);
1331 printf ("'%s' -> %ld\n", argv[i], v);
1337 builtin_error (format, arg1, arg2, arg3, arg4, arg5)
1340 fprintf (stderr, "expr: ");
1341 fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
1342 fprintf (stderr, "\n");
1353 #endif /* EXPR_TEST */