OSDN Git Service

* cccp.c (do_pragma): Add cast to (char *).
[pf3gnuchains/gcc-fork.git] / gcc / c-lex.c
1 /* Lexical analyzer for C and Objective C.
2    Copyright (C) 1987, 88, 89, 92, 94-99, 2000 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23
24 #include "rtl.h"
25 #include "tree.h"
26 #include "input.h"
27 #include "output.h"
28 #include "c-lex.h"
29 #include "c-tree.h"
30 #include "flags.h"
31 #include "c-parse.h"
32 #include "c-pragma.h"
33 #include "toplev.h"
34 #include "intl.h"
35 #include "ggc.h"
36 #include "tm_p.h"
37
38 /* MULTIBYTE_CHARS support only works for native compilers.
39    ??? Ideally what we want is to model widechar support after
40    the current floating point support.  */
41 #ifdef CROSS_COMPILE
42 #undef MULTIBYTE_CHARS
43 #endif
44
45 #ifdef MULTIBYTE_CHARS
46 #include "mbchar.h"
47 #include <locale.h>
48 #endif /* MULTIBYTE_CHARS */
49 #ifndef GET_ENVIRONMENT
50 #define GET_ENVIRONMENT(ENV_VALUE,ENV_NAME) ((ENV_VALUE) = getenv (ENV_NAME))
51 #endif
52
53 #if USE_CPPLIB
54 #include "cpplib.h"
55 extern cpp_reader  parse_in;
56 extern cpp_options parse_options;
57 #else
58 /* Stream for reading from the input file.  */
59 FILE *finput;
60 #endif
61
62 extern void yyprint                     PARAMS ((FILE *, int, YYSTYPE));
63
64 /* The elements of `ridpointers' are identifier nodes
65    for the reserved type names and storage classes.
66    It is indexed by a RID_... value.  */
67 tree ridpointers[(int) RID_MAX];
68
69 /* Cause the `yydebug' variable to be defined.  */
70 #define YYDEBUG 1
71
72 #if USE_CPPLIB
73 extern unsigned char *yy_cur, *yy_lim;
74 extern enum cpp_token cpp_token;
75
76 extern int yy_get_token ();
77
78 #define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ())
79 #define UNGETC(c) ((c) == EOF ? 0 : yy_cur--)
80
81 #else /* ! USE_CPPLIB */
82
83 #define GETC() getch ()
84 #define UNGETC(c) put_back (c)
85
86 struct putback_buffer {
87   char *buffer;
88   int   buffer_size;
89   int   index;
90 };
91
92 static struct putback_buffer putback = {NULL, 0, -1};
93
94 static inline int getch PARAMS ((void));
95
96 static inline int
97 getch ()
98 {
99   if (putback.index != -1)
100     {
101       int ch = putback.buffer[putback.index];
102       --putback.index;
103       return ch;
104     }
105   return getc (finput);
106 }
107
108 static inline void put_back PARAMS ((int));
109
110 static inline void
111 put_back (ch)
112      int ch;
113 {
114   if (ch != EOF)
115     {
116       if (putback.index == putback.buffer_size - 1)
117         {
118           putback.buffer_size += 16;
119           putback.buffer = xrealloc (putback.buffer, putback.buffer_size);
120         }
121       putback.buffer[++putback.index] = ch;
122     }
123 }
124 #endif /* ! USE_CPPLIB */
125
126 int linemode;
127
128 /* the declaration found for the last IDENTIFIER token read in.
129    yylex must look this up to detect typedefs, which get token type TYPENAME,
130    so it is left around in case the identifier is not a typedef but is
131    used in a context which makes it a reference to a variable.  */
132 tree lastiddecl;
133
134 /* Nonzero enables objc features.  */
135
136 int doing_objc_thang;
137
138 extern int yydebug;
139
140 /* File used for outputting assembler code.  */
141 extern FILE *asm_out_file;
142
143 #undef WCHAR_TYPE_SIZE
144 #define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
145
146 /* Number of bytes in a wide character.  */
147 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
148
149 static int maxtoken;            /* Current nominal length of token buffer.  */
150 char *token_buffer;     /* Pointer to token buffer.
151                            Actual allocated length is maxtoken + 2.
152                            This is not static because objc-parse.y uses it.  */
153
154 static int indent_level;        /* Number of { minus number of }. */
155
156 /* Nonzero tells yylex to ignore \ in string constants.  */
157 static int ignore_escape_flag;
158
159 /* Nonzero if end-of-file has been seen on input.  */
160 static int end_of_file;
161
162 #ifdef HANDLE_GENERIC_PRAGMAS
163 static int handle_generic_pragma        PARAMS ((int));
164 #endif /* HANDLE_GENERIC_PRAGMAS */
165 static int whitespace_cr                PARAMS ((int));
166 static int skip_white_space             PARAMS ((int));
167 static char *extend_token_buffer        PARAMS ((const char *));
168 static int readescape                   PARAMS ((int *));
169 static void parse_float                 PARAMS ((PTR));
170 static void extend_token_buffer_to      PARAMS ((int));
171 static int read_line_number             PARAMS ((int *));
172 \f
173 /* Do not insert generated code into the source, instead, include it.
174    This allows us to build gcc automatically even for targets that
175    need to add or modify the reserved keyword lists.  */
176 #include "c-gperf.h"
177 \f
178 /* Return something to represent absolute declarators containing a *.
179    TARGET is the absolute declarator that the * contains.
180    TYPE_QUALS is a list of modifiers such as const or volatile
181    to apply to the pointer type, represented as identifiers.
182
183    We return an INDIRECT_REF whose "contents" are TARGET
184    and whose type is the modifier list.  */
185
186 tree
187 make_pointer_declarator (type_quals, target)
188      tree type_quals, target;
189 {
190   return build1 (INDIRECT_REF, type_quals, target);
191 }
192 \f
193 void
194 forget_protocol_qualifiers ()
195 {
196   int i, n = sizeof wordlist / sizeof (struct resword);
197
198   for (i = 0; i < n; i++)
199     if ((int) wordlist[i].rid >= (int) RID_IN
200         && (int) wordlist[i].rid <= (int) RID_ONEWAY)
201       wordlist[i].name = "";
202 }
203
204 void
205 remember_protocol_qualifiers ()
206 {
207   int i, n = sizeof wordlist / sizeof (struct resword);
208
209   for (i = 0; i < n; i++)
210     if (wordlist[i].rid == RID_IN)
211       wordlist[i].name = "in";
212     else if (wordlist[i].rid == RID_OUT)
213       wordlist[i].name = "out";
214     else if (wordlist[i].rid == RID_INOUT)
215       wordlist[i].name = "inout";
216     else if (wordlist[i].rid == RID_BYCOPY)
217       wordlist[i].name = "bycopy";
218     else if (wordlist[i].rid == RID_BYREF)
219       wordlist[i].name = "byref";
220     else if (wordlist[i].rid == RID_ONEWAY)
221       wordlist[i].name = "oneway";
222 }
223 \f
224 char *
225 init_parse (filename)
226      char *filename;
227 {
228 #if !USE_CPPLIB
229   /* Open input file.  */
230   if (filename == 0 || !strcmp (filename, "-"))
231     {
232       finput = stdin;
233       filename = "stdin";
234     }
235   else
236     finput = fopen (filename, "r");
237   if (finput == 0)
238     pfatal_with_name (filename);
239
240 #ifdef IO_BUFFER_SIZE
241   setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE);
242 #endif
243 #else /* !USE_CPPLIB */
244   parse_in.show_column = 1;
245   if (! cpp_start_read (&parse_in, filename))
246     abort ();
247
248   if (filename == 0 || !strcmp (filename, "-"))
249     filename = "stdin";
250
251   /* cpp_start_read always puts at least one line directive into the
252      token buffer.  We must arrange to read it out here. */
253   yy_cur = parse_in.token_buffer;
254   yy_lim = CPP_PWRITTEN (&parse_in);
255   cpp_token = CPP_DIRECTIVE;
256 #endif
257
258   init_lex ();
259   init_pragma ();
260
261   return filename;
262 }
263
264 void
265 finish_parse ()
266 {
267 #if USE_CPPLIB
268   cpp_finish (&parse_in);
269   errorcount += parse_in.errors;
270 #else
271   fclose (finput);
272 #endif
273 }
274
275 void
276 init_lex ()
277 {
278   /* Make identifier nodes long enough for the language-specific slots.  */
279   set_identifier_size (sizeof (struct lang_identifier));
280
281   /* Start it at 0, because check_newline is called at the very beginning
282      and will increment it to 1.  */
283   lineno = 0;
284
285 #ifdef MULTIBYTE_CHARS
286   /* Change to the native locale for multibyte conversions.  */
287   setlocale (LC_CTYPE, "");
288   GET_ENVIRONMENT (literal_codeset, "LANG");
289 #endif
290
291   maxtoken = 40;
292   token_buffer = (char *) xmalloc (maxtoken + 2);
293
294   ridpointers[(int) RID_INT] = get_identifier ("int");
295   ridpointers[(int) RID_CHAR] = get_identifier ("char");
296   ridpointers[(int) RID_VOID] = get_identifier ("void");
297   ridpointers[(int) RID_FLOAT] = get_identifier ("float");
298   ridpointers[(int) RID_DOUBLE] = get_identifier ("double");
299   ridpointers[(int) RID_SHORT] = get_identifier ("short");
300   ridpointers[(int) RID_LONG] = get_identifier ("long");
301   ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned");
302   ridpointers[(int) RID_SIGNED] = get_identifier ("signed");
303   ridpointers[(int) RID_INLINE] = get_identifier ("inline");
304   ridpointers[(int) RID_CONST] = get_identifier ("const");
305   ridpointers[(int) RID_RESTRICT] = get_identifier ("restrict");
306   ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
307   ridpointers[(int) RID_AUTO] = get_identifier ("auto");
308   ridpointers[(int) RID_STATIC] = get_identifier ("static");
309   ridpointers[(int) RID_EXTERN] = get_identifier ("extern");
310   ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef");
311   ridpointers[(int) RID_REGISTER] = get_identifier ("register");
312   ridpointers[(int) RID_ITERATOR] = get_identifier ("iterator");
313   ridpointers[(int) RID_COMPLEX] = get_identifier ("complex");
314   ridpointers[(int) RID_ID] = get_identifier ("id");
315   ridpointers[(int) RID_IN] = get_identifier ("in");
316   ridpointers[(int) RID_OUT] = get_identifier ("out");
317   ridpointers[(int) RID_INOUT] = get_identifier ("inout");
318   ridpointers[(int) RID_BYCOPY] = get_identifier ("bycopy");
319   ridpointers[(int) RID_BYREF] = get_identifier ("byref");
320   ridpointers[(int) RID_ONEWAY] = get_identifier ("oneway");
321   forget_protocol_qualifiers();
322
323   /* Some options inhibit certain reserved words.
324      Clear those words out of the hash table so they won't be recognized.  */
325 #define UNSET_RESERVED_WORD(STRING) \
326   do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
327        if (s) s->name = ""; } while (0)
328
329   if (! doing_objc_thang)
330     UNSET_RESERVED_WORD ("id");
331
332   if (flag_traditional)
333     {
334       UNSET_RESERVED_WORD ("const");
335       UNSET_RESERVED_WORD ("restrict");
336       UNSET_RESERVED_WORD ("volatile");
337       UNSET_RESERVED_WORD ("typeof");
338       UNSET_RESERVED_WORD ("signed");
339       UNSET_RESERVED_WORD ("inline");
340       UNSET_RESERVED_WORD ("iterator");
341       UNSET_RESERVED_WORD ("complex");
342     }
343   else if (!flag_isoc9x)
344     UNSET_RESERVED_WORD ("restrict");
345
346   if (flag_no_asm)
347     {
348       UNSET_RESERVED_WORD ("asm");
349       UNSET_RESERVED_WORD ("typeof");
350       UNSET_RESERVED_WORD ("inline");
351       UNSET_RESERVED_WORD ("iterator");
352       UNSET_RESERVED_WORD ("complex");
353     }
354 }
355
356 void
357 reinit_parse_for_function ()
358 {
359 }
360 \f
361 /* Function used when yydebug is set, to print a token in more detail.  */
362
363 void
364 yyprint (file, yychar, yylval)
365      FILE *file;
366      int yychar;
367      YYSTYPE yylval;
368 {
369   tree t;
370   switch (yychar)
371     {
372     case IDENTIFIER:
373     case TYPENAME:
374     case OBJECTNAME:
375       t = yylval.ttype;
376       if (IDENTIFIER_POINTER (t))
377         fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
378       break;
379
380     case CONSTANT:
381       t = yylval.ttype;
382       if (TREE_CODE (t) == INTEGER_CST)
383         fprintf (file,
384 #if HOST_BITS_PER_WIDE_INT == 64
385 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
386                  " 0x%x%016x",
387 #else
388 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
389                  " 0x%lx%016lx",
390 #else
391                  " 0x%llx%016llx",
392 #endif
393 #endif
394 #else
395 #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
396                  " 0x%lx%08lx",
397 #else
398                  " 0x%x%08x",
399 #endif
400 #endif
401                  TREE_INT_CST_HIGH (t), TREE_INT_CST_LOW (t));
402       break;
403     }
404 }
405 \f
406 /* Iff C is a carriage return, warn about it - if appropriate -
407    and return nonzero.  */
408 static int
409 whitespace_cr (c)
410      int c;
411 {
412   static int newline_warning = 0;
413
414   if (c == '\r')
415     {
416       /* ANSI C says the effects of a carriage return in a source file
417          are undefined.  */
418       if (pedantic && !newline_warning)
419         {
420           warning ("carriage return in source file");
421           warning ("(we only warn about the first carriage return)");
422           newline_warning = 1;
423         }
424       return 1;
425     }
426   return 0;
427 }
428
429 /* If C is not whitespace, return C.
430    Otherwise skip whitespace and return first nonwhite char read.  */
431
432 static int
433 skip_white_space (c)
434      register int c;
435 {
436   for (;;)
437     {
438       switch (c)
439         {
440           /* We don't recognize comments here, because
441              cpp output can include / and * consecutively as operators.
442              Also, there's no need, since cpp removes all comments.  */
443
444         case '\n':
445           if (linemode)
446             {
447               UNGETC (c);
448               return EOF;
449             }
450           c = check_newline ();
451           break;
452
453         case ' ':
454         case '\t':
455         case '\f':
456         case '\v':
457         case '\b':
458 #if USE_CPPLIB
459           /* While processing a # directive we don't get CPP_HSPACE
460              tokens, so we also need to handle whitespace the normal way.  */
461           if (cpp_token == CPP_HSPACE)
462             c = yy_get_token ();
463           else
464 #endif
465             c = GETC();
466           break;
467
468         case '\r':
469           whitespace_cr (c);
470           c = GETC();
471           break;
472
473         case '\\':
474           c = GETC();
475           if (c == '\n')
476             lineno++;
477           else
478             error ("stray '\\' in program");
479           c = GETC();
480           break;
481
482         default:
483           return (c);
484         }
485     }
486 }
487
488 /* Skips all of the white space at the current location in the input file.  */
489
490 void
491 position_after_white_space ()
492 {
493   register int c;
494
495   c = GETC();
496
497   UNGETC (skip_white_space (c));
498 }
499
500 /* Make the token buffer longer, preserving the data in it.
501    P should point to just beyond the last valid character in the old buffer.
502    The value we return is a pointer to the new buffer
503    at a place corresponding to P.  */
504
505 static void
506 extend_token_buffer_to (size)
507      int size;
508 {
509   do
510     maxtoken = maxtoken * 2 + 10;
511   while (maxtoken < size);
512   token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2);
513 }
514
515 static char *
516 extend_token_buffer (p)
517      const char *p;
518 {
519   int offset = p - token_buffer;
520   extend_token_buffer_to (offset);
521   return token_buffer + offset;
522 }
523 \f
524 #if defined HANDLE_PRAGMA
525 /* Local versions of these macros, that can be passed as function pointers.  */
526 static int
527 pragma_getc ()
528 {
529   return GETC ();
530 }
531
532 static void
533 pragma_ungetc (arg)
534      int arg;
535 {
536   UNGETC (arg);
537 }
538 #endif
539
540 static int
541 read_line_number (num)
542      int *num;
543 {
544   register int token = yylex ();
545
546   if (token == CONSTANT
547       && TREE_CODE (yylval.ttype) == INTEGER_CST)
548     {
549       *num = TREE_INT_CST_LOW (yylval.ttype);
550       return 1;
551     }
552   else
553     {
554       if (token != END_OF_LINE)
555         error ("invalid #-line");
556       return 0;
557     }
558 }
559   
560 /* At the beginning of a line, increment the line number
561    and process any #-directive on this line.
562    If the line is a #-directive, read the entire line and return a newline.
563    Otherwise, return the line's first non-whitespace character.
564
565    Note that in the case of USE_CPPLIB, we get the whole line as one
566    CPP_DIRECTIVE token.  */
567
568 int
569 check_newline ()
570 {
571   register int c;
572   register int token;
573   int saw_line;
574   enum { act_none, act_push, act_pop } action;
575   int old_lineno, action_number, l;
576
577  restart:
578   /* Read first nonwhite char on the line.  */
579
580 #ifdef USE_CPPLIB
581   c = GETC ();
582   /* In some cases where we're leaving an include file, we can get multiple
583      CPP_HSPACE tokens in a row, so we need to loop.  */
584   while (cpp_token == CPP_HSPACE)
585     c = yy_get_token ();
586 #else
587   do
588     c = GETC ();
589   while (c == ' ' || c == '\t');
590 #endif
591
592   lineno++;
593
594   if (c != '#')
595     {
596       /* Sequences of multiple newlines are very common; optimize them.  */
597       if (c == '\n')
598         goto restart;
599
600       /* If not #, return it so caller will use it.  */
601       return c;
602     }
603
604   /* Don't read beyond this line.  */
605   saw_line = 0;
606   linemode = 1;
607   
608 #if USE_CPPLIB
609   if (cpp_token == CPP_VSPACE)
610     {
611       /* Format is "<space> <line number> <filename> <newline>".
612          Only the line number is interesting, and even that
613          we can get more efficiently than scanning the line.  */
614       yy_cur = yy_lim - 1;
615       lineno = parse_in.lineno - 1;
616       goto skipline;
617     }
618 #endif
619
620   token = yylex ();
621
622   if (token == IDENTIFIER)
623     {
624       /* If a letter follows, then if the word here is `line', skip
625          it and ignore it; otherwise, ignore the line, with an error
626          if the word isn't `pragma'.  */
627
628       const char *name = IDENTIFIER_POINTER (yylval.ttype);
629
630       if (!strcmp (name, "pragma"))
631         {
632           token = yylex ();
633           if (token != IDENTIFIER
634               || TREE_CODE (yylval.ttype) != IDENTIFIER_NODE)
635             goto skipline;
636
637 #ifdef HANDLE_PRAGMA
638           /* We invoke HANDLE_PRAGMA before HANDLE_GENERIC_PRAGMAS
639              (if both are defined), in order to give the back
640              end a chance to override the interpretation of
641              SYSV style pragmas.  */
642           if (HANDLE_PRAGMA (pragma_getc, pragma_ungetc,
643                              IDENTIFIER_POINTER (yylval.ttype)))
644             goto skipline;
645 #endif /* HANDLE_PRAGMA */
646               
647 #ifdef HANDLE_GENERIC_PRAGMAS
648           if (handle_generic_pragma (token))
649             goto skipline;
650 #endif /* HANDLE_GENERIC_PRAGMAS */
651
652           /* Issue a warning message if we have been asked to do so.
653              Ignoring unknown pragmas in system header file unless
654              an explcit -Wunknown-pragmas has been given. */
655           if (warn_unknown_pragmas > 1
656               || (warn_unknown_pragmas && ! in_system_header))
657             warning ("ignoring pragma: %s", token_buffer);
658
659           goto skipline;
660         }
661       else if (!strcmp (name, "define"))
662         {
663           debug_define (lineno, GET_DIRECTIVE_LINE ());
664           goto skipline;
665         }
666       else if (!strcmp (name, "undef"))
667         {
668           debug_undef (lineno, GET_DIRECTIVE_LINE ());
669           goto skipline;
670         }
671       else if (!strcmp (name, "line"))
672         {
673           saw_line = 1;
674           token = yylex ();
675           goto linenum;
676         }
677       else if (!strcmp (name, "ident"))
678         {
679           /* #ident.  The pedantic warning is now in cccp.c.  */
680
681           /* Here we have just seen `#ident '.
682              A string constant should follow.  */
683
684           token = yylex ();
685           if (token == END_OF_LINE)
686             goto skipline;
687           if (token != STRING
688               || TREE_CODE (yylval.ttype) != STRING_CST)
689             {
690               error ("invalid #ident");
691               goto skipline;
692             }
693
694           if (! flag_no_ident)
695             {
696 #ifdef ASM_OUTPUT_IDENT
697               ASM_OUTPUT_IDENT (asm_out_file,
698                                 TREE_STRING_POINTER (yylval.ttype));
699 #endif
700             }
701
702           /* Skip the rest of this line.  */
703           goto skipline;
704         }
705
706       error ("undefined or invalid # directive `%s'", name);
707       goto skipline;
708     }
709
710   /* If the # is the only nonwhite char on the line,
711      just ignore it.  Check the new newline.  */
712   if (token == END_OF_LINE)
713     goto skipline;
714
715 linenum:
716   /* Here we have either `#line' or `# <nonletter>'.
717      In either case, it should be a line number; a digit should follow.  */
718
719   if (token != CONSTANT
720       || TREE_CODE (yylval.ttype) != INTEGER_CST)
721     {
722       error ("invalid #-line");
723       goto skipline;
724     }
725
726   /* subtract one, because it is the following line that
727      gets the specified number */
728
729   l = TREE_INT_CST_LOW (yylval.ttype) - 1;
730
731   /* More follows: it must be a string constant (filename).
732      It would be neat to use cpplib to quickly process the string, but
733      (1) we don't have a handy tokenization of the string, and
734      (2) I don't know how well that would work in the presense
735      of filenames that contain wide characters.  */
736
737   if (saw_line)
738     {
739       /* Don't treat \ as special if we are processing #line 1 "...".
740          If you want it to be treated specially, use # 1 "...".  */
741       ignore_escape_flag = 1;
742     }
743
744   /* Read the string constant.  */
745   token = yylex ();
746
747   ignore_escape_flag = 0;
748
749   if (token == END_OF_LINE)
750     {
751       /* No more: store the line number and check following line.  */
752       lineno = l;
753       goto skipline;
754     }
755
756   if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
757     {
758       error ("invalid #line");
759       goto skipline;
760     }
761
762   if (! ggc_p && !TREE_PERMANENT (yylval.ttype))
763     {
764       input_filename
765         = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
766       strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype));
767     }
768   else
769     input_filename = TREE_STRING_POINTER (yylval.ttype);
770
771   if (main_input_filename == 0)
772     main_input_filename = input_filename;
773
774   old_lineno = lineno;
775   action = act_none;
776   action_number = 0;
777   lineno = l;
778
779   /* Each change of file name
780      reinitializes whether we are now in a system header.  */
781   in_system_header = 0;
782
783   if (!read_line_number (&action_number))
784     {
785       /* Update the name in the top element of input_file_stack.  */
786       if (input_file_stack)
787         input_file_stack->name = input_filename;
788     }
789
790   /* `1' after file name means entering new file.
791      `2' after file name means just left a file.  */
792
793   if (action_number == 1)
794     {
795       action = act_push;
796       read_line_number (&action_number);
797     }
798   else if (action_number == 2)
799     {
800       action = act_pop;
801       read_line_number (&action_number);
802     }
803   if (action_number == 3)
804     {
805       /* `3' after file name means this is a system header file.  */
806       in_system_header = 1;
807       read_line_number (&action_number);
808     }
809
810   /* Do the actions implied by the preceding numbers.  */
811
812   if (action == act_push)
813     {
814       /* Pushing to a new file.  */
815       struct file_stack *p
816         = (struct file_stack *) xmalloc (sizeof (struct file_stack));
817       input_file_stack->line = old_lineno;
818       p->next = input_file_stack;
819       p->name = input_filename;
820       p->indent_level = indent_level;
821       input_file_stack = p;
822       input_file_stack_tick++;
823       debug_start_source_file (input_filename);
824     }
825   else if (action == act_pop)
826     {
827       /* Popping out of a file.  */
828       if (input_file_stack->next)
829         {
830           struct file_stack *p = input_file_stack;
831           if (indent_level != p->indent_level)
832             {
833               warning_with_file_and_line
834                 (p->name, old_lineno,
835                  "This file contains more `%c's than `%c's.",
836                  indent_level > p->indent_level ? '{' : '}',
837                  indent_level > p->indent_level ? '}' : '{');
838             }
839           input_file_stack = p->next;
840           free (p);
841           input_file_stack_tick++;
842           debug_end_source_file (input_file_stack->line);
843         }
844       else
845         error ("#-lines for entering and leaving files don't match");
846     }
847
848   /* Now that we've pushed or popped the input stack,
849      update the name in the top element.  */
850   if (input_file_stack)
851     input_file_stack->name = input_filename;
852
853   /* skip the rest of this line.  */
854  skipline:
855   linemode = 0;
856   end_of_file = 0;
857
858   do
859     c = GETC();
860   while (c != '\n' && c != EOF);
861   return c;
862 }
863 \f
864 #ifdef HANDLE_GENERIC_PRAGMAS
865
866 /* Handle a #pragma directive.
867    TOKEN is the token we read after `#pragma'.  Processes the entire input
868    line and return non-zero iff the pragma has been successfully parsed.  */
869
870 /* This function has to be in this file, in order to get at
871    the token types.  */
872
873 static int
874 handle_generic_pragma (token)
875      register int token;
876 {
877   for (;;)
878     {
879       switch (token)
880         {
881         case IDENTIFIER:
882         case TYPENAME:
883         case STRING:
884         case CONSTANT:
885           handle_pragma_token (token_buffer, yylval.ttype);
886           break;
887
888         case END_OF_LINE:
889           return handle_pragma_token (NULL_PTR, NULL_TREE);
890
891         default:
892           handle_pragma_token (token_buffer, NULL);
893         }
894
895       token = yylex ();
896     }
897 }
898
899 #endif /* HANDLE_GENERIC_PRAGMAS */
900 \f
901 #define ENDFILE -1  /* token that represents end-of-file */
902
903 /* Read an escape sequence, returning its equivalent as a character,
904    or store 1 in *ignore_ptr if it is backslash-newline.  */
905
906 static int
907 readescape (ignore_ptr)
908      int *ignore_ptr;
909 {
910   register int c = GETC();
911   register int code;
912   register unsigned count;
913   unsigned firstdig = 0;
914   int nonnull;
915
916   switch (c)
917     {
918     case 'x':
919       if (warn_traditional)
920         warning ("the meaning of `\\x' varies with -traditional");
921
922       if (flag_traditional)
923         return c;
924
925       code = 0;
926       count = 0;
927       nonnull = 0;
928       while (1)
929         {
930           c = GETC();
931           if (! ISXDIGIT (c))
932             {
933               UNGETC (c);
934               break;
935             }
936           code *= 16;
937           if (c >= 'a' && c <= 'f')
938             code += c - 'a' + 10;
939           if (c >= 'A' && c <= 'F')
940             code += c - 'A' + 10;
941           if (c >= '0' && c <= '9')
942             code += c - '0';
943           if (code != 0 || count != 0)
944             {
945               if (count == 0)
946                 firstdig = code;
947               count++;
948             }
949           nonnull = 1;
950         }
951       if (! nonnull)
952         error ("\\x used with no following hex digits");
953       else if (count == 0)
954         /* Digits are all 0's.  Ok.  */
955         ;
956       else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node)
957                || (count > 1
958                    && (((unsigned)1
959                         << (TYPE_PRECISION (integer_type_node)
960                             - (count - 1) * 4))
961                        <= firstdig)))
962         pedwarn ("hex escape out of range");
963       return code;
964
965     case '0':  case '1':  case '2':  case '3':  case '4':
966     case '5':  case '6':  case '7':
967       code = 0;
968       count = 0;
969       while ((c <= '7') && (c >= '0') && (count++ < 3))
970         {
971           code = (code * 8) + (c - '0');
972           c = GETC();
973         }
974       UNGETC (c);
975       return code;
976
977     case '\\': case '\'': case '"':
978       return c;
979
980     case '\n':
981       lineno++;
982       *ignore_ptr = 1;
983       return 0;
984
985     case 'n':
986       return TARGET_NEWLINE;
987
988     case 't':
989       return TARGET_TAB;
990
991     case 'r':
992       return TARGET_CR;
993
994     case 'f':
995       return TARGET_FF;
996
997     case 'b':
998       return TARGET_BS;
999
1000     case 'a':
1001       if (warn_traditional)
1002         warning ("the meaning of `\\a' varies with -traditional");
1003
1004       if (flag_traditional)
1005         return c;
1006       return TARGET_BELL;
1007
1008     case 'v':
1009 #if 0 /* Vertical tab is present in common usage compilers.  */
1010       if (flag_traditional)
1011         return c;
1012 #endif
1013       return TARGET_VT;
1014
1015     case 'e':
1016     case 'E':
1017       if (pedantic)
1018         pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
1019       return TARGET_ESC;
1020
1021     case '?':
1022       return c;
1023
1024       /* `\(', etc, are used at beginning of line to avoid confusing Emacs.  */
1025     case '(':
1026     case '{':
1027     case '[':
1028       /* `\%' is used to prevent SCCS from getting confused.  */
1029     case '%':
1030       if (pedantic)
1031         pedwarn ("unknown escape sequence `\\%c'", c);
1032       return c;
1033     }
1034   if (ISGRAPH (c))
1035     pedwarn ("unknown escape sequence `\\%c'", c);
1036   else
1037     pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c);
1038   return c;
1039 }
1040 \f
1041 void
1042 yyerror (msgid)
1043      const char *msgid;
1044 {
1045   const char *string = _(msgid);
1046
1047   /* We can't print string and character constants well
1048      because the token_buffer contains the result of processing escapes.  */
1049   if (end_of_file)
1050     error ("%s at end of input", string);
1051   else if (token_buffer[0] == 0)
1052     error ("%s at null character", string);
1053   else if (token_buffer[0] == '"')
1054     error ("%s before string constant", string);
1055   else if (token_buffer[0] == '\'')
1056     error ("%s before character constant", string);
1057   else if (!ISGRAPH(token_buffer[0]))
1058     error ("%s before character 0%o", string, (unsigned char) token_buffer[0]);
1059   else
1060     error ("%s before `%s'", string, token_buffer);
1061 }
1062
1063 #if 0
1064
1065 struct try_type
1066 {
1067   tree *node_var;
1068   char unsigned_flag;
1069   char long_flag;
1070   char long_long_flag;
1071 };
1072
1073 struct try_type type_sequence[] =
1074 {
1075   { &integer_type_node, 0, 0, 0},
1076   { &unsigned_type_node, 1, 0, 0},
1077   { &long_integer_type_node, 0, 1, 0},
1078   { &long_unsigned_type_node, 1, 1, 0},
1079   { &long_long_integer_type_node, 0, 1, 1},
1080   { &long_long_unsigned_type_node, 1, 1, 1}
1081 };
1082 #endif /* 0 */
1083 \f
1084 struct pf_args
1085 {
1086   /* Input */
1087   int base;
1088   char * p;
1089   /* I/O */
1090   int c;
1091   /* Output */
1092   int imag;
1093   tree type;
1094   int conversion_errno;
1095   REAL_VALUE_TYPE value;
1096 };
1097  
1098 static void
1099 parse_float (data)
1100   PTR data;
1101 {
1102   struct pf_args * args = (struct pf_args *) data;
1103   int fflag = 0, lflag = 0;
1104   /* Copy token_buffer now, while it has just the number
1105      and not the suffixes; once we add `f' or `i',
1106      REAL_VALUE_ATOF may not work any more.  */
1107   char *copy = (char *) alloca (args->p - token_buffer + 1);
1108   bcopy (token_buffer, copy, args->p - token_buffer + 1);
1109   args->imag = 0;
1110   args->conversion_errno = 0;
1111   args->type = double_type_node;
1112
1113   while (1)
1114     {
1115       int lose = 0;
1116
1117       /* Read the suffixes to choose a data type.  */
1118       switch (args->c)
1119         {
1120         case 'f': case 'F':
1121           if (fflag)
1122             error ("more than one `f' in numeric constant");
1123           fflag = 1;
1124           break;
1125
1126         case 'l': case 'L':
1127           if (lflag)
1128             error ("more than one `l' in numeric constant");
1129           lflag = 1;
1130           break;
1131
1132         case 'i': case 'I':
1133           if (args->imag)
1134             error ("more than one `i' or `j' in numeric constant");
1135           else if (pedantic)
1136             pedwarn ("ANSI C forbids imaginary numeric constants");
1137           args->imag = 1;
1138           break;
1139
1140         default:
1141           lose = 1;
1142         }
1143
1144       if (lose)
1145         break;
1146
1147       if (args->p >= token_buffer + maxtoken - 3)
1148         args->p = extend_token_buffer (args->p);
1149       *(args->p++) = args->c;
1150       *(args->p) = 0;
1151       args->c = GETC();
1152     }
1153
1154   /* The second argument, machine_mode, of REAL_VALUE_ATOF
1155      tells the desired precision of the binary result
1156      of decimal-to-binary conversion.  */
1157
1158   if (fflag)
1159     {
1160       if (lflag)
1161         error ("both `f' and `l' in floating constant");
1162
1163       args->type = float_type_node;
1164       errno = 0;
1165       if (args->base == 16)
1166         args->value = REAL_VALUE_HTOF (copy, TYPE_MODE (args->type));
1167       else
1168         args->value = REAL_VALUE_ATOF (copy, TYPE_MODE (args->type));
1169       args->conversion_errno = errno;
1170       /* A diagnostic is required here by some ANSI C testsuites.
1171          This is not pedwarn, because some people don't want
1172          an error for this.  */
1173       if (REAL_VALUE_ISINF (args->value) && pedantic)
1174         warning ("floating point number exceeds range of `float'");
1175     }
1176   else if (lflag)
1177     {
1178       args->type = long_double_type_node;
1179       errno = 0;
1180       if (args->base == 16)
1181         args->value = REAL_VALUE_HTOF (copy, TYPE_MODE (args->type));
1182       else
1183         args->value = REAL_VALUE_ATOF (copy, TYPE_MODE (args->type));
1184       args->conversion_errno = errno;
1185       if (REAL_VALUE_ISINF (args->value) && pedantic)
1186         warning ("floating point number exceeds range of `long double'");
1187     }
1188   else
1189     {
1190       errno = 0;
1191       if (args->base == 16)
1192         args->value = REAL_VALUE_HTOF (copy, TYPE_MODE (args->type));
1193       else
1194         args->value = REAL_VALUE_ATOF (copy, TYPE_MODE (args->type));
1195       args->conversion_errno = errno;
1196       if (REAL_VALUE_ISINF (args->value) && pedantic)
1197         warning ("floating point number exceeds range of `double'");
1198     }
1199 }
1200  
1201 /* Get the next character, staying within the current token if possible.
1202    If we're lexing a token, we don't want to look beyond the end of the
1203    token cpplib has prepared for us; otherwise, we end up reading in the
1204    next token, which screws up feed_input.  So just return a null
1205    character.  */
1206
1207 static inline int token_getch PARAMS ((void));
1208
1209 static inline int
1210 token_getch ()
1211 {
1212 #if USE_CPPLIB
1213   if (yy_cur == yy_lim)
1214     return '\0';
1215 #endif
1216   return GETC ();
1217 }
1218
1219 static inline void token_put_back PARAMS ((int));
1220
1221 static inline void
1222 token_put_back (ch)
1223      int ch;
1224 {
1225 #if USE_CPPLIB
1226   if (ch == '\0')
1227     return;
1228 #endif
1229   UNGETC (ch);
1230 }
1231
1232 /* Read a single token from the input stream, and assign it lexical
1233    semantics.  */
1234
1235 int
1236 yylex ()
1237 {
1238   register int c;
1239   register char *p;
1240   register int value;
1241   int wide_flag = 0;
1242   int objc_flag = 0;
1243
1244   c = GETC();
1245
1246   /* Effectively do c = skip_white_space (c)
1247      but do it faster in the usual cases.  */
1248   while (1)
1249     switch (c)
1250       {
1251       case ' ':
1252       case '\t':
1253       case '\f':
1254       case '\v':
1255       case '\b':
1256 #if USE_CPPLIB
1257         if (cpp_token == CPP_HSPACE)
1258           c = yy_get_token ();
1259         else
1260 #endif
1261           c = GETC();
1262         break;
1263
1264       case '\r':
1265         /* Call skip_white_space so we can warn if appropriate.  */
1266
1267       case '\n':
1268       case '/':
1269       case '\\':
1270         c = skip_white_space (c);
1271       default:
1272         goto found_nonwhite;
1273       }
1274  found_nonwhite:
1275
1276   token_buffer[0] = c;
1277   token_buffer[1] = 0;
1278
1279 /*  yylloc.first_line = lineno; */
1280
1281   switch (c)
1282     {
1283     case EOF:
1284       end_of_file = 1;
1285       token_buffer[0] = 0;
1286       if (linemode)
1287         value = END_OF_LINE;
1288       else
1289         value = ENDFILE;
1290       break;
1291
1292     case 'L':
1293 #if USE_CPPLIB
1294       if (cpp_token == CPP_NAME)
1295         goto letter;
1296 #endif
1297       /* Capital L may start a wide-string or wide-character constant.  */
1298       {
1299         register int c = token_getch();
1300         if (c == '\'')
1301           {
1302             wide_flag = 1;
1303             goto char_constant;
1304           }
1305         if (c == '"')
1306           {
1307             wide_flag = 1;
1308             goto string_constant;
1309           }
1310         token_put_back (c);
1311       }
1312       goto letter;
1313
1314     case '@':
1315       if (!doing_objc_thang)
1316         {
1317           value = c;
1318           break;
1319         }
1320       else
1321         {
1322           /* '@' may start a constant string object.  */
1323           register int c = token_getch ();
1324           if (c == '"')
1325             {
1326               objc_flag = 1;
1327               goto string_constant;
1328             }
1329           token_put_back (c);
1330           /* Fall through to treat '@' as the start of an identifier.  */
1331         }
1332
1333     case 'A':  case 'B':  case 'C':  case 'D':  case 'E':
1334     case 'F':  case 'G':  case 'H':  case 'I':  case 'J':
1335     case 'K':             case 'M':  case 'N':  case 'O':
1336     case 'P':  case 'Q':  case 'R':  case 'S':  case 'T':
1337     case 'U':  case 'V':  case 'W':  case 'X':  case 'Y':
1338     case 'Z':
1339     case 'a':  case 'b':  case 'c':  case 'd':  case 'e':
1340     case 'f':  case 'g':  case 'h':  case 'i':  case 'j':
1341     case 'k':  case 'l':  case 'm':  case 'n':  case 'o':
1342     case 'p':  case 'q':  case 'r':  case 's':  case 't':
1343     case 'u':  case 'v':  case 'w':  case 'x':  case 'y':
1344     case 'z':
1345     case '_':
1346     case '$':
1347     letter:
1348 #if USE_CPPLIB
1349       if (cpp_token == CPP_NAME)
1350         {
1351           /* Note that one character has already been read from
1352              yy_cur into token_buffer.  Also, cpplib complains about
1353              $ in identifiers, so we don't have to.  */
1354
1355           int len = yy_lim - yy_cur + 1;
1356           if (len >= maxtoken)
1357             extend_token_buffer_to (len + 1);
1358           memcpy (token_buffer + 1, yy_cur, len);
1359           p = token_buffer + len;
1360           yy_cur = yy_lim;
1361         }
1362       else
1363 #endif
1364         {
1365           p = token_buffer;
1366           while (ISALNUM (c) || c == '_' || c == '$' || c == '@')
1367             {
1368               /* Make sure this char really belongs in an identifier.  */
1369               if (c == '$')
1370                 {
1371                   if (! dollars_in_ident)
1372                     error ("`$' in identifier");
1373                   else if (pedantic)
1374                     pedwarn ("`$' in identifier");
1375                 }
1376
1377               if (p >= token_buffer + maxtoken)
1378                 p = extend_token_buffer (p);
1379
1380               *p++ = c;
1381               c = token_getch();
1382             }
1383
1384           *p = 0;
1385           token_put_back (c);
1386         }
1387
1388       value = IDENTIFIER;
1389       yylval.itype = 0;
1390
1391       /* Try to recognize a keyword.  Uses minimum-perfect hash function */
1392
1393       {
1394         register struct resword *ptr;
1395
1396         if ((ptr = is_reserved_word (token_buffer, p - token_buffer)))
1397           {
1398             if (ptr->rid)
1399               yylval.ttype = ridpointers[(int) ptr->rid];
1400             value = (int) ptr->token;
1401
1402             /* Only return OBJECTNAME if it is a typedef.  */
1403             if (doing_objc_thang && value == OBJECTNAME)
1404               {
1405                 lastiddecl = lookup_name(yylval.ttype);
1406
1407                 if (lastiddecl == NULL_TREE
1408                     || TREE_CODE (lastiddecl) != TYPE_DECL)
1409                   value = IDENTIFIER;
1410               }
1411
1412             /* Even if we decided to recognize asm, still perhaps warn.  */
1413             if (pedantic
1414                 && (value == ASM_KEYWORD || value == TYPEOF
1415                     || ptr->rid == RID_INLINE)
1416                 && token_buffer[0] != '_')
1417               pedwarn ("ANSI does not permit the keyword `%s'",
1418                        token_buffer);
1419           }
1420       }
1421
1422       /* If we did not find a keyword, look for an identifier
1423          (or a typename).  */
1424
1425       if (value == IDENTIFIER)
1426         {
1427           if (token_buffer[0] == '@')
1428             error("invalid identifier `%s'", token_buffer);
1429
1430           yylval.ttype = get_identifier (token_buffer);
1431           lastiddecl = lookup_name (yylval.ttype);
1432
1433           if (lastiddecl != 0 && TREE_CODE (lastiddecl) == TYPE_DECL)
1434             value = TYPENAME;
1435           /* A user-invisible read-only initialized variable
1436              should be replaced by its value.
1437              We handle only strings since that's the only case used in C.  */
1438           else if (lastiddecl != 0 && TREE_CODE (lastiddecl) == VAR_DECL
1439                    && DECL_IGNORED_P (lastiddecl)
1440                    && TREE_READONLY (lastiddecl)
1441                    && DECL_INITIAL (lastiddecl) != 0
1442                    && TREE_CODE (DECL_INITIAL (lastiddecl)) == STRING_CST)
1443             {
1444               tree stringval = DECL_INITIAL (lastiddecl);
1445
1446               /* Copy the string value so that we won't clobber anything
1447                  if we put something in the TREE_CHAIN of this one.  */
1448               yylval.ttype = build_string (TREE_STRING_LENGTH (stringval),
1449                                            TREE_STRING_POINTER (stringval));
1450               value = STRING;
1451             }
1452           else if (doing_objc_thang)
1453             {
1454               tree objc_interface_decl = is_class_name (yylval.ttype);
1455
1456               if (objc_interface_decl)
1457                 {
1458                   value = CLASSNAME;
1459                   yylval.ttype = objc_interface_decl;
1460                 }
1461             }
1462         }
1463
1464       break;
1465
1466     case '.':
1467 #if USE_CPPLIB
1468       if (yy_cur < yy_lim)
1469 #endif
1470         {
1471           /* It's hard to preserve tokenization on '.' because
1472              it could be a symbol by itself, or it could be the
1473              start of a floating point number and cpp won't tell us.  */
1474           register int c1 = token_getch ();
1475           token_buffer[1] = c1;
1476           if (c1 == '.')
1477             {
1478               c1 = token_getch ();
1479               if (c1 == '.')
1480                 {
1481                   token_buffer[2] = c1;
1482                   token_buffer[3] = 0;
1483                   value = ELLIPSIS;
1484                   goto done;
1485                 }
1486               error ("parse error at `..'");
1487             }
1488           if (ISDIGIT (c1))
1489             {
1490               token_put_back (c1);
1491               goto number;
1492             }
1493           token_put_back (c1);
1494         }
1495       value = '.';
1496       token_buffer[1] = 0;
1497       break;
1498
1499     case '0':  case '1':
1500       /* Optimize for most frequent case.  */
1501       {
1502         register int cond;
1503
1504 #if USE_CPPLIB
1505         cond = (yy_cur == yy_lim);
1506 #else
1507         register int c1 = token_getch ();
1508         token_put_back (c1);
1509         cond = (! ISALNUM (c1) && c1 != '.');
1510 #endif
1511         if (cond)
1512           {
1513             yylval.ttype = (c == '0') ? integer_zero_node : integer_one_node;
1514             value = CONSTANT;
1515             break;
1516           }
1517         /*FALLTHRU*/
1518       }
1519     case '2':  case '3':  case '4':
1520     case '5':  case '6':  case '7':  case '8':  case '9':
1521     number:
1522       {
1523         int base = 10;
1524         int count = 0;
1525         int largest_digit = 0;
1526         int numdigits = 0;
1527         int overflow = 0;
1528
1529         /* We actually store only HOST_BITS_PER_CHAR bits in each part.
1530            The code below which fills the parts array assumes that a host
1531            int is at least twice as wide as a host char, and that 
1532            HOST_BITS_PER_WIDE_INT is an even multiple of HOST_BITS_PER_CHAR.
1533            Two HOST_WIDE_INTs is the largest int literal we can store.
1534            In order to detect overflow below, the number of parts (TOTAL_PARTS)
1535            must be exactly the number of parts needed to hold the bits
1536            of two HOST_WIDE_INTs. */
1537 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2)
1538         unsigned int parts[TOTAL_PARTS];
1539
1540         enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS, AFTER_EXPON}
1541           floatflag = NOT_FLOAT;
1542
1543         for (count = 0; count < TOTAL_PARTS; count++)
1544           parts[count] = 0;
1545
1546         p = token_buffer;
1547         *p++ = c;
1548
1549         if (c == '0')
1550           {
1551             *p++ = (c = token_getch());
1552             if ((c == 'x') || (c == 'X'))
1553               {
1554                 base = 16;
1555                 *p++ = (c = token_getch());
1556               }
1557             /* Leading 0 forces octal unless the 0 is the only digit.  */
1558             else if (c >= '0' && c <= '9')
1559               {
1560                 base = 8;
1561                 numdigits++;
1562               }
1563             else
1564               numdigits++;
1565           }
1566
1567         /* Read all the digits-and-decimal-points.  */
1568
1569         while (c == '.'
1570                || (ISALNUM (c) && c != 'l' && c != 'L'
1571                    && c != 'u' && c != 'U'
1572                    && c != 'i' && c != 'I' && c != 'j' && c != 'J'
1573                    && (floatflag == NOT_FLOAT
1574                        || ((base != 16) && (c != 'f') && (c != 'F'))
1575                        || base == 16)))   
1576           {
1577             if (c == '.')
1578               {
1579                 if (base == 16 && pedantic)
1580                   pedwarn ("floating constant may not be in radix 16");
1581                 if (floatflag == TOO_MANY_POINTS)
1582                   /* We have already emitted an error.  Don't need another.  */
1583                   ;
1584                 else if (floatflag == AFTER_POINT || floatflag == AFTER_EXPON)
1585                   {
1586                     error ("malformed floating constant");
1587                     floatflag = TOO_MANY_POINTS;
1588                     /* Avoid another error from atof by forcing all characters
1589                        from here on to be ignored.  */
1590                     p[-1] = '\0';
1591                   }
1592                 else
1593                   floatflag = AFTER_POINT;
1594
1595                 if (base == 8)
1596                   base = 10;
1597                 *p++ = c = token_getch();
1598                 /* Accept '.' as the start of a floating-point number
1599                    only when it is followed by a digit.  */
1600                 if (p == token_buffer + 2 && !ISDIGIT (c))
1601                   abort ();
1602               }
1603             else
1604               {
1605                 /* It is not a decimal point.
1606                    It should be a digit (perhaps a hex digit).  */
1607
1608                 if (ISDIGIT (c))
1609                   {
1610                     c = c - '0';
1611                   }
1612                 else if (base <= 10)
1613                   {
1614                     if (c == 'e' || c == 'E')
1615                       {
1616                         base = 10;
1617                         floatflag = AFTER_EXPON;
1618                         break;   /* start of exponent */
1619                       }
1620                     error ("nondigits in number and not hexadecimal");
1621                     c = 0;
1622                   }
1623                 else if (base == 16 && (c == 'p' || c == 'P'))
1624                   {
1625                     floatflag = AFTER_EXPON;
1626                     break;   /* start of exponent */
1627                   }
1628                 else if (c >= 'a')
1629                   {
1630                     c = c - 'a' + 10;
1631                   }
1632                 else
1633                   {
1634                     c = c - 'A' + 10;
1635                   }
1636                 if (c >= largest_digit)
1637                   largest_digit = c;
1638                 numdigits++;
1639
1640                 for (count = 0; count < TOTAL_PARTS; count++)
1641                   {
1642                     parts[count] *= base;
1643                     if (count)
1644                       {
1645                         parts[count]
1646                           += (parts[count-1] >> HOST_BITS_PER_CHAR);
1647                         parts[count-1]
1648                           &= (1 << HOST_BITS_PER_CHAR) - 1;
1649                       }
1650                     else
1651                       parts[0] += c;
1652                   }
1653
1654                 /* If the highest-order part overflows (gets larger than
1655                    a host char will hold) then the whole number has 
1656                    overflowed.  Record this and truncate the highest-order
1657                    part. */
1658                 if (parts[TOTAL_PARTS - 1] >> HOST_BITS_PER_CHAR)
1659                   {
1660                     overflow = 1;
1661                     parts[TOTAL_PARTS - 1] &= (1 << HOST_BITS_PER_CHAR) - 1;
1662                   }
1663
1664                 if (p >= token_buffer + maxtoken - 3)
1665                   p = extend_token_buffer (p);
1666                 *p++ = (c = token_getch());
1667               }
1668           }
1669
1670         /* This can happen on input like `int i = 0x;' */
1671         if (numdigits == 0)
1672           error ("numeric constant with no digits");
1673
1674         if (largest_digit >= base)
1675           error ("numeric constant contains digits beyond the radix");
1676
1677         /* Remove terminating char from the token buffer and delimit the
1678            string.  */
1679         *--p = 0;
1680
1681         if (floatflag != NOT_FLOAT)
1682           {
1683             tree type;
1684             int imag, conversion_errno;
1685             REAL_VALUE_TYPE value;
1686             struct pf_args args;
1687
1688             /* Read explicit exponent if any, and put it in tokenbuf.  */
1689
1690             if ((base == 10 && ((c == 'e') || (c == 'E')))
1691                 || (base == 16 && (c == 'p' || c == 'P')))
1692               {
1693                 if (p >= token_buffer + maxtoken - 3)
1694                   p = extend_token_buffer (p);
1695                 *p++ = c;
1696                 c = token_getch();
1697                 if ((c == '+') || (c == '-'))
1698                   {
1699                     *p++ = c;
1700                     c = token_getch();
1701                   }
1702                 /* Exponent is decimal, even if string is a hex float.  */
1703                 if (! ISDIGIT (c))
1704                   error ("floating constant exponent has no digits");
1705                 while (ISDIGIT (c))
1706                   {
1707                     if (p >= token_buffer + maxtoken - 3)
1708                       p = extend_token_buffer (p);
1709                     *p++ = c;
1710                     c = token_getch ();
1711                   }
1712               }
1713             if (base == 16 && floatflag != AFTER_EXPON)
1714               error ("hexadecimal floating constant has no exponent");
1715
1716             *p = 0;
1717
1718             /* Setup input for parse_float() */
1719             args.base = base;
1720             args.p = p;
1721             args.c = c;
1722
1723             /* Convert string to a double, checking for overflow.  */
1724             if (do_float_handler (parse_float, (PTR) &args))
1725               {
1726                 /* Receive output from parse_float() */
1727                 value = args.value;
1728               }
1729             else
1730               {
1731                 /* We got an exception from parse_float() */
1732                 error ("floating constant out of range");
1733                 value = dconst0;
1734               }
1735
1736             /* Receive output from parse_float() */
1737             c = args.c;
1738             imag = args.imag;
1739             type = args.type;
1740             conversion_errno = args.conversion_errno;
1741             
1742 #ifdef ERANGE
1743             /* ERANGE is also reported for underflow,
1744                so test the value to distinguish overflow from that.  */
1745             if (conversion_errno == ERANGE && !flag_traditional && pedantic
1746                 && (REAL_VALUES_LESS (dconst1, value)
1747                     || REAL_VALUES_LESS (value, dconstm1)))
1748               warning ("floating point number exceeds range of `double'");
1749 #endif
1750
1751             /* If the result is not a number, assume it must have been
1752                due to some error message above, so silently convert
1753                it to a zero.  */
1754             if (REAL_VALUE_ISNAN (value))
1755               value = dconst0;
1756
1757             /* Create a node with determined type and value.  */
1758             if (imag)
1759               yylval.ttype = build_complex (NULL_TREE,
1760                                             convert (type, integer_zero_node),
1761                                             build_real (type, value));
1762             else
1763               yylval.ttype = build_real (type, value);
1764           }
1765         else
1766           {
1767             tree traditional_type, ansi_type, type;
1768             HOST_WIDE_INT high, low;
1769             int spec_unsigned = 0;
1770             int spec_long = 0;
1771             int spec_long_long = 0;
1772             int spec_imag = 0;
1773             int warn = 0, i;
1774
1775             traditional_type = ansi_type = type = NULL_TREE;
1776             while (1)
1777               {
1778                 if (c == 'u' || c == 'U')
1779                   {
1780                     if (spec_unsigned)
1781                       error ("two `u's in integer constant");
1782                     spec_unsigned = 1;
1783                   }
1784                 else if (c == 'l' || c == 'L')
1785                   {
1786                     if (spec_long)
1787                       {
1788                         if (spec_long_long)
1789                           error ("three `l's in integer constant");
1790                         else if (pedantic && ! in_system_header && warn_long_long)
1791                           pedwarn ("ANSI C forbids long long integer constants");
1792                         spec_long_long = 1;
1793                       }
1794                     spec_long = 1;
1795                   }
1796                 else if (c == 'i' || c == 'j' || c == 'I' || c == 'J')
1797                   {
1798                     if (spec_imag)
1799                       error ("more than one `i' or `j' in numeric constant");
1800                     else if (pedantic)
1801                       pedwarn ("ANSI C forbids imaginary numeric constants");
1802                     spec_imag = 1;
1803                   }
1804                 else
1805                   break;
1806                 if (p >= token_buffer + maxtoken - 3)
1807                   p = extend_token_buffer (p);
1808                 *p++ = c;
1809                 c = token_getch();
1810               }
1811
1812             /* If the literal overflowed, pedwarn about it now. */
1813             if (overflow)
1814               {
1815                 warn = 1;
1816                 pedwarn ("integer constant is too large for this configuration of the compiler - truncated to %d bits", HOST_BITS_PER_WIDE_INT * 2);
1817               }
1818
1819             /* This is simplified by the fact that our constant
1820                is always positive.  */
1821
1822             high = low = 0;
1823
1824             for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
1825               {
1826                 high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
1827                                                     / HOST_BITS_PER_CHAR)]
1828                          << (i * HOST_BITS_PER_CHAR));
1829                 low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
1830               }
1831
1832             yylval.ttype = build_int_2 (low, high);
1833             TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node;
1834
1835             /* If warn_traditional, calculate both the ANSI type and the
1836                traditional type, then see if they disagree.
1837                Otherwise, calculate only the type for the dialect in use.  */
1838             if (warn_traditional || flag_traditional)
1839               {
1840                 /* Calculate the traditional type.  */
1841                 /* Traditionally, any constant is signed;
1842                    but if unsigned is specified explicitly, obey that.
1843                    Use the smallest size with the right number of bits,
1844                    except for one special case with decimal constants.  */
1845                 if (! spec_long && base != 10
1846                     && int_fits_type_p (yylval.ttype, unsigned_type_node))
1847                   traditional_type = (spec_unsigned ? unsigned_type_node
1848                                       : integer_type_node);
1849                 /* A decimal constant must be long
1850                    if it does not fit in type int.
1851                    I think this is independent of whether
1852                    the constant is signed.  */
1853                 else if (! spec_long && base == 10
1854                          && int_fits_type_p (yylval.ttype, integer_type_node))
1855                   traditional_type = (spec_unsigned ? unsigned_type_node
1856                                       : integer_type_node);
1857                 else if (! spec_long_long)
1858                   traditional_type = (spec_unsigned ? long_unsigned_type_node
1859                                       : long_integer_type_node);
1860                 else if (int_fits_type_p (yylval.ttype,
1861                                           spec_unsigned 
1862                                           ? long_long_unsigned_type_node
1863                                           : long_long_integer_type_node)) 
1864                   traditional_type = (spec_unsigned
1865                                       ? long_long_unsigned_type_node
1866                                       : long_long_integer_type_node);
1867                 else
1868                   traditional_type = (spec_unsigned
1869                                       ? widest_unsigned_literal_type_node
1870                                       : widest_integer_literal_type_node);
1871               }
1872             if (warn_traditional || ! flag_traditional)
1873               {
1874                 /* Calculate the ANSI type.  */
1875                 if (! spec_long && ! spec_unsigned
1876                     && int_fits_type_p (yylval.ttype, integer_type_node))
1877                   ansi_type = integer_type_node;
1878                 else if (! spec_long && (base != 10 || spec_unsigned)
1879                          && int_fits_type_p (yylval.ttype, unsigned_type_node))
1880                   ansi_type = unsigned_type_node;
1881                 else if (! spec_unsigned && !spec_long_long
1882                          && int_fits_type_p (yylval.ttype, long_integer_type_node))
1883                   ansi_type = long_integer_type_node;
1884                 else if (! spec_long_long
1885                          && int_fits_type_p (yylval.ttype,
1886                                              long_unsigned_type_node))
1887                   ansi_type = long_unsigned_type_node;
1888                 else if (! spec_unsigned
1889                          && int_fits_type_p (yylval.ttype,
1890                                              long_long_integer_type_node))
1891                   ansi_type = long_long_integer_type_node;
1892                 else if (int_fits_type_p (yylval.ttype,
1893                                           long_long_unsigned_type_node))
1894                   ansi_type = long_long_unsigned_type_node;
1895                 else if (! spec_unsigned
1896                          && int_fits_type_p (yylval.ttype,
1897                                              widest_integer_literal_type_node))
1898                   ansi_type = widest_integer_literal_type_node;
1899                 else
1900                   ansi_type = widest_unsigned_literal_type_node;
1901               }
1902
1903             type = flag_traditional ? traditional_type : ansi_type;
1904
1905             /* We assume that constants specified in a non-decimal
1906                base are bit patterns, and that the programmer really
1907                meant what they wrote.  */
1908             if (warn_traditional && base == 10
1909                 && traditional_type != ansi_type)
1910               {
1911                 if (TYPE_PRECISION (traditional_type)
1912                     != TYPE_PRECISION (ansi_type))
1913                   warning ("width of integer constant changes with -traditional");
1914                 else if (TREE_UNSIGNED (traditional_type)
1915                          != TREE_UNSIGNED (ansi_type))
1916                   warning ("integer constant is unsigned in ANSI C, signed with -traditional");
1917                 else
1918                   warning ("width of integer constant may change on other systems with -traditional");
1919               }
1920
1921             if (pedantic && !flag_traditional && !spec_long_long && !warn
1922                 && (TYPE_PRECISION (long_integer_type_node)
1923                     < TYPE_PRECISION (type)))
1924               {
1925                 warn = 1;
1926                 pedwarn ("integer constant larger than the maximum value of an unsigned long int");
1927               }
1928
1929             if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
1930               warning ("decimal constant is so large that it is unsigned");
1931
1932             if (spec_imag)
1933               {
1934                 if (TYPE_PRECISION (type)
1935                     <= TYPE_PRECISION (integer_type_node))
1936                   yylval.ttype
1937                     = build_complex (NULL_TREE, integer_zero_node,
1938                                      convert (integer_type_node,
1939                                               yylval.ttype));
1940                 else
1941                   error ("complex integer constant is too wide for `complex int'");
1942               }
1943             else if (flag_traditional && !int_fits_type_p (yylval.ttype, type))
1944               /* The traditional constant 0x80000000 is signed
1945                  but doesn't fit in the range of int.
1946                  This will change it to -0x80000000, which does fit.  */
1947               {
1948                 TREE_TYPE (yylval.ttype) = unsigned_type (type);
1949                 yylval.ttype = convert (type, yylval.ttype);
1950                 TREE_OVERFLOW (yylval.ttype)
1951                   = TREE_CONSTANT_OVERFLOW (yylval.ttype) = 0;
1952               }
1953             else
1954               TREE_TYPE (yylval.ttype) = type;
1955
1956
1957             /* If it's still an integer (not a complex), and it doesn't
1958                fit in the type we choose for it, then pedwarn. */
1959
1960             if (! warn
1961                 && TREE_CODE (TREE_TYPE (yylval.ttype)) == INTEGER_TYPE
1962                 && ! int_fits_type_p (yylval.ttype, TREE_TYPE (yylval.ttype)))
1963               pedwarn ("integer constant is larger than the maximum value for its type");
1964           }
1965
1966         token_put_back (c);
1967         *p = 0;
1968
1969         if (ISALNUM (c) || c == '.' || c == '_' || c == '$'
1970             || (!flag_traditional && (c == '-' || c == '+')
1971                 && (p[-1] == 'e' || p[-1] == 'E')))
1972           error ("missing white space after number `%s'", token_buffer);
1973
1974         value = CONSTANT; break;
1975       }
1976
1977     case '\'':
1978     char_constant:
1979       {
1980         register int result = 0;
1981         register int num_chars = 0;
1982         int chars_seen = 0;
1983         unsigned width = TYPE_PRECISION (char_type_node);
1984         int max_chars;
1985 #ifdef MULTIBYTE_CHARS
1986         int longest_char = local_mb_cur_max ();
1987         (void) local_mbtowc (NULL_PTR, NULL_PTR, 0);
1988 #endif
1989
1990         max_chars = TYPE_PRECISION (integer_type_node) / width;
1991         if (wide_flag)
1992           width = WCHAR_TYPE_SIZE;
1993
1994         while (1)
1995           {
1996           tryagain:
1997             c = token_getch();
1998
1999             if (c == '\'' || c == EOF)
2000               break;
2001
2002             ++chars_seen;
2003             if (c == '\\')
2004               {
2005                 int ignore = 0;
2006                 c = readescape (&ignore);
2007                 if (ignore)
2008                   goto tryagain;
2009                 if (width < HOST_BITS_PER_INT
2010                     && (unsigned) c >= ((unsigned)1 << width))
2011                   pedwarn ("escape sequence out of range for character");
2012 #ifdef MAP_CHARACTER
2013                 if (ISPRINT (c))
2014                   c = MAP_CHARACTER (c);
2015 #endif
2016               }
2017             else if (c == '\n')
2018               {
2019                 if (pedantic)
2020                   pedwarn ("ANSI C forbids newline in character constant");
2021                 lineno++;
2022               }
2023             else
2024               {
2025 #ifdef MULTIBYTE_CHARS
2026                 wchar_t wc;
2027                 int i;
2028                 int char_len = -1;
2029                 for (i = 1; i <= longest_char; ++i)
2030                   {
2031                     if (i > maxtoken - 4)
2032                       extend_token_buffer (token_buffer);
2033
2034                     token_buffer[i] = c;
2035                     char_len = local_mbtowc (& wc,
2036                                              token_buffer + 1,
2037                                              i);
2038                     if (char_len != -1)
2039                       break;
2040                     c = token_getch ();
2041                   }
2042                 if (char_len > 1)
2043                   {
2044                     /* mbtowc sometimes needs an extra char before accepting */
2045                     if (char_len < i)
2046                       token_put_back (c);
2047                     if (! wide_flag)
2048                       {
2049                         /* Merge character into result; ignore excess chars.  */
2050                         for (i = 1; i <= char_len; ++i)
2051                           {
2052                             if (i > max_chars)
2053                               break;
2054                             if (width < HOST_BITS_PER_INT)
2055                               result = (result << width)
2056                                 | (token_buffer[i]
2057                                    & ((1 << width) - 1));
2058                             else
2059                               result = token_buffer[i];
2060                           }
2061                         num_chars += char_len;
2062                         goto tryagain;
2063                       }
2064                     c = wc;
2065                   }
2066                 else
2067                   {
2068                     if (char_len == -1)
2069                       {
2070                         warning ("Ignoring invalid multibyte character");
2071                         /* Replace all but the first byte.  */
2072                         for (--i; i > 1; --i)
2073                           token_put_back (token_buffer[i]);
2074                         wc = token_buffer[1];
2075                       }
2076 #ifdef MAP_CHARACTER
2077                       c = MAP_CHARACTER (wc);
2078 #else
2079                       c = wc;
2080 #endif
2081                   }
2082 #else /* ! MULTIBYTE_CHARS */
2083 #ifdef MAP_CHARACTER
2084                 c = MAP_CHARACTER (c);
2085 #endif
2086 #endif /* ! MULTIBYTE_CHARS */
2087               }
2088
2089             if (wide_flag)
2090               {
2091                 if (chars_seen == 1) /* only keep the first one */
2092                   result = c;
2093                 goto tryagain;
2094               }
2095
2096             /* Merge character into result; ignore excess chars.  */
2097             num_chars += (width / TYPE_PRECISION (char_type_node));
2098             if (num_chars < max_chars + 1)
2099               {
2100                 if (width < HOST_BITS_PER_INT)
2101                   result = (result << width) | (c & ((1 << width) - 1));
2102                 else
2103                   result = c;
2104               }
2105           }
2106
2107         if (c != '\'')
2108           error ("malformed character constant");
2109         else if (chars_seen == 0)
2110           error ("empty character constant");
2111         else if (num_chars > max_chars)
2112           {
2113             num_chars = max_chars;
2114             error ("character constant too long");
2115           }
2116         else if (chars_seen != 1 && ! flag_traditional && warn_multichar)
2117           warning ("multi-character character constant");
2118
2119         /* If char type is signed, sign-extend the constant.  */
2120         if (! wide_flag)
2121           {
2122             int num_bits = num_chars * width;
2123             if (num_bits == 0)
2124               /* We already got an error; avoid invalid shift.  */
2125               yylval.ttype = build_int_2 (0, 0);
2126             else if (TREE_UNSIGNED (char_type_node)
2127                      || ((result >> (num_bits - 1)) & 1) == 0)
2128               yylval.ttype
2129                 = build_int_2 (result & (~(unsigned HOST_WIDE_INT) 0
2130                                          >> (HOST_BITS_PER_WIDE_INT - num_bits)),
2131                                0);
2132             else
2133               yylval.ttype
2134                 = build_int_2 (result | ~(~(unsigned HOST_WIDE_INT) 0
2135                                           >> (HOST_BITS_PER_WIDE_INT - num_bits)),
2136                                -1);
2137             TREE_TYPE (yylval.ttype) = integer_type_node;
2138           }
2139         else
2140           {
2141             yylval.ttype = build_int_2 (result, 0);
2142             TREE_TYPE (yylval.ttype) = wchar_type_node;
2143           }
2144
2145         value = CONSTANT;
2146         break;
2147       }
2148
2149     case '"':
2150     string_constant:
2151       {
2152         unsigned width = wide_flag ? WCHAR_TYPE_SIZE
2153                                    : TYPE_PRECISION (char_type_node);
2154 #ifdef MULTIBYTE_CHARS
2155         int longest_char = local_mb_cur_max ();
2156         (void) local_mbtowc (NULL_PTR, NULL_PTR, 0);
2157 #endif
2158         c = token_getch ();
2159         p = token_buffer + 1;
2160
2161         while (c != '"' && c != EOF)
2162           {
2163             /* ignore_escape_flag is set for reading the filename in #line.  */
2164             if (!ignore_escape_flag && c == '\\')
2165               {
2166                 int ignore = 0;
2167                 c = readescape (&ignore);
2168                 if (ignore)
2169                   goto skipnewline;
2170                 if (width < HOST_BITS_PER_INT
2171                     && (unsigned) c >= ((unsigned)1 << width))
2172                   pedwarn ("escape sequence out of range for character");
2173               }
2174             else if (c == '\n')
2175               {
2176                 if (pedantic)
2177                   pedwarn ("ANSI C forbids newline in string constant");
2178                 lineno++;
2179               }
2180             else
2181               {
2182 #ifdef MULTIBYTE_CHARS
2183                 wchar_t wc;
2184                 int i;
2185                 int char_len = -1;
2186                 for (i = 0; i < longest_char; ++i)
2187                   {
2188                     if (p + i >= token_buffer + maxtoken)
2189                       p = extend_token_buffer (p);
2190                     p[i] = c;
2191
2192                     char_len = local_mbtowc (& wc, p, i + 1);
2193                     if (char_len != -1)
2194                       break;
2195                     c = token_getch ();
2196                   }
2197                 if (char_len == -1)
2198                   {
2199                     warning ("Ignoring invalid multibyte character");
2200                     /* Replace all except the first byte.  */
2201                     token_put_back (c);
2202                     for (--i; i > 0; --i)
2203                       token_put_back (p[i]);
2204                     char_len = 1;
2205                   }
2206                 /* mbtowc sometimes needs an extra char before accepting */
2207                 if (char_len <= i)
2208                   token_put_back (c);
2209                 if (! wide_flag)
2210                   {
2211                     p += (i + 1);
2212                     c = token_getch ();
2213                     continue;
2214                   }
2215                 c = wc;
2216 #endif /* MULTIBYTE_CHARS */
2217               }
2218
2219             /* Add this single character into the buffer either as a wchar_t
2220                or as a single byte.  */
2221             if (wide_flag)
2222               {
2223                 unsigned width = TYPE_PRECISION (char_type_node);
2224                 unsigned bytemask = (1 << width) - 1;
2225                 int byte;
2226
2227                 if (p + WCHAR_BYTES > token_buffer + maxtoken)
2228                   p = extend_token_buffer (p);
2229
2230                 for (byte = 0; byte < WCHAR_BYTES; ++byte)
2231                   {
2232                     int value;
2233                     if (byte >= (int) sizeof (c))
2234                       value = 0;
2235                     else
2236                       value = (c >> (byte * width)) & bytemask;
2237                     if (BYTES_BIG_ENDIAN)
2238                       p[WCHAR_BYTES - byte - 1] = value;
2239                     else
2240                       p[byte] = value;
2241                   }
2242                 p += WCHAR_BYTES;
2243               }
2244             else
2245               {
2246                 if (p >= token_buffer + maxtoken)
2247                   p = extend_token_buffer (p);
2248                 *p++ = c;
2249               }
2250
2251           skipnewline:
2252             c = token_getch ();
2253           }
2254
2255         /* Terminate the string value, either with a single byte zero
2256            or with a wide zero.  */
2257         if (wide_flag)
2258           {
2259             if (p + WCHAR_BYTES > token_buffer + maxtoken)
2260               p = extend_token_buffer (p);
2261             bzero (p, WCHAR_BYTES);
2262             p += WCHAR_BYTES;
2263           }
2264         else
2265           {
2266             if (p >= token_buffer + maxtoken)
2267               p = extend_token_buffer (p);
2268             *p++ = 0;
2269           }
2270
2271         if (c == EOF)
2272           error ("Unterminated string constant");
2273
2274         /* We have read the entire constant.
2275            Construct a STRING_CST for the result.  */
2276
2277         if (wide_flag)
2278           {
2279             yylval.ttype = build_string (p - (token_buffer + 1),
2280                                          token_buffer + 1);
2281             TREE_TYPE (yylval.ttype) = wchar_array_type_node;
2282             value = STRING;
2283           }
2284         else if (objc_flag)
2285           {
2286             /* Return an Objective-C @"..." constant string object.  */
2287             yylval.ttype = build_objc_string (p - (token_buffer + 1),
2288                                               token_buffer + 1);
2289             TREE_TYPE (yylval.ttype) = char_array_type_node;
2290             value = OBJC_STRING;
2291           }
2292         else
2293           {
2294             yylval.ttype = build_string (p - (token_buffer + 1),
2295                                          token_buffer + 1);
2296             TREE_TYPE (yylval.ttype) = char_array_type_node;
2297             value = STRING;
2298           }
2299
2300         break;
2301       }
2302
2303     case '+':
2304     case '-':
2305     case '&':
2306     case '|':
2307     case ':':
2308     case '<':
2309     case '>':
2310     case '*':
2311     case '/':
2312     case '%':
2313     case '^':
2314     case '!':
2315     case '=':
2316       {
2317         register int c1;
2318
2319       combine:
2320
2321         switch (c)
2322           {
2323           case '+':
2324             yylval.code = PLUS_EXPR; break;
2325           case '-':
2326             yylval.code = MINUS_EXPR; break;
2327           case '&':
2328             yylval.code = BIT_AND_EXPR; break;
2329           case '|':
2330             yylval.code = BIT_IOR_EXPR; break;
2331           case '*':
2332             yylval.code = MULT_EXPR; break;
2333           case '/':
2334             yylval.code = TRUNC_DIV_EXPR; break;
2335           case '%':
2336             yylval.code = TRUNC_MOD_EXPR; break;
2337           case '^':
2338             yylval.code = BIT_XOR_EXPR; break;
2339           case LSHIFT:
2340             yylval.code = LSHIFT_EXPR; break;
2341           case RSHIFT:
2342             yylval.code = RSHIFT_EXPR; break;
2343           case '<':
2344             yylval.code = LT_EXPR; break;
2345           case '>':
2346             yylval.code = GT_EXPR; break;
2347           }
2348
2349         token_buffer[1] = c1 = token_getch();
2350         token_buffer[2] = 0;
2351
2352         if (c1 == '=')
2353           {
2354             switch (c)
2355               {
2356               case '<':
2357                 value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done;
2358               case '>':
2359                 value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done;
2360               case '!':
2361                 value = EQCOMPARE; yylval.code = NE_EXPR; goto done;
2362               case '=':
2363                 value = EQCOMPARE; yylval.code = EQ_EXPR; goto done;
2364               }
2365             value = ASSIGN; goto done;
2366           }
2367         else if (c == c1)
2368           switch (c)
2369             {
2370             case '+':
2371               value = PLUSPLUS; goto done;
2372             case '-':
2373               value = MINUSMINUS; goto done;
2374             case '&':
2375               value = ANDAND; goto done;
2376             case '|':
2377               value = OROR; goto done;
2378             case '<':
2379               c = LSHIFT;
2380               goto combine;
2381             case '>':
2382               c = RSHIFT;
2383               goto combine;
2384             }
2385         else
2386           switch (c)
2387             {
2388             case '-':
2389               if (c1 == '>')
2390                 { value = POINTSAT; goto done; }
2391               break;
2392
2393               /* digraphs */
2394             case ':':
2395               if (c1 == '>')
2396                 { value = ']'; goto done; }
2397               break;
2398             case '<':
2399               if (c1 == '%')
2400                 { value = '{'; indent_level++; goto done; }
2401               if (c1 == ':')
2402                 { value = '['; goto done; }
2403               break;
2404             case '%':
2405               if (c1 == '>')
2406                 { value = '}'; indent_level--; goto done; }
2407               break;
2408             }
2409
2410         token_put_back (c1);
2411         token_buffer[1] = 0;
2412
2413         if ((c == '<') || (c == '>'))
2414           value = ARITHCOMPARE;
2415         else value = c;
2416         break;
2417       }
2418
2419     case 0:
2420       /* Don't make yyparse think this is eof.  */
2421       value = 1;
2422       break;
2423
2424     case '{':
2425       indent_level++;
2426       value = c;
2427       break;
2428
2429     case '}':
2430       indent_level--;
2431       value = c;
2432       break;
2433
2434     default:
2435       value = c;
2436     }
2437
2438 done:
2439 /*  yylloc.last_line = lineno; */
2440
2441   return value;
2442 }
2443
2444 /* Sets the value of the 'yydebug' variable to VALUE.
2445    This is a function so we don't have to have YYDEBUG defined
2446    in order to build the compiler.  */
2447
2448 void
2449 set_yydebug (value)
2450      int value;
2451 {
2452 #if YYDEBUG != 0
2453   yydebug = value;
2454 #else
2455   warning ("YYDEBUG not defined.");
2456 #endif
2457 }