1 /* Parse C expressions for CCCP.
2 Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998 Free Software Foundation.
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License as published by the
6 Free Software Foundation; either version 2, or (at your option) any
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA.
19 In other words, you are welcome to use, share and improve this program.
20 You are forbidden to forbid anyone else to use, share and improve
21 what you give them. Help stamp out software-hoarding!
23 Written by Per Bothner 1994. */
25 /* Parse a C expression from text in a string */
31 #ifdef MULTIBYTE_CHARS
35 /* This is used for communicating lists of keywords with cccp.c. */
43 #ifndef CHAR_TYPE_SIZE
44 #define CHAR_TYPE_SIZE BITS_PER_UNIT
48 #define INT_TYPE_SIZE BITS_PER_WORD
51 #ifndef LONG_TYPE_SIZE
52 #define LONG_TYPE_SIZE BITS_PER_WORD
55 #ifndef WCHAR_TYPE_SIZE
56 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
59 #ifndef MAX_CHAR_TYPE_SIZE
60 #define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE
63 #ifndef MAX_INT_TYPE_SIZE
64 #define MAX_INT_TYPE_SIZE INT_TYPE_SIZE
67 #ifndef MAX_LONG_TYPE_SIZE
68 #define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE
71 #ifndef MAX_WCHAR_TYPE_SIZE
72 #define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE
75 #define MAX_CHAR_TYPE_MASK (MAX_CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT \
76 ? (~ (~ (HOST_WIDE_INT) 0 << MAX_CHAR_TYPE_SIZE)) \
77 : ~ (HOST_WIDE_INT) 0)
79 #define MAX_WCHAR_TYPE_MASK (MAX_WCHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT \
80 ? ~ (~ (HOST_WIDE_INT) 0 << MAX_WCHAR_TYPE_SIZE) \
81 : ~ (HOST_WIDE_INT) 0)
83 /* Yield nonzero if adding two numbers with A's and B's signs can yield a
84 number with SUM's sign, where A, B, and SUM are all C integers. */
85 #define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
87 static void integer_overflow PARAMS ((cpp_reader *));
88 static long left_shift PARAMS ((cpp_reader *, long, int, unsigned long));
89 static long right_shift PARAMS ((cpp_reader *, long, int, unsigned long));
104 #define LEFT_OPERAND_REQUIRED 1
105 #define RIGHT_OPERAND_REQUIRED 2
107 /* SKIP_OPERAND is set for '&&' '||' '?' and ':' when the
108 following operand should be short-circuited instead of evaluated. */
109 #define SKIP_OPERAND 8
110 /*#define UNSIGNEDP 16*/
116 #ifndef HOST_BITS_PER_WIDE_INT
117 #define HOST_BITS_PER_WIDE_INT (CHAR_BIT * sizeof (HOST_WIDE_INT))
122 char rprio; /* Priority of op (relative to it right operand). */
124 char unsignedp; /* true if value should be treated as unsigned */
125 HOST_WIDE_INT value; /* The value logically "right" of op. */
128 /* Take care of parsing a number (anything that starts with a digit).
129 LEN is the number of characters in it. */
131 /* maybe needs to actually deal with floating point numbers */
134 parse_number (pfile, start, olen)
140 register char *p = start;
142 register unsigned long n = 0, nd, ULONG_MAX_over_base;
143 register int base = 10;
144 register int len = olen;
145 register int overflow = 0;
146 register int digit, largest_digit = 0;
151 for (c = 0; c < len; c++)
153 /* It's a float since it contains a point. */
155 "floating point numbers not allowed in #if expressions");
160 if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
168 /* Some buggy compilers (e.g. MPW C) seem to need both casts. */
169 ULONG_MAX_over_base = ((unsigned long) -1) / ((unsigned long) base);
171 for (; len > 0; len--) {
174 if (c >= '0' && c <= '9')
176 else if (base == 16 && c >= 'a' && c <= 'f')
177 digit = c - 'a' + 10;
178 else if (base == 16 && c >= 'A' && c <= 'F')
179 digit = c - 'A' + 10;
181 /* `l' means long, and `u' means unsigned. */
183 if (c == 'l' || c == 'L')
186 cpp_error (pfile, "two `l's in integer constant");
189 else if (c == 'u' || c == 'U')
192 cpp_error (pfile, "two `u's in integer constant");
202 /* Don't look for any more digits after the suffixes. */
205 if (largest_digit < digit)
206 largest_digit = digit;
207 nd = n * base + digit;
208 overflow |= ULONG_MAX_over_base < n || nd < n;
214 cpp_error (pfile, "Invalid number in #if expression");
219 if (base <= largest_digit)
220 cpp_pedwarn (pfile, "integer constant contains digits beyond the radix");
223 cpp_pedwarn (pfile, "integer constant out of range");
225 /* If too big to be signed, consider it unsigned. */
226 if ((long) n < 0 && ! op.unsignedp)
229 cpp_warning (pfile, "integer constant is so large that it is unsigned");
243 static struct token tokentab2[] = {
257 /* Read one token. */
260 cpp_lex (pfile, skip_evaluation)
264 register HOST_WIDE_INT c;
265 register struct token *toktab;
266 enum cpp_token token;
268 U_CHAR *tok_start, *tok_end;
273 old_written = CPP_WRITTEN (pfile);
274 cpp_skip_hspace (pfile);
275 c = CPP_BUF_PEEK (CPP_BUFFER (pfile));
279 op.value = cpp_read_check_assertion (pfile);
289 token = cpp_get_token (pfile);
290 tok_start = pfile->token_buffer + old_written;
291 tok_end = CPP_PWRITTEN (pfile);
292 pfile->limit = tok_start;
295 case CPP_EOF: /* Should not happen ... */
300 if (CPP_BUFFER (pfile)->fname != NULL)
305 cpp_pop_buffer (pfile);
307 case CPP_HSPACE: case CPP_COMMENT:
310 return parse_number (pfile, tok_start, tok_end - tok_start);
312 cpp_error (pfile, "string constants not allowed in #if expressions");
316 /* This code for reading a character constant
317 handles multicharacter constants and wide characters.
318 It is mostly copied from c-lex.c. */
320 register int result = 0;
321 register int num_chars = 0;
322 unsigned width = MAX_CHAR_TYPE_SIZE;
325 U_CHAR *ptr = tok_start;
326 #ifdef MULTIBYTE_CHARS
327 char token_buffer[MAX_LONG_TYPE_SIZE/MAX_CHAR_TYPE_SIZE + MB_CUR_MAX];
329 char token_buffer[MAX_LONG_TYPE_SIZE/MAX_CHAR_TYPE_SIZE + 1];
336 width = MAX_WCHAR_TYPE_SIZE;
337 #ifdef MULTIBYTE_CHARS
338 max_chars = MB_CUR_MAX;
344 max_chars = MAX_LONG_TYPE_SIZE / width;
347 while (ptr < tok_end && ((c = *ptr++) != '\''))
351 c = cpp_parse_escape (pfile, (char **) &ptr,
352 wide_flag ? MAX_WCHAR_TYPE_MASK
353 : MAX_CHAR_TYPE_MASK);
354 if (width < HOST_BITS_PER_INT
355 && (unsigned) c >= (unsigned)(1 << width))
357 "escape sequence out of range for character");
362 /* Merge character into result; ignore excess chars. */
363 if (num_chars < max_chars + 1)
365 if (width < HOST_BITS_PER_INT)
366 result = (result << width) | (c & ((1 << width) - 1));
369 token_buffer[num_chars - 1] = c;
373 token_buffer[num_chars] = 0;
376 cpp_error (pfile, "malformatted character constant");
377 else if (num_chars == 0)
378 cpp_error (pfile, "empty character constant");
379 else if (num_chars > max_chars)
381 num_chars = max_chars;
382 cpp_error (pfile, "character constant too long");
384 else if (num_chars != 1 && ! CPP_TRADITIONAL (pfile))
385 cpp_warning (pfile, "multi-character character constant");
387 /* If char type is signed, sign-extend the constant. */
390 int num_bits = num_chars * width;
392 if (cpp_lookup (pfile, (U_CHAR *)"__CHAR_UNSIGNED__",
393 sizeof ("__CHAR_UNSIGNED__")-1, -1)
394 || ((result >> (num_bits - 1)) & 1) == 0)
396 = result & ((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
399 = result | ~((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
403 #ifdef MULTIBYTE_CHARS
404 /* Set the initial shift state and convert the next sequence. */
406 /* In all locales L'\0' is zero and mbtowc will return zero,
409 || (num_chars == 1 && token_buffer[0] != '\0'))
412 (void) mbtowc (NULL_PTR, NULL_PTR, 0);
413 if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
416 cpp_pedwarn (pfile,"Ignoring invalid multibyte character");
423 /* This is always a signed type. */
430 if (CPP_WARN_UNDEF (pfile) && !skip_evaluation)
431 cpp_warning (pfile, "`%.*s' is not defined",
432 (int) (tok_end - tok_start), tok_start);
433 return parse_number (pfile, "0", 0);
436 /* See if it is a special token of length 2. */
437 if (tok_start + 2 == tok_end)
439 for (toktab = tokentab2; toktab->operator != NULL; toktab++)
440 if (tok_start[0] == toktab->operator[0]
441 && tok_start[1] == toktab->operator[1])
443 if (toktab->token == ERROR)
445 char *buf = (char *) alloca (40);
446 sprintf (buf, "`%s' not allowed in operand of `#if'", tok_start);
447 cpp_error (pfile, buf);
449 op.op = toktab->token;
460 /* Parse a C escape sequence. STRING_PTR points to a variable
461 containing a pointer to the string to parse. That pointer
462 is updated past the characters we use. The value of the
463 escape sequence is returned.
465 A negative value means the sequence \ newline was seen,
466 which is supposed to be equivalent to nothing at all.
468 If \ is followed by a null character, we return a negative
469 value and leave the string pointer pointing at the null character.
471 If \ is followed by 000, we return 0 and leave the string pointer
472 after the zeros. A value of 0 does not mean end of string. */
475 cpp_parse_escape (pfile, string_ptr, result_mask)
478 HOST_WIDE_INT result_mask;
480 register int c = *(*string_ptr)++;
489 if (CPP_OPTIONS (pfile)->pedantic)
490 cpp_pedwarn (pfile, "non-ANSI-standard escape sequence, `\\%c'", c);
495 return TARGET_NEWLINE;
517 register HOST_WIDE_INT i = c - '0';
518 register int count = 0;
521 c = *(*string_ptr)++;
522 if (c >= '0' && c <= '7')
523 i = (i << 3) + c - '0';
530 if (i != (i & result_mask))
533 cpp_pedwarn (pfile, "octal escape sequence out of range");
539 register unsigned HOST_WIDE_INT i = 0, overflow = 0;
540 register int digits_found = 0, digit;
543 c = *(*string_ptr)++;
544 if (c >= '0' && c <= '9')
546 else if (c >= 'a' && c <= 'f')
547 digit = c - 'a' + 10;
548 else if (c >= 'A' && c <= 'F')
549 digit = c - 'A' + 10;
555 overflow |= i ^ (i << 4 >> 4);
556 i = (i << 4) + digit;
560 cpp_error (pfile, "\\x used with no following hex digits");
561 if (overflow | (i != (i & result_mask)))
564 cpp_pedwarn (pfile, "hex escape sequence out of range");
574 integer_overflow (pfile)
577 if (CPP_PEDANTIC (pfile))
578 cpp_pedwarn (pfile, "integer overflow in preprocessor expression");
582 left_shift (pfile, a, unsignedp, b)
588 if (b >= HOST_BITS_PER_LONG)
590 if (! unsignedp && a != 0)
591 integer_overflow (pfile);
595 return (unsigned long) a << b;
600 integer_overflow (pfile);
606 right_shift (pfile, a, unsignedp, b)
607 cpp_reader *pfile ATTRIBUTE_UNUSED;
612 if (b >= HOST_BITS_PER_LONG)
613 return unsignedp ? 0 : a >> (HOST_BITS_PER_LONG - 1);
615 return (unsigned long) a >> b;
620 /* These priorities are all even, so we can handle associatively. */
621 #define PAREN_INNER_PRIO 0
623 #define COND_PRIO (COMMA_PRIO+2)
624 #define OROR_PRIO (COND_PRIO+2)
625 #define ANDAND_PRIO (OROR_PRIO+2)
626 #define OR_PRIO (ANDAND_PRIO+2)
627 #define XOR_PRIO (OR_PRIO+2)
628 #define AND_PRIO (XOR_PRIO+2)
629 #define EQUAL_PRIO (AND_PRIO+2)
630 #define LESS_PRIO (EQUAL_PRIO+2)
631 #define SHIFT_PRIO (LESS_PRIO+2)
632 #define PLUS_PRIO (SHIFT_PRIO+2)
633 #define MUL_PRIO (PLUS_PRIO+2)
634 #define UNARY_PRIO (MUL_PRIO+2)
635 #define PAREN_OUTER_PRIO (UNARY_PRIO+2)
637 #define COMPARE(OP) \
639 top->value = (unsigned1 || unsigned2) \
640 ? (unsigned long) v1 OP (unsigned long) v2 : (v1 OP v2)
642 /* Parse and evaluate a C expression, reading from PFILE.
643 Returns the value of the expression. */
646 cpp_parse_expr (pfile)
649 /* The implementation is an operator precedence parser,
650 i.e. a bottom-up parser, using a stack for not-yet-reduced tokens.
652 The stack base is 'stack', and the current stack pointer is 'top'.
653 There is a stack element for each operator (only),
654 and the most recently pushed operator is 'top->op'.
655 An operand (value) is stored in the 'value' field of the stack
656 element of the operator that precedes it.
657 In that case the 'flags' field has the HAVE_VALUE flag set. */
659 #define INIT_STACK_SIZE 20
660 struct operation init_stack[INIT_STACK_SIZE];
661 struct operation *stack = init_stack;
662 struct operation *limit = stack + INIT_STACK_SIZE;
663 register struct operation *top = stack;
665 int skip_evaluation = 0;
675 op = cpp_lex (pfile, skip_evaluation);
677 /* See if the token is an operand, in which case go to set_value.
678 If the token is an operator, figure out its left and right
679 priorities, and then goto maybe_reduce. */
686 top->value = op.value;
687 top->unsignedp = op.unsignedp;
690 lprio = 0; goto maybe_reduce;
692 /* Is this correct if unary ? FIXME */
693 flags = RIGHT_OPERAND_REQUIRED;
694 lprio = PLUS_PRIO; rprio = lprio + 1; goto maybe_reduce;
696 flags = RIGHT_OPERAND_REQUIRED;
697 rprio = UNARY_PRIO; lprio = rprio + 1; goto maybe_reduce;
698 case '*': case '/': case '%':
699 lprio = MUL_PRIO; goto binop;
700 case '<': case '>': case LEQ: case GEQ:
701 lprio = LESS_PRIO; goto binop;
702 case EQUAL: case NOTEQUAL:
703 lprio = EQUAL_PRIO; goto binop;
705 lprio = SHIFT_PRIO; goto binop;
706 case '&': lprio = AND_PRIO; goto binop;
707 case '^': lprio = XOR_PRIO; goto binop;
708 case '|': lprio = OR_PRIO; goto binop;
709 case ANDAND: lprio = ANDAND_PRIO; goto binop;
710 case OROR: lprio = OROR_PRIO; goto binop;
712 lprio = COMMA_PRIO; goto binop;
714 lprio = PAREN_OUTER_PRIO; rprio = PAREN_INNER_PRIO;
717 lprio = PAREN_INNER_PRIO; rprio = PAREN_OUTER_PRIO;
720 lprio = COND_PRIO; rprio = COND_PRIO;
723 lprio = COND_PRIO + 1; rprio = COND_PRIO;
726 flags = LEFT_OPERAND_REQUIRED|RIGHT_OPERAND_REQUIRED;
730 cpp_error (pfile, "invalid character in #if");
735 /* Push a value onto the stack. */
736 if (top->flags & HAVE_VALUE)
738 cpp_error (pfile, "syntax error in #if");
741 top->flags |= HAVE_VALUE;
745 /* Push an operator, and check if we can reduce now. */
746 while (top->rprio > lprio)
748 long v1 = top[-1].value, v2 = top[0].value;
749 int unsigned1 = top[-1].unsignedp, unsigned2 = top[0].unsignedp;
751 if ((top[1].flags & LEFT_OPERAND_REQUIRED)
752 && ! (top[0].flags & HAVE_VALUE))
754 cpp_error (pfile, "syntax error - missing left operand");
757 if ((top[1].flags & RIGHT_OPERAND_REQUIRED)
758 && ! (top[1].flags & HAVE_VALUE))
760 cpp_error (pfile, "syntax error - missing right operand");
763 /* top[0].value = (top[1].op)(v1, v2);*/
767 if (!(top->flags & HAVE_VALUE))
770 top->unsignedp = unsigned2;
771 top->flags |= HAVE_VALUE;
775 top->value = v1 + v2;
776 top->unsignedp = unsigned1 || unsigned2;
777 if (! top->unsignedp && ! skip_evaluation
778 && ! possible_sum_sign (v1, v2, top->value))
779 integer_overflow (pfile);
783 if (!(top->flags & HAVE_VALUE))
786 if (!skip_evaluation && (top->value & v2) < 0 && !unsigned2)
787 integer_overflow (pfile);
788 top->unsignedp = unsigned2;
789 top->flags |= HAVE_VALUE;
793 top->value = v1 - v2;
794 top->unsignedp = unsigned1 || unsigned2;
795 if (! top->unsignedp && ! skip_evaluation
796 && ! possible_sum_sign (top->value, v2, v1))
797 integer_overflow (pfile);
801 top->unsignedp = unsigned1 || unsigned2;
803 top->value = (unsigned long) v1 * v2;
804 else if (!skip_evaluation)
806 top->value = v1 * v2;
808 && (top->value / v1 != v2
809 || (top->value & v1 & v2) < 0))
810 integer_overflow (pfile);
818 cpp_error (pfile, "division by zero in #if");
821 top->unsignedp = unsigned1 || unsigned2;
823 top->value = (unsigned long) v1 / v2;
826 top->value = v1 / v2;
827 if ((top->value & v1 & v2) < 0)
828 integer_overflow (pfile);
836 cpp_error (pfile, "division by zero in #if");
839 top->unsignedp = unsigned1 || unsigned2;
841 top->value = (unsigned long) v1 % v2;
843 top->value = v1 % v2;
846 if (top->flags & HAVE_VALUE)
848 cpp_error (pfile, "syntax error");
853 top->flags |= HAVE_VALUE;
856 if (top->flags & HAVE_VALUE)
858 cpp_error (pfile, "syntax error");
862 top->unsignedp = unsigned2;
863 top->flags |= HAVE_VALUE;
865 case '<': COMPARE(<); break;
866 case '>': COMPARE(>); break;
867 case LEQ: COMPARE(<=); break;
868 case GEQ: COMPARE(>=); break;
870 top->value = (v1 == v2);
874 top->value = (v1 != v2);
880 top->unsignedp = unsigned1;
881 if (v2 < 0 && ! unsigned2)
882 top->value = right_shift (pfile, v1, unsigned1, -v2);
884 top->value = left_shift (pfile, v1, unsigned1, v2);
889 top->unsignedp = unsigned1;
890 if (v2 < 0 && ! unsigned2)
891 top->value = left_shift (pfile, v1, unsigned1, -v2);
893 top->value = right_shift (pfile, v1, unsigned1, v2);
895 #define LOGICAL(OP) \
896 top->value = v1 OP v2;\
897 top->unsignedp = unsigned1 || unsigned2;
898 case '&': LOGICAL(&); break;
899 case '^': LOGICAL(^); break;
900 case '|': LOGICAL(|); break;
902 top->value = v1 && v2; top->unsignedp = 0;
903 if (!v1) skip_evaluation--;
906 top->value = v1 || v2; top->unsignedp = 0;
907 if (v1) skip_evaluation--;
910 if (CPP_PEDANTIC (pfile))
911 cpp_pedwarn (pfile, "comma operator in operand of `#if'");
913 top->unsignedp = unsigned2;
916 cpp_error (pfile, "syntax error in #if");
919 if (top[0].op != '?')
922 "syntax error ':' without preceding '?'");
925 else if (! (top[1].flags & HAVE_VALUE)
926 || !(top[-1].flags & HAVE_VALUE)
927 || !(top[0].flags & HAVE_VALUE))
929 cpp_error (pfile, "bad syntax for ?: operator");
935 if (top->value) skip_evaluation--;
936 top->value = top->value ? v1 : v2;
937 top->unsignedp = unsigned1 || unsigned2;
941 if ((top[1].flags & HAVE_VALUE)
942 || ! (top[0].flags & HAVE_VALUE)
944 || (top[-1].flags & HAVE_VALUE))
946 cpp_error (pfile, "mismatched parentheses in #if");
953 top->unsignedp = unsigned1;
954 top->flags |= HAVE_VALUE;
959 top[1].op >= ' ' && top[1].op <= '~'
960 ? "unimplemented operator '%c'\n"
961 : "unimplemented operator '\\%03o'\n",
968 cpp_error (pfile, "internal error in #if expression");
969 if (stack != init_stack)
975 /* Check for and handle stack overflow. */
978 struct operation *new_stack;
979 int old_size = (char *) limit - (char *) stack;
980 int new_size = 2 * old_size;
981 if (stack != init_stack)
982 new_stack = (struct operation *) xrealloc (stack, new_size);
985 new_stack = (struct operation *) xmalloc (new_size);
986 bcopy ((char *) stack, (char *) new_stack, old_size);
989 top = (struct operation *) ((char *) new_stack + old_size);
990 limit = (struct operation *) ((char *) new_stack + new_size);
996 if ((op.op == OROR && top[-1].value)
997 || (op.op == ANDAND && !top[-1].value)
998 || (op.op == '?' && !top[-1].value))
1002 else if (op.op == ':')
1004 if (top[-2].value) /* Was condition true? */
1011 if (stack != init_stack)
1013 skip_rest_of_line (pfile);