OSDN Git Service

* traditional.c (_cpp_scan_out_logical_line): Initialize
[pf3gnuchains/gcc-fork.git] / libcpp / traditional.c
1 /* CPP Library - traditional lexical analysis and macro expansion.
2    Copyright (C) 2002, 2004, 2005, 2007 Free Software Foundation, Inc.
3    Contributed by Neil Booth, May 2002
4
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
8 later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19 #include "config.h"
20 #include "system.h"
21 #include "cpplib.h"
22 #include "internal.h"
23
24 /* The replacement text of a function-like macro is stored as a
25    contiguous sequence of aligned blocks, each representing the text
26    between subsequent parameters.
27
28    Each block comprises the text between its surrounding parameters,
29    the length of that text, and the one-based index of the following
30    parameter.  The final block in the replacement text is easily
31    recognizable as it has an argument index of zero.  */
32
33 struct block
34 {
35   unsigned int text_len;
36   unsigned short arg_index;
37   uchar text[1];
38 };
39
40 #define BLOCK_HEADER_LEN offsetof (struct block, text)
41 #define BLOCK_LEN(TEXT_LEN) CPP_ALIGN (BLOCK_HEADER_LEN + (TEXT_LEN))
42
43 /* Structure holding information about a function-like macro
44    invocation.  */
45 struct fun_macro
46 {
47   /* Memory buffer holding the trad_arg array.  */
48   _cpp_buff *buff;
49
50   /* An array of size the number of macro parameters + 1, containing
51      the offsets of the start of each macro argument in the output
52      buffer.  The argument continues until the character before the
53      start of the next one.  */
54   size_t *args;
55
56   /* The hashnode of the macro.  */
57   cpp_hashnode *node;
58
59   /* The offset of the macro name in the output buffer.  */
60   size_t offset;
61
62   /* The line the macro name appeared on.  */
63   unsigned int line;
64
65   /* Zero-based index of argument being currently lexed.  */
66   unsigned int argc;
67 };
68
69 /* Lexing state.  It is mostly used to prevent macro expansion.  */
70 enum ls {ls_none = 0,           /* Normal state.  */
71          ls_fun_open,           /* When looking for '('.  */
72          ls_fun_close,          /* When looking for ')'.  */
73          ls_defined,            /* After defined.  */
74          ls_defined_close,      /* Looking for ')' of defined().  */
75          ls_hash,               /* After # in preprocessor conditional.  */
76          ls_predicate,          /* After the predicate, maybe paren?  */
77          ls_answer};            /* In answer to predicate.  */
78
79 /* Lexing TODO: Maybe handle space in escaped newlines.  Stop lex.c
80    from recognizing comments and directives during its lexing pass.  */
81
82 static const uchar *skip_whitespace (cpp_reader *, const uchar *, int);
83 static cpp_hashnode *lex_identifier (cpp_reader *, const uchar *);
84 static const uchar *copy_comment (cpp_reader *, const uchar *, int);
85 static void check_output_buffer (cpp_reader *, size_t);
86 static void push_replacement_text (cpp_reader *, cpp_hashnode *);
87 static bool scan_parameters (cpp_reader *, cpp_macro *);
88 static bool recursive_macro (cpp_reader *, cpp_hashnode *);
89 static void save_replacement_text (cpp_reader *, cpp_macro *, unsigned int);
90 static void maybe_start_funlike (cpp_reader *, cpp_hashnode *, const uchar *,
91                                  struct fun_macro *);
92 static void save_argument (struct fun_macro *, size_t);
93 static void replace_args_and_push (cpp_reader *, struct fun_macro *);
94 static size_t canonicalize_text (uchar *, const uchar *, size_t, uchar *);
95
96 /* Ensures we have N bytes' space in the output buffer, and
97    reallocates it if not.  */
98 static void
99 check_output_buffer (cpp_reader *pfile, size_t n)
100 {
101   /* We might need two bytes to terminate an unterminated comment, and
102      one more to terminate the line with a NUL.  */
103   n += 2 + 1;
104
105   if (n > (size_t) (pfile->out.limit - pfile->out.cur))
106     {
107       size_t size = pfile->out.cur - pfile->out.base;
108       size_t new_size = (size + n) * 3 / 2;
109
110       pfile->out.base = XRESIZEVEC (unsigned char, pfile->out.base, new_size);
111       pfile->out.limit = pfile->out.base + new_size;
112       pfile->out.cur = pfile->out.base + size;
113     }
114 }
115
116 /* Skip a C-style block comment in a macro as a result of -CC.
117    Buffer->cur points to the initial asterisk of the comment.  */
118 static void
119 skip_macro_block_comment (cpp_reader *pfile)
120 {
121   const uchar *cur = pfile->buffer->cur;
122
123   cur++;
124   if (*cur == '/')
125     cur++;
126
127   /* People like decorating comments with '*', so check for '/'
128      instead for efficiency.  */
129   while(! (*cur++ == '/' && cur[-2] == '*') )
130     ;
131
132   pfile->buffer->cur = cur;
133 }
134
135 /* CUR points to the asterisk introducing a comment in the current
136    context.  IN_DEFINE is true if we are in the replacement text of a
137    macro.
138
139    The asterisk and following comment is copied to the buffer pointed
140    to by pfile->out.cur, which must be of sufficient size.
141    Unterminated comments are diagnosed, and correctly terminated in
142    the output.  pfile->out.cur is updated depending upon IN_DEFINE,
143    -C, -CC and pfile->state.in_directive.
144
145    Returns a pointer to the first character after the comment in the
146    input buffer.  */
147 static const uchar *
148 copy_comment (cpp_reader *pfile, const uchar *cur, int in_define)
149 {
150   bool unterminated, copy = false;
151   source_location src_loc = pfile->line_table->highest_line;
152   cpp_buffer *buffer = pfile->buffer;
153
154   buffer->cur = cur;
155   if (pfile->context->prev)
156     unterminated = false, skip_macro_block_comment (pfile);
157   else
158     unterminated = _cpp_skip_block_comment (pfile);
159     
160   if (unterminated)
161     cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0,
162                          "unterminated comment");
163
164   /* Comments in directives become spaces so that tokens are properly
165      separated when the ISO preprocessor re-lexes the line.  The
166      exception is #define.  */
167   if (pfile->state.in_directive)
168     {
169       if (in_define)
170         {
171           if (CPP_OPTION (pfile, discard_comments_in_macro_exp))
172             pfile->out.cur--;
173           else
174             copy = true;
175         }
176       else
177         pfile->out.cur[-1] = ' ';
178     }
179   else if (CPP_OPTION (pfile, discard_comments))
180     pfile->out.cur--;
181   else
182     copy = true;
183
184   if (copy)
185     {
186       size_t len = (size_t) (buffer->cur - cur);
187       memcpy (pfile->out.cur, cur, len);
188       pfile->out.cur += len;
189       if (unterminated)
190         {
191           *pfile->out.cur++ = '*';
192           *pfile->out.cur++ = '/';
193         }
194     }
195
196   return buffer->cur;
197 }
198
199 /* CUR points to any character in the input buffer.  Skips over all
200    contiguous horizontal white space and NULs, including comments if
201    SKIP_COMMENTS, until reaching the first non-horizontal-whitespace
202    character or the end of the current context.  Escaped newlines are
203    removed.
204
205    The whitespace is copied verbatim to the output buffer, except that
206    comments are handled as described in copy_comment().
207    pfile->out.cur is updated.
208
209    Returns a pointer to the first character after the whitespace in
210    the input buffer.  */
211 static const uchar *
212 skip_whitespace (cpp_reader *pfile, const uchar *cur, int skip_comments)
213 {
214   uchar *out = pfile->out.cur;
215
216   for (;;)
217     {
218       unsigned int c = *cur++;
219       *out++ = c;
220
221       if (is_nvspace (c))
222         continue;
223
224       if (c == '/' && *cur == '*' && skip_comments)
225         {
226           pfile->out.cur = out;
227           cur = copy_comment (pfile, cur, false /* in_define */);
228           out = pfile->out.cur;
229           continue;
230         }
231
232       out--;
233       break;
234     }
235
236   pfile->out.cur = out;
237   return cur - 1;
238 }
239
240 /* Lexes and outputs an identifier starting at CUR, which is assumed
241    to point to a valid first character of an identifier.  Returns
242    the hashnode, and updates out.cur.  */
243 static cpp_hashnode *
244 lex_identifier (cpp_reader *pfile, const uchar *cur)
245 {
246   size_t len;
247   uchar *out = pfile->out.cur;
248   cpp_hashnode *result;
249
250   do
251     *out++ = *cur++;
252   while (is_numchar (*cur));
253
254   CUR (pfile->context) = cur;
255   len = out - pfile->out.cur;
256   result = (cpp_hashnode *) ht_lookup (pfile->hash_table, pfile->out.cur,
257                                        len, HT_ALLOC);
258   pfile->out.cur = out;
259   return result;
260 }
261
262 /* Overlays the true file buffer temporarily with text of length LEN
263    starting at START.  The true buffer is restored upon calling
264    restore_buff().  */
265 void
266 _cpp_overlay_buffer (cpp_reader *pfile, const uchar *start, size_t len)
267 {
268   cpp_buffer *buffer = pfile->buffer;
269
270   pfile->overlaid_buffer = buffer;
271   pfile->saved_cur = buffer->cur;
272   pfile->saved_rlimit = buffer->rlimit;
273   pfile->saved_line_base = buffer->next_line;
274   buffer->need_line = false;
275
276   buffer->cur = start;
277   buffer->line_base = start;
278   buffer->rlimit = start + len;
279 }
280
281 /* Restores a buffer overlaid by _cpp_overlay_buffer().  */
282 void
283 _cpp_remove_overlay (cpp_reader *pfile)
284 {
285   cpp_buffer *buffer = pfile->overlaid_buffer;
286
287   buffer->cur = pfile->saved_cur;
288   buffer->rlimit = pfile->saved_rlimit;
289   buffer->line_base = pfile->saved_line_base;
290   buffer->need_line = true;
291
292   pfile->overlaid_buffer = NULL;
293 }
294
295 /* Reads a logical line into the output buffer.  Returns TRUE if there
296    is more text left in the buffer.  */
297 bool
298 _cpp_read_logical_line_trad (cpp_reader *pfile)
299 {
300   do
301     {
302       if (pfile->buffer->need_line && !_cpp_get_fresh_line (pfile))
303         return false;
304     }
305   while (!_cpp_scan_out_logical_line (pfile, NULL) || pfile->state.skipping);
306
307   return pfile->buffer != NULL;
308 }
309
310 /* Set up state for finding the opening '(' of a function-like
311    macro.  */
312 static void
313 maybe_start_funlike (cpp_reader *pfile, cpp_hashnode *node, const uchar *start, struct fun_macro *macro)
314 {
315   unsigned int n = node->value.macro->paramc + 1;
316
317   if (macro->buff)
318     _cpp_release_buff (pfile, macro->buff);
319   macro->buff = _cpp_get_buff (pfile, n * sizeof (size_t));
320   macro->args = (size_t *) BUFF_FRONT (macro->buff);
321   macro->node = node;
322   macro->offset = start - pfile->out.base;
323   macro->argc = 0;
324 }
325
326 /* Save the OFFSET of the start of the next argument to MACRO.  */
327 static void
328 save_argument (struct fun_macro *macro, size_t offset)
329 {
330   macro->argc++;
331   if (macro->argc <= macro->node->value.macro->paramc)
332     macro->args[macro->argc] = offset;
333 }
334
335 /* Copies the next logical line in the current buffer (starting at
336    buffer->cur) to the output buffer.  The output is guaranteed to
337    terminate with a NUL character.  buffer->cur is updated.
338
339    If MACRO is non-NULL, then we are scanning the replacement list of
340    MACRO, and we call save_replacement_text() every time we meet an
341    argument.  */
342 bool
343 _cpp_scan_out_logical_line (cpp_reader *pfile, cpp_macro *macro)
344 {
345   bool result = true;
346   cpp_context *context;
347   const uchar *cur;
348   uchar *out;
349   struct fun_macro fmacro;
350   unsigned int c, paren_depth = 0, quote;
351   enum ls lex_state = ls_none;
352   bool header_ok;
353   const uchar *start_of_input_line;
354
355   fmacro.buff = NULL;
356   fmacro.args = NULL;
357   fmacro.node = NULL;
358   fmacro.offset = 0;
359   fmacro.line = 0;
360   fmacro.argc = 0;
361
362   quote = 0;
363   header_ok = pfile->state.angled_headers;
364   CUR (pfile->context) = pfile->buffer->cur;
365   RLIMIT (pfile->context) = pfile->buffer->rlimit;
366   pfile->out.cur = pfile->out.base;
367   pfile->out.first_line = pfile->line_table->highest_line;
368   /* start_of_input_line is needed to make sure that directives really,
369      really start at the first character of the line.  */
370   start_of_input_line = pfile->buffer->cur;
371  new_context:
372   context = pfile->context;
373   cur = CUR (context);
374   check_output_buffer (pfile, RLIMIT (context) - cur);
375   out = pfile->out.cur;
376
377   for (;;)
378     {
379       if (!context->prev
380           && cur >= pfile->buffer->notes[pfile->buffer->cur_note].pos)
381         {
382           pfile->buffer->cur = cur;
383           _cpp_process_line_notes (pfile, false);
384         }
385       c = *cur++;
386       *out++ = c;
387
388       /* Whitespace should "continue" out of the switch,
389          non-whitespace should "break" out of it.  */
390       switch (c)
391         {
392         case ' ':
393         case '\t':
394         case '\f':
395         case '\v':
396         case '\0':
397           continue;
398
399         case '\n':
400           /* If this is a macro's expansion, pop it.  */
401           if (context->prev)
402             {
403               pfile->out.cur = out - 1;
404               _cpp_pop_context (pfile);
405               goto new_context;
406             }
407
408           /* Omit the newline from the output buffer.  */
409           pfile->out.cur = out - 1;
410           pfile->buffer->cur = cur;
411           pfile->buffer->need_line = true;
412           CPP_INCREMENT_LINE (pfile, 0);
413
414           if ((lex_state == ls_fun_open || lex_state == ls_fun_close)
415               && !pfile->state.in_directive
416               && _cpp_get_fresh_line (pfile))
417             {
418               /* Newlines in arguments become a space, but we don't
419                  clear any in-progress quote.  */
420               if (lex_state == ls_fun_close)
421                 out[-1] = ' ';
422               cur = pfile->buffer->cur;
423               continue;
424             }
425           goto done;
426
427         case '<':
428           if (header_ok)
429             quote = '>';
430           break;
431         case '>':
432           if (c == quote)
433             quote = 0;
434           break;
435
436         case '"':
437         case '\'':
438           if (c == quote)
439             quote = 0;
440           else if (!quote)
441             quote = c;
442           break;
443
444         case '\\':
445           /* Skip escaped quotes here, it's easier than above.  */
446           if (*cur == '\\' || *cur == '"' || *cur == '\'')
447             *out++ = *cur++;
448           break;
449
450         case '/':
451           /* Traditional CPP does not recognize comments within
452              literals.  */
453           if (!quote && *cur == '*')
454             {
455               pfile->out.cur = out;
456               cur = copy_comment (pfile, cur, macro != 0);
457               out = pfile->out.cur;
458               continue;
459             }
460           break;
461
462         case '_':
463         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
464         case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
465         case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
466         case 's': case 't': case 'u': case 'v': case 'w': case 'x':
467         case 'y': case 'z':
468         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
469         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
470         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
471         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
472         case 'Y': case 'Z':
473           if (!pfile->state.skipping && (quote == 0 || macro))
474             {
475               cpp_hashnode *node;
476               uchar *out_start = out - 1;
477
478               pfile->out.cur = out_start;
479               node = lex_identifier (pfile, cur - 1);
480               out = pfile->out.cur;
481               cur = CUR (context);
482
483               if (node->type == NT_MACRO
484                   /* Should we expand for ls_answer?  */
485                   && (lex_state == ls_none || lex_state == ls_fun_open)
486                   && !pfile->state.prevent_expansion)
487                 {
488                   /* Macros invalidate MI optimization.  */
489                   pfile->mi_valid = false;
490                   if (! (node->flags & NODE_BUILTIN)
491                       && node->value.macro->fun_like)
492                     {
493                       maybe_start_funlike (pfile, node, out_start, &fmacro);
494                       lex_state = ls_fun_open;
495                       fmacro.line = pfile->line_table->highest_line;
496                       continue;
497                     }
498                   else if (!recursive_macro (pfile, node))
499                     {
500                       /* Remove the object-like macro's name from the
501                          output, and push its replacement text.  */
502                       pfile->out.cur = out_start;
503                       push_replacement_text (pfile, node);
504                       lex_state = ls_none;
505                       goto new_context;
506                     }
507                 }
508               else if (macro && (node->flags & NODE_MACRO_ARG) != 0)
509                 {
510                   /* Found a parameter in the replacement text of a
511                      #define.  Remove its name from the output.  */
512                   pfile->out.cur = out_start;
513                   save_replacement_text (pfile, macro, node->value.arg_index);
514                   out = pfile->out.base;
515                 }
516               else if (lex_state == ls_hash)
517                 {
518                   lex_state = ls_predicate;
519                   continue;
520                 }
521               else if (pfile->state.in_expression
522                        && node == pfile->spec_nodes.n_defined)
523                 {
524                   lex_state = ls_defined;
525                   continue;
526                 }
527             }
528           break;
529
530         case '(':
531           if (quote == 0)
532             {
533               paren_depth++;
534               if (lex_state == ls_fun_open)
535                 {
536                   if (recursive_macro (pfile, fmacro.node))
537                     lex_state = ls_none;
538                   else
539                     {
540                       lex_state = ls_fun_close;
541                       paren_depth = 1;
542                       out = pfile->out.base + fmacro.offset;
543                       fmacro.args[0] = fmacro.offset;
544                     }
545                 }
546               else if (lex_state == ls_predicate)
547                 lex_state = ls_answer;
548               else if (lex_state == ls_defined)
549                 lex_state = ls_defined_close;
550             }
551           break;
552
553         case ',':
554           if (quote == 0 && lex_state == ls_fun_close && paren_depth == 1)
555             save_argument (&fmacro, out - pfile->out.base);
556           break;
557
558         case ')':
559           if (quote == 0)
560             {
561               paren_depth--;
562               if (lex_state == ls_fun_close && paren_depth == 0)
563                 {
564                   cpp_macro *m = fmacro.node->value.macro;
565
566                   m->used = 1;
567                   lex_state = ls_none;
568                   save_argument (&fmacro, out - pfile->out.base);
569
570                   /* A single zero-length argument is no argument.  */
571                   if (fmacro.argc == 1
572                       && m->paramc == 0
573                       && out == pfile->out.base + fmacro.offset + 1)
574                     fmacro.argc = 0;
575
576                   if (_cpp_arguments_ok (pfile, m, fmacro.node, fmacro.argc))
577                     {
578                       /* Remove the macro's invocation from the
579                          output, and push its replacement text.  */
580                       pfile->out.cur = (pfile->out.base
581                                              + fmacro.offset);
582                       CUR (context) = cur;
583                       replace_args_and_push (pfile, &fmacro);
584                       goto new_context;
585                     }
586                 }
587               else if (lex_state == ls_answer || lex_state == ls_defined_close)
588                 lex_state = ls_none;
589             }
590           break;
591
592         case '#':
593           if (cur - 1 == start_of_input_line
594               /* A '#' from a macro doesn't start a directive.  */
595               && !pfile->context->prev
596               && !pfile->state.in_directive)
597             {
598               /* A directive.  With the way _cpp_handle_directive
599                  currently works, we only want to call it if either we
600                  know the directive is OK, or we want it to fail and
601                  be removed from the output.  If we want it to be
602                  passed through (the assembler case) then we must not
603                  call _cpp_handle_directive.  */
604               pfile->out.cur = out;
605               cur = skip_whitespace (pfile, cur, true /* skip_comments */);
606               out = pfile->out.cur;
607
608               if (*cur == '\n')
609                 {
610                   /* Null directive.  Ignore it and don't invalidate
611                      the MI optimization.  */
612                   pfile->buffer->need_line = true;
613                   CPP_INCREMENT_LINE (pfile, 0);
614                   result = false;
615                   goto done;
616                 }
617               else
618                 {
619                   bool do_it = false;
620
621                   if (is_numstart (*cur)
622                       && CPP_OPTION (pfile, lang) != CLK_ASM)
623                     do_it = true;
624                   else if (is_idstart (*cur))
625                     /* Check whether we know this directive, but don't
626                        advance.  */
627                     do_it = lex_identifier (pfile, cur)->is_directive;
628
629                   if (do_it || CPP_OPTION (pfile, lang) != CLK_ASM)
630                     {
631                       /* This is a kludge.  We want to have the ISO
632                          preprocessor lex the next token.  */
633                       pfile->buffer->cur = cur;
634                       _cpp_handle_directive (pfile, false /* indented */);
635                       result = false;
636                       goto done;
637                     }
638                 }
639             }
640
641           if (pfile->state.in_expression)
642             {
643               lex_state = ls_hash;
644               continue;
645             }
646           break;
647
648         default:
649           break;
650         }
651
652       /* Non-whitespace disables MI optimization and stops treating
653          '<' as a quote in #include.  */
654       header_ok = false;
655       if (!pfile->state.in_directive)
656         pfile->mi_valid = false;
657
658       if (lex_state == ls_none)
659         continue;
660
661       /* Some of these transitions of state are syntax errors.  The
662          ISO preprocessor will issue errors later.  */
663       if (lex_state == ls_fun_open)
664         /* Missing '('.  */
665         lex_state = ls_none;
666       else if (lex_state == ls_hash
667                || lex_state == ls_predicate
668                || lex_state == ls_defined)
669         lex_state = ls_none;
670
671       /* ls_answer and ls_defined_close keep going until ')'.  */
672     }
673
674  done:
675   if (fmacro.buff)
676     _cpp_release_buff (pfile, fmacro.buff);
677
678   if (lex_state == ls_fun_close)
679     cpp_error_with_line (pfile, CPP_DL_ERROR, fmacro.line, 0,
680                          "unterminated argument list invoking macro \"%s\"",
681                          NODE_NAME (fmacro.node));
682   return result;
683 }
684
685 /* Push a context holding the replacement text of the macro NODE on
686    the context stack.  NODE is either object-like, or a function-like
687    macro with no arguments.  */
688 static void
689 push_replacement_text (cpp_reader *pfile, cpp_hashnode *node)
690 {
691   size_t len;
692   const uchar *text;
693   uchar *buf;
694
695   if (node->flags & NODE_BUILTIN)
696     {
697       text = _cpp_builtin_macro_text (pfile, node);
698       len = ustrlen (text);
699       buf = _cpp_unaligned_alloc (pfile, len + 1);
700       memcpy (buf, text, len);
701       buf[len]='\n';
702       text = buf;
703     }
704   else
705     {
706       cpp_macro *macro = node->value.macro;
707       macro->used = 1;
708       text = macro->exp.text;
709       macro->traditional = 1;
710       len = macro->count;
711     }
712
713   _cpp_push_text_context (pfile, node, text, len);
714 }
715
716 /* Returns TRUE if traditional macro recursion is detected.  */
717 static bool
718 recursive_macro (cpp_reader *pfile, cpp_hashnode *node)
719 {
720   bool recursing = !!(node->flags & NODE_DISABLED);
721
722   /* Object-like macros that are already expanding are necessarily
723      recursive.
724
725      However, it is possible to have traditional function-like macros
726      that are not infinitely recursive but recurse to any given depth.
727      Further, it is easy to construct examples that get ever longer
728      until the point they stop recursing.  So there is no easy way to
729      detect true recursion; instead we assume any expansion more than
730      20 deep since the first invocation of this macro must be
731      recursing.  */
732   if (recursing && node->value.macro->fun_like)
733     {
734       size_t depth = 0;
735       cpp_context *context = pfile->context;
736
737       do
738         {
739           depth++;
740           if (context->macro == node && depth > 20)
741             break;
742           context = context->prev;
743         }
744       while (context);
745       recursing = context != NULL;
746     }
747
748   if (recursing)
749     cpp_error (pfile, CPP_DL_ERROR,
750                "detected recursion whilst expanding macro \"%s\"",
751                NODE_NAME (node));
752
753   return recursing;
754 }
755
756 /* Return the length of the replacement text of a function-like or
757    object-like non-builtin macro.  */
758 size_t
759 _cpp_replacement_text_len (const cpp_macro *macro)
760 {
761   size_t len;
762
763   if (macro->fun_like && (macro->paramc != 0))
764     {
765       const uchar *exp;
766
767       len = 0;
768       for (exp = macro->exp.text;;)
769         {
770           struct block *b = (struct block *) exp;
771
772           len += b->text_len;
773           if (b->arg_index == 0)
774             break;
775           len += NODE_LEN (macro->params[b->arg_index - 1]);
776           exp += BLOCK_LEN (b->text_len);
777         }
778     }
779   else
780     len = macro->count;
781   
782   return len;
783 }
784
785 /* Copy the replacement text of MACRO to DEST, which must be of
786    sufficient size.  It is not NUL-terminated.  The next character is
787    returned.  */
788 uchar *
789 _cpp_copy_replacement_text (const cpp_macro *macro, uchar *dest)
790 {
791   if (macro->fun_like && (macro->paramc != 0))
792     {
793       const uchar *exp;
794
795       for (exp = macro->exp.text;;)
796         {
797           struct block *b = (struct block *) exp;
798           cpp_hashnode *param;
799
800           memcpy (dest, b->text, b->text_len);
801           dest += b->text_len;
802           if (b->arg_index == 0)
803             break;
804           param = macro->params[b->arg_index - 1];
805           memcpy (dest, NODE_NAME (param), NODE_LEN (param));
806           dest += NODE_LEN (param);
807           exp += BLOCK_LEN (b->text_len);
808         }
809     }
810   else
811     {
812       memcpy (dest, macro->exp.text, macro->count);
813       dest += macro->count;
814     }
815
816   return dest;
817 }
818
819 /* Push a context holding the replacement text of the macro NODE on
820    the context stack.  NODE is either object-like, or a function-like
821    macro with no arguments.  */
822 static void
823 replace_args_and_push (cpp_reader *pfile, struct fun_macro *fmacro)
824 {
825   cpp_macro *macro = fmacro->node->value.macro;
826
827   if (macro->paramc == 0)
828     push_replacement_text (pfile, fmacro->node);
829   else
830     {
831       const uchar *exp;
832       uchar *p;
833       _cpp_buff *buff;
834       size_t len = 0;
835
836       /* Calculate the length of the argument-replaced text.  */
837       for (exp = macro->exp.text;;)
838         {
839           struct block *b = (struct block *) exp;
840
841           len += b->text_len;
842           if (b->arg_index == 0)
843             break;
844           len += (fmacro->args[b->arg_index]
845                   - fmacro->args[b->arg_index - 1] - 1);
846           exp += BLOCK_LEN (b->text_len);
847         }
848
849       /* Allocate room for the expansion plus \n.  */
850       buff = _cpp_get_buff (pfile, len + 1);
851
852       /* Copy the expansion and replace arguments.  */
853       p = BUFF_FRONT (buff);
854       for (exp = macro->exp.text;;)
855         {
856           struct block *b = (struct block *) exp;
857           size_t arglen;
858
859           memcpy (p, b->text, b->text_len);
860           p += b->text_len;
861           if (b->arg_index == 0)
862             break;
863           arglen = (fmacro->args[b->arg_index]
864                     - fmacro->args[b->arg_index - 1] - 1);
865           memcpy (p, pfile->out.base + fmacro->args[b->arg_index - 1],
866                   arglen);
867           p += arglen;
868           exp += BLOCK_LEN (b->text_len);
869         }
870
871       /* \n-terminate.  */
872       *p = '\n';
873       _cpp_push_text_context (pfile, fmacro->node, BUFF_FRONT (buff), len);
874
875       /* So we free buffer allocation when macro is left.  */
876       pfile->context->buff = buff;
877     }
878 }
879
880 /* Read and record the parameters, if any, of a function-like macro
881    definition.  Destroys pfile->out.cur.
882
883    Returns true on success, false on failure (syntax error or a
884    duplicate parameter).  On success, CUR (pfile->context) is just
885    past the closing parenthesis.  */
886 static bool
887 scan_parameters (cpp_reader *pfile, cpp_macro *macro)
888 {
889   const uchar *cur = CUR (pfile->context) + 1;
890   bool ok;
891
892   for (;;)
893     {
894       cur = skip_whitespace (pfile, cur, true /* skip_comments */);
895
896       if (is_idstart (*cur))
897         {
898           ok = false;
899           if (_cpp_save_parameter (pfile, macro, lex_identifier (pfile, cur)))
900             break;
901           cur = skip_whitespace (pfile, CUR (pfile->context),
902                                  true /* skip_comments */);
903           if (*cur == ',')
904             {
905               cur++;
906               continue;
907             }
908           ok = (*cur == ')');
909           break;
910         }
911
912       ok = (*cur == ')' && macro->paramc == 0);
913       break;
914     }
915
916   if (!ok)
917     cpp_error (pfile, CPP_DL_ERROR, "syntax error in macro parameter list");
918
919   CUR (pfile->context) = cur + (*cur == ')');
920
921   return ok;
922 }
923
924 /* Save the text from pfile->out.base to pfile->out.cur as
925    the replacement text for the current macro, followed by argument
926    ARG_INDEX, with zero indicating the end of the replacement
927    text.  */
928 static void
929 save_replacement_text (cpp_reader *pfile, cpp_macro *macro,
930                        unsigned int arg_index)
931 {
932   size_t len = pfile->out.cur - pfile->out.base;
933   uchar *exp;
934
935   if (macro->paramc == 0)
936     {
937       /* Object-like and function-like macros without parameters
938          simply store their \n-terminated replacement text.  */
939       exp = _cpp_unaligned_alloc (pfile, len + 1);
940       memcpy (exp, pfile->out.base, len);
941       exp[len] = '\n';
942       macro->exp.text = exp;
943       macro->traditional = 1;
944       macro->count = len;
945     }
946   else
947     {
948       /* Store the text's length (unsigned int), the argument index
949          (unsigned short, base 1) and then the text.  */
950       size_t blen = BLOCK_LEN (len);
951       struct block *block;
952
953       if (macro->count + blen > BUFF_ROOM (pfile->a_buff))
954         _cpp_extend_buff (pfile, &pfile->a_buff, macro->count + blen);
955
956       exp = BUFF_FRONT (pfile->a_buff);
957       block = (struct block *) (exp + macro->count);
958       macro->exp.text = exp;
959       macro->traditional = 1;
960
961       /* Write out the block information.  */
962       block->text_len = len;
963       block->arg_index = arg_index;
964       memcpy (block->text, pfile->out.base, len);
965
966       /* Lex the rest into the start of the output buffer.  */
967       pfile->out.cur = pfile->out.base;
968
969       macro->count += blen;
970
971       /* If we've finished, commit the memory.  */
972       if (arg_index == 0)
973         BUFF_FRONT (pfile->a_buff) += macro->count;
974     }
975 }
976
977 /* Analyze and save the replacement text of a macro.  Returns true on
978    success.  */
979 bool
980 _cpp_create_trad_definition (cpp_reader *pfile, cpp_macro *macro)
981 {
982   const uchar *cur;
983   uchar *limit;
984   cpp_context *context = pfile->context;
985
986   /* The context has not been set up for command line defines, and CUR
987      has not been updated for the macro name for in-file defines.  */
988   pfile->out.cur = pfile->out.base;
989   CUR (context) = pfile->buffer->cur;
990   RLIMIT (context) = pfile->buffer->rlimit;
991   check_output_buffer (pfile, RLIMIT (context) - CUR (context));
992
993   /* Is this a function-like macro?  */
994   if (* CUR (context) == '(')
995     {
996       bool ok = scan_parameters (pfile, macro);
997
998       /* Remember the params so we can clear NODE_MACRO_ARG flags.  */
999       macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff);
1000
1001       /* Setting macro to NULL indicates an error occurred, and
1002          prevents unnecessary work in _cpp_scan_out_logical_line.  */
1003       if (!ok)
1004         macro = NULL;
1005       else
1006         {
1007           BUFF_FRONT (pfile->a_buff) = (uchar *) &macro->params[macro->paramc];
1008           macro->fun_like = 1;
1009         }
1010     }
1011
1012   /* Skip leading whitespace in the replacement text.  */
1013   pfile->buffer->cur
1014     = skip_whitespace (pfile, CUR (context),
1015                        CPP_OPTION (pfile, discard_comments_in_macro_exp));
1016
1017   pfile->state.prevent_expansion++;
1018   _cpp_scan_out_logical_line (pfile, macro);
1019   pfile->state.prevent_expansion--;
1020
1021   if (!macro)
1022     return false;
1023
1024   /* Skip trailing white space.  */
1025   cur = pfile->out.base;
1026   limit = pfile->out.cur;
1027   while (limit > cur && is_space (limit[-1]))
1028     limit--;
1029   pfile->out.cur = limit;
1030   save_replacement_text (pfile, macro, 0);
1031
1032   return true;
1033 }
1034
1035 /* Copy SRC of length LEN to DEST, but convert all contiguous
1036    whitespace to a single space, provided it is not in quotes.  The
1037    quote currently in effect is pointed to by PQUOTE, and is updated
1038    by the function.  Returns the number of bytes copied.  */
1039 static size_t
1040 canonicalize_text (uchar *dest, const uchar *src, size_t len, uchar *pquote)
1041 {
1042   uchar *orig_dest = dest;
1043   uchar quote = *pquote;
1044
1045   while (len)
1046     {
1047       if (is_space (*src) && !quote)
1048         {
1049           do
1050             src++, len--;
1051           while (len && is_space (*src));
1052           *dest++ = ' ';
1053         }
1054       else
1055         {
1056           if (*src == '\'' || *src == '"')
1057             {
1058               if (!quote)
1059                 quote = *src;
1060               else if (quote == *src)
1061                 quote = 0;
1062             }
1063           *dest++ = *src++, len--;
1064         }
1065     }
1066
1067   *pquote = quote;
1068   return dest - orig_dest;
1069 }
1070
1071 /* Returns true if MACRO1 and MACRO2 have expansions different other
1072    than in the form of their whitespace.  */
1073 bool
1074 _cpp_expansions_different_trad (const cpp_macro *macro1,
1075                                 const cpp_macro *macro2)
1076 {
1077   uchar *p1 = XNEWVEC (uchar, macro1->count + macro2->count);
1078   uchar *p2 = p1 + macro1->count;
1079   uchar quote1 = 0, quote2 = 0;
1080   bool mismatch;
1081   size_t len1, len2;
1082
1083   if (macro1->paramc > 0)
1084     {
1085       const uchar *exp1 = macro1->exp.text, *exp2 = macro2->exp.text;
1086
1087       mismatch = true;
1088       for (;;)
1089         {
1090           struct block *b1 = (struct block *) exp1;
1091           struct block *b2 = (struct block *) exp2;
1092
1093           if (b1->arg_index != b2->arg_index)
1094             break;
1095
1096           len1 = canonicalize_text (p1, b1->text, b1->text_len, &quote1);
1097           len2 = canonicalize_text (p2, b2->text, b2->text_len, &quote2);
1098           if (len1 != len2 || memcmp (p1, p2, len1))
1099             break;
1100           if (b1->arg_index == 0)
1101             {
1102               mismatch = false;
1103               break;
1104             }
1105           exp1 += BLOCK_LEN (b1->text_len);
1106           exp2 += BLOCK_LEN (b2->text_len);
1107         }
1108     }
1109   else
1110     {
1111       len1 = canonicalize_text (p1, macro1->exp.text, macro1->count, &quote1);
1112       len2 = canonicalize_text (p2, macro2->exp.text, macro2->count, &quote2);
1113       mismatch = (len1 != len2 || memcmp (p1, p2, len1));
1114     }
1115
1116   free (p1);
1117   return mismatch;
1118 }