OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.2.2/] [libcpp/] [traditional.c] - Blame information for rev 611

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* CPP Library - traditional lexical analysis and macro expansion.
2
   Copyright (C) 2002, 2004, 2005 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
 
357
  quote = 0;
358
  header_ok = pfile->state.angled_headers;
359
  CUR (pfile->context) = pfile->buffer->cur;
360
  RLIMIT (pfile->context) = pfile->buffer->rlimit;
361
  pfile->out.cur = pfile->out.base;
362
  pfile->out.first_line = pfile->line_table->highest_line;
363
  /* start_of_input_line is needed to make sure that directives really,
364
     really start at the first character of the line.  */
365
  start_of_input_line = pfile->buffer->cur;
366
 new_context:
367
  context = pfile->context;
368
  cur = CUR (context);
369
  check_output_buffer (pfile, RLIMIT (context) - cur);
370
  out = pfile->out.cur;
371
 
372
  for (;;)
373
    {
374
      if (!context->prev
375
          && cur >= pfile->buffer->notes[pfile->buffer->cur_note].pos)
376
        {
377
          pfile->buffer->cur = cur;
378
          _cpp_process_line_notes (pfile, false);
379
        }
380
      c = *cur++;
381
      *out++ = c;
382
 
383
      /* Whitespace should "continue" out of the switch,
384
         non-whitespace should "break" out of it.  */
385
      switch (c)
386
        {
387
        case ' ':
388
        case '\t':
389
        case '\f':
390
        case '\v':
391
        case '\0':
392
          continue;
393
 
394
        case '\n':
395
          /* If this is a macro's expansion, pop it.  */
396
          if (context->prev)
397
            {
398
              pfile->out.cur = out - 1;
399
              _cpp_pop_context (pfile);
400
              goto new_context;
401
            }
402
 
403
          /* Omit the newline from the output buffer.  */
404
          pfile->out.cur = out - 1;
405
          pfile->buffer->cur = cur;
406
          pfile->buffer->need_line = true;
407
          CPP_INCREMENT_LINE (pfile, 0);
408
 
409
          if ((lex_state == ls_fun_open || lex_state == ls_fun_close)
410
              && !pfile->state.in_directive
411
              && _cpp_get_fresh_line (pfile))
412
            {
413
              /* Newlines in arguments become a space, but we don't
414
                 clear any in-progress quote.  */
415
              if (lex_state == ls_fun_close)
416
                out[-1] = ' ';
417
              cur = pfile->buffer->cur;
418
              continue;
419
            }
420
          goto done;
421
 
422
        case '<':
423
          if (header_ok)
424
            quote = '>';
425
          break;
426
        case '>':
427
          if (c == quote)
428
            quote = 0;
429
          break;
430
 
431
        case '"':
432
        case '\'':
433
          if (c == quote)
434
            quote = 0;
435
          else if (!quote)
436
            quote = c;
437
          break;
438
 
439
        case '\\':
440
          /* Skip escaped quotes here, it's easier than above.  */
441
          if (*cur == '\\' || *cur == '"' || *cur == '\'')
442
            *out++ = *cur++;
443
          break;
444
 
445
        case '/':
446
          /* Traditional CPP does not recognize comments within
447
             literals.  */
448
          if (!quote && *cur == '*')
449
            {
450
              pfile->out.cur = out;
451
              cur = copy_comment (pfile, cur, macro != 0);
452
              out = pfile->out.cur;
453
              continue;
454
            }
455
          break;
456
 
457
        case '_':
458
        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
459
        case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
460
        case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
461
        case 's': case 't': case 'u': case 'v': case 'w': case 'x':
462
        case 'y': case 'z':
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
          if (!pfile->state.skipping && (quote == 0 || macro))
469
            {
470
              cpp_hashnode *node;
471
              uchar *out_start = out - 1;
472
 
473
              pfile->out.cur = out_start;
474
              node = lex_identifier (pfile, cur - 1);
475
              out = pfile->out.cur;
476
              cur = CUR (context);
477
 
478
              if (node->type == NT_MACRO
479
                  /* Should we expand for ls_answer?  */
480
                  && (lex_state == ls_none || lex_state == ls_fun_open)
481
                  && !pfile->state.prevent_expansion)
482
                {
483
                  /* Macros invalidate MI optimization.  */
484
                  pfile->mi_valid = false;
485
                  if (! (node->flags & NODE_BUILTIN)
486
                      && node->value.macro->fun_like)
487
                    {
488
                      maybe_start_funlike (pfile, node, out_start, &fmacro);
489
                      lex_state = ls_fun_open;
490
                      fmacro.line = pfile->line_table->highest_line;
491
                      continue;
492
                    }
493
                  else if (!recursive_macro (pfile, node))
494
                    {
495
                      /* Remove the object-like macro's name from the
496
                         output, and push its replacement text.  */
497
                      pfile->out.cur = out_start;
498
                      push_replacement_text (pfile, node);
499
                      lex_state = ls_none;
500
                      goto new_context;
501
                    }
502
                }
503
              else if (macro && (node->flags & NODE_MACRO_ARG) != 0)
504
                {
505
                  /* Found a parameter in the replacement text of a
506
                     #define.  Remove its name from the output.  */
507
                  pfile->out.cur = out_start;
508
                  save_replacement_text (pfile, macro, node->value.arg_index);
509
                  out = pfile->out.base;
510
                }
511
              else if (lex_state == ls_hash)
512
                {
513
                  lex_state = ls_predicate;
514
                  continue;
515
                }
516
              else if (pfile->state.in_expression
517
                       && node == pfile->spec_nodes.n_defined)
518
                {
519
                  lex_state = ls_defined;
520
                  continue;
521
                }
522
            }
523
          break;
524
 
525
        case '(':
526
          if (quote == 0)
527
            {
528
              paren_depth++;
529
              if (lex_state == ls_fun_open)
530
                {
531
                  if (recursive_macro (pfile, fmacro.node))
532
                    lex_state = ls_none;
533
                  else
534
                    {
535
                      lex_state = ls_fun_close;
536
                      paren_depth = 1;
537
                      out = pfile->out.base + fmacro.offset;
538
                      fmacro.args[0] = fmacro.offset;
539
                    }
540
                }
541
              else if (lex_state == ls_predicate)
542
                lex_state = ls_answer;
543
              else if (lex_state == ls_defined)
544
                lex_state = ls_defined_close;
545
            }
546
          break;
547
 
548
        case ',':
549
          if (quote == 0 && lex_state == ls_fun_close && paren_depth == 1)
550
            save_argument (&fmacro, out - pfile->out.base);
551
          break;
552
 
553
        case ')':
554
          if (quote == 0)
555
            {
556
              paren_depth--;
557
              if (lex_state == ls_fun_close && paren_depth == 0)
558
                {
559
                  cpp_macro *m = fmacro.node->value.macro;
560
 
561
                  m->used = 1;
562
                  lex_state = ls_none;
563
                  save_argument (&fmacro, out - pfile->out.base);
564
 
565
                  /* A single zero-length argument is no argument.  */
566
                  if (fmacro.argc == 1
567
                      && m->paramc == 0
568
                      && out == pfile->out.base + fmacro.offset + 1)
569
                    fmacro.argc = 0;
570
 
571
                  if (_cpp_arguments_ok (pfile, m, fmacro.node, fmacro.argc))
572
                    {
573
                      /* Remove the macro's invocation from the
574
                         output, and push its replacement text.  */
575
                      pfile->out.cur = (pfile->out.base
576
                                             + fmacro.offset);
577
                      CUR (context) = cur;
578
                      replace_args_and_push (pfile, &fmacro);
579
                      goto new_context;
580
                    }
581
                }
582
              else if (lex_state == ls_answer || lex_state == ls_defined_close)
583
                lex_state = ls_none;
584
            }
585
          break;
586
 
587
        case '#':
588
          if (cur - 1 == start_of_input_line
589
              /* A '#' from a macro doesn't start a directive.  */
590
              && !pfile->context->prev
591
              && !pfile->state.in_directive)
592
            {
593
              /* A directive.  With the way _cpp_handle_directive
594
                 currently works, we only want to call it if either we
595
                 know the directive is OK, or we want it to fail and
596
                 be removed from the output.  If we want it to be
597
                 passed through (the assembler case) then we must not
598
                 call _cpp_handle_directive.  */
599
              pfile->out.cur = out;
600
              cur = skip_whitespace (pfile, cur, true /* skip_comments */);
601
              out = pfile->out.cur;
602
 
603
              if (*cur == '\n')
604
                {
605
                  /* Null directive.  Ignore it and don't invalidate
606
                     the MI optimization.  */
607
                  pfile->buffer->need_line = true;
608
                  CPP_INCREMENT_LINE (pfile, 0);
609
                  result = false;
610
                  goto done;
611
                }
612
              else
613
                {
614
                  bool do_it = false;
615
 
616
                  if (is_numstart (*cur)
617
                      && CPP_OPTION (pfile, lang) != CLK_ASM)
618
                    do_it = true;
619
                  else if (is_idstart (*cur))
620
                    /* Check whether we know this directive, but don't
621
                       advance.  */
622
                    do_it = lex_identifier (pfile, cur)->is_directive;
623
 
624
                  if (do_it || CPP_OPTION (pfile, lang) != CLK_ASM)
625
                    {
626
                      /* This is a kludge.  We want to have the ISO
627
                         preprocessor lex the next token.  */
628
                      pfile->buffer->cur = cur;
629
                      _cpp_handle_directive (pfile, false /* indented */);
630
                      result = false;
631
                      goto done;
632
                    }
633
                }
634
            }
635
 
636
          if (pfile->state.in_expression)
637
            {
638
              lex_state = ls_hash;
639
              continue;
640
            }
641
          break;
642
 
643
        default:
644
          break;
645
        }
646
 
647
      /* Non-whitespace disables MI optimization and stops treating
648
         '<' as a quote in #include.  */
649
      header_ok = false;
650
      if (!pfile->state.in_directive)
651
        pfile->mi_valid = false;
652
 
653
      if (lex_state == ls_none)
654
        continue;
655
 
656
      /* Some of these transitions of state are syntax errors.  The
657
         ISO preprocessor will issue errors later.  */
658
      if (lex_state == ls_fun_open)
659
        /* Missing '('.  */
660
        lex_state = ls_none;
661
      else if (lex_state == ls_hash
662
               || lex_state == ls_predicate
663
               || lex_state == ls_defined)
664
        lex_state = ls_none;
665
 
666
      /* ls_answer and ls_defined_close keep going until ')'.  */
667
    }
668
 
669
 done:
670
  if (fmacro.buff)
671
    _cpp_release_buff (pfile, fmacro.buff);
672
 
673
  if (lex_state == ls_fun_close)
674
    cpp_error_with_line (pfile, CPP_DL_ERROR, fmacro.line, 0,
675
                         "unterminated argument list invoking macro \"%s\"",
676
                         NODE_NAME (fmacro.node));
677
  return result;
678
}
679
 
680
/* Push a context holding the replacement text of the macro NODE on
681
   the context stack.  NODE is either object-like, or a function-like
682
   macro with no arguments.  */
683
static void
684
push_replacement_text (cpp_reader *pfile, cpp_hashnode *node)
685
{
686
  size_t len;
687
  const uchar *text;
688
  uchar *buf;
689
 
690
  if (node->flags & NODE_BUILTIN)
691
    {
692
      text = _cpp_builtin_macro_text (pfile, node);
693
      len = ustrlen (text);
694
      buf = _cpp_unaligned_alloc (pfile, len + 1);
695
      memcpy (buf, text, len);
696
      buf[len]='\n';
697
      text = buf;
698
    }
699
  else
700
    {
701
      cpp_macro *macro = node->value.macro;
702
      macro->used = 1;
703
      text = macro->exp.text;
704
      macro->traditional = 1;
705
      len = macro->count;
706
    }
707
 
708
  _cpp_push_text_context (pfile, node, text, len);
709
}
710
 
711
/* Returns TRUE if traditional macro recursion is detected.  */
712
static bool
713
recursive_macro (cpp_reader *pfile, cpp_hashnode *node)
714
{
715
  bool recursing = !!(node->flags & NODE_DISABLED);
716
 
717
  /* Object-like macros that are already expanding are necessarily
718
     recursive.
719
 
720
     However, it is possible to have traditional function-like macros
721
     that are not infinitely recursive but recurse to any given depth.
722
     Further, it is easy to construct examples that get ever longer
723
     until the point they stop recursing.  So there is no easy way to
724
     detect true recursion; instead we assume any expansion more than
725
     20 deep since the first invocation of this macro must be
726
     recursing.  */
727
  if (recursing && node->value.macro->fun_like)
728
    {
729
      size_t depth = 0;
730
      cpp_context *context = pfile->context;
731
 
732
      do
733
        {
734
          depth++;
735
          if (context->macro == node && depth > 20)
736
            break;
737
          context = context->prev;
738
        }
739
      while (context);
740
      recursing = context != NULL;
741
    }
742
 
743
  if (recursing)
744
    cpp_error (pfile, CPP_DL_ERROR,
745
               "detected recursion whilst expanding macro \"%s\"",
746
               NODE_NAME (node));
747
 
748
  return recursing;
749
}
750
 
751
/* Return the length of the replacement text of a function-like or
752
   object-like non-builtin macro.  */
753
size_t
754
_cpp_replacement_text_len (const cpp_macro *macro)
755
{
756
  size_t len;
757
 
758
  if (macro->fun_like && (macro->paramc != 0))
759
    {
760
      const uchar *exp;
761
 
762
      len = 0;
763
      for (exp = macro->exp.text;;)
764
        {
765
          struct block *b = (struct block *) exp;
766
 
767
          len += b->text_len;
768
          if (b->arg_index == 0)
769
            break;
770
          len += NODE_LEN (macro->params[b->arg_index - 1]);
771
          exp += BLOCK_LEN (b->text_len);
772
        }
773
    }
774
  else
775
    len = macro->count;
776
 
777
  return len;
778
}
779
 
780
/* Copy the replacement text of MACRO to DEST, which must be of
781
   sufficient size.  It is not NUL-terminated.  The next character is
782
   returned.  */
783
uchar *
784
_cpp_copy_replacement_text (const cpp_macro *macro, uchar *dest)
785
{
786
  if (macro->fun_like && (macro->paramc != 0))
787
    {
788
      const uchar *exp;
789
 
790
      for (exp = macro->exp.text;;)
791
        {
792
          struct block *b = (struct block *) exp;
793
          cpp_hashnode *param;
794
 
795
          memcpy (dest, b->text, b->text_len);
796
          dest += b->text_len;
797
          if (b->arg_index == 0)
798
            break;
799
          param = macro->params[b->arg_index - 1];
800
          memcpy (dest, NODE_NAME (param), NODE_LEN (param));
801
          dest += NODE_LEN (param);
802
          exp += BLOCK_LEN (b->text_len);
803
        }
804
    }
805
  else
806
    {
807
      memcpy (dest, macro->exp.text, macro->count);
808
      dest += macro->count;
809
    }
810
 
811
  return dest;
812
}
813
 
814
/* Push a context holding the replacement text of the macro NODE on
815
   the context stack.  NODE is either object-like, or a function-like
816
   macro with no arguments.  */
817
static void
818
replace_args_and_push (cpp_reader *pfile, struct fun_macro *fmacro)
819
{
820
  cpp_macro *macro = fmacro->node->value.macro;
821
 
822
  if (macro->paramc == 0)
823
    push_replacement_text (pfile, fmacro->node);
824
  else
825
    {
826
      const uchar *exp;
827
      uchar *p;
828
      _cpp_buff *buff;
829
      size_t len = 0;
830
 
831
      /* Calculate the length of the argument-replaced text.  */
832
      for (exp = macro->exp.text;;)
833
        {
834
          struct block *b = (struct block *) exp;
835
 
836
          len += b->text_len;
837
          if (b->arg_index == 0)
838
            break;
839
          len += (fmacro->args[b->arg_index]
840
                  - fmacro->args[b->arg_index - 1] - 1);
841
          exp += BLOCK_LEN (b->text_len);
842
        }
843
 
844
      /* Allocate room for the expansion plus \n.  */
845
      buff = _cpp_get_buff (pfile, len + 1);
846
 
847
      /* Copy the expansion and replace arguments.  */
848
      p = BUFF_FRONT (buff);
849
      for (exp = macro->exp.text;;)
850
        {
851
          struct block *b = (struct block *) exp;
852
          size_t arglen;
853
 
854
          memcpy (p, b->text, b->text_len);
855
          p += b->text_len;
856
          if (b->arg_index == 0)
857
            break;
858
          arglen = (fmacro->args[b->arg_index]
859
                    - fmacro->args[b->arg_index - 1] - 1);
860
          memcpy (p, pfile->out.base + fmacro->args[b->arg_index - 1],
861
                  arglen);
862
          p += arglen;
863
          exp += BLOCK_LEN (b->text_len);
864
        }
865
 
866
      /* \n-terminate.  */
867
      *p = '\n';
868
      _cpp_push_text_context (pfile, fmacro->node, BUFF_FRONT (buff), len);
869
 
870
      /* So we free buffer allocation when macro is left.  */
871
      pfile->context->buff = buff;
872
    }
873
}
874
 
875
/* Read and record the parameters, if any, of a function-like macro
876
   definition.  Destroys pfile->out.cur.
877
 
878
   Returns true on success, false on failure (syntax error or a
879
   duplicate parameter).  On success, CUR (pfile->context) is just
880
   past the closing parenthesis.  */
881
static bool
882
scan_parameters (cpp_reader *pfile, cpp_macro *macro)
883
{
884
  const uchar *cur = CUR (pfile->context) + 1;
885
  bool ok;
886
 
887
  for (;;)
888
    {
889
      cur = skip_whitespace (pfile, cur, true /* skip_comments */);
890
 
891
      if (is_idstart (*cur))
892
        {
893
          ok = false;
894
          if (_cpp_save_parameter (pfile, macro, lex_identifier (pfile, cur)))
895
            break;
896
          cur = skip_whitespace (pfile, CUR (pfile->context),
897
                                 true /* skip_comments */);
898
          if (*cur == ',')
899
            {
900
              cur++;
901
              continue;
902
            }
903
          ok = (*cur == ')');
904
          break;
905
        }
906
 
907
      ok = (*cur == ')' && macro->paramc == 0);
908
      break;
909
    }
910
 
911
  if (!ok)
912
    cpp_error (pfile, CPP_DL_ERROR, "syntax error in macro parameter list");
913
 
914
  CUR (pfile->context) = cur + (*cur == ')');
915
 
916
  return ok;
917
}
918
 
919
/* Save the text from pfile->out.base to pfile->out.cur as
920
   the replacement text for the current macro, followed by argument
921
   ARG_INDEX, with zero indicating the end of the replacement
922
   text.  */
923
static void
924
save_replacement_text (cpp_reader *pfile, cpp_macro *macro,
925
                       unsigned int arg_index)
926
{
927
  size_t len = pfile->out.cur - pfile->out.base;
928
  uchar *exp;
929
 
930
  if (macro->paramc == 0)
931
    {
932
      /* Object-like and function-like macros without parameters
933
         simply store their \n-terminated replacement text.  */
934
      exp = _cpp_unaligned_alloc (pfile, len + 1);
935
      memcpy (exp, pfile->out.base, len);
936
      exp[len] = '\n';
937
      macro->exp.text = exp;
938
      macro->traditional = 1;
939
      macro->count = len;
940
    }
941
  else
942
    {
943
      /* Store the text's length (unsigned int), the argument index
944
         (unsigned short, base 1) and then the text.  */
945
      size_t blen = BLOCK_LEN (len);
946
      struct block *block;
947
 
948
      if (macro->count + blen > BUFF_ROOM (pfile->a_buff))
949
        _cpp_extend_buff (pfile, &pfile->a_buff, macro->count + blen);
950
 
951
      exp = BUFF_FRONT (pfile->a_buff);
952
      block = (struct block *) (exp + macro->count);
953
      macro->exp.text = exp;
954
      macro->traditional = 1;
955
 
956
      /* Write out the block information.  */
957
      block->text_len = len;
958
      block->arg_index = arg_index;
959
      memcpy (block->text, pfile->out.base, len);
960
 
961
      /* Lex the rest into the start of the output buffer.  */
962
      pfile->out.cur = pfile->out.base;
963
 
964
      macro->count += blen;
965
 
966
      /* If we've finished, commit the memory.  */
967
      if (arg_index == 0)
968
        BUFF_FRONT (pfile->a_buff) += macro->count;
969
    }
970
}
971
 
972
/* Analyze and save the replacement text of a macro.  Returns true on
973
   success.  */
974
bool
975
_cpp_create_trad_definition (cpp_reader *pfile, cpp_macro *macro)
976
{
977
  const uchar *cur;
978
  uchar *limit;
979
  cpp_context *context = pfile->context;
980
 
981
  /* The context has not been set up for command line defines, and CUR
982
     has not been updated for the macro name for in-file defines.  */
983
  pfile->out.cur = pfile->out.base;
984
  CUR (context) = pfile->buffer->cur;
985
  RLIMIT (context) = pfile->buffer->rlimit;
986
  check_output_buffer (pfile, RLIMIT (context) - CUR (context));
987
 
988
  /* Is this a function-like macro?  */
989
  if (* CUR (context) == '(')
990
    {
991
      bool ok = scan_parameters (pfile, macro);
992
 
993
      /* Remember the params so we can clear NODE_MACRO_ARG flags.  */
994
      macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff);
995
 
996
      /* Setting macro to NULL indicates an error occurred, and
997
         prevents unnecessary work in _cpp_scan_out_logical_line.  */
998
      if (!ok)
999
        macro = NULL;
1000
      else
1001
        {
1002
          BUFF_FRONT (pfile->a_buff) = (uchar *) &macro->params[macro->paramc];
1003
          macro->fun_like = 1;
1004
        }
1005
    }
1006
 
1007
  /* Skip leading whitespace in the replacement text.  */
1008
  pfile->buffer->cur
1009
    = skip_whitespace (pfile, CUR (context),
1010
                       CPP_OPTION (pfile, discard_comments_in_macro_exp));
1011
 
1012
  pfile->state.prevent_expansion++;
1013
  _cpp_scan_out_logical_line (pfile, macro);
1014
  pfile->state.prevent_expansion--;
1015
 
1016
  if (!macro)
1017
    return false;
1018
 
1019
  /* Skip trailing white space.  */
1020
  cur = pfile->out.base;
1021
  limit = pfile->out.cur;
1022
  while (limit > cur && is_space (limit[-1]))
1023
    limit--;
1024
  pfile->out.cur = limit;
1025
  save_replacement_text (pfile, macro, 0);
1026
 
1027
  return true;
1028
}
1029
 
1030
/* Copy SRC of length LEN to DEST, but convert all contiguous
1031
   whitespace to a single space, provided it is not in quotes.  The
1032
   quote currently in effect is pointed to by PQUOTE, and is updated
1033
   by the function.  Returns the number of bytes copied.  */
1034
static size_t
1035
canonicalize_text (uchar *dest, const uchar *src, size_t len, uchar *pquote)
1036
{
1037
  uchar *orig_dest = dest;
1038
  uchar quote = *pquote;
1039
 
1040
  while (len)
1041
    {
1042
      if (is_space (*src) && !quote)
1043
        {
1044
          do
1045
            src++, len--;
1046
          while (len && is_space (*src));
1047
          *dest++ = ' ';
1048
        }
1049
      else
1050
        {
1051
          if (*src == '\'' || *src == '"')
1052
            {
1053
              if (!quote)
1054
                quote = *src;
1055
              else if (quote == *src)
1056
                quote = 0;
1057
            }
1058
          *dest++ = *src++, len--;
1059
        }
1060
    }
1061
 
1062
  *pquote = quote;
1063
  return dest - orig_dest;
1064
}
1065
 
1066
/* Returns true if MACRO1 and MACRO2 have expansions different other
1067
   than in the form of their whitespace.  */
1068
bool
1069
_cpp_expansions_different_trad (const cpp_macro *macro1,
1070
                                const cpp_macro *macro2)
1071
{
1072
  uchar *p1 = XNEWVEC (uchar, macro1->count + macro2->count);
1073
  uchar *p2 = p1 + macro1->count;
1074
  uchar quote1 = 0, quote2 = 0;
1075
  bool mismatch;
1076
  size_t len1, len2;
1077
 
1078
  if (macro1->paramc > 0)
1079
    {
1080
      const uchar *exp1 = macro1->exp.text, *exp2 = macro2->exp.text;
1081
 
1082
      mismatch = true;
1083
      for (;;)
1084
        {
1085
          struct block *b1 = (struct block *) exp1;
1086
          struct block *b2 = (struct block *) exp2;
1087
 
1088
          if (b1->arg_index != b2->arg_index)
1089
            break;
1090
 
1091
          len1 = canonicalize_text (p1, b1->text, b1->text_len, &quote1);
1092
          len2 = canonicalize_text (p2, b2->text, b2->text_len, &quote2);
1093
          if (len1 != len2 || memcmp (p1, p2, len1))
1094
            break;
1095
          if (b1->arg_index == 0)
1096
            {
1097
              mismatch = false;
1098
              break;
1099
            }
1100
          exp1 += BLOCK_LEN (b1->text_len);
1101
          exp2 += BLOCK_LEN (b2->text_len);
1102
        }
1103
    }
1104
  else
1105
    {
1106
      len1 = canonicalize_text (p1, macro1->exp.text, macro1->count, &quote1);
1107
      len2 = canonicalize_text (p2, macro2->exp.text, macro2->count, &quote2);
1108
      mismatch = (len1 != len2 || memcmp (p1, p2, len1));
1109
    }
1110
 
1111
  free (p1);
1112
  return mismatch;
1113
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.