489559fb64164d55efac17f4278eab74a5b42f06
[fw/sdcc] / support / cpp2 / cpplex.c
1 /* CPP Library - lexical analysis.
2    Copyright (C) 2000 Free Software Foundation, Inc.
3    Contributed by Per Bothner, 1994-95.
4    Based on CCCP program by Paul Rubin, June 1986
5    Adapted to ANSI C, Richard Stallman, Jan 1987
6    Broken out to separate file, Zack Weinberg, Mar 2000
7    Single-pass line tokenization by Neil Booth, April 2000
8
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
23 /* This lexer works with a single pass of the file.  Recently I
24    re-wrote it to minimize the places where we step backwards in the
25    input stream, to make future changes to support multi-byte
26    character sets fairly straight-forward.
27
28    There is now only one routine where we do step backwards:
29    skip_escaped_newlines.  This routine could probably also be changed
30    so that it doesn't need to step back.  One possibility is to use a
31    trick similar to that used in lex_period and lex_percent.  Two
32    extra characters might be needed, but skip_escaped_newlines itself
33    would probably be the only place that needs to be aware of that,
34    and changes to the remaining routines would probably only be needed
35    if they process a backslash.  */
36
37 #include "config.h"
38 #include "system.h"
39 #include "cpplib.h"
40 #include "cpphash.h"
41 #include <assert.h>
42
43 /* MULTIBYTE_CHARS support only works for native compilers.
44    ??? Ideally what we want is to model widechar support after
45    the current floating point support.  */
46 #ifdef CROSS_COMPILE
47 #undef MULTIBYTE_CHARS
48 #endif
49
50 #ifdef MULTIBYTE_CHARS
51 #include "mbchar.h"
52 #include <locale.h>
53 #endif
54
55 /* Tokens with SPELL_STRING store their spelling in the token list,
56    and it's length in the token->val.name.len.  */
57 enum spell_type
58 {
59   SPELL_OPERATOR = 0,
60   SPELL_CHAR,
61   SPELL_IDENT,
62   SPELL_STRING,
63   SPELL_NONE
64 };
65
66 struct token_spelling
67 {
68   enum spell_type category;
69   const unsigned char *name;
70 };
71
72 const unsigned char *digraph_spellings [] = {U"%:", U"%:%:", U"<:",
73                                              U":>", U"<%", U"%>"};
74
75 #define OP(e, s) { SPELL_OPERATOR, U s           },
76 #define TK(e, s) { s,              U STRINGX (e) },
77 const struct token_spelling token_spellings [N_TTYPES] = {TTYPE_TABLE };
78 #undef OP
79 #undef TK
80
81 #define TOKEN_SPELL(token) (token_spellings[(token)->type].category)
82 #define TOKEN_NAME(token) (token_spellings[(token)->type].name)
83
84 static cppchar_t handle_newline PARAMS ((cpp_buffer *, cppchar_t));
85 static cppchar_t skip_escaped_newlines PARAMS ((cpp_buffer *, cppchar_t));
86 static cppchar_t get_effective_char PARAMS ((cpp_buffer *));
87
88 static int skip_asm_block PARAMS ((cpp_reader *, int));
89 static int skip_block_comment PARAMS ((cpp_reader *));
90 static int skip_line_comment PARAMS ((cpp_reader *));
91 static void adjust_column PARAMS ((cpp_reader *));
92 static void skip_whitespace PARAMS ((cpp_reader *, cppchar_t));
93 static cpp_hashnode *parse_identifier PARAMS ((cpp_reader *, cppchar_t));
94 static void parse_number PARAMS ((cpp_reader *, cpp_string *, cppchar_t, int));
95 static int unescaped_terminator_p PARAMS ((cpp_reader *, const U_CHAR *));
96 static void parse_string PARAMS ((cpp_reader *, cpp_token *, cppchar_t));
97 static void unterminated PARAMS ((cpp_reader *, int));
98 static int trigraph_ok PARAMS ((cpp_reader *, cppchar_t));
99 static unsigned int copy_text_chars (char *, const char *, unsigned int, int);
100 static void save_asm PARAMS ((cpp_reader *, cpp_token *, const U_CHAR *, int));
101 static void save_comment PARAMS ((cpp_reader *, cpp_token *, const U_CHAR *));
102 static void lex_percent PARAMS ((cpp_buffer *, cpp_token *));
103 static void lex_dot PARAMS ((cpp_reader *, cpp_token *));
104 static int name_p PARAMS ((cpp_reader *, const cpp_string *));
105 static int maybe_read_ucs PARAMS ((cpp_reader *, const unsigned char **,
106                                    const unsigned char *, unsigned int *));
107
108 static cpp_chunk *new_chunk PARAMS ((unsigned int));
109 static int chunk_suitable PARAMS ((cpp_pool *, cpp_chunk *, unsigned int));
110 static unsigned int hex_digit_value PARAMS ((unsigned int));
111
112 /* Utility routine:
113
114    Compares, the token TOKEN to the NUL-terminated string STRING.
115    TOKEN must be a CPP_NAME.  Returns 1 for equal, 0 for unequal.  */
116
117 int
118 cpp_ideq (token, string)
119      const cpp_token *token;
120      const char *string;
121 {
122   if (token->type != CPP_NAME)
123     return 0;
124
125   return !ustrcmp (NODE_NAME (token->val.node), (const U_CHAR *) string);
126 }
127
128 /* Call when meeting a newline.  Returns the character after the newline
129    (or carriage-return newline combination), or EOF.  */
130 static cppchar_t
131 handle_newline (buffer, newline_char)
132      cpp_buffer *buffer;
133      cppchar_t newline_char;
134 {
135   cppchar_t next = EOF;
136
137   buffer->col_adjust = 0;
138   buffer->lineno++;
139   buffer->line_base = buffer->cur;
140
141   /* Handle CR-LF and LF-CR combinations, get the next character.  */
142   if (buffer->cur < buffer->rlimit)
143     {
144       next = *buffer->cur++;
145       if (next + newline_char == '\r' + '\n')
146         {
147           buffer->line_base = buffer->cur;
148           if (buffer->cur < buffer->rlimit)
149             next = *buffer->cur++;
150           else
151             next = EOF;
152         }
153     }
154
155   buffer->read_ahead = next;
156   return next;
157 }
158
159 /* Subroutine of skip_escaped_newlines; called when a trigraph is
160    encountered.  It warns if necessary, and returns true if the
161    trigraph should be honoured.  FROM_CHAR is the third character of a
162    trigraph, and presumed to be the previous character for position
163    reporting.  */
164 static int
165 trigraph_ok (pfile, from_char)
166      cpp_reader *pfile;
167      cppchar_t from_char;
168 {
169   int accept = CPP_OPTION (pfile, trigraphs);
170   
171   /* Don't warn about trigraphs in comments.  */
172   if (CPP_OPTION (pfile, warn_trigraphs) && !pfile->state.lexing_comment)
173     {
174       cpp_buffer *buffer = pfile->buffer;
175       if (accept)
176         cpp_warning_with_line (pfile, buffer->lineno, CPP_BUF_COL (buffer) - 2,
177                                "trigraph ??%c converted to %c",
178                                (int) from_char,
179                                (int) _cpp_trigraph_map[from_char]);
180       else if (buffer->cur != buffer->last_Wtrigraphs)
181         {
182           buffer->last_Wtrigraphs = buffer->cur;
183           cpp_warning_with_line (pfile, buffer->lineno,
184                                  CPP_BUF_COL (buffer) - 2,
185                                  "trigraph ??%c ignored", (int) from_char);
186         }
187     }
188
189   return accept;
190 }
191
192 /* Assumes local variables buffer and result.  */
193 #define ACCEPT_CHAR(t) \
194   do { result->type = t; buffer->read_ahead = EOF; } while (0)
195
196 /* When we move to multibyte character sets, add to these something
197    that saves and restores the state of the multibyte conversion
198    library.  This probably involves saving and restoring a "cookie".
199    In the case of glibc it is an 8-byte structure, so is not a high
200    overhead operation.  In any case, it's out of the fast path.  */
201 #define SAVE_STATE() do { saved_cur = buffer->cur; } while (0)
202 #define RESTORE_STATE() do { buffer->cur = saved_cur; } while (0)
203
204 /* Skips any escaped newlines introduced by NEXT, which is either a
205    '?' or a '\\'.  Returns the next character, which will also have
206    been placed in buffer->read_ahead.  This routine performs
207    preprocessing stages 1 and 2 of the ISO C standard.  */
208 static cppchar_t
209 skip_escaped_newlines (buffer, next)
210      cpp_buffer *buffer;
211      cppchar_t next;
212 {
213   /* Only do this if we apply stages 1 and 2.  */
214   if (!buffer->from_stage3)
215     {
216       cppchar_t next1;
217       const unsigned char *saved_cur;
218       int space;
219
220       do
221         {
222           if (buffer->cur == buffer->rlimit)
223             break;
224       
225           SAVE_STATE ();
226           if (next == '?')
227             {
228               next1 = *buffer->cur++;
229               if (next1 != '?' || buffer->cur == buffer->rlimit)
230                 {
231                   RESTORE_STATE ();
232                   break;
233                 }
234
235               next1 = *buffer->cur++;
236               if (!_cpp_trigraph_map[next1]
237                   || !trigraph_ok (buffer->pfile, next1))
238                 {
239                   RESTORE_STATE ();
240                   break;
241                 }
242
243               /* We have a full trigraph here.  */
244               next = _cpp_trigraph_map[next1];
245               if (next != '\\' || buffer->cur == buffer->rlimit)
246                 break;
247               SAVE_STATE ();
248             }
249
250           /* We have a backslash, and room for at least one more character.  */
251           space = 0;
252           do
253             {
254               next1 = *buffer->cur++;
255               if (!is_nvspace (next1))
256                 break;
257               space = 1;
258             }
259           while (buffer->cur < buffer->rlimit);
260
261           if (!is_vspace (next1))
262             {
263               RESTORE_STATE ();
264               break;
265             }
266
267           if (space && !buffer->pfile->state.lexing_comment)
268             cpp_warning (buffer->pfile,
269                          "backslash and newline separated by space");
270
271           next = handle_newline (buffer, next1);
272           if (next == EOF)
273             cpp_pedwarn (buffer->pfile, "backslash-newline at end of file");
274         }
275       while (next == '\\' || next == '?');
276     }
277
278   buffer->read_ahead = next;
279   return next;
280 }
281
282 /* Obtain the next character, after trigraph conversion and skipping
283    an arbitrary string of escaped newlines.  The common case of no
284    trigraphs or escaped newlines falls through quickly.  */
285 static cppchar_t
286 get_effective_char (buffer)
287      cpp_buffer *buffer;
288 {
289   cppchar_t next = EOF;
290
291   if (buffer->cur < buffer->rlimit)
292     {
293       next = *buffer->cur++;
294
295       /* '?' can introduce trigraphs (and therefore backslash); '\\'
296          can introduce escaped newlines, which we want to skip, or
297          UCNs, which, depending upon lexer state, we will handle in
298          the future.  */
299       if (next == '?' || next == '\\')
300         next = skip_escaped_newlines (buffer, next);
301     }
302
303   buffer->read_ahead = next;
304   return next;
305 }
306
307 /* SDCC _asm specific */
308 /* Skip an _asm ... _endasm block.  We find the end of the comment by
309    seeing _endasm.  Returns non-zero if _asm terminated by EOF, zero
310    otherwise.  */
311 static int
312 skip_asm_block (pfile, read_ahead)
313      cpp_reader *pfile;
314      int read_ahead;
315 {
316 #define _ENDASM_STR "endasm"
317 #define _ENDASM_LEN ((sizeof _ENDASM_STR) - 1)
318
319   cpp_buffer *buffer = pfile->buffer;
320   cppchar_t c = EOF;
321   int prev_space = 0;
322   int ret = 1;
323
324   pfile->state.lexing_comment = 1;
325   while (buffer->cur != buffer->rlimit)
326     {
327       if (read_ahead != EOF)
328         {
329           prev_space = 0;
330           c = buffer->read_ahead;
331           read_ahead = EOF;
332         }
333       else
334         {
335           prev_space = is_space(c);
336           c = *buffer->cur++;
337         }
338
339     next_char:
340       /* FIXME: For speed, create a new character class of characters
341          of interest inside block comments.  */
342       if (c == '?' || c == '\\')
343         c = skip_escaped_newlines (buffer, c);
344
345       if (prev_space && c == '_')
346         {
347           if (buffer->cur + _ENDASM_LEN <= buffer->rlimit &&
348             strncmp(buffer->cur, _ENDASM_STR, _ENDASM_LEN) == 0)
349             {
350               buffer->cur += _ENDASM_LEN;
351               ret = 0;
352               break;
353             }
354         }
355       else if (is_vspace (c))
356         {
357           prev_space = is_space(c), c = handle_newline (buffer, c);
358           goto next_char;
359         }
360       else if (c == '\t')
361         adjust_column (pfile);
362     }
363
364   pfile->state.lexing_comment = 0;
365   buffer->read_ahead = EOF;
366   return ret;
367 }
368
369 /* Skip a C-style block comment.  We find the end of the comment by
370    seeing if an asterisk is before every '/' we encounter.  Returns
371    non-zero if comment terminated by EOF, zero otherwise.  */
372 static int
373 skip_block_comment (pfile)
374      cpp_reader *pfile;
375 {
376   cpp_buffer *buffer = pfile->buffer;
377   cppchar_t c = EOF, prevc = EOF;
378
379   pfile->state.lexing_comment = 1;
380   while (buffer->cur != buffer->rlimit)
381     {
382       prevc = c, c = *buffer->cur++;
383
384     next_char:
385       /* FIXME: For speed, create a new character class of characters
386          of interest inside block comments.  */
387       if (c == '?' || c == '\\')
388         c = skip_escaped_newlines (buffer, c);
389
390       /* People like decorating comments with '*', so check for '/'
391          instead for efficiency.  */
392       if (c == '/')
393         {
394           if (prevc == '*')
395             break;
396
397           /* Warn about potential nested comments, but not if the '/'
398              comes immediately before the true comment delimeter.
399              Don't bother to get it right across escaped newlines.  */
400           if (CPP_OPTION (pfile, warn_comments)
401               && buffer->cur != buffer->rlimit)
402             {
403               prevc = c, c = *buffer->cur++;
404               if (c == '*' && buffer->cur != buffer->rlimit)
405                 {
406                   prevc = c, c = *buffer->cur++;
407                   if (c != '/') 
408                     cpp_warning_with_line (pfile, CPP_BUF_LINE (buffer),
409                                            CPP_BUF_COL (buffer),
410                                            "\"/*\" within comment");
411                 }
412               goto next_char;
413             }
414         }
415       else if (is_vspace (c))
416         {
417           prevc = c, c = handle_newline (buffer, c);
418           goto next_char;
419         }
420       else if (c == '\t')
421         adjust_column (pfile);
422     }
423
424   pfile->state.lexing_comment = 0;
425   buffer->read_ahead = EOF;
426   return c != '/' || prevc != '*';
427 }
428
429 /* Skip a C++ line comment.  Handles escaped newlines.  Returns
430    non-zero if a multiline comment.  The following new line, if any,
431    is left in buffer->read_ahead.  */
432 static int
433 skip_line_comment (pfile)
434      cpp_reader *pfile;
435 {
436   cpp_buffer *buffer = pfile->buffer;
437   unsigned int orig_lineno = buffer->lineno;
438   cppchar_t c;
439
440   pfile->state.lexing_comment = 1;
441   do
442     {
443       c = EOF;
444       if (buffer->cur == buffer->rlimit)
445         break;
446
447       c = *buffer->cur++;
448       if (c == '?' || c == '\\')
449         c = skip_escaped_newlines (buffer, c);
450     }
451   while (!is_vspace (c));
452
453   pfile->state.lexing_comment = 0;
454   buffer->read_ahead = c;       /* Leave any newline for caller.  */
455   return orig_lineno != buffer->lineno;
456 }
457
458 /* pfile->buffer->cur is one beyond the \t character.  Update
459    col_adjust so we track the column correctly.  */
460 static void
461 adjust_column (pfile)
462      cpp_reader *pfile;
463 {
464   cpp_buffer *buffer = pfile->buffer;
465   unsigned int col = CPP_BUF_COL (buffer) - 1; /* Zero-based column.  */
466
467   /* Round it up to multiple of the tabstop, but subtract 1 since the
468      tab itself occupies a character position.  */
469   buffer->col_adjust += (CPP_OPTION (pfile, tabstop)
470                          - col % CPP_OPTION (pfile, tabstop)) - 1;
471 }
472
473 /* Skips whitespace, saving the next non-whitespace character.
474    Adjusts pfile->col_adjust to account for tabs.  Without this,
475    tokens might be assigned an incorrect column.  */
476 static void
477 skip_whitespace (pfile, c)
478      cpp_reader *pfile;
479      cppchar_t c;
480 {
481   cpp_buffer *buffer = pfile->buffer;
482   unsigned int warned = 0;
483
484   do
485     {
486       /* Horizontal space always OK.  */
487       if (c == ' ')
488         ;
489       else if (c == '\t')
490         adjust_column (pfile);
491       /* Just \f \v or \0 left.  */
492       else if (c == '\0')
493         {
494           if (!warned)
495             {
496               cpp_warning (pfile, "null character(s) ignored");
497               warned = 1;
498             }
499         }
500       else if (pfile->state.in_directive && CPP_PEDANTIC (pfile))
501         cpp_pedwarn_with_line (pfile, CPP_BUF_LINE (buffer),
502                                CPP_BUF_COL (buffer),
503                                "%s in preprocessing directive",
504                                c == '\f' ? "form feed" : "vertical tab");
505
506       c = EOF;
507       if (buffer->cur == buffer->rlimit)
508         break;
509       c = *buffer->cur++;
510     }
511   /* We only want non-vertical space, i.e. ' ' \t \f \v \0. */
512   while (is_nvspace (c));
513
514   /* Remember the next character.  */
515   buffer->read_ahead = c;
516 }
517
518 /* See if the characters of a number token are valid in a name (no
519    '.', '+' or '-').  */
520 static int
521 name_p (pfile, string)
522      cpp_reader *pfile;
523      const cpp_string *string;
524 {
525   unsigned int i;
526
527   for (i = 0; i < string->len; i++)
528     if (!is_idchar (string->text[i]))
529       return 0;
530
531   return 1;  
532 }
533
534 /* Parse an identifier, skipping embedded backslash-newlines.
535    Calculate the hash value of the token while parsing, for improved
536    performance.  The hashing algorithm *must* match cpp_lookup().  */
537
538 static cpp_hashnode *
539 parse_identifier (pfile, c)
540      cpp_reader *pfile;
541      cppchar_t c;
542 {
543   cpp_hashnode *result;
544   cpp_buffer *buffer = pfile->buffer;
545   unsigned int saw_dollar = 0, len;
546   struct obstack *stack = &pfile->hash_table->stack;
547
548   do
549     {
550       do
551         {
552           obstack_1grow (stack, c);
553
554           if (c == '$')
555             saw_dollar++;
556
557           c = EOF;
558           if (buffer->cur == buffer->rlimit)
559             break;
560
561           c = *buffer->cur++;
562         }
563       while (is_idchar (c));
564
565       /* Potential escaped newline?  */
566       if (c != '?' && c != '\\')
567         break;
568       c = skip_escaped_newlines (buffer, c);
569     }
570   while (is_idchar (c));
571
572   /* Remember the next character.  */
573   buffer->read_ahead = c;
574
575   /* $ is not a identifier character in the standard, but is commonly
576      accepted as an extension.  Don't warn about it in skipped
577      conditional blocks.  */
578   if (saw_dollar && CPP_PEDANTIC (pfile) && ! pfile->skipping)
579     cpp_pedwarn (pfile, "'$' character(s) in identifier");
580
581   /* Identifiers are null-terminated.  */
582   len = obstack_object_size (stack);
583   obstack_1grow (stack, '\0');
584
585   /* This routine commits the memory if necessary.  */
586   result = (cpp_hashnode *)
587     ht_lookup (pfile->hash_table, obstack_finish (stack), len, HT_ALLOCED);
588
589   /* Some identifiers require diagnostics when lexed.  */
590   if (result->flags & NODE_DIAGNOSTIC && !pfile->skipping)
591     {
592       /* It is allowed to poison the same identifier twice.  */
593       if ((result->flags & NODE_POISONED) && !pfile->state.poisoned_ok)
594         cpp_error (pfile, "attempt to use poisoned \"%s\"",
595                    NODE_NAME (result));
596
597       /* Constraint 6.10.3.5: __VA_ARGS__ should only appear in the
598          replacement list of a variadic macro.  */
599       if (result == pfile->spec_nodes.n__VA_ARGS__
600           && !pfile->state.va_args_ok)
601         cpp_pedwarn (pfile, "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro");
602     }
603
604   return result;
605 }
606
607 /* Parse a number, skipping embedded backslash-newlines.  */
608 static void
609 parse_number (pfile, number, c, leading_period)
610      cpp_reader *pfile;
611      cpp_string *number;
612      cppchar_t c;
613      int leading_period;
614 {
615   cpp_buffer *buffer = pfile->buffer;
616   cpp_pool *pool = &pfile->ident_pool;
617   unsigned char *dest, *limit;
618
619   dest = POOL_FRONT (pool);
620   limit = POOL_LIMIT (pool);
621
622   /* Place a leading period.  */
623   if (leading_period)
624     {
625       if (dest >= limit)
626         limit = _cpp_next_chunk (pool, 0, &dest);
627       *dest++ = '.';
628     }
629   
630   do
631     {
632       do
633         {
634           /* Need room for terminating null.  */
635           if (dest + 1 >= limit)
636             limit = _cpp_next_chunk (pool, 0, &dest);
637           *dest++ = c;
638
639           c = EOF;
640           if (buffer->cur == buffer->rlimit)
641             break;
642
643           c = *buffer->cur++;
644         }
645       while (is_numchar (c) || c == '.' || VALID_SIGN (c, dest[-1]));
646
647       /* Potential escaped newline?  */
648       if (c != '?' && c != '\\')
649         break;
650       c = skip_escaped_newlines (buffer, c);
651     }
652   while (is_numchar (c) || c == '.' || VALID_SIGN (c, dest[-1]));
653
654   /* Remember the next character.  */
655   buffer->read_ahead = c;
656
657   /* Null-terminate the number.  */
658   *dest = '\0';
659
660   number->text = POOL_FRONT (pool);
661   number->len = dest - number->text;
662   POOL_COMMIT (pool, number->len + 1);
663 }
664
665 /* Subroutine of parse_string.  Emits error for unterminated strings.  */
666 static void
667 unterminated (pfile, term)
668      cpp_reader *pfile;
669      int term;
670 {
671   cpp_error (pfile, "missing terminating %c character", term);
672
673   if (term == '\"' && pfile->mlstring_pos.line
674       && pfile->mlstring_pos.line != pfile->lexer_pos.line)
675     {
676       cpp_error_with_line (pfile, pfile->mlstring_pos.line,
677                            pfile->mlstring_pos.col,
678                            "possible start of unterminated string literal");
679       pfile->mlstring_pos.line = 0;
680     }
681 }
682
683 /* Subroutine of parse_string.  */
684 static int
685 unescaped_terminator_p (pfile, dest)
686      cpp_reader *pfile;
687      const unsigned char *dest;
688 {
689   const unsigned char *start, *temp;
690
691   /* In #include-style directives, terminators are not escapeable.  */
692   if (pfile->state.angled_headers)
693     return 1;
694
695   start = POOL_FRONT (&pfile->ident_pool);
696
697   /* An odd number of consecutive backslashes represents an escaped
698      terminator.  */
699   for (temp = dest; temp > start && temp[-1] == '\\'; temp--)
700     ;
701
702   return ((dest - temp) & 1) == 0;
703 }
704
705 /* Parses a string, character constant, or angle-bracketed header file
706    name.  Handles embedded trigraphs and escaped newlines.  The stored
707    string is guaranteed NUL-terminated, but it is not guaranteed that
708    this is the first NUL since embedded NULs are preserved.
709
710    Multi-line strings are allowed, but they are deprecated.  */
711 static void
712 parse_string (pfile, token, terminator)
713      cpp_reader *pfile;
714      cpp_token *token;
715      cppchar_t terminator;
716 {
717   cpp_buffer *buffer = pfile->buffer;
718   cpp_pool *pool = &pfile->ident_pool;
719   unsigned char *dest, *limit;
720   cppchar_t c;
721   unsigned int nulls = 0;
722
723   dest = POOL_FRONT (pool);
724   limit = POOL_LIMIT (pool);
725
726   for (;;)
727     {
728       if (buffer->cur == buffer->rlimit)
729         c = EOF;
730       else
731         c = *buffer->cur++;
732
733     have_char:
734       /* We need space for the terminating NUL.  */
735       if (dest >= limit)
736         limit = _cpp_next_chunk (pool, 0, &dest);
737
738       if (c == EOF)
739         {
740           unterminated (pfile, terminator);
741           break;
742         }
743
744       /* Handle trigraphs, escaped newlines etc.  */
745       if (c == '?' || c == '\\')
746         c = skip_escaped_newlines (buffer, c);
747
748       if (c == terminator && unescaped_terminator_p (pfile, dest))
749         {
750           c = EOF;
751           break;
752         }
753       else if (is_vspace (c))
754         {
755           /* In assembly language, silently terminate string and
756              character literals at end of line.  This is a kludge
757              around not knowing where comments are.  */
758           if (CPP_OPTION (pfile, lang) == CLK_ASM && terminator != '>')
759             break;
760
761           /* Character constants and header names may not extend over
762              multiple lines.  In Standard C, neither may strings.
763              Unfortunately, we accept multiline strings as an
764              extension, except in #include family directives.  */
765           if (terminator != '"' || pfile->state.angled_headers)
766             {
767               unterminated (pfile, terminator);
768               break;
769             }
770
771           cpp_pedwarn (pfile, "multi-line string literals are deprecated");
772           if (pfile->mlstring_pos.line == 0)
773             pfile->mlstring_pos = pfile->lexer_pos;
774               
775           c = handle_newline (buffer, c);
776           *dest++ = '\n';
777           goto have_char;
778         }
779       else if (c == '\0')
780         {
781           if (nulls++ == 0)
782             cpp_warning (pfile, "null character(s) preserved in literal");
783         }
784
785       *dest++ = c;
786     }
787
788   /* Remember the next character.  */
789   buffer->read_ahead = c;
790   *dest = '\0';
791
792   token->val.str.text = POOL_FRONT (pool);
793   token->val.str.len = dest - token->val.str.text;
794   POOL_COMMIT (pool, token->val.str.len + 1);
795 }
796
797 /* Count and copy characters from src to dest, excluding CRs:
798    CRs are automatically generated, because the output is
799    opened in TEXT mode. If dest == NULL, only count chars */
800 static unsigned int
801 copy_text_chars (dest, src, len, read_ahead)
802      char *dest;
803      const char *src;
804      unsigned int len;
805      int read_ahead;
806 {
807   unsigned int n = 0;
808   const char *p;
809
810   if (read_ahead != EOF && read_ahead != '\r')
811     {
812       if (dest != NULL)
813         *dest++ = read_ahead;
814       ++n;
815     }
816
817   for (p = src; p != src + len; ++p)
818     {
819       assert(*p != '\0');
820
821       if (*p != '\r')
822         {
823           if (dest != NULL)
824             *dest++ = *p;
825           ++n;
826         }
827     }
828
829     return n;
830 }
831
832 /* SDCC _asm specific */
833 /* The stored comment includes the comment start and any terminator.  */
834 static void
835 save_asm (pfile, token, from, read_ahead)
836      cpp_reader *pfile;
837      cpp_token *token;
838      const unsigned char *from;
839      int read_ahead;
840 {
841 #define _ASM_STR  "_asm"
842 #define _ASM_LEN  ((sizeof _ASM_STR) - 1)
843
844   unsigned char *buffer;
845   unsigned int text_len, len;
846
847   /* ignore read_ahead if it is a CR */ 
848   if (read_ahead == '\r')
849     read_ahead = EOF;
850   len = pfile->buffer->cur - from;
851   /* + _ASM_LEN for the initial '_asm'.  */
852   text_len = copy_text_chars (NULL, from, len, read_ahead) + _ASM_LEN;
853   buffer = _cpp_pool_alloc (&pfile->ident_pool, text_len);
854
855   token->type = CPP_ASM;
856   token->val.str.len = text_len;
857   token->val.str.text = buffer;
858
859   memcpy (buffer, _ASM_STR, _ASM_LEN);
860   copy_text_chars (buffer + _ASM_LEN, from, len, read_ahead);
861 }
862
863 /* The stored comment includes the comment start and any terminator.  */
864 static void
865 save_comment (pfile, token, from)
866      cpp_reader *pfile;
867      cpp_token *token;
868      const unsigned char *from;
869 {
870   unsigned char *buffer;
871   unsigned int text_len, len;
872
873   len = pfile->buffer->cur - from;
874   /* C++ comments probably (not definitely) have moved past a new
875      line, which we don't want to save in the comment.  */
876   if (pfile->buffer->read_ahead != EOF)
877     len--;
878   /* + 1 for the initial '/'.  */
879   text_len = copy_text_chars (NULL, from, len, EOF) + 1;
880   buffer = _cpp_pool_alloc (&pfile->ident_pool, text_len);
881
882   token->type = CPP_COMMENT;
883   token->val.str.len = text_len;
884   token->val.str.text = buffer;
885
886   buffer[0] = '/';
887   copy_text_chars (buffer + 1, from, len, EOF);
888 }
889
890 /* Subroutine of lex_token to handle '%'.  A little tricky, since we
891    want to avoid stepping back when lexing %:%X.  */
892 static void
893 lex_percent (buffer, result)
894      cpp_buffer *buffer;
895      cpp_token *result;
896 {
897   cppchar_t c;
898
899   result->type = CPP_MOD;
900   /* Parsing %:%X could leave an extra character.  */
901   if (buffer->extra_char == EOF)
902     c = get_effective_char (buffer);
903   else
904     {
905       c = buffer->read_ahead = buffer->extra_char;
906       buffer->extra_char = EOF;
907     }
908
909   if (c == '=')
910     ACCEPT_CHAR (CPP_MOD_EQ);
911   else if (CPP_OPTION (buffer->pfile, digraphs))
912     {
913       if (c == ':')
914         {
915           result->flags |= DIGRAPH;
916           ACCEPT_CHAR (CPP_HASH);
917           if (get_effective_char (buffer) == '%')
918             {
919               buffer->extra_char = get_effective_char (buffer);
920               if (buffer->extra_char == ':')
921                 {
922                   buffer->extra_char = EOF;
923                   ACCEPT_CHAR (CPP_PASTE);
924                 }
925               else
926                 /* We'll catch the extra_char when we're called back.  */
927                 buffer->read_ahead = '%';
928             }
929         }
930       else if (c == '>')
931         {
932           result->flags |= DIGRAPH;
933           ACCEPT_CHAR (CPP_CLOSE_BRACE);
934         }
935     }
936 }
937
938 /* Subroutine of lex_token to handle '.'.  This is tricky, since we
939    want to avoid stepping back when lexing '...' or '.123'.  In the
940    latter case we should also set a flag for parse_number.  */
941 static void
942 lex_dot (pfile, result)
943      cpp_reader *pfile;
944      cpp_token *result;
945 {
946   cpp_buffer *buffer = pfile->buffer;
947   cppchar_t c;
948
949   /* Parsing ..X could leave an extra character.  */
950   if (buffer->extra_char == EOF)
951     c = get_effective_char (buffer);
952   else
953     {
954       c = buffer->read_ahead = buffer->extra_char;
955       buffer->extra_char = EOF;
956     }
957
958   /* All known character sets have 0...9 contiguous.  */
959   if (c >= '0' && c <= '9')
960     {
961       result->type = CPP_NUMBER;
962       parse_number (pfile, &result->val.str, c, 1);
963     }
964   else
965     {
966       result->type = CPP_DOT;
967       if (c == '.')
968         {
969           buffer->extra_char = get_effective_char (buffer);
970           if (buffer->extra_char == '.')
971             {
972               buffer->extra_char = EOF;
973               ACCEPT_CHAR (CPP_ELLIPSIS);
974             }
975           else
976             /* We'll catch the extra_char when we're called back.  */
977             buffer->read_ahead = '.';
978         }
979       else if (c == '*' && CPP_OPTION (pfile, cplusplus))
980         ACCEPT_CHAR (CPP_DOT_STAR);
981     }
982 }
983
984 void
985 _cpp_lex_token (pfile, result)
986      cpp_reader *pfile;
987      cpp_token *result;
988 {
989   cppchar_t c;
990   cpp_buffer *buffer;
991   const unsigned char *comment_start;
992   unsigned char bol;
993
994  skip:
995   bol = pfile->state.next_bol;
996  done_directive:
997   buffer = pfile->buffer;
998   pfile->state.next_bol = 0;
999   result->flags = buffer->saved_flags;
1000   buffer->saved_flags = 0;
1001  next_char:
1002   pfile->lexer_pos.line = buffer->lineno;
1003  next_char2:
1004   pfile->lexer_pos.col = CPP_BUF_COLUMN (buffer, buffer->cur);
1005
1006   c = buffer->read_ahead;
1007   if (c == EOF && buffer->cur < buffer->rlimit)
1008     {
1009       c = *buffer->cur++;
1010       pfile->lexer_pos.col++;
1011     }
1012
1013  do_switch:
1014   buffer->read_ahead = EOF;
1015   switch (c)
1016     {
1017     case EOF:
1018       /* Non-empty files should end in a newline.  Checking "bol" too
1019           prevents multiple warnings when hitting the EOF more than
1020           once, like in a directive.  Don't warn for command line and
1021           _Pragma buffers.  */
1022       if (pfile->lexer_pos.col != 0 && !bol && !buffer->from_stage3)
1023         cpp_pedwarn (pfile, "no newline at end of file");
1024       pfile->state.next_bol = 1;
1025       pfile->skipping = 0;      /* In case missing #endif.  */
1026       result->type = CPP_EOF;
1027       /* Don't do MI optimisation.  */
1028       return;
1029
1030     case ' ': case '\t': case '\f': case '\v': case '\0':
1031       skip_whitespace (pfile, c);
1032       result->flags |= PREV_WHITE;
1033       goto next_char2;
1034
1035     case '\n': case '\r':
1036       if (!pfile->state.in_directive)
1037         {
1038           handle_newline (buffer, c);
1039           bol = 1;
1040           pfile->lexer_pos.output_line = buffer->lineno;
1041           /* This is a new line, so clear any white space flag.
1042              Newlines in arguments are white space (6.10.3.10);
1043              parse_arg takes care of that.  */
1044           result->flags &= ~(PREV_WHITE | AVOID_LPASTE);
1045           goto next_char;
1046         }
1047
1048       /* Don't let directives spill over to the next line.  */
1049       buffer->read_ahead = c;
1050       pfile->state.next_bol = 1;
1051       result->type = CPP_EOF;
1052       /* Don't break; pfile->skipping might be true.  */
1053       return;
1054
1055     case '?':
1056     case '\\':
1057       /* These could start an escaped newline, or '?' a trigraph.  Let
1058          skip_escaped_newlines do all the work.  */
1059       {
1060         unsigned int lineno = buffer->lineno;
1061
1062         c = skip_escaped_newlines (buffer, c);
1063         if (lineno != buffer->lineno)
1064           /* We had at least one escaped newline of some sort, and the
1065              next character is in buffer->read_ahead.  Update the
1066              token's line and column.  */
1067             goto next_char;
1068
1069         /* We are either the original '?' or '\\', or a trigraph.  */
1070         result->type = CPP_QUERY;
1071         buffer->read_ahead = EOF;
1072         if (c == '\\')
1073           goto random_char;
1074         else if (c != '?')
1075           goto do_switch;
1076       }
1077       break;
1078
1079     case '0': case '1': case '2': case '3': case '4':
1080     case '5': case '6': case '7': case '8': case '9':
1081       result->type = CPP_NUMBER;
1082       parse_number (pfile, &result->val.str, c, 0);
1083       break;
1084
1085     case '$':
1086       if (!CPP_OPTION (pfile, dollars_in_ident))
1087         goto random_char;
1088       /* Fall through... */
1089
1090     case '_':
1091     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
1092     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
1093     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
1094     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
1095     case 'y': case 'z':
1096     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
1097     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
1098     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
1099     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
1100     case 'Y': case 'Z':
1101       result->type = CPP_NAME;
1102       result->val.node = parse_identifier (pfile, c);
1103
1104       /* 'L' may introduce wide characters or strings.  */
1105       if (result->val.node == pfile->spec_nodes.n_L)
1106         {
1107           c = buffer->read_ahead; /* For make_string.  */
1108           if (c == '\'' || c == '"')
1109             {
1110               ACCEPT_CHAR (c == '"' ? CPP_WSTRING: CPP_WCHAR);
1111               goto make_string;
1112             }
1113         }
1114       /* SDCC _asm specific */
1115       /* handle _asm ... _endasm ;  */
1116       else if (result->val.node == pfile->spec_nodes.n__asm)
1117         {
1118           int read_ahead = buffer->read_ahead;
1119
1120           comment_start = buffer->cur;
1121           result->type = CPP_ASM;
1122           skip_asm_block (pfile, read_ahead);
1123           /* Save the _asm block as a token in its own right.  */
1124           save_asm (pfile, result, comment_start, read_ahead);
1125         }
1126       /* Convert named operators to their proper types.  */
1127       else if (result->val.node->flags & NODE_OPERATOR)
1128         {
1129           result->flags |= NAMED_OP;
1130           result->type = result->val.node->value.operator;
1131         }
1132       break;
1133
1134     case '\'':
1135     case '"':
1136       result->type = c == '"' ? CPP_STRING: CPP_CHAR;
1137     make_string:
1138       parse_string (pfile, result, c);
1139       break;
1140
1141     case '/':
1142       /* A potential block or line comment.  */
1143       comment_start = buffer->cur;
1144       result->type = CPP_DIV;
1145       c = get_effective_char (buffer);
1146       if (c == '=')
1147         ACCEPT_CHAR (CPP_DIV_EQ);
1148       if (c != '/' && c != '*')
1149         break;
1150       
1151       if (c == '*')
1152         {
1153           if (skip_block_comment (pfile))
1154             cpp_error_with_line (pfile, pfile->lexer_pos.line,
1155                                  pfile->lexer_pos.col,
1156                                  "unterminated comment");
1157         }
1158       else
1159         {
1160           if (!CPP_OPTION (pfile, cplusplus_comments)
1161               && !CPP_IN_SYSTEM_HEADER (pfile))
1162             break;
1163
1164           /* Warn about comments only if pedantically GNUC89, and not
1165              in system headers.  */
1166           if (CPP_OPTION (pfile, lang) == CLK_GNUC89 && CPP_PEDANTIC (pfile)
1167               && ! buffer->warned_cplusplus_comments)
1168             {
1169               cpp_pedwarn (pfile,
1170                            "C++ style comments are not allowed in ISO C89");
1171               cpp_pedwarn (pfile,
1172                            "(this will be reported only once per input file)");
1173               buffer->warned_cplusplus_comments = 1;
1174             }
1175
1176           /* Skip_line_comment updates buffer->read_ahead.  */
1177           if (skip_line_comment (pfile) && CPP_OPTION (pfile, warn_comments))
1178             cpp_warning_with_line (pfile, pfile->lexer_pos.line,
1179                                    pfile->lexer_pos.col,
1180                                    "multi-line comment");
1181         }
1182
1183       /* Skipping the comment has updated buffer->read_ahead.  */
1184       if (!pfile->state.save_comments)
1185         {
1186           result->flags |= PREV_WHITE;
1187           goto next_char;
1188         }
1189
1190       /* Save the comment as a token in its own right.  */
1191       save_comment (pfile, result, comment_start);
1192       /* fixed for SDCPP:
1193          when executed with -C option, comments
1194          were included even if they where in skipped #if block.
1195          Applied solution from GCC cpp 3.3.2 */
1196       break;
1197
1198     case '<':
1199       if (pfile->state.angled_headers)
1200         {
1201           result->type = CPP_HEADER_NAME;
1202           c = '>';              /* terminator.  */
1203           goto make_string;
1204         }
1205
1206       result->type = CPP_LESS;
1207       c = get_effective_char (buffer);
1208       if (c == '=')
1209         ACCEPT_CHAR (CPP_LESS_EQ);
1210       else if (c == '<')
1211         {
1212           ACCEPT_CHAR (CPP_LSHIFT);
1213           if (get_effective_char (buffer) == '=')
1214             ACCEPT_CHAR (CPP_LSHIFT_EQ);
1215         }
1216       else if (c == '?' && CPP_OPTION (pfile, cplusplus))
1217         {
1218           ACCEPT_CHAR (CPP_MIN);
1219           if (get_effective_char (buffer) == '=')
1220             ACCEPT_CHAR (CPP_MIN_EQ);
1221         }
1222       else if (c == ':' && CPP_OPTION (pfile, digraphs))
1223         {
1224           ACCEPT_CHAR (CPP_OPEN_SQUARE);
1225           result->flags |= DIGRAPH;
1226         }
1227       else if (c == '%' && CPP_OPTION (pfile, digraphs))
1228         {
1229           ACCEPT_CHAR (CPP_OPEN_BRACE);
1230           result->flags |= DIGRAPH;
1231         }
1232       break;
1233
1234     case '>':
1235       result->type = CPP_GREATER;
1236       c = get_effective_char (buffer);
1237       if (c == '=')
1238         ACCEPT_CHAR (CPP_GREATER_EQ);
1239       else if (c == '>')
1240         {
1241           ACCEPT_CHAR (CPP_RSHIFT);
1242           if (get_effective_char (buffer) == '=')
1243             ACCEPT_CHAR (CPP_RSHIFT_EQ);
1244         }
1245       else if (c == '?' && CPP_OPTION (pfile, cplusplus))
1246         {
1247           ACCEPT_CHAR (CPP_MAX);
1248           if (get_effective_char (buffer) == '=')
1249             ACCEPT_CHAR (CPP_MAX_EQ);
1250         }
1251       break;
1252
1253     case '%':
1254       lex_percent (buffer, result);
1255       if (result->type == CPP_HASH)
1256         goto do_hash;
1257       break;
1258
1259     case '.':
1260       lex_dot (pfile, result);
1261       break;
1262
1263     case '+':
1264       result->type = CPP_PLUS;
1265       c = get_effective_char (buffer);
1266       if (c == '=')
1267         ACCEPT_CHAR (CPP_PLUS_EQ);
1268       else if (c == '+')
1269         ACCEPT_CHAR (CPP_PLUS_PLUS);
1270       break;
1271
1272     case '-':
1273       result->type = CPP_MINUS;
1274       c = get_effective_char (buffer);
1275       if (c == '>')
1276         {
1277           ACCEPT_CHAR (CPP_DEREF);
1278           if (CPP_OPTION (pfile, cplusplus)
1279               && get_effective_char (buffer) == '*')
1280             ACCEPT_CHAR (CPP_DEREF_STAR);
1281         }
1282       else if (c == '=')
1283         ACCEPT_CHAR (CPP_MINUS_EQ);
1284       else if (c == '-')
1285         ACCEPT_CHAR (CPP_MINUS_MINUS);
1286       break;
1287
1288     case '*':
1289       result->type = CPP_MULT;
1290       if (get_effective_char (buffer) == '=')
1291         ACCEPT_CHAR (CPP_MULT_EQ);
1292       break;
1293
1294     case '=':
1295       result->type = CPP_EQ;
1296       if (get_effective_char (buffer) == '=')
1297         ACCEPT_CHAR (CPP_EQ_EQ);
1298       break;
1299
1300     case '!':
1301       result->type = CPP_NOT;
1302       if (get_effective_char (buffer) == '=')
1303         ACCEPT_CHAR (CPP_NOT_EQ);
1304       break;
1305
1306     case '&':
1307       result->type = CPP_AND;
1308       c = get_effective_char (buffer);
1309       if (c == '=')
1310         ACCEPT_CHAR (CPP_AND_EQ);
1311       else if (c == '&')
1312         ACCEPT_CHAR (CPP_AND_AND);
1313       break;
1314           
1315     case '#':
1316       c = buffer->extra_char;   /* Can be set by error condition below.  */
1317       if (c != EOF)
1318         {
1319           buffer->read_ahead = c;
1320           buffer->extra_char = EOF;
1321         }
1322       else
1323         c = get_effective_char (buffer);
1324
1325       if (c == '#')
1326         {
1327           ACCEPT_CHAR (CPP_PASTE);
1328           break;
1329         }
1330
1331       result->type = CPP_HASH;
1332     do_hash:
1333       if (!bol)
1334         break;
1335       /* 6.10.3 paragraph 11: If there are sequences of preprocessing
1336          tokens within the list of arguments that would otherwise act
1337          as preprocessing directives, the behavior is undefined.
1338
1339          This implementation will report a hard error, terminate the
1340          macro invocation, and proceed to process the directive.  */
1341       if (pfile->state.parsing_args)
1342         {
1343           if (pfile->state.parsing_args == 2)
1344             cpp_error (pfile,
1345                        "directives may not be used inside a macro argument");
1346
1347           /* Put a '#' in lookahead, return CPP_EOF for parse_arg.  */
1348           buffer->extra_char = buffer->read_ahead;
1349           buffer->read_ahead = '#';
1350           pfile->state.next_bol = 1;
1351           result->type = CPP_EOF;
1352
1353           /* Get whitespace right - newline_in_args sets it.  */
1354           if (pfile->lexer_pos.col == 1)
1355             result->flags &= ~(PREV_WHITE | AVOID_LPASTE);
1356         }
1357       else
1358         {
1359           /* This is the hash introducing a directive.  */
1360           if (_cpp_handle_directive (pfile, result->flags & PREV_WHITE))
1361             goto done_directive; /* bol still 1.  */
1362           /* This is in fact an assembler #.  */
1363         }
1364       break;
1365
1366     case '|':
1367       result->type = CPP_OR;
1368       c = get_effective_char (buffer);
1369       if (c == '=')
1370         ACCEPT_CHAR (CPP_OR_EQ);
1371       else if (c == '|')
1372         ACCEPT_CHAR (CPP_OR_OR);
1373       break;
1374
1375     case '^':
1376       result->type = CPP_XOR;
1377       if (get_effective_char (buffer) == '=')
1378         ACCEPT_CHAR (CPP_XOR_EQ);
1379       break;
1380
1381     case ':':
1382       result->type = CPP_COLON;
1383       c = get_effective_char (buffer);
1384       if (c == ':' && CPP_OPTION (pfile, cplusplus))
1385         ACCEPT_CHAR (CPP_SCOPE);
1386       else if (c == '>' && CPP_OPTION (pfile, digraphs))
1387         {
1388           result->flags |= DIGRAPH;
1389           ACCEPT_CHAR (CPP_CLOSE_SQUARE);
1390         }
1391       break;
1392
1393     case '~': result->type = CPP_COMPL; break;
1394     case ',': result->type = CPP_COMMA; break;
1395     case '(': result->type = CPP_OPEN_PAREN; break;
1396     case ')': result->type = CPP_CLOSE_PAREN; break;
1397     case '[': result->type = CPP_OPEN_SQUARE; break;
1398     case ']': result->type = CPP_CLOSE_SQUARE; break;
1399     case '{': result->type = CPP_OPEN_BRACE; break;
1400     case '}': result->type = CPP_CLOSE_BRACE; break;
1401     case ';': result->type = CPP_SEMICOLON; break;
1402
1403       /* @ is a punctuator in Objective C.  */
1404     case '@': result->type = CPP_ATSIGN; break;
1405
1406     random_char:
1407     default:
1408       result->type = CPP_OTHER;
1409       result->val.c = c;
1410       break;
1411     }
1412
1413   if (pfile->skipping)
1414     goto skip;
1415
1416   /* If not in a directive, this token invalidates controlling macros.  */
1417   if (!pfile->state.in_directive)
1418     pfile->mi_state = MI_FAILED;
1419 }
1420
1421 /* An upper bound on the number of bytes needed to spell a token,
1422    including preceding whitespace.  */
1423 unsigned int
1424 cpp_token_len (token)
1425      const cpp_token *token;
1426 {
1427   unsigned int len;
1428
1429   switch (TOKEN_SPELL (token))
1430     {
1431     default:            len = 0;                                break;
1432     case SPELL_STRING:  len = token->val.str.len;               break;
1433     case SPELL_IDENT:   len = NODE_LEN (token->val.node);       break;
1434     }
1435   /* 1 for whitespace, 4 for comment delimeters.  */
1436   return len + 5;
1437 }
1438
1439 /* Write the spelling of a token TOKEN to BUFFER.  The buffer must
1440    already contain the enough space to hold the token's spelling.
1441    Returns a pointer to the character after the last character
1442    written.  */
1443 unsigned char *
1444 cpp_spell_token (pfile, token, buffer)
1445      cpp_reader *pfile;         /* Would be nice to be rid of this...  */
1446      const cpp_token *token;
1447      unsigned char *buffer;
1448 {
1449   switch (TOKEN_SPELL (token))
1450     {
1451     case SPELL_OPERATOR:
1452       {
1453         const unsigned char *spelling;
1454         unsigned char c;
1455
1456         if (token->flags & DIGRAPH)
1457           spelling
1458             = digraph_spellings[(int) token->type - (int) CPP_FIRST_DIGRAPH];
1459         else if (token->flags & NAMED_OP)
1460           goto spell_ident;
1461         else
1462           spelling = TOKEN_NAME (token);
1463         
1464         while ((c = *spelling++) != '\0')
1465           *buffer++ = c;
1466       }
1467       break;
1468
1469     case SPELL_IDENT:
1470       spell_ident:
1471       memcpy (buffer, NODE_NAME (token->val.node), NODE_LEN (token->val.node));
1472       buffer += NODE_LEN (token->val.node);
1473       break;
1474
1475     case SPELL_STRING:
1476       {
1477         int left, right, tag;
1478         switch (token->type)
1479           {
1480           case CPP_STRING:      left = '"';  right = '"';  tag = '\0'; break;
1481           case CPP_WSTRING:     left = '"';  right = '"';  tag = 'L';  break;
1482           case CPP_CHAR:        left = '\''; right = '\''; tag = '\0'; break;
1483           case CPP_WCHAR:       left = '\''; right = '\''; tag = 'L';  break;
1484           case CPP_HEADER_NAME: left = '<';  right = '>';  tag = '\0'; break;
1485           default:              left = '\0'; right = '\0'; tag = '\0'; break;
1486           }
1487         if (tag) *buffer++ = tag;
1488         if (left) *buffer++ = left;
1489         memcpy (buffer, token->val.str.text, token->val.str.len);
1490         buffer += token->val.str.len;
1491         if (right) *buffer++ = right;
1492       }
1493       break;
1494
1495     case SPELL_CHAR:
1496       *buffer++ = token->val.c;
1497       break;
1498
1499     case SPELL_NONE:
1500       cpp_ice (pfile, "Unspellable token %s", TOKEN_NAME (token));
1501       break;
1502     }
1503
1504   return buffer;
1505 }
1506
1507 /* Returns a token as a null-terminated string.  The string is
1508    temporary, and automatically freed later.  Useful for diagnostics.  */
1509 unsigned char *
1510 cpp_token_as_text (pfile, token)
1511      cpp_reader *pfile;
1512      const cpp_token *token;
1513 {
1514   unsigned int len = cpp_token_len (token);
1515   unsigned char *start = _cpp_pool_alloc (&pfile->ident_pool, len), *end;
1516
1517   end = cpp_spell_token (pfile, token, start);
1518   end[0] = '\0';
1519
1520   return start;
1521 }
1522
1523 /* Used by C front ends.  Should really move to using cpp_token_as_text.  */
1524 const char *
1525 cpp_type2name (type)
1526      enum cpp_ttype type;
1527 {
1528   return (const char *) token_spellings[type].name;
1529 }
1530
1531 /* Writes the spelling of token to FP.  Separate from cpp_spell_token
1532    for efficiency - to avoid double-buffering.  Also, outputs a space
1533    if PREV_WHITE is flagged.  */
1534 void
1535 cpp_output_token (token, fp)
1536      const cpp_token *token;
1537      FILE *fp;
1538 {
1539   if (token->flags & PREV_WHITE)
1540     putc (' ', fp);
1541
1542   switch (TOKEN_SPELL (token))
1543     {
1544     case SPELL_OPERATOR:
1545       {
1546         const unsigned char *spelling;
1547
1548         if (token->flags & DIGRAPH)
1549           spelling
1550             = digraph_spellings[(int) token->type - (int) CPP_FIRST_DIGRAPH];
1551         else if (token->flags & NAMED_OP)
1552           goto spell_ident;
1553         else
1554           spelling = TOKEN_NAME (token);
1555
1556         ufputs (spelling, fp);
1557       }
1558       break;
1559
1560     spell_ident:
1561     case SPELL_IDENT:
1562       ufputs (NODE_NAME (token->val.node), fp);
1563     break;
1564
1565     case SPELL_STRING:
1566       {
1567         int left, right, tag;
1568         switch (token->type)
1569           {
1570           case CPP_STRING:      left = '"';  right = '"';  tag = '\0'; break;
1571           case CPP_WSTRING:     left = '"';  right = '"';  tag = 'L';  break;
1572           case CPP_CHAR:        left = '\''; right = '\''; tag = '\0'; break;
1573           case CPP_WCHAR:       left = '\''; right = '\''; tag = 'L';  break;
1574           case CPP_HEADER_NAME: left = '<';  right = '>';  tag = '\0'; break;
1575           default:              left = '\0'; right = '\0'; tag = '\0'; break;
1576           }
1577         if (tag) putc (tag, fp);
1578         if (left) putc (left, fp);
1579         fwrite (token->val.str.text, 1, token->val.str.len, fp);
1580         if (right) putc (right, fp);
1581       }
1582       break;
1583
1584     case SPELL_CHAR:
1585       putc (token->val.c, fp);
1586       break;
1587
1588     case SPELL_NONE:
1589       /* An error, most probably.  */
1590       break;
1591     }
1592 }
1593
1594 /* Compare two tokens.  */
1595 int
1596 _cpp_equiv_tokens (a, b)
1597      const cpp_token *a, *b;
1598 {
1599   if (a->type == b->type && a->flags == b->flags)
1600     switch (TOKEN_SPELL (a))
1601       {
1602       default:                  /* Keep compiler happy.  */
1603       case SPELL_OPERATOR:
1604         return 1;
1605       case SPELL_CHAR:
1606         return a->val.c == b->val.c; /* Character.  */
1607       case SPELL_NONE:
1608         return (a->type != CPP_MACRO_ARG || a->val.arg_no == b->val.arg_no);
1609       case SPELL_IDENT:
1610         return a->val.node == b->val.node;
1611       case SPELL_STRING:
1612         return (a->val.str.len == b->val.str.len
1613                 && !memcmp (a->val.str.text, b->val.str.text,
1614                             a->val.str.len));
1615       }
1616
1617   return 0;
1618 }
1619
1620 /* Determine whether two tokens can be pasted together, and if so,
1621    what the resulting token is.  Returns CPP_EOF if the tokens cannot
1622    be pasted, or the appropriate type for the merged token if they
1623    can.  */
1624 enum cpp_ttype
1625 cpp_can_paste (pfile, token1, token2, digraph)
1626      cpp_reader * pfile;
1627      const cpp_token *token1, *token2;
1628      int* digraph;
1629 {
1630   enum cpp_ttype a = token1->type, b = token2->type;
1631   int cxx = CPP_OPTION (pfile, cplusplus);
1632
1633   /* Treat named operators as if they were ordinary NAMEs.  */
1634   if (token1->flags & NAMED_OP)
1635     a = CPP_NAME;
1636   if (token2->flags & NAMED_OP)
1637     b = CPP_NAME;
1638
1639   if ((int) a <= (int) CPP_LAST_EQ && b == CPP_EQ)
1640     return (enum cpp_ttype) ((int) a + ((int) CPP_EQ_EQ - (int) CPP_EQ));
1641
1642   switch (a)
1643     {
1644     case CPP_GREATER:
1645       if (b == a) return CPP_RSHIFT;
1646       if (b == CPP_QUERY && cxx)        return CPP_MAX;
1647       if (b == CPP_GREATER_EQ)  return CPP_RSHIFT_EQ;
1648       break;
1649     case CPP_LESS:
1650       if (b == a) return CPP_LSHIFT;
1651       if (b == CPP_QUERY && cxx)        return CPP_MIN;
1652       if (b == CPP_LESS_EQ)     return CPP_LSHIFT_EQ;
1653       if (CPP_OPTION (pfile, digraphs))
1654         {
1655           if (b == CPP_COLON)
1656             {*digraph = 1; return CPP_OPEN_SQUARE;} /* <: digraph */
1657           if (b == CPP_MOD)
1658             {*digraph = 1; return CPP_OPEN_BRACE;}      /* <% digraph */
1659         }
1660       break;
1661
1662     case CPP_PLUS: if (b == a)  return CPP_PLUS_PLUS; break;
1663     case CPP_AND:  if (b == a)  return CPP_AND_AND; break;
1664     case CPP_OR:   if (b == a)  return CPP_OR_OR;   break;
1665
1666     case CPP_MINUS:
1667       if (b == a)               return CPP_MINUS_MINUS;
1668       if (b == CPP_GREATER)     return CPP_DEREF;
1669       break;
1670     case CPP_COLON:
1671       if (b == a && cxx)        return CPP_SCOPE;
1672       if (b == CPP_GREATER && CPP_OPTION (pfile, digraphs))
1673         {*digraph = 1; return CPP_CLOSE_SQUARE;} /* :> digraph */
1674       break;
1675
1676     case CPP_MOD:
1677       if (CPP_OPTION (pfile, digraphs))
1678         {
1679           if (b == CPP_GREATER)
1680             {*digraph = 1; return CPP_CLOSE_BRACE;}  /* %> digraph */
1681           if (b == CPP_COLON)
1682             {*digraph = 1; return CPP_HASH;}         /* %: digraph */
1683         }
1684       break;
1685     case CPP_DEREF:
1686       if (b == CPP_MULT && cxx) return CPP_DEREF_STAR;
1687       break;
1688     case CPP_DOT:
1689       if (b == CPP_MULT && cxx) return CPP_DOT_STAR;
1690       if (b == CPP_NUMBER)      return CPP_NUMBER;
1691       break;
1692
1693     case CPP_HASH:
1694       if (b == a && (token1->flags & DIGRAPH) == (token2->flags & DIGRAPH))
1695         /* %:%: digraph */
1696         {*digraph = (token1->flags & DIGRAPH); return CPP_PASTE;}
1697       break;
1698
1699     case CPP_NAME:
1700       if (b == CPP_NAME)        return CPP_NAME;
1701       if (b == CPP_NUMBER
1702           && name_p (pfile, &token2->val.str)) return CPP_NAME;
1703       if (b == CPP_CHAR
1704           && token1->val.node == pfile->spec_nodes.n_L) return CPP_WCHAR;
1705       if (b == CPP_STRING
1706           && token1->val.node == pfile->spec_nodes.n_L) return CPP_WSTRING;
1707       break;
1708
1709     case CPP_NUMBER:
1710       if (b == CPP_NUMBER)      return CPP_NUMBER;
1711       if (b == CPP_NAME)        return CPP_NUMBER;
1712       if (b == CPP_DOT)         return CPP_NUMBER;
1713       /* Numbers cannot have length zero, so this is safe.  */
1714       if ((b == CPP_PLUS || b == CPP_MINUS)
1715           && VALID_SIGN ('+', token1->val.str.text[token1->val.str.len - 1]))
1716         return CPP_NUMBER;
1717       break;
1718
1719     default:
1720       break;
1721     }
1722
1723   return CPP_EOF;
1724 }
1725
1726 /* Returns nonzero if a space should be inserted to avoid an
1727    accidental token paste for output.  For simplicity, it is
1728    conservative, and occasionally advises a space where one is not
1729    needed, e.g. "." and ".2".  */
1730
1731 int
1732 cpp_avoid_paste (pfile, token1, token2)
1733      cpp_reader *pfile;
1734      const cpp_token *token1, *token2;
1735 {
1736   enum cpp_ttype a = token1->type, b = token2->type;
1737   cppchar_t c;
1738
1739   if (token1->flags & NAMED_OP)
1740     a = CPP_NAME;
1741   if (token2->flags & NAMED_OP)
1742     b = CPP_NAME;
1743
1744   c = EOF;
1745   if (token2->flags & DIGRAPH)
1746     c = digraph_spellings[(int) b - (int) CPP_FIRST_DIGRAPH][0];
1747   else if (token_spellings[b].category == SPELL_OPERATOR)
1748     c = token_spellings[b].name[0];
1749
1750   /* Quickly get everything that can paste with an '='.  */
1751   if ((int) a <= (int) CPP_LAST_EQ && c == '=')
1752     return 1;
1753
1754   switch (a)
1755     {
1756     case CPP_GREATER:   return c == '>' || c == '?';
1757     case CPP_LESS:      return c == '<' || c == '?' || c == '%' || c == ':';
1758     case CPP_PLUS:      return c == '+';
1759     case CPP_MINUS:     return c == '-' || c == '>';
1760     case CPP_DIV:       return c == '/' || c == '*'; /* Comments.  */
1761     case CPP_MOD:       return c == ':' || c == '>';
1762     case CPP_AND:       return c == '&';
1763     case CPP_OR:        return c == '|';
1764     case CPP_COLON:     return c == ':' || c == '>';
1765     case CPP_DEREF:     return c == '*';
1766     case CPP_DOT:       return c == '.' || c == '%' || b == CPP_NUMBER;
1767     case CPP_HASH:      return c == '#' || c == '%'; /* Digraph form.  */
1768     case CPP_NAME:      return ((b == CPP_NUMBER
1769                                  && name_p (pfile, &token2->val.str))
1770                                 || b == CPP_NAME
1771                                 || b == CPP_CHAR || b == CPP_STRING); /* L */
1772     case CPP_NUMBER:    return (b == CPP_NUMBER || b == CPP_NAME
1773                                 || c == '.' || c == '+' || c == '-');
1774     case CPP_OTHER:     return (CPP_OPTION (pfile, objc)
1775                                 && token1->val.c == '@'
1776                                 && (b == CPP_NAME || b == CPP_STRING));
1777     default:            break;
1778     }
1779
1780   return 0;
1781 }
1782
1783 /* Output all the remaining tokens on the current line, and a newline
1784    character, to FP.  Leading whitespace is removed.  */
1785 void
1786 cpp_output_line (pfile, fp)
1787      cpp_reader *pfile;
1788      FILE *fp;
1789 {
1790   cpp_token token;
1791
1792   cpp_get_token (pfile, &token);
1793   token.flags &= ~PREV_WHITE;
1794   while (token.type != CPP_EOF)
1795     {
1796       cpp_output_token (&token, fp);
1797       cpp_get_token (pfile, &token);
1798     }
1799
1800   putc ('\n', fp);
1801 }
1802
1803 /* Returns the value of a hexadecimal digit.  */
1804 static unsigned int
1805 hex_digit_value (c)
1806      unsigned int c;
1807 {
1808   if (c >= 'a' && c <= 'f')
1809     return c - 'a' + 10;
1810   if (c >= 'A' && c <= 'F')
1811     return c - 'A' + 10;
1812   if (c >= '0' && c <= '9')
1813     return c - '0';
1814   abort ();
1815 }
1816
1817 /* Parse a '\uNNNN' or '\UNNNNNNNN' sequence.  Returns 1 to indicate
1818    failure if cpplib is not parsing C++ or C99.  Such failure is
1819    silent, and no variables are updated.  Otherwise returns 0, and
1820    warns if -Wtraditional.
1821
1822    [lex.charset]: The character designated by the universal character
1823    name \UNNNNNNNN is that character whose character short name in
1824    ISO/IEC 10646 is NNNNNNNN; the character designated by the
1825    universal character name \uNNNN is that character whose character
1826    short name in ISO/IEC 10646 is 0000NNNN.  If the hexadecimal value
1827    for a universal character name is less than 0x20 or in the range
1828    0x7F-0x9F (inclusive), or if the universal character name
1829    designates a character in the basic source character set, then the
1830    program is ill-formed.
1831
1832    We assume that wchar_t is Unicode, so we don't need to do any
1833    mapping.  Is this ever wrong?
1834
1835    PC points to the 'u' or 'U', PSTR is points to the byte after PC,
1836    LIMIT is the end of the string or charconst.  PSTR is updated to
1837    point after the UCS on return, and the UCS is written into PC.  */
1838
1839 static int
1840 maybe_read_ucs (pfile, pstr, limit, pc)
1841      cpp_reader *pfile;
1842      const unsigned char **pstr;
1843      const unsigned char *limit;
1844      unsigned int *pc;
1845 {
1846   const unsigned char *p = *pstr;
1847   unsigned int code = 0;
1848   unsigned int c = *pc, length;
1849
1850   /* Only attempt to interpret a UCS for C++ and C99.  */
1851   if (! (CPP_OPTION (pfile, cplusplus) || CPP_OPTION (pfile, c99)))
1852     return 1;
1853
1854   if (CPP_WTRADITIONAL (pfile))
1855     cpp_warning (pfile, "the meaning of '\\%c' varies with -traditional", c);
1856
1857   length = (c == 'u' ? 4: 8);
1858
1859   if ((size_t) (limit - p) < length)
1860     {
1861       cpp_error (pfile, "incomplete universal-character-name");
1862       /* Skip to the end to avoid more diagnostics.  */
1863       p = limit;
1864     }
1865   else
1866     {
1867       for (; length; length--, p++)
1868         {
1869           c = *p;
1870           if (ISXDIGIT (c))
1871             code = (code << 4) + hex_digit_value (c);
1872           else
1873             {
1874               cpp_error (pfile,
1875                          "non-hex digit '%c' in universal-character-name", c);
1876               /* We shouldn't skip in case there are multibyte chars.  */
1877               break;
1878             }
1879         }
1880     }
1881
1882 #ifdef TARGET_EBCDIC
1883   cpp_error (pfile, "universal-character-name on EBCDIC target");
1884   code = 0x3f;  /* EBCDIC invalid character */
1885 #else
1886  /* True extended characters are OK.  */
1887   if (code >= 0xa0
1888       && !(code & 0x80000000)
1889       && !(code >= 0xD800 && code <= 0xDFFF))
1890     ;
1891   /* The standard permits $, @ and ` to be specified as UCNs.  We use
1892      hex escapes so that this also works with EBCDIC hosts.  */
1893   else if (code == 0x24 || code == 0x40 || code == 0x60)
1894     ;
1895   /* Don't give another error if one occurred above.  */
1896   else if (length == 0)
1897     cpp_error (pfile, "universal-character-name out of range");
1898 #endif
1899
1900   *pstr = p;
1901   *pc = code;
1902   return 0;
1903 }
1904
1905 /* Interpret an escape sequence, and return its value.  PSTR points to
1906    the input pointer, which is just after the backslash.  LIMIT is how
1907    much text we have.  MASK is a bitmask for the precision for the
1908    destination type (char or wchar_t).  TRADITIONAL, if true, does not
1909    interpret escapes that did not exist in traditional C.
1910
1911    Handles all relevant diagnostics.  */
1912
1913 unsigned int
1914 cpp_parse_escape (pfile, pstr, limit, mask, traditional)
1915      cpp_reader *pfile;
1916      const unsigned char **pstr;
1917      const unsigned char *limit;
1918      unsigned HOST_WIDE_INT mask;
1919      int traditional;
1920 {
1921   int unknown = 0;
1922   const unsigned char *str = *pstr;
1923   unsigned int c = *str++;
1924
1925   switch (c)
1926     {
1927     case '\\': case '\'': case '"': case '?': break;
1928     case 'b': c = TARGET_BS;      break;
1929     case 'f': c = TARGET_FF;      break;
1930     case 'n': c = TARGET_NEWLINE; break;
1931     case 'r': c = TARGET_CR;      break;
1932     case 't': c = TARGET_TAB;     break;
1933     case 'v': c = TARGET_VT;      break;
1934
1935     case '(': case '{': case '[': case '%':
1936       /* '\(', etc, are used at beginning of line to avoid confusing Emacs.
1937          '\%' is used to prevent SCCS from getting confused.  */
1938       unknown = CPP_PEDANTIC (pfile);
1939       break;
1940
1941     case 'a':
1942       if (CPP_WTRADITIONAL (pfile))
1943         cpp_warning (pfile, "the meaning of '\\a' varies with -traditional");
1944       if (!traditional)
1945         c = TARGET_BELL;
1946       break;
1947
1948     case 'e': case 'E':
1949       if (CPP_PEDANTIC (pfile))
1950         cpp_pedwarn (pfile, "non-ISO-standard escape sequence, '\\%c'", c);
1951       c = TARGET_ESC;
1952       break;
1953       
1954     case 'u': case 'U':
1955       unknown = maybe_read_ucs (pfile, &str, limit, &c);
1956       break;
1957
1958     case 'x':
1959       if (CPP_WTRADITIONAL (pfile))
1960         cpp_warning (pfile, "the meaning of '\\x' varies with -traditional");
1961
1962       if (!traditional)
1963         {
1964           unsigned int i = 0, overflow = 0;
1965           int digits_found = 0;
1966
1967           while (str < limit)
1968             {
1969               c = *str;
1970               if (! ISXDIGIT (c))
1971                 break;
1972               str++;
1973               overflow |= i ^ (i << 4 >> 4);
1974               i = (i << 4) + hex_digit_value (c);
1975               digits_found = 1;
1976             }
1977
1978           if (!digits_found)
1979             cpp_error (pfile, "\\x used with no following hex digits");
1980
1981           if (overflow | (i != (i & mask)))
1982             {
1983               cpp_pedwarn (pfile, "hex escape sequence out of range");
1984               i &= mask;
1985             }
1986           c = i;
1987         }
1988       break;
1989
1990     case '0':  case '1':  case '2':  case '3':
1991     case '4':  case '5':  case '6':  case '7':
1992       {
1993         unsigned int i = c - '0';
1994         int count = 0;
1995
1996         while (str < limit && ++count < 3)
1997           {
1998             c = *str;
1999             if (c < '0' || c > '7')
2000               break;
2001             str++;
2002             i = (i << 3) + c - '0';
2003           }
2004
2005         if (i != (i & mask))
2006           {
2007             cpp_pedwarn (pfile, "octal escape sequence out of range");
2008             i &= mask;
2009           }
2010         c = i;
2011       }
2012       break;
2013
2014     default:
2015       unknown = 1;
2016       break;
2017     }
2018
2019   if (unknown)
2020     {
2021       if (ISGRAPH (c))
2022         cpp_pedwarn (pfile, "unknown escape sequence '\\%c'", c);
2023       else
2024         cpp_pedwarn (pfile, "unknown escape sequence: '\\%03o'", c);
2025     }
2026
2027   if (c > mask)
2028     cpp_pedwarn (pfile, "escape sequence out of range for character");
2029
2030   *pstr = str;
2031   return c;
2032 }
2033
2034 #ifndef MAX_CHAR_TYPE_SIZE
2035 #define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE
2036 #endif
2037
2038 #ifndef MAX_WCHAR_TYPE_SIZE
2039 #define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE
2040 #endif
2041
2042 /* Interpret a (possibly wide) character constant in TOKEN.
2043    WARN_MULTI warns about multi-character charconsts, if not
2044    TRADITIONAL.  TRADITIONAL also indicates not to interpret escapes
2045    that did not exist in traditional C.  PCHARS_SEEN points to a
2046    variable that is filled in with the number of characters seen.  */
2047 HOST_WIDE_INT
2048 cpp_interpret_charconst (pfile, token, warn_multi, traditional, pchars_seen)
2049      cpp_reader *pfile;
2050      const cpp_token *token;
2051      int warn_multi;
2052      int traditional;
2053      unsigned int *pchars_seen;
2054 {
2055   const unsigned char *str = token->val.str.text;
2056   const unsigned char *limit = str + token->val.str.len;
2057   unsigned int chars_seen = 0;
2058   unsigned int width, max_chars, c;
2059   unsigned HOST_WIDE_INT mask;
2060   HOST_WIDE_INT result = 0;
2061
2062 #ifdef MULTIBYTE_CHARS
2063   (void) local_mbtowc (NULL, NULL, 0);
2064 #endif
2065
2066   /* Width in bits.  */
2067   if (token->type == CPP_CHAR)
2068     width = MAX_CHAR_TYPE_SIZE;
2069   else
2070     width = MAX_WCHAR_TYPE_SIZE;
2071
2072   if (width < HOST_BITS_PER_WIDE_INT)
2073     mask = ((unsigned HOST_WIDE_INT) 1 << width) - 1;
2074   else
2075     mask = ~0;
2076   max_chars = HOST_BITS_PER_WIDE_INT / width;
2077
2078   while (str < limit)
2079     {
2080 #ifdef MULTIBYTE_CHARS
2081       wchar_t wc;
2082       int char_len;
2083
2084       char_len = local_mbtowc (&wc, str, limit - str);
2085       if (char_len == -1)
2086         {
2087           cpp_warning (pfile, "ignoring invalid multibyte character");
2088           c = *str++;
2089         }
2090       else
2091         {
2092           str += char_len;
2093           c = wc;
2094         }
2095 #else
2096       c = *str++;
2097 #endif
2098
2099       if (c == '\\')
2100         c = cpp_parse_escape (pfile, &str, limit, mask, traditional);
2101
2102 #ifdef MAP_CHARACTER
2103       if (ISPRINT (c))
2104         c = MAP_CHARACTER (c);
2105 #endif
2106       
2107       /* Merge character into result; ignore excess chars.  */
2108       if (++chars_seen <= max_chars)
2109         {
2110           if (width < HOST_BITS_PER_WIDE_INT)
2111             result = (result << width) | (c & mask);
2112           else
2113             result = c;
2114         }
2115     }
2116
2117   if (chars_seen == 0)
2118     cpp_error (pfile, "empty character constant");
2119   else if (chars_seen > max_chars)
2120     {
2121       chars_seen = max_chars;
2122       cpp_warning (pfile, "character constant too long");
2123     }
2124   else if (chars_seen > 1 && !traditional && warn_multi)
2125     cpp_warning (pfile, "multi-character character constant");
2126
2127   /* If char type is signed, sign-extend the constant.  The
2128      __CHAR_UNSIGNED__ macro is set by the driver if appropriate.  */
2129   if (token->type == CPP_CHAR && chars_seen)
2130     {
2131       unsigned int nbits = chars_seen * width;
2132       unsigned int mask = (unsigned int) ~0 >> (HOST_BITS_PER_INT - nbits);
2133
2134       if (pfile->spec_nodes.n__CHAR_UNSIGNED__->type == NT_MACRO
2135           || ((result >> (nbits - 1)) & 1) == 0)
2136         result &= mask;
2137       else
2138         result |= ~mask;
2139     }
2140
2141   *pchars_seen = chars_seen;
2142   return result;
2143 }
2144
2145 /* Memory pools.  */
2146
2147 struct dummy
2148 {
2149   char c;
2150   union
2151   {
2152     double d;
2153     int *p;
2154   } u;
2155 };
2156
2157 #define DEFAULT_ALIGNMENT (offsetof (struct dummy, u))
2158
2159 static int
2160 chunk_suitable (pool, chunk, size)
2161      cpp_pool *pool;
2162      cpp_chunk *chunk;
2163      unsigned int size;
2164 {
2165   /* Being at least twice SIZE means we can use memcpy in
2166      _cpp_next_chunk rather than memmove.  Besides, it's a good idea
2167      anyway.  */
2168   return (chunk && pool->locked != chunk
2169           && (unsigned int) (chunk->limit - chunk->base) >= size * 2);
2170 }
2171
2172 /* Returns the end of the new pool.  PTR points to a char in the old
2173    pool, and is updated to point to the same char in the new pool.  */
2174 unsigned char *
2175 _cpp_next_chunk (pool, len, ptr)
2176      cpp_pool *pool;
2177      unsigned int len;
2178      unsigned char **ptr;
2179 {
2180   cpp_chunk *chunk = pool->cur->next;
2181
2182   /* LEN is the minimum size we want in the new pool.  */
2183   len += POOL_ROOM (pool);
2184   if (! chunk_suitable (pool, chunk, len))
2185     {
2186       chunk = new_chunk (POOL_SIZE (pool) * 2 + len);
2187
2188       chunk->next = pool->cur->next;
2189       pool->cur->next = chunk;
2190     }
2191
2192   /* Update the pointer before changing chunk's front.  */
2193   if (ptr)
2194     *ptr += chunk->base - POOL_FRONT (pool);
2195
2196   memcpy (chunk->base, POOL_FRONT (pool), POOL_ROOM (pool));
2197   chunk->front = chunk->base;
2198
2199   pool->cur = chunk;
2200   return POOL_LIMIT (pool);
2201 }
2202
2203 static cpp_chunk *
2204 new_chunk (size)
2205      unsigned int size;
2206 {
2207   unsigned char *base;
2208   cpp_chunk *result;
2209
2210   size = POOL_ALIGN (size, DEFAULT_ALIGNMENT);
2211   base = (unsigned char *) xmalloc (size + sizeof (cpp_chunk));
2212   /* Put the chunk descriptor at the end.  Then chunk overruns will
2213      cause obvious chaos.  */
2214   result = (cpp_chunk *) (base + size);
2215   result->base = base;
2216   result->front = base;
2217   result->limit = base + size;
2218   result->next = 0;
2219
2220   return result;
2221 }
2222
2223 void
2224 _cpp_init_pool (pool, size, align, temp)
2225      cpp_pool *pool;
2226      unsigned int size, align, temp;
2227 {
2228   if (align == 0)
2229     align = DEFAULT_ALIGNMENT;
2230   if (align & (align - 1))
2231     abort ();
2232   pool->align = align;
2233   pool->cur = new_chunk (size);
2234   pool->locked = 0;
2235   pool->locks = 0;
2236   if (temp)
2237     pool->cur->next = pool->cur;
2238 }
2239
2240 void
2241 _cpp_lock_pool (pool)
2242      cpp_pool *pool;
2243 {
2244   if (pool->locks++ == 0)
2245     pool->locked = pool->cur;
2246 }
2247
2248 void
2249 _cpp_unlock_pool (pool)
2250      cpp_pool *pool;
2251 {
2252   if (--pool->locks == 0)
2253     pool->locked = 0;
2254 }
2255
2256 void
2257 _cpp_free_pool (pool)
2258      cpp_pool *pool;
2259 {
2260   cpp_chunk *chunk = pool->cur, *next;
2261
2262   do
2263     {
2264       next = chunk->next;
2265       free (chunk->base);
2266       chunk = next;
2267     }
2268   while (chunk && chunk != pool->cur);
2269 }
2270
2271 /* Reserve LEN bytes from a memory pool.  */
2272 unsigned char *
2273 _cpp_pool_reserve (pool, len)
2274      cpp_pool *pool;
2275      unsigned int len;
2276 {
2277   len = POOL_ALIGN (len, pool->align);
2278   if (len > (unsigned int) POOL_ROOM (pool))
2279     _cpp_next_chunk (pool, len, 0);
2280
2281   return POOL_FRONT (pool);
2282 }
2283
2284 /* Allocate LEN bytes from a memory pool.  */
2285 unsigned char *
2286 _cpp_pool_alloc (pool, len)
2287      cpp_pool *pool;
2288      unsigned int len;
2289 {
2290   unsigned char *result = _cpp_pool_reserve (pool, len);
2291
2292   POOL_COMMIT (pool, len);
2293   return result;
2294 }