]> git.ipfire.org Git - thirdparty/bash.git/blob - expr.c
Bash-4.3 patch 32
[thirdparty/bash.git] / expr.c
1 /* expr.c -- arithmetic expression evaluation. */
2
3 /* Copyright (C) 1990-2013 Free Software Foundation, Inc.
4
5 This file is part of GNU Bash, the Bourne Again SHell.
6
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 /*
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).
24
25 The following operators are handled, grouped into a set of levels in
26 order of decreasing precedence.
27
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]
46
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.)
52
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).
57
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.
62
63 Implementation is a recursive-descent parser.
64
65 Chet Ramey
66 chet@po.cwru.edu
67 */
68
69 #include "config.h"
70
71 #include <stdio.h>
72 #include "bashansi.h"
73
74 #if defined (HAVE_UNISTD_H)
75 # ifdef _MINIX
76 # include <sys/types.h>
77 # endif
78 # include <unistd.h>
79 #endif
80
81 #include "chartypes.h"
82 #include "bashintl.h"
83
84 #include "shell.h"
85 #include "typemax.h" /* INTMAX_MAX, INTMAX_MIN */
86
87 /* Because of the $((...)) construct, expressions may include newlines.
88 Here is a macro which accepts newlines, tabs and spaces as whitespace. */
89 #define cr_whitespace(c) (whitespace(c) || ((c) == '\n'))
90
91 /* Size be which the expression stack grows when necessary. */
92 #define EXPR_STACK_GROW_SIZE 10
93
94 /* Maximum amount of recursion allowed. This prevents a non-integer
95 variable such as "num=num+2" from infinitely adding to itself when
96 "let num=num+2" is given. */
97 #define MAX_EXPR_RECURSION_LEVEL 1024
98
99 /* The Tokens. Singing "The Lion Sleeps Tonight". */
100
101 #define EQEQ 1 /* "==" */
102 #define NEQ 2 /* "!=" */
103 #define LEQ 3 /* "<=" */
104 #define GEQ 4 /* ">=" */
105 #define STR 5 /* string */
106 #define NUM 6 /* number */
107 #define LAND 7 /* "&&" Logical AND */
108 #define LOR 8 /* "||" Logical OR */
109 #define LSH 9 /* "<<" Left SHift */
110 #define RSH 10 /* ">>" Right SHift */
111 #define OP_ASSIGN 11 /* op= expassign as in Posix.2 */
112 #define COND 12 /* exp1 ? exp2 : exp3 */
113 #define POWER 13 /* exp1**exp2 */
114 #define PREINC 14 /* ++var */
115 #define PREDEC 15 /* --var */
116 #define POSTINC 16 /* var++ */
117 #define POSTDEC 17 /* var-- */
118 #define EQ '='
119 #define GT '>'
120 #define LT '<'
121 #define PLUS '+'
122 #define MINUS '-'
123 #define MUL '*'
124 #define DIV '/'
125 #define MOD '%'
126 #define NOT '!'
127 #define LPAR '('
128 #define RPAR ')'
129 #define BAND '&' /* Bitwise AND */
130 #define BOR '|' /* Bitwise OR. */
131 #define BXOR '^' /* Bitwise eXclusive OR. */
132 #define BNOT '~' /* Bitwise NOT; Two's complement. */
133 #define QUES '?'
134 #define COL ':'
135 #define COMMA ','
136
137 /* This should be the function corresponding to the operator with the
138 highest precedence. */
139 #define EXP_HIGHEST expcomma
140
141 #ifndef MAX_INT_LEN
142 # define MAX_INT_LEN 32
143 #endif
144
145 struct lvalue
146 {
147 char *tokstr; /* possibly-rewritten lvalue if not NULL */
148 intmax_t tokval; /* expression evaluated value */
149 SHELL_VAR *tokvar; /* variable described by array or var reference */
150 intmax_t ind; /* array index if not -1 */
151 };
152
153 /* A structure defining a single expression context. */
154 typedef struct {
155 int curtok, lasttok;
156 char *expression, *tp, *lasttp;
157 intmax_t tokval;
158 char *tokstr;
159 int noeval;
160 struct lvalue lval;
161 } EXPR_CONTEXT;
162
163 static char *expression; /* The current expression */
164 static char *tp; /* token lexical position */
165 static char *lasttp; /* pointer to last token position */
166 static int curtok; /* the current token */
167 static int lasttok; /* the previous token */
168 static int assigntok; /* the OP in OP= */
169 static char *tokstr; /* current token string */
170 static intmax_t tokval; /* current token value */
171 static int noeval; /* set to 1 if no assignment to be done */
172 static procenv_t evalbuf;
173
174 static struct lvalue curlval = {0, 0, 0, -1};
175 static struct lvalue lastlval = {0, 0, 0, -1};
176
177 static int _is_arithop __P((int));
178 static void readtok __P((void)); /* lexical analyzer */
179
180 static void init_lvalue __P((struct lvalue *));
181 static struct lvalue *alloc_lvalue __P((void));
182 static void free_lvalue __P((struct lvalue *));
183
184 static intmax_t expr_streval __P((char *, int, struct lvalue *));
185 static intmax_t strlong __P((char *));
186 static void evalerror __P((const char *));
187
188 static void pushexp __P((void));
189 static void popexp __P((void));
190 static void expr_unwind __P((void));
191 static void expr_bind_variable __P((char *, char *));
192 #if defined (ARRAY_VARS)
193 static void expr_bind_array_element __P((char *, arrayind_t, char *));
194 #endif
195
196 static intmax_t subexpr __P((char *));
197
198 static intmax_t expcomma __P((void));
199 static intmax_t expassign __P((void));
200 static intmax_t expcond __P((void));
201 static intmax_t explor __P((void));
202 static intmax_t expland __P((void));
203 static intmax_t expbor __P((void));
204 static intmax_t expbxor __P((void));
205 static intmax_t expband __P((void));
206 static intmax_t exp5 __P((void));
207 static intmax_t exp4 __P((void));
208 static intmax_t expshift __P((void));
209 static intmax_t exp3 __P((void));
210 static intmax_t exp2 __P((void));
211 static intmax_t exppower __P((void));
212 static intmax_t exp1 __P((void));
213 static intmax_t exp0 __P((void));
214
215 /* Global var which contains the stack of expression contexts. */
216 static EXPR_CONTEXT **expr_stack;
217 static int expr_depth; /* Location in the stack. */
218 static int expr_stack_size; /* Number of slots already allocated. */
219
220 extern char *this_command_name;
221 extern int unbound_vars_is_error, last_command_exit_value;
222
223 #if defined (ARRAY_VARS)
224 extern const char * const bash_badsub_errmsg;
225 #endif
226
227 #define SAVETOK(X) \
228 do { \
229 (X)->curtok = curtok; \
230 (X)->lasttok = lasttok; \
231 (X)->tp = tp; \
232 (X)->lasttp = lasttp; \
233 (X)->tokval = tokval; \
234 (X)->tokstr = tokstr; \
235 (X)->noeval = noeval; \
236 (X)->lval = curlval; \
237 } while (0)
238
239 #define RESTORETOK(X) \
240 do { \
241 curtok = (X)->curtok; \
242 lasttok = (X)->lasttok; \
243 tp = (X)->tp; \
244 lasttp = (X)->lasttp; \
245 tokval = (X)->tokval; \
246 tokstr = (X)->tokstr; \
247 noeval = (X)->noeval; \
248 curlval = (X)->lval; \
249 } while (0)
250
251 /* Push and save away the contents of the globals describing the
252 current expression context. */
253 static void
254 pushexp ()
255 {
256 EXPR_CONTEXT *context;
257
258 if (expr_depth >= MAX_EXPR_RECURSION_LEVEL)
259 evalerror (_("expression recursion level exceeded"));
260
261 if (expr_depth >= expr_stack_size)
262 {
263 expr_stack_size += EXPR_STACK_GROW_SIZE;
264 expr_stack = (EXPR_CONTEXT **)xrealloc (expr_stack, expr_stack_size * sizeof (EXPR_CONTEXT *));
265 }
266
267 context = (EXPR_CONTEXT *)xmalloc (sizeof (EXPR_CONTEXT));
268
269 context->expression = expression;
270 SAVETOK(context);
271
272 expr_stack[expr_depth++] = context;
273 }
274
275 /* Pop the the contents of the expression context stack into the
276 globals describing the current expression context. */
277 static void
278 popexp ()
279 {
280 EXPR_CONTEXT *context;
281
282 if (expr_depth == 0)
283 evalerror (_("recursion stack underflow"));
284
285 context = expr_stack[--expr_depth];
286
287 expression = context->expression;
288 RESTORETOK (context);
289
290 free (context);
291 }
292
293 static void
294 expr_unwind ()
295 {
296 while (--expr_depth > 0)
297 {
298 if (expr_stack[expr_depth]->tokstr)
299 free (expr_stack[expr_depth]->tokstr);
300
301 if (expr_stack[expr_depth]->expression)
302 free (expr_stack[expr_depth]->expression);
303
304 free (expr_stack[expr_depth]);
305 }
306 free (expr_stack[expr_depth]); /* free the allocated EXPR_CONTEXT */
307
308 noeval = 0; /* XXX */
309 }
310
311 static void
312 expr_bind_variable (lhs, rhs)
313 char *lhs, *rhs;
314 {
315 SHELL_VAR *v;
316
317 v = bind_int_variable (lhs, rhs);
318 if (v && (readonly_p (v) || noassign_p (v)))
319 longjmp (evalbuf, 1); /* variable assignment error */
320 stupidly_hack_special_variables (lhs);
321 }
322
323 #if defined (ARRAY_VARS)
324 /* Rewrite tok, which is of the form vname[expression], to vname[ind], where
325 IND is the already-calculated value of expression. */
326 static void
327 expr_bind_array_element (tok, ind, rhs)
328 char *tok;
329 arrayind_t ind;
330 char *rhs;
331 {
332 char *lhs, *vname;
333 size_t llen;
334 char ibuf[INT_STRLEN_BOUND (arrayind_t) + 1], *istr;
335
336 istr = fmtumax (ind, 10, ibuf, sizeof (ibuf), 0);
337 vname = array_variable_name (tok, (char **)NULL, (int *)NULL);
338
339 llen = strlen (vname) + sizeof (ibuf) + 3;
340 lhs = xmalloc (llen);
341
342 sprintf (lhs, "%s[%s]", vname, istr); /* XXX */
343
344 /*itrace("expr_bind_array_element: %s=%s", lhs, rhs);*/
345 expr_bind_variable (lhs, rhs);
346 free (vname);
347 free (lhs);
348 }
349 #endif /* ARRAY_VARS */
350
351 /* Evaluate EXPR, and return the arithmetic result. If VALIDP is
352 non-null, a zero is stored into the location to which it points
353 if the expression is invalid, non-zero otherwise. If a non-zero
354 value is returned in *VALIDP, the return value of evalexp() may
355 be used.
356
357 The `while' loop after the longjmp is caught relies on the above
358 implementation of pushexp and popexp leaving in expr_stack[0] the
359 values that the variables had when the program started. That is,
360 the first things saved are the initial values of the variables that
361 were assigned at program startup or by the compiler. Therefore, it is
362 safe to let the loop terminate when expr_depth == 0, without freeing up
363 any of the expr_depth[0] stuff. */
364 intmax_t
365 evalexp (expr, validp)
366 char *expr;
367 int *validp;
368 {
369 intmax_t val;
370 int c;
371 procenv_t oevalbuf;
372
373 val = 0;
374 noeval = 0;
375
376 FASTCOPY (evalbuf, oevalbuf, sizeof (evalbuf));
377
378 c = setjmp_nosigs (evalbuf);
379
380 if (c)
381 {
382 FREE (tokstr);
383 FREE (expression);
384 tokstr = expression = (char *)NULL;
385
386 expr_unwind ();
387
388 if (validp)
389 *validp = 0;
390 return (0);
391 }
392
393 val = subexpr (expr);
394
395 if (validp)
396 *validp = 1;
397
398 FASTCOPY (oevalbuf, evalbuf, sizeof (evalbuf));
399
400 return (val);
401 }
402
403 static intmax_t
404 subexpr (expr)
405 char *expr;
406 {
407 intmax_t val;
408 char *p;
409
410 for (p = expr; p && *p && cr_whitespace (*p); p++)
411 ;
412
413 if (p == NULL || *p == '\0')
414 return (0);
415
416 pushexp ();
417 expression = savestring (expr);
418 tp = expression;
419
420 curtok = lasttok = 0;
421 tokstr = (char *)NULL;
422 tokval = 0;
423 init_lvalue (&curlval);
424 lastlval = curlval;
425
426 readtok ();
427
428 val = EXP_HIGHEST ();
429
430 if (curtok != 0)
431 evalerror (_("syntax error in expression"));
432
433 FREE (tokstr);
434 FREE (expression);
435
436 popexp ();
437
438 return val;
439 }
440
441 static intmax_t
442 expcomma ()
443 {
444 register intmax_t value;
445
446 value = expassign ();
447 while (curtok == COMMA)
448 {
449 readtok ();
450 value = expassign ();
451 }
452
453 return value;
454 }
455
456 static intmax_t
457 expassign ()
458 {
459 register intmax_t value;
460 char *lhs, *rhs;
461 arrayind_t lind;
462 #if defined (HAVE_IMAXDIV)
463 imaxdiv_t idiv;
464 #endif
465
466 value = expcond ();
467 if (curtok == EQ || curtok == OP_ASSIGN)
468 {
469 int special, op;
470 intmax_t lvalue;
471
472 special = curtok == OP_ASSIGN;
473
474 if (lasttok != STR)
475 evalerror (_("attempted assignment to non-variable"));
476
477 if (special)
478 {
479 op = assigntok; /* a OP= b */
480 lvalue = value;
481 }
482
483 /* XXX - watch out for pointer aliasing issues here */
484 lhs = savestring (tokstr);
485 /* save ind in case rhs is string var and evaluation overwrites it */
486 lind = curlval.ind;
487 readtok ();
488 value = expassign ();
489
490 if (special)
491 {
492 if ((op == DIV || op == MOD) && value == 0)
493 {
494 if (noeval == 0)
495 evalerror (_("division by 0"));
496 else
497 value = 1;
498 }
499
500 switch (op)
501 {
502 case MUL:
503 lvalue *= value;
504 break;
505 case DIV:
506 case MOD:
507 if (lvalue == INTMAX_MIN && value == -1)
508 lvalue = (op == DIV) ? INTMAX_MIN : 0;
509 else
510 #if HAVE_IMAXDIV
511 {
512 idiv = imaxdiv (lvalue, value);
513 lvalue = (op == DIV) ? idiv.quot : idiv.rem;
514 }
515 #else
516 lvalue = (op == DIV) ? lvalue / value : lvalue % value;
517 #endif
518 break;
519 case PLUS:
520 lvalue += value;
521 break;
522 case MINUS:
523 lvalue -= value;
524 break;
525 case LSH:
526 lvalue <<= value;
527 break;
528 case RSH:
529 lvalue >>= value;
530 break;
531 case BAND:
532 lvalue &= value;
533 break;
534 case BOR:
535 lvalue |= value;
536 break;
537 case BXOR:
538 lvalue ^= value;
539 break;
540 default:
541 free (lhs);
542 evalerror (_("bug: bad expassign token"));
543 break;
544 }
545 value = lvalue;
546 }
547
548 rhs = itos (value);
549 if (noeval == 0)
550 {
551 #if defined (ARRAY_VARS)
552 if (lind != -1)
553 expr_bind_array_element (lhs, lind, rhs);
554 else
555 #endif
556 expr_bind_variable (lhs, rhs);
557 }
558 if (curlval.tokstr && curlval.tokstr == tokstr)
559 init_lvalue (&curlval);
560
561 free (rhs);
562 free (lhs);
563 FREE (tokstr);
564 tokstr = (char *)NULL; /* For freeing on errors. */
565 }
566
567 return (value);
568 }
569
570 /* Conditional expression (expr?expr:expr) */
571 static intmax_t
572 expcond ()
573 {
574 intmax_t cval, val1, val2, rval;
575 int set_noeval;
576
577 set_noeval = 0;
578 rval = cval = explor ();
579 if (curtok == QUES) /* found conditional expr */
580 {
581 readtok ();
582 if (curtok == 0 || curtok == COL)
583 evalerror (_("expression expected"));
584 if (cval == 0)
585 {
586 set_noeval = 1;
587 noeval++;
588 }
589
590 val1 = EXP_HIGHEST ();
591
592 if (set_noeval)
593 noeval--;
594 if (curtok != COL)
595 evalerror (_("`:' expected for conditional expression"));
596 readtok ();
597 if (curtok == 0)
598 evalerror (_("expression expected"));
599 set_noeval = 0;
600 if (cval)
601 {
602 set_noeval = 1;
603 noeval++;
604 }
605
606 val2 = expcond ();
607 if (set_noeval)
608 noeval--;
609 rval = cval ? val1 : val2;
610 lasttok = COND;
611 }
612 return rval;
613 }
614
615 /* Logical OR. */
616 static intmax_t
617 explor ()
618 {
619 register intmax_t val1, val2;
620 int set_noeval;
621
622 val1 = expland ();
623
624 while (curtok == LOR)
625 {
626 set_noeval = 0;
627 if (val1 != 0)
628 {
629 noeval++;
630 set_noeval = 1;
631 }
632 readtok ();
633 val2 = expland ();
634 if (set_noeval)
635 noeval--;
636 val1 = val1 || val2;
637 lasttok = LOR;
638 }
639
640 return (val1);
641 }
642
643 /* Logical AND. */
644 static intmax_t
645 expland ()
646 {
647 register intmax_t val1, val2;
648 int set_noeval;
649
650 val1 = expbor ();
651
652 while (curtok == LAND)
653 {
654 set_noeval = 0;
655 if (val1 == 0)
656 {
657 set_noeval = 1;
658 noeval++;
659 }
660 readtok ();
661 val2 = expbor ();
662 if (set_noeval)
663 noeval--;
664 val1 = val1 && val2;
665 lasttok = LAND;
666 }
667
668 return (val1);
669 }
670
671 /* Bitwise OR. */
672 static intmax_t
673 expbor ()
674 {
675 register intmax_t val1, val2;
676
677 val1 = expbxor ();
678
679 while (curtok == BOR)
680 {
681 readtok ();
682 val2 = expbxor ();
683 val1 = val1 | val2;
684 lasttok = NUM;
685 }
686
687 return (val1);
688 }
689
690 /* Bitwise XOR. */
691 static intmax_t
692 expbxor ()
693 {
694 register intmax_t val1, val2;
695
696 val1 = expband ();
697
698 while (curtok == BXOR)
699 {
700 readtok ();
701 val2 = expband ();
702 val1 = val1 ^ val2;
703 lasttok = NUM;
704 }
705
706 return (val1);
707 }
708
709 /* Bitwise AND. */
710 static intmax_t
711 expband ()
712 {
713 register intmax_t val1, val2;
714
715 val1 = exp5 ();
716
717 while (curtok == BAND)
718 {
719 readtok ();
720 val2 = exp5 ();
721 val1 = val1 & val2;
722 lasttok = NUM;
723 }
724
725 return (val1);
726 }
727
728 static intmax_t
729 exp5 ()
730 {
731 register intmax_t val1, val2;
732
733 val1 = exp4 ();
734
735 while ((curtok == EQEQ) || (curtok == NEQ))
736 {
737 int op = curtok;
738
739 readtok ();
740 val2 = exp4 ();
741 if (op == EQEQ)
742 val1 = (val1 == val2);
743 else if (op == NEQ)
744 val1 = (val1 != val2);
745 lasttok = NUM;
746 }
747 return (val1);
748 }
749
750 static intmax_t
751 exp4 ()
752 {
753 register intmax_t val1, val2;
754
755 val1 = expshift ();
756 while ((curtok == LEQ) ||
757 (curtok == GEQ) ||
758 (curtok == LT) ||
759 (curtok == GT))
760 {
761 int op = curtok;
762
763 readtok ();
764 val2 = expshift ();
765
766 if (op == LEQ)
767 val1 = val1 <= val2;
768 else if (op == GEQ)
769 val1 = val1 >= val2;
770 else if (op == LT)
771 val1 = val1 < val2;
772 else /* (op == GT) */
773 val1 = val1 > val2;
774 lasttok = NUM;
775 }
776 return (val1);
777 }
778
779 /* Left and right shifts. */
780 static intmax_t
781 expshift ()
782 {
783 register intmax_t val1, val2;
784
785 val1 = exp3 ();
786
787 while ((curtok == LSH) || (curtok == RSH))
788 {
789 int op = curtok;
790
791 readtok ();
792 val2 = exp3 ();
793
794 if (op == LSH)
795 val1 = val1 << val2;
796 else
797 val1 = val1 >> val2;
798 lasttok = NUM;
799 }
800
801 return (val1);
802 }
803
804 static intmax_t
805 exp3 ()
806 {
807 register intmax_t val1, val2;
808
809 val1 = exp2 ();
810
811 while ((curtok == PLUS) || (curtok == MINUS))
812 {
813 int op = curtok;
814
815 readtok ();
816 val2 = exp2 ();
817
818 if (op == PLUS)
819 val1 += val2;
820 else if (op == MINUS)
821 val1 -= val2;
822 lasttok = NUM;
823 }
824 return (val1);
825 }
826
827 static intmax_t
828 exp2 ()
829 {
830 register intmax_t val1, val2;
831 #if defined (HAVE_IMAXDIV)
832 imaxdiv_t idiv;
833 #endif
834
835 val1 = exppower ();
836
837 while ((curtok == MUL) ||
838 (curtok == DIV) ||
839 (curtok == MOD))
840 {
841 int op = curtok;
842 char *stp, *sltp;
843
844 stp = tp;
845 readtok ();
846
847 val2 = exppower ();
848
849 /* Handle division by 0 and twos-complement arithmetic overflow */
850 if (((op == DIV) || (op == MOD)) && (val2 == 0))
851 {
852 if (noeval == 0)
853 {
854 sltp = lasttp;
855 lasttp = stp;
856 while (lasttp && *lasttp && whitespace (*lasttp))
857 lasttp++;
858 evalerror (_("division by 0"));
859 lasttp = sltp;
860 }
861 else
862 val2 = 1;
863 }
864 else if (op == MOD && val1 == INTMAX_MIN && val2 == -1)
865 {
866 val1 = 0;
867 continue;
868 }
869 else if (op == DIV && val1 == INTMAX_MIN && val2 == -1)
870 val2 = 1;
871
872 if (op == MUL)
873 val1 *= val2;
874 else if (op == DIV || op == MOD)
875 #if defined (HAVE_IMAXDIV)
876 {
877 idiv = imaxdiv (val1, val2);
878 val1 = (op == DIV) ? idiv.quot : idiv.rem;
879 }
880 #else
881 val1 = (op == DIV) ? val1 / val2 : val1 % val2;
882 #endif
883 lasttok = NUM;
884 }
885 return (val1);
886 }
887
888 static intmax_t
889 ipow (base, exp)
890 intmax_t base, exp;
891 {
892 intmax_t result;
893
894 result = 1;
895 while (exp)
896 {
897 if (exp & 1)
898 result *= base;
899 exp >>= 1;
900 base *= base;
901 }
902 return result;
903 }
904
905 static intmax_t
906 exppower ()
907 {
908 register intmax_t val1, val2, c;
909
910 val1 = exp1 ();
911 while (curtok == POWER)
912 {
913 readtok ();
914 val2 = exppower (); /* exponentiation is right-associative */
915 lasttok = NUM;
916 if (val2 == 0)
917 return (1);
918 if (val2 < 0)
919 evalerror (_("exponent less than 0"));
920 val1 = ipow (val1, val2);
921 }
922 return (val1);
923 }
924
925 static intmax_t
926 exp1 ()
927 {
928 register intmax_t val;
929
930 if (curtok == NOT)
931 {
932 readtok ();
933 val = !exp1 ();
934 lasttok = NUM;
935 }
936 else if (curtok == BNOT)
937 {
938 readtok ();
939 val = ~exp1 ();
940 lasttok = NUM;
941 }
942 else if (curtok == MINUS)
943 {
944 readtok ();
945 val = - exp1 ();
946 lasttok = NUM;
947 }
948 else if (curtok == PLUS)
949 {
950 readtok ();
951 val = exp1 ();
952 lasttok = NUM;
953 }
954 else
955 val = exp0 ();
956
957 return (val);
958 }
959
960 static intmax_t
961 exp0 ()
962 {
963 register intmax_t val = 0, v2;
964 char *vincdec;
965 int stok;
966 EXPR_CONTEXT ec;
967
968 /* XXX - might need additional logic here to decide whether or not
969 pre-increment or pre-decrement is legal at this point. */
970 if (curtok == PREINC || curtok == PREDEC)
971 {
972 stok = lasttok = curtok;
973 readtok ();
974 if (curtok != STR)
975 /* readtok() catches this */
976 evalerror (_("identifier expected after pre-increment or pre-decrement"));
977
978 v2 = tokval + ((stok == PREINC) ? 1 : -1);
979 vincdec = itos (v2);
980 if (noeval == 0)
981 {
982 #if defined (ARRAY_VARS)
983 if (curlval.ind != -1)
984 expr_bind_array_element (curlval.tokstr, curlval.ind, vincdec);
985 else
986 #endif
987 expr_bind_variable (tokstr, vincdec);
988 }
989 free (vincdec);
990 val = v2;
991
992 curtok = NUM; /* make sure --x=7 is flagged as an error */
993 readtok ();
994 }
995 else if (curtok == LPAR)
996 {
997 /* XXX - save curlval here? Or entire expression context? */
998 readtok ();
999 val = EXP_HIGHEST ();
1000
1001 if (curtok != RPAR) /* ( */
1002 evalerror (_("missing `)'"));
1003
1004 /* Skip over closing paren. */
1005 readtok ();
1006 }
1007 else if ((curtok == NUM) || (curtok == STR))
1008 {
1009 val = tokval;
1010 if (curtok == STR)
1011 {
1012 SAVETOK (&ec);
1013 tokstr = (char *)NULL; /* keep it from being freed */
1014 noeval = 1;
1015 readtok ();
1016 stok = curtok;
1017
1018 /* post-increment or post-decrement */
1019 if (stok == POSTINC || stok == POSTDEC)
1020 {
1021 /* restore certain portions of EC */
1022 tokstr = ec.tokstr;
1023 noeval = ec.noeval;
1024 curlval = ec.lval;
1025 lasttok = STR; /* ec.curtok */
1026
1027 v2 = val + ((stok == POSTINC) ? 1 : -1);
1028 vincdec = itos (v2);
1029 if (noeval == 0)
1030 {
1031 #if defined (ARRAY_VARS)
1032 if (curlval.ind != -1)
1033 expr_bind_array_element (curlval.tokstr, curlval.ind, vincdec);
1034 else
1035 #endif
1036 expr_bind_variable (tokstr, vincdec);
1037 }
1038 free (vincdec);
1039 curtok = NUM; /* make sure x++=7 is flagged as an error */
1040 }
1041 else
1042 {
1043 /* XXX - watch out for pointer aliasing issues here */
1044 if (stok == STR) /* free new tokstr before old one is restored */
1045 FREE (tokstr);
1046 RESTORETOK (&ec);
1047 }
1048 }
1049
1050 readtok ();
1051 }
1052 else
1053 evalerror (_("syntax error: operand expected"));
1054
1055 return (val);
1056 }
1057
1058 static void
1059 init_lvalue (lv)
1060 struct lvalue *lv;
1061 {
1062 lv->tokstr = 0;
1063 lv->tokvar = 0;
1064 lv->tokval = lv->ind = -1;
1065 }
1066
1067 static struct lvalue *
1068 alloc_lvalue ()
1069 {
1070 struct lvalue *lv;
1071
1072 lv = xmalloc (sizeof (struct lvalue));
1073 init_lvalue (lv);
1074 return (lv);
1075 }
1076
1077 static void
1078 free_lvalue (lv)
1079 struct lvalue *lv;
1080 {
1081 free (lv); /* should be inlined */
1082 }
1083
1084 static intmax_t
1085 expr_streval (tok, e, lvalue)
1086 char *tok;
1087 int e;
1088 struct lvalue *lvalue;
1089 {
1090 SHELL_VAR *v;
1091 char *value;
1092 intmax_t tval;
1093 #if defined (ARRAY_VARS)
1094 arrayind_t ind;
1095 #endif
1096
1097 /*itrace("expr_streval: %s: noeval = %d", tok, noeval);*/
1098 /* If we are suppressing evaluation, just short-circuit here instead of
1099 going through the rest of the evaluator. */
1100 if (noeval)
1101 return (0);
1102
1103 /* [[[[[ */
1104 #if defined (ARRAY_VARS)
1105 v = (e == ']') ? array_variable_part (tok, (char **)0, (int *)0) : find_variable (tok);
1106 #else
1107 v = find_variable (tok);
1108 #endif
1109
1110 if ((v == 0 || invisible_p (v)) && unbound_vars_is_error)
1111 {
1112 #if defined (ARRAY_VARS)
1113 value = (e == ']') ? array_variable_name (tok, (char **)0, (int *)0) : tok;
1114 #else
1115 value = tok;
1116 #endif
1117
1118 last_command_exit_value = EXECUTION_FAILURE;
1119 err_unboundvar (value);
1120
1121 #if defined (ARRAY_VARS)
1122 if (e == ']')
1123 FREE (value); /* array_variable_name returns new memory */
1124 #endif
1125
1126 if (interactive_shell)
1127 {
1128 expr_unwind ();
1129 top_level_cleanup ();
1130 jump_to_top_level (DISCARD);
1131 }
1132 else
1133 jump_to_top_level (FORCE_EOF);
1134 }
1135
1136 #if defined (ARRAY_VARS)
1137 ind = -1;
1138 /* Second argument of 0 to get_array_value means that we don't allow
1139 references like array[@]. In this case, get_array_value is just
1140 like get_variable_value in that it does not return newly-allocated
1141 memory or quote the results. */
1142 value = (e == ']') ? get_array_value (tok, 0, (int *)NULL, &ind) : get_variable_value (v);
1143 #else
1144 value = get_variable_value (v);
1145 #endif
1146
1147 tval = (value && *value) ? subexpr (value) : 0;
1148
1149 if (lvalue)
1150 {
1151 lvalue->tokstr = tok; /* XXX */
1152 lvalue->tokval = tval;
1153 lvalue->tokvar = v; /* XXX */
1154 #if defined (ARRAY_VARS)
1155 lvalue->ind = ind;
1156 #else
1157 lvalue->ind = -1;
1158 #endif
1159 }
1160
1161 return (tval);
1162 }
1163
1164 static int
1165 _is_multiop (c)
1166 int c;
1167 {
1168 switch (c)
1169 {
1170 case EQEQ:
1171 case NEQ:
1172 case LEQ:
1173 case GEQ:
1174 case LAND:
1175 case LOR:
1176 case LSH:
1177 case RSH:
1178 case OP_ASSIGN:
1179 case COND:
1180 case POWER:
1181 case PREINC:
1182 case PREDEC:
1183 case POSTINC:
1184 case POSTDEC:
1185 return 1;
1186 default:
1187 return 0;
1188 }
1189 }
1190
1191 static int
1192 _is_arithop (c)
1193 int c;
1194 {
1195 switch (c)
1196 {
1197 case EQ:
1198 case GT:
1199 case LT:
1200 case PLUS:
1201 case MINUS:
1202 case MUL:
1203 case DIV:
1204 case MOD:
1205 case NOT:
1206 case LPAR:
1207 case RPAR:
1208 case BAND:
1209 case BOR:
1210 case BXOR:
1211 case BNOT:
1212 return 1; /* operator tokens */
1213 case QUES:
1214 case COL:
1215 case COMMA:
1216 return 1; /* questionable */
1217 default:
1218 return 0; /* anything else is invalid */
1219 }
1220 }
1221
1222 /* Lexical analyzer/token reader for the expression evaluator. Reads the
1223 next token and puts its value into curtok, while advancing past it.
1224 Updates value of tp. May also set tokval (for number) or tokstr (for
1225 string). */
1226 static void
1227 readtok ()
1228 {
1229 register char *cp, *xp;
1230 register unsigned char c, c1;
1231 register int e;
1232 struct lvalue lval;
1233
1234 /* Skip leading whitespace. */
1235 cp = tp;
1236 c = e = 0;
1237 while (cp && (c = *cp) && (cr_whitespace (c)))
1238 cp++;
1239
1240 if (c)
1241 cp++;
1242
1243 if (c == '\0')
1244 {
1245 lasttok = curtok;
1246 curtok = 0;
1247 tp = cp;
1248 return;
1249 }
1250 lasttp = tp = cp - 1;
1251
1252 if (legal_variable_starter (c))
1253 {
1254 /* variable names not preceded with a dollar sign are shell variables. */
1255 char *savecp;
1256 EXPR_CONTEXT ec;
1257 int peektok;
1258
1259 while (legal_variable_char (c))
1260 c = *cp++;
1261
1262 c = *--cp;
1263
1264 #if defined (ARRAY_VARS)
1265 if (c == '[')
1266 {
1267 e = skipsubscript (cp, 0, 0);
1268 if (cp[e] == ']')
1269 {
1270 cp += e + 1;
1271 c = *cp;
1272 e = ']';
1273 }
1274 else
1275 evalerror (bash_badsub_errmsg);
1276 }
1277 #endif /* ARRAY_VARS */
1278
1279 *cp = '\0';
1280 /* XXX - watch out for pointer aliasing issues here */
1281 if (curlval.tokstr && curlval.tokstr == tokstr)
1282 init_lvalue (&curlval);
1283
1284 FREE (tokstr);
1285 tokstr = savestring (tp);
1286 *cp = c;
1287
1288 /* XXX - make peektok part of saved token state? */
1289 SAVETOK (&ec);
1290 tokstr = (char *)NULL; /* keep it from being freed */
1291 tp = savecp = cp;
1292 noeval = 1;
1293 curtok = STR;
1294 readtok ();
1295 peektok = curtok;
1296 if (peektok == STR) /* free new tokstr before old one is restored */
1297 FREE (tokstr);
1298 RESTORETOK (&ec);
1299 cp = savecp;
1300
1301 /* The tests for PREINC and PREDEC aren't strictly correct, but they
1302 preserve old behavior if a construct like --x=9 is given. */
1303 if (lasttok == PREINC || lasttok == PREDEC || peektok != EQ)
1304 {
1305 lastlval = curlval;
1306 tokval = expr_streval (tokstr, e, &curlval);
1307 }
1308 else
1309 tokval = 0;
1310
1311 lasttok = curtok;
1312 curtok = STR;
1313 }
1314 else if (DIGIT(c))
1315 {
1316 while (ISALNUM (c) || c == '#' || c == '@' || c == '_')
1317 c = *cp++;
1318
1319 c = *--cp;
1320 *cp = '\0';
1321
1322 tokval = strlong (tp);
1323 *cp = c;
1324 lasttok = curtok;
1325 curtok = NUM;
1326 }
1327 else
1328 {
1329 c1 = *cp++;
1330 if ((c == EQ) && (c1 == EQ))
1331 c = EQEQ;
1332 else if ((c == NOT) && (c1 == EQ))
1333 c = NEQ;
1334 else if ((c == GT) && (c1 == EQ))
1335 c = GEQ;
1336 else if ((c == LT) && (c1 == EQ))
1337 c = LEQ;
1338 else if ((c == LT) && (c1 == LT))
1339 {
1340 if (*cp == '=') /* a <<= b */
1341 {
1342 assigntok = LSH;
1343 c = OP_ASSIGN;
1344 cp++;
1345 }
1346 else
1347 c = LSH;
1348 }
1349 else if ((c == GT) && (c1 == GT))
1350 {
1351 if (*cp == '=')
1352 {
1353 assigntok = RSH; /* a >>= b */
1354 c = OP_ASSIGN;
1355 cp++;
1356 }
1357 else
1358 c = RSH;
1359 }
1360 else if ((c == BAND) && (c1 == BAND))
1361 c = LAND;
1362 else if ((c == BOR) && (c1 == BOR))
1363 c = LOR;
1364 else if ((c == '*') && (c1 == '*'))
1365 c = POWER;
1366 else if ((c == '-' || c == '+') && c1 == c && curtok == STR)
1367 c = (c == '-') ? POSTDEC : POSTINC;
1368 else if ((c == '-' || c == '+') && c1 == c)
1369 {
1370 /* Quickly scan forward to see if this is followed by optional
1371 whitespace and an identifier. */
1372 xp = cp;
1373 while (xp && *xp && cr_whitespace (*xp))
1374 xp++;
1375 if (legal_variable_starter ((unsigned char)*xp))
1376 c = (c == '-') ? PREDEC : PREINC;
1377 else
1378 cp--; /* not preinc or predec, so unget the character */
1379 }
1380 else if (c1 == EQ && member (c, "*/%+-&^|"))
1381 {
1382 assigntok = c; /* a OP= b */
1383 c = OP_ASSIGN;
1384 }
1385 else if (_is_arithop (c) == 0)
1386 {
1387 cp--;
1388 /* use curtok, since it hasn't been copied to lasttok yet */
1389 if (curtok == 0 || _is_arithop (curtok) || _is_multiop (curtok))
1390 evalerror (_("syntax error: operand expected"));
1391 else
1392 evalerror (_("syntax error: invalid arithmetic operator"));
1393 }
1394 else
1395 cp--; /* `unget' the character */
1396
1397 /* Should check here to make sure that the current character is one
1398 of the recognized operators and flag an error if not. Could create
1399 a character map the first time through and check it on subsequent
1400 calls. */
1401 lasttok = curtok;
1402 curtok = c;
1403 }
1404 tp = cp;
1405 }
1406
1407 static void
1408 evalerror (msg)
1409 const char *msg;
1410 {
1411 char *name, *t;
1412
1413 name = this_command_name;
1414 for (t = expression; whitespace (*t); t++)
1415 ;
1416 internal_error (_("%s%s%s: %s (error token is \"%s\")"),
1417 name ? name : "", name ? ": " : "", t,
1418 msg, (lasttp && *lasttp) ? lasttp : "");
1419 longjmp (evalbuf, 1);
1420 }
1421
1422 /* Convert a string to an intmax_t integer, with an arbitrary base.
1423 0nnn -> base 8
1424 0[Xx]nn -> base 16
1425 Anything else: [base#]number (this is implemented to match ksh93)
1426
1427 Base may be >=2 and <=64. If base is <= 36, the numbers are drawn
1428 from [0-9][a-zA-Z], and lowercase and uppercase letters may be used
1429 interchangably. If base is > 36 and <= 64, the numbers are drawn
1430 from [0-9][a-z][A-Z]_@ (a = 10, z = 35, A = 36, Z = 61, @ = 62, _ = 63 --
1431 you get the picture). */
1432
1433 static intmax_t
1434 strlong (num)
1435 char *num;
1436 {
1437 register char *s;
1438 register unsigned char c;
1439 int base, foundbase;
1440 intmax_t val;
1441
1442 s = num;
1443
1444 base = 10;
1445 foundbase = 0;
1446 if (*s == '0')
1447 {
1448 s++;
1449
1450 if (*s == '\0')
1451 return 0;
1452
1453 /* Base 16? */
1454 if (*s == 'x' || *s == 'X')
1455 {
1456 base = 16;
1457 s++;
1458 }
1459 else
1460 base = 8;
1461 foundbase++;
1462 }
1463
1464 val = 0;
1465 for (c = *s++; c; c = *s++)
1466 {
1467 if (c == '#')
1468 {
1469 if (foundbase)
1470 evalerror (_("invalid number"));
1471
1472 /* Illegal base specifications raise an evaluation error. */
1473 if (val < 2 || val > 64)
1474 evalerror (_("invalid arithmetic base"));
1475
1476 base = val;
1477 val = 0;
1478 foundbase++;
1479 }
1480 else if (ISALNUM(c) || (c == '_') || (c == '@'))
1481 {
1482 if (DIGIT(c))
1483 c = TODIGIT(c);
1484 else if (c >= 'a' && c <= 'z')
1485 c -= 'a' - 10;
1486 else if (c >= 'A' && c <= 'Z')
1487 c -= 'A' - ((base <= 36) ? 10 : 36);
1488 else if (c == '@')
1489 c = 62;
1490 else if (c == '_')
1491 c = 63;
1492
1493 if (c >= base)
1494 evalerror (_("value too great for base"));
1495
1496 val = (val * base) + c;
1497 }
1498 else
1499 break;
1500 }
1501
1502 return (val);
1503 }
1504
1505 #if defined (EXPR_TEST)
1506 void *
1507 xmalloc (n)
1508 int n;
1509 {
1510 return (malloc (n));
1511 }
1512
1513 void *
1514 xrealloc (s, n)
1515 char *s;
1516 int n;
1517 {
1518 return (realloc (s, n));
1519 }
1520
1521 SHELL_VAR *find_variable () { return 0;}
1522 SHELL_VAR *bind_variable () { return 0; }
1523
1524 char *get_string_value () { return 0; }
1525
1526 procenv_t top_level;
1527
1528 main (argc, argv)
1529 int argc;
1530 char **argv;
1531 {
1532 register int i;
1533 intmax_t v;
1534 int expok;
1535
1536 if (setjmp (top_level))
1537 exit (0);
1538
1539 for (i = 1; i < argc; i++)
1540 {
1541 v = evalexp (argv[i], &expok);
1542 if (expok == 0)
1543 fprintf (stderr, _("%s: expression error\n"), argv[i]);
1544 else
1545 printf ("'%s' -> %ld\n", argv[i], v);
1546 }
1547 exit (0);
1548 }
1549
1550 int
1551 builtin_error (format, arg1, arg2, arg3, arg4, arg5)
1552 char *format;
1553 {
1554 fprintf (stderr, "expr: ");
1555 fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
1556 fprintf (stderr, "\n");
1557 return 0;
1558 }
1559
1560 char *
1561 itos (n)
1562 intmax_t n;
1563 {
1564 return ("42");
1565 }
1566
1567 #endif /* EXPR_TEST */