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