source: trunk/src/gcc/gcc/cpplex.c@ 1392

Last change on this file since 1392 was 1392, checked in by bird, 21 years ago

This commit was generated by cvs2svn to compensate for changes in r1391,
which included commits to RCS files with non-trunk default branches.

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