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 */
292 expr_bind_variable (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
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. */
313 evalexp (expr
, validp
)
323 FASTCOPY (evalbuf
, oevalbuf
, sizeof (evalbuf
));
325 c
= setjmp (evalbuf
);
331 tokstr
= expression
= (char *)NULL
;
340 val
= subexpr (expr
);
345 FASTCOPY (oevalbuf
, evalbuf
, sizeof (evalbuf
));
357 for (p
= expr
; p
&& *p
&& cr_whitespace (*p
); p
++)
360 if (p
== NULL
|| *p
== '\0')
364 curtok
= lasttok
= 0;
365 expression
= savestring (expr
);
368 tokstr
= (char *)NULL
;
373 val
= EXP_HIGHEST ();
376 evalerror (_("syntax error in expression"));
389 register intmax_t value
;
391 value
= expassign ();
392 while (curtok
== COMMA
)
395 value
= expassign ();
404 register intmax_t value
;
408 if (curtok
== EQ
|| curtok
== OP_ASSIGN
)
413 special
= curtok
== OP_ASSIGN
;
416 evalerror (_("attempted assignment to non-variable"));
420 op
= assigntok
; /* a OP= b */
424 lhs
= savestring (tokstr
);
426 value
= expassign ();
437 evalerror (_("division by 0"));
442 evalerror (_("division by 0"));
468 evalerror (_("bug: bad expassign token"));
476 expr_bind_variable (lhs
, rhs
);
480 tokstr
= (char *)NULL
; /* For freeing on errors. */
485 /* Conditional expression (expr?expr:expr) */
489 intmax_t cval
, val1
, val2
, rval
;
493 rval
= cval
= explor ();
494 if (curtok
== QUES
) /* found conditional expr */
497 if (curtok
== 0 || curtok
== COL
)
498 evalerror (_("expression expected"));
505 val1
= EXP_HIGHEST ();
510 evalerror (_("`:' expected for conditional expression"));
513 evalerror (_("expression expected"));
523 rval
= cval
? val1
: val2
;
533 register intmax_t val1
, val2
;
538 while (curtok
== LOR
)
561 register intmax_t val1
, val2
;
566 while (curtok
== LAND
)
589 register intmax_t val1
, val2
;
593 while (curtok
== BOR
)
607 register intmax_t val1
, val2
;
611 while (curtok
== BXOR
)
625 register intmax_t val1
, val2
;
629 while (curtok
== BAND
)
642 register intmax_t val1
, val2
;
646 while ((curtok
== EQEQ
) || (curtok
== NEQ
))
653 val1
= (val1
== val2
);
655 val1
= (val1
!= val2
);
663 register intmax_t val1
, val2
;
666 while ((curtok
== LEQ
) ||
682 else /* (op == GT) */
688 /* Left and right shifts. */
692 register intmax_t val1
, val2
;
696 while ((curtok
== LSH
) || (curtok
== RSH
))
715 register intmax_t val1
, val2
;
719 while ((curtok
== PLUS
) || (curtok
== MINUS
))
728 else if (op
== MINUS
)
737 register intmax_t val1
, val2
;
741 while ((curtok
== MUL
) ||
751 if (((op
== DIV
) || (op
== MOD
)) && (val2
== 0))
752 evalerror (_("division by 0"));
767 register intmax_t val1
, val2
, c
;
770 while (curtok
== POWER
)
773 val2
= exppower (); /* exponentiation is right-associative */
777 evalerror (_("exponent less than 0"));
778 for (c
= 1; val2
--; c
*= val1
)
788 register intmax_t val
;
795 else if (curtok
== BNOT
)
809 register intmax_t val
= 0, v2
;
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
;
821 /* readtok() catches this */
822 evalerror (_("identifier expected after pre-increment or pre-decrement"));
824 v2
= tokval
+ ((stok
== PREINC
) ? 1 : -1);
827 expr_bind_variable (tokstr
, vincdec
);
831 curtok
= NUM
; /* make sure --x=7 is flagged as an error */
834 else if (curtok
== MINUS
)
839 else if (curtok
== PLUS
)
844 else if (curtok
== LPAR
)
847 val
= EXP_HIGHEST ();
849 if (curtok
!= RPAR
) /* ( */
850 evalerror (_("missing `)'"));
852 /* Skip over closing paren. */
855 else if ((curtok
== NUM
) || (curtok
== STR
))
861 tokstr
= (char *)NULL
; /* keep it from being freed */
866 /* post-increment or post-decrement */
867 if (stok
== POSTINC
|| stok
== POSTDEC
)
869 /* restore certain portions of EC */
872 lasttok
= STR
; /* ec.curtok */
874 v2
= val
+ ((stok
== POSTINC
) ? 1 : -1);
877 expr_bind_variable (tokstr
, vincdec
);
879 curtok
= NUM
; /* make sure x++=7 is flagged as an error */
883 if (stok
== STR
) /* free new tokstr before old one is restored */
893 evalerror (_("syntax error: operand expected"));
899 expr_streval (tok
, e
)
908 #if defined (ARRAY_VARS)
909 v
= (e
== ']') ? array_variable_part (tok
, (char **)0, (int *)0) : find_variable (tok
);
911 v
= find_variable (tok
);
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
;
922 err_unboundvar (value
);
924 #if defined (ARRAY_VARS)
926 FREE (value
); /* array_variable_name returns new memory */
929 if (interactive_shell
)
932 jump_to_top_level (DISCARD
);
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
);
945 value
= get_variable_value (v
);
948 tval
= (value
&& *value
) ? subexpr (value
) : 0;
1001 return 1; /* operator tokens */
1005 return 1; /* questionable */
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
1018 register char *cp
, *xp
;
1019 register unsigned char c
, c1
;
1022 /* Skip leading whitespace. */
1025 while (cp
&& (c
= *cp
) && (cr_whitespace (c
)))
1031 lasttp
= tp
= cp
- 1;
1041 if (legal_variable_starter (c
))
1043 /* variable names not preceded with a dollar sign are shell variables. */
1048 while (legal_variable_char (c
))
1053 #if defined (ARRAY_VARS)
1056 e
= skipsubscript (cp
, 0);
1064 evalerror (bash_badsub_errmsg
);
1066 #endif /* ARRAY_VARS */
1070 tokstr
= savestring (tp
);
1074 tokstr
= (char *)NULL
; /* keep it from being freed */
1080 if (peektok
== STR
) /* free new tokstr before old one is restored */
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
);
1097 while (ISALNUM (c
) || c
== '#' || c
== '@' || c
== '_')
1103 tokval
= strlong (tp
);
1111 if ((c
== EQ
) && (c1
== EQ
))
1113 else if ((c
== NOT
) && (c1
== EQ
))
1115 else if ((c
== GT
) && (c1
== EQ
))
1117 else if ((c
== LT
) && (c1
== EQ
))
1119 else if ((c
== LT
) && (c1
== LT
))
1121 if (*cp
== '=') /* a <<= b */
1130 else if ((c
== GT
) && (c1
== GT
))
1134 assigntok
= RSH
; /* a >>= b */
1141 else if ((c
== BAND
) && (c1
== BAND
))
1143 else if ((c
== BOR
) && (c1
== BOR
))
1145 else if ((c
== '*') && (c1
== '*'))
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. */
1154 while (xp
&& *xp
&& cr_whitespace (*xp
))
1156 if (legal_variable_starter ((unsigned char)*xp
))
1157 c
= (c
== '-') ? PREDEC
: PREINC
;
1159 cp
--; /* not preinc or predec, so unget the character */
1161 else if (c1
== EQ
&& member (c
, "*/%+-&^|"))
1163 assigntok
= c
; /* a OP= b */
1166 else if (_is_arithop (c
) == 0)
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"));
1173 evalerror (_("syntax error: invalid arithmetic operator"));
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
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.
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). */
1219 register unsigned char c
;
1220 int base
, foundbase
;
1235 if (*s
== 'x' || *s
== 'X')
1246 for (c
= *s
++; c
; c
= *s
++)
1251 evalerror (_("invalid number"));
1253 /* Illegal base specifications raise an evaluation error. */
1254 if (val
< 2 || val
> 64)
1255 evalerror (_("invalid arithmetic base"));
1261 else if (ISALNUM(c
) || (c
== '_') || (c
== '@'))
1265 else if (c
>= 'a' && c
<= 'z')
1267 else if (c
>= 'A' && c
<= 'Z')
1268 c
-= 'A' - ((base
<= 36) ? 10 : 36);
1275 evalerror (_("value too great for base"));
1277 val
= (val
* base
) + c
;
1286 #if defined (EXPR_TEST)
1291 return (malloc (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
;
1317 if (setjmp (top_level
))
1320 for (i
= 1; i
< argc
; i
++)
1322 v
= evalexp (argv
[i
], &expok
);
1324 fprintf (stderr
, "%s: expression error\n", argv
[i
]);
1326 printf ("'%s' -> %ld\n", argv
[i
], v
);
1332 builtin_error (format
, arg1
, arg2
, arg3
, arg4
, arg5
)
1335 fprintf (stderr
, "expr: ");
1336 fprintf (stderr
, format
, arg1
, arg2
, arg3
, arg4
, arg5
);
1337 fprintf (stderr
, "\n");
1348 #endif /* EXPR_TEST */