]> gcc.gnu.org Git - gcc.git/blob - gcc/cpphash.c
cppexp.c: Don't include cpphash.h.
[gcc.git] / gcc / cpphash.c
1 /* Part of CPP library. (Macro handling.)
2 Copyright (C) 1986, 87, 89, 92-96, 98, 99, 2000
3 Free Software Foundation, Inc.
4 Written by Per Bothner, 1994.
5 Based on CCCP program by Paul Rubin, June 1986
6 Adapted to ANSI C, Richard Stallman, Jan 1987
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
22 In other words, you are welcome to use, share and improve this program.
23 You are forbidden to forbid anyone else to use, share and improve
24 what you give them. Help stamp out software-hoarding! */
25
26 #include "config.h"
27 #include "system.h"
28 #include "cpplib.h"
29 #include "cpphash.h"
30 #undef abort
31
32 static unsigned int hashf PARAMS ((const U_CHAR *, int));
33 static int comp_def_part PARAMS ((int, U_CHAR *, int, U_CHAR *,
34 int, int));
35 static void push_macro_expansion PARAMS ((cpp_reader *,
36 U_CHAR *, int, HASHNODE *));
37 static int unsafe_chars PARAMS ((int, int));
38 static int macro_cleanup PARAMS ((cpp_buffer *, cpp_reader *));
39 static enum cpp_token macarg PARAMS ((cpp_reader *, int));
40 static struct tm *timestamp PARAMS ((cpp_reader *));
41 static void special_symbol PARAMS ((HASHNODE *, cpp_reader *));
42
43
44 #define SKIP_WHITE_SPACE(p) do { while (is_hspace(*p)) p++; } while (0)
45 #define CPP_IS_MACRO_BUFFER(PBUF) ((PBUF)->data != NULL)
46 #define FORWARD(N) CPP_FORWARD (CPP_BUFFER (pfile), (N))
47
48 extern char *version_string;
49
50 /* The arglist structure is built by create_definition to tell
51 collect_expansion where the argument names begin. That
52 is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
53 would contain pointers to the strings x, y, and z.
54 collect_expansion would then build a DEFINITION node,
55 with reflist nodes pointing to the places x, y, and z had
56 appeared. So the arglist is just convenience data passed
57 between these two routines. It is not kept around after
58 the current #define has been processed and entered into the
59 hash table. */
60
61 struct arglist
62 {
63 struct arglist *next;
64 U_CHAR *name;
65 int length;
66 int argno;
67 char rest_args;
68 };
69
70 static DEFINITION *collect_expansion PARAMS ((cpp_reader *, U_CHAR *, U_CHAR *,
71 int, struct arglist *));
72
73 /* This structure represents one parsed argument in a macro call.
74 `raw' points to the argument text as written (`raw_length' is its length).
75 `expanded' points to the argument's macro-expansion
76 (its length is `expand_length').
77 `stringified_length' is the length the argument would have
78 if stringified. */
79
80 /* raw and expanded are relative to ARG_BASE */
81 #define ARG_BASE ((pfile)->token_buffer)
82
83 struct argdata
84 {
85 /* Strings relative to pfile->token_buffer */
86 long raw, expanded, stringified;
87 int raw_length, expand_length;
88 int stringified_length;
89 };
90
91
92 /* Return hash function on name. must be compatible with the one
93 computed a step at a time, elsewhere */
94
95 static unsigned int
96 hashf (s, len)
97 register const U_CHAR *s;
98 register int len;
99 {
100 unsigned int n = len;
101 unsigned int r = 0;
102
103 do
104 r = r * 67 + (*s++ - 113);
105 while (--n);
106 return r + len;
107 }
108
109 /* Find the most recent hash node for name "name" (ending with first
110 non-identifier char) installed by cpp_install
111
112 If LEN is >= 0, it is the length of the name.
113 Otherwise, compute the length by scanning the entire name. */
114
115 HASHNODE *
116 cpp_lookup (pfile, name, len)
117 cpp_reader *pfile;
118 const U_CHAR *name;
119 int len;
120 {
121 register const U_CHAR *bp;
122 register HASHNODE *bucket;
123 register unsigned int hash;
124
125 if (len < 0)
126 {
127 for (bp = name; is_idchar (*bp); bp++);
128 len = bp - name;
129 }
130
131 hash = hashf (name, len) % HASHSIZE;
132
133 bucket = pfile->hashtab[hash];
134 while (bucket)
135 {
136 if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
137 return bucket;
138 bucket = bucket->next;
139 }
140 return (HASHNODE *) 0;
141 }
142
143 /* Free a DEFINITION structure. Used by delete_macro, and by
144 do_define when redefining macros. */
145
146 void
147 free_definition (d)
148 DEFINITION *d;
149 {
150 struct reflist *ap, *nextap;
151
152 for (ap = d->pattern; ap != NULL; ap = nextap)
153 {
154 nextap = ap->next;
155 free (ap);
156 }
157 if (d->nargs >= 0)
158 free (d->argnames);
159 free (d);
160 }
161
162 /*
163 * Delete a hash node. Some weirdness to free junk from macros.
164 * More such weirdness will have to be added if you define more hash
165 * types that need it.
166 */
167
168 void
169 delete_macro (hp)
170 HASHNODE *hp;
171 {
172
173 if (hp->prev != NULL)
174 hp->prev->next = hp->next;
175 if (hp->next != NULL)
176 hp->next->prev = hp->prev;
177
178 /* make sure that the bucket chain header that
179 the deleted guy was on points to the right thing afterwards. */
180 if (hp == *hp->bucket_hdr)
181 *hp->bucket_hdr = hp->next;
182
183 if (hp->type == T_MACRO)
184 free_definition (hp->value.defn);
185
186 free (hp);
187 }
188
189 /* Install a name in the main hash table, even if it is already there.
190 Name stops with first non alphanumeric, except leading '#'.
191 Caller must check against redefinition if that is desired.
192 delete_macro () removes things installed by cpp_install () in fifo order.
193 this is important because of the `defined' special symbol used
194 in #if, and also if pushdef/popdef directives are ever implemented.
195
196 If LEN is >= 0, it is the length of the name.
197 Otherwise, compute the length by scanning the entire name.
198
199 If HASH is >= 0, it is the precomputed hash code.
200 Otherwise, compute the hash code. */
201
202 HASHNODE *
203 cpp_install (pfile, name, len, type, value)
204 cpp_reader *pfile;
205 const U_CHAR *name;
206 int len;
207 enum node_type type;
208 const char *value;
209 {
210 register HASHNODE *hp;
211 register int i, bucket;
212 register const U_CHAR *p;
213 unsigned int hash;
214
215 if (len < 0)
216 {
217 p = name;
218 while (is_idchar(*p))
219 p++;
220 len = p - name;
221 }
222
223 hash = hashf (name, len) % HASHSIZE;
224
225 i = sizeof (HASHNODE) + len + 1;
226 hp = (HASHNODE *) xmalloc (i);
227 bucket = hash;
228 hp->bucket_hdr = &pfile->hashtab[bucket];
229 hp->next = pfile->hashtab[bucket];
230 pfile->hashtab[bucket] = hp;
231 hp->prev = NULL;
232 if (hp->next != NULL)
233 hp->next->prev = hp;
234 hp->type = type;
235 hp->length = len;
236 hp->value.cpval = value;
237 hp->name = ((U_CHAR *) hp) + sizeof (HASHNODE);
238 bcopy (name, hp->name, len);
239 hp->name[len] = 0;
240 return hp;
241 }
242
243 static int
244 macro_cleanup (pbuf, pfile)
245 cpp_buffer *pbuf;
246 cpp_reader *pfile ATTRIBUTE_UNUSED;
247 {
248 HASHNODE *macro = (HASHNODE *) pbuf->data;
249 if (macro->type == T_DISABLED)
250 macro->type = T_MACRO;
251 if (macro->type != T_MACRO || pbuf->buf != macro->value.defn->expansion)
252 free (pbuf->buf);
253 return 0;
254 }
255
256
257 /* Read a replacement list for a macro with parameters.
258 Build the DEFINITION structure.
259 Reads characters of text starting at BUF until END.
260 ARGLIST specifies the formal parameters to look for
261 in the text of the definition; NARGS is the number of args
262 in that list, or -1 for a macro name that wants no argument list.
263 MACRONAME is the macro name itself (so we can avoid recursive expansion)
264 and NAMELEN is its length in characters.
265
266 Note that comments, backslash-newlines, and leading white space
267 have already been deleted from the argument. */
268
269 static DEFINITION *
270 collect_expansion (pfile, buf, limit, nargs, arglist)
271 cpp_reader *pfile;
272 U_CHAR *buf, *limit;
273 int nargs;
274 struct arglist *arglist;
275 {
276 DEFINITION *defn;
277 register U_CHAR *p, *lastp, *exp_p;
278 struct reflist *endpat = NULL;
279 /* Pointer to first nonspace after last ## seen. */
280 U_CHAR *concat = 0;
281 /* Pointer to first nonspace after last single-# seen. */
282 U_CHAR *stringify = 0;
283 int maxsize;
284 int expected_delimiter = '\0';
285
286 /* Scan thru the replacement list, ignoring comments and quoted
287 strings, picking up on the macro calls. It does a linear search
288 thru the arg list on every potential symbol. Profiling might say
289 that something smarter should happen. */
290
291 if (limit < buf)
292 {
293 cpp_ice (pfile, "limit < buf in collect_expansion");
294 limit = buf; /* treat it like a null defn */
295 }
296
297 /* Find the beginning of the trailing whitespace. */
298 p = buf;
299 while (p < limit && is_space(limit[-1]))
300 limit--;
301
302 /* Allocate space for the text in the macro definition.
303 Leading and trailing whitespace chars need 2 bytes each.
304 Each other input char may or may not need 1 byte,
305 so this is an upper bound. The extra 5 are for invented
306 leading and trailing escape-marker and final null. */
307 maxsize = (sizeof (DEFINITION)
308 + (limit - p) + 5);
309 defn = (DEFINITION *) xcalloc (1, maxsize);
310
311 defn->nargs = nargs;
312 exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
313 lastp = exp_p;
314
315 p = buf;
316
317 /* Add one initial space escape-marker to prevent accidental
318 token-pasting (often removed by macroexpand). */
319 *exp_p++ = '\r';
320 *exp_p++ = ' ';
321
322 if (limit - p >= 2 && p[0] == '#' && p[1] == '#')
323 {
324 cpp_error (pfile, "`##' at start of macro definition");
325 p += 2;
326 }
327
328 /* Process the main body of the definition. */
329 while (p < limit)
330 {
331 int skipped_arg = 0;
332 register U_CHAR c = *p++;
333
334 *exp_p++ = c;
335
336 if (!CPP_TRADITIONAL (pfile))
337 {
338 switch (c)
339 {
340 case '\'':
341 case '\"':
342 if (expected_delimiter != '\0')
343 {
344 if (c == expected_delimiter)
345 expected_delimiter = '\0';
346 }
347 else
348 expected_delimiter = c;
349 break;
350
351 case '\\':
352 if (p < limit && expected_delimiter)
353 {
354 /* In a string, backslash goes through
355 and makes next char ordinary. */
356 *exp_p++ = *p++;
357 }
358 break;
359
360 case '#':
361 /* # is ordinary inside a string. */
362 if (expected_delimiter)
363 break;
364 if (p < limit && *p == '#')
365 {
366 /* ##: concatenate preceding and following tokens. */
367 /* Take out the first #, discard preceding whitespace. */
368 exp_p--;
369 while (exp_p > lastp && is_hspace(exp_p[-1]))
370 --exp_p;
371 /* Skip the second #. */
372 p++;
373 /* Discard following whitespace. */
374 SKIP_WHITE_SPACE (p);
375 concat = p;
376 if (p == limit)
377 cpp_error (pfile, "`##' at end of macro definition");
378 }
379 else if (nargs >= 0)
380 {
381 /* Single #: stringify following argument ref.
382 Don't leave the # in the expansion. */
383 exp_p--;
384 SKIP_WHITE_SPACE (p);
385 if (p == limit || !is_idstart(*p)
386 || (*p == 'L' && p + 1 < limit && (p[1] == '\'' ||
387 p[1] == '"')))
388 cpp_error (pfile,
389 "`#' operator is not followed by a macro argument name");
390 else
391 stringify = p;
392 }
393 break;
394 }
395 }
396 else
397 {
398 /* In -traditional mode, recognize arguments inside strings and
399 character constants, and ignore special properties of #.
400 Arguments inside strings are considered "stringified", but no
401 extra quote marks are supplied. */
402 switch (c)
403 {
404 case '\'':
405 case '\"':
406 if (expected_delimiter != '\0')
407 {
408 if (c == expected_delimiter)
409 expected_delimiter = '\0';
410 }
411 else
412 expected_delimiter = c;
413 break;
414
415 case '\\':
416 /* Backslash quotes delimiters and itself,
417 but not macro args. */
418 if (expected_delimiter != 0 && p < limit
419 && (*p == expected_delimiter || *p == '\\'))
420 {
421 *exp_p++ = *p++;
422 continue;
423 }
424 break;
425
426 case '/':
427 if (expected_delimiter != '\0')
428 /* No comments inside strings. */
429 break;
430 if (*p == '*')
431 {
432 /* If we find a comment that wasn't removed by
433 handle_directive, this must be -traditional.
434 So replace the comment with nothing at all. */
435 exp_p--;
436 p += 1;
437 while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
438 p++;
439 }
440 break;
441 }
442 }
443
444 /* Handle the start of a symbol. */
445 if (is_idchar(c) && nargs > 0)
446 {
447 U_CHAR *id_beg = p - 1;
448 int id_len;
449
450 --exp_p;
451 while (p != limit && is_idchar(*p))
452 p++;
453 id_len = p - id_beg;
454
455 if (is_idstart(c)
456 && !(id_len == 1 && c == 'L' && (*p == '\'' || *p == '"')))
457 {
458 register struct arglist *arg;
459
460 for (arg = arglist; arg != NULL; arg = arg->next)
461 {
462 struct reflist *tpat;
463
464 if (arg->name[0] == c
465 && arg->length == id_len
466 && strncmp (arg->name, id_beg, id_len) == 0)
467 {
468 if (expected_delimiter && CPP_OPTIONS
469 (pfile)->warn_stringify)
470 {
471 if (CPP_TRADITIONAL (pfile))
472 {
473 cpp_warning (pfile,
474 "macro argument `%.*s' is stringified.",
475 id_len, arg->name);
476 }
477 else
478 {
479 cpp_warning (pfile,
480 "macro arg `%.*s' would be stringified with -traditional.",
481 id_len, arg->name);
482 }
483 }
484 /* If ANSI, don't actually substitute
485 inside a string. */
486 if (!CPP_TRADITIONAL (pfile) && expected_delimiter)
487 break;
488 /* make a pat node for this arg and append it
489 to the end of the pat list */
490 tpat = (struct reflist *)
491 xmalloc (sizeof (struct reflist));
492 tpat->next = NULL;
493 tpat->raw_before = concat == id_beg;
494 tpat->raw_after = 0;
495 tpat->rest_args = arg->rest_args;
496 tpat->stringify = (CPP_TRADITIONAL (pfile)
497 ? expected_delimiter != '\0'
498 : stringify == id_beg);
499
500 if (endpat == NULL)
501 defn->pattern = tpat;
502 else
503 endpat->next = tpat;
504 endpat = tpat;
505
506 tpat->argno = arg->argno;
507 tpat->nchars = exp_p - lastp;
508 {
509 register U_CHAR *p1 = p;
510 SKIP_WHITE_SPACE (p1);
511 if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
512 tpat->raw_after = 1;
513 }
514 lastp = exp_p;
515 skipped_arg = 1;
516 break;
517 }
518 }
519 }
520
521 /* If this was not a macro arg, copy it into the expansion. */
522 if (!skipped_arg)
523 {
524 register U_CHAR *lim1 = p;
525 p = id_beg;
526 while (p != lim1)
527 *exp_p++ = *p++;
528 if (stringify == id_beg)
529 cpp_error (pfile,
530 "`#' operator should be followed by a macro argument name");
531 }
532 }
533 }
534
535 if (!CPP_TRADITIONAL (pfile) && expected_delimiter == 0)
536 {
537 /* If ANSI, put in a "\r " marker to prevent token pasting.
538 But not if "inside a string" (which in ANSI mode
539 happens only for -D option). */
540 *exp_p++ = '\r';
541 *exp_p++ = ' ';
542 }
543
544 *exp_p = '\0';
545
546 defn->length = exp_p - defn->expansion;
547
548 /* Crash now if we overrun the allocated size. */
549 if (defn->length + 1 > maxsize)
550 abort ();
551
552 #if 0
553 /* This isn't worth the time it takes. */
554 /* give back excess storage */
555 defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
556 #endif
557
558 return defn;
559 }
560
561 /*
562 * special extension string that can be added to the last macro argument to
563 * allow it to absorb the "rest" of the arguments when expanded. Ex:
564 * #define wow(a, b...) process (b, a, b)
565 * { wow (1, 2, 3); } -> { process (2, 3, 1, 2, 3); }
566 * { wow (one, two); } -> { process (two, one, two); }
567 * if this "rest_arg" is used with the concat token '##' and if it is not
568 * supplied then the token attached to with ## will not be outputted. Ex:
569 * #define wow (a, b...) process (b ## , a, ## b)
570 * { wow (1, 2); } -> { process (2, 1, 2); }
571 * { wow (one); } -> { process (one); {
572 */
573 static char rest_extension[] = "...";
574 #define REST_EXTENSION_LENGTH (sizeof (rest_extension) - 1)
575
576 /* Create a DEFINITION node from a #define directive. Arguments are
577 as for do_define. */
578
579 MACRODEF
580 create_definition (buf, limit, pfile)
581 U_CHAR *buf, *limit;
582 cpp_reader *pfile;
583 {
584 U_CHAR *bp; /* temp ptr into input buffer */
585 U_CHAR *symname; /* remember where symbol name starts */
586 int sym_length; /* and how long it is */
587 int rest_args = 0;
588 long line, col;
589 const char *file =
590 CPP_BUFFER (pfile) ? CPP_BUFFER (pfile)->nominal_fname : "";
591 DEFINITION *defn;
592 int arglengths = 0; /* Accumulate lengths of arg names
593 plus number of args. */
594 MACRODEF mdef;
595 cpp_buf_line_and_col (CPP_BUFFER (pfile), &line, &col);
596
597 bp = buf;
598
599 while (is_hspace(*bp))
600 bp++;
601
602 symname = bp; /* remember where it starts */
603
604 sym_length = check_macro_name (pfile, bp);
605 bp += sym_length;
606
607 /* Lossage will occur if identifiers or control keywords are broken
608 across lines using backslash. This is not the right place to take
609 care of that. */
610
611 if (*bp == '(')
612 {
613 struct arglist *arg_ptrs = NULL;
614 int argno = 0;
615
616 bp++; /* skip '(' */
617 SKIP_WHITE_SPACE (bp);
618
619 /* Loop over macro argument names. */
620 while (*bp != ')')
621 {
622 struct arglist *temp;
623
624 temp = (struct arglist *) alloca (sizeof (struct arglist));
625 temp->name = bp;
626 temp->next = arg_ptrs;
627 temp->argno = argno++;
628 temp->rest_args = 0;
629 arg_ptrs = temp;
630
631 if (rest_args)
632 cpp_pedwarn (pfile, "another parameter follows `%s'",
633 rest_extension);
634
635 if (!is_idstart(*bp))
636 cpp_pedwarn (pfile, "invalid character in macro parameter name");
637
638 /* Find the end of the arg name. */
639 while (is_idchar(*bp))
640 {
641 bp++;
642 /* do we have a "special" rest-args extension here? */
643 if ((size_t) (limit - bp) > REST_EXTENSION_LENGTH
644 && !strncmp (rest_extension, bp, REST_EXTENSION_LENGTH))
645 {
646 rest_args = 1;
647 temp->rest_args = 1;
648 break;
649 }
650 }
651 temp->length = bp - temp->name;
652 if (rest_args == 1)
653 bp += REST_EXTENSION_LENGTH;
654 arglengths += temp->length + 2;
655 SKIP_WHITE_SPACE (bp);
656 if (temp->length == 0 || (*bp != ',' && *bp != ')'))
657 {
658 cpp_error (pfile,
659 "badly punctuated parameter list in `#define'");
660 goto nope;
661 }
662 if (*bp == ',')
663 {
664 bp++;
665 SKIP_WHITE_SPACE (bp);
666 }
667 if (bp >= limit)
668 {
669 cpp_error (pfile, "unterminated parameter list in `#define'");
670 goto nope;
671 }
672 {
673 struct arglist *otemp;
674
675 for (otemp = temp->next; otemp != NULL; otemp = otemp->next)
676 if (temp->length == otemp->length
677 && strncmp (temp->name, otemp->name, temp->length) == 0)
678 {
679 U_CHAR *name;
680
681 name = (U_CHAR *) alloca (temp->length + 1);
682 (void) strncpy (name, temp->name, temp->length);
683 name[temp->length] = '\0';
684 cpp_error (pfile,
685 "duplicate argument name `%s' in `#define'",
686 name);
687 goto nope;
688 }
689 }
690 }
691
692 ++bp; /* skip paren */
693 SKIP_WHITE_SPACE (bp);
694 /* now everything from bp before limit is the definition. */
695 defn = collect_expansion (pfile, bp, limit, argno, arg_ptrs);
696 defn->rest_args = rest_args;
697
698 /* Now set defn->argnames to the result of concatenating
699 the argument names in reverse order
700 with comma-space between them. */
701 defn->argnames = (U_CHAR *) xmalloc (arglengths + 1);
702 {
703 struct arglist *temp;
704 int i = 0;
705 for (temp = arg_ptrs; temp; temp = temp->next)
706 {
707 bcopy (temp->name, &defn->argnames[i], temp->length);
708 i += temp->length;
709 if (temp->next != 0)
710 {
711 defn->argnames[i++] = ',';
712 defn->argnames[i++] = ' ';
713 }
714 }
715 defn->argnames[i] = 0;
716 }
717 }
718 else
719 {
720 /* Simple expansion or empty definition. */
721
722 if (bp < limit)
723 {
724 if (is_hspace(*bp))
725 {
726 bp++;
727 SKIP_WHITE_SPACE (bp);
728 }
729 else
730 /* Per C9x, missing white space after the name in a #define
731 of an object-like macro is always a constraint violation. */
732 cpp_pedwarn (pfile,
733 "missing white space after `#define %.*s'",
734 sym_length, symname);
735 }
736 /* now everything from bp before limit is the definition. */
737 defn = collect_expansion (pfile, bp, limit, -1, NULL_PTR);
738 defn->argnames = (U_CHAR *) "";
739 }
740
741 defn->line = line;
742 defn->file = file;
743
744 mdef.defn = defn;
745 mdef.symnam = symname;
746 mdef.symlen = sym_length;
747
748 return mdef;
749
750 nope:
751 mdef.defn = 0;
752 return mdef;
753 }
754
755 /*
756 * Parse a macro argument and append the info on PFILE's token_buffer.
757 * REST_ARGS means to absorb the rest of the args.
758 * Return nonzero to indicate a syntax error.
759 */
760
761 static enum cpp_token
762 macarg (pfile, rest_args)
763 cpp_reader *pfile;
764 int rest_args;
765 {
766 int paren = 0;
767 enum cpp_token token;
768
769 /* Try to parse as much of the argument as exists at this
770 input stack level. */
771 for (;;)
772 {
773 token = cpp_get_token (pfile);
774 switch (token)
775 {
776 case CPP_EOF:
777 return token;
778 case CPP_POP:
779 /* If we've hit end of file, it's an error (reported by caller).
780 Ditto if it's the end of cpp_expand_to_buffer text.
781 If we've hit end of macro, just continue. */
782 if (!CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
783 return token;
784 break;
785 case CPP_LPAREN:
786 paren++;
787 break;
788 case CPP_RPAREN:
789 if (--paren < 0)
790 goto found;
791 break;
792 case CPP_COMMA:
793 /* if we've returned to lowest level and
794 we aren't absorbing all args */
795 if (paren == 0 && rest_args == 0)
796 goto found;
797 break;
798 found:
799 /* Remove ',' or ')' from argument buffer. */
800 CPP_ADJUST_WRITTEN (pfile, -1);
801 return token;
802 default:;
803 }
804 }
805 }
806 \f
807
808 static struct tm *
809 timestamp (pfile)
810 cpp_reader *pfile;
811 {
812 if (!pfile->timebuf)
813 {
814 time_t t = time ((time_t *) 0);
815 pfile->timebuf = localtime (&t);
816 }
817 return pfile->timebuf;
818 }
819
820 static const char * const monthnames[] =
821 {
822 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
823 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
824 };
825
826 /*
827 * expand things like __FILE__. Place the expansion into the output
828 * buffer *without* rescanning.
829 */
830
831 static void
832 special_symbol (hp, pfile)
833 HASHNODE *hp;
834 cpp_reader *pfile;
835 {
836 const char *buf;
837 int len;
838 cpp_buffer *ip;
839
840 switch (hp->type)
841 {
842 case T_FILE:
843 case T_BASE_FILE:
844 {
845 ip = CPP_BUFFER (pfile);
846 if (hp->type == T_BASE_FILE)
847 {
848 while (CPP_PREV_BUFFER (ip) != CPP_NULL_BUFFER (pfile))
849 ip = CPP_PREV_BUFFER (ip);
850 }
851 else
852 {
853 ip = CPP_BUFFER (pfile);
854 while (!ip->nominal_fname && ip != CPP_NULL_BUFFER (pfile))
855 ip = CPP_PREV_BUFFER (ip);
856 }
857
858 buf = ip->nominal_fname;
859
860 if (!buf)
861 buf = "";
862 CPP_RESERVE (pfile, 3 + 4 * strlen (buf));
863 quote_string (pfile, buf);
864 return;
865 }
866
867 case T_INCLUDE_LEVEL:
868 {
869 int true_indepth = 0;
870 ip = CPP_BUFFER (pfile);
871 for (; ip != CPP_NULL_BUFFER (pfile); ip = CPP_PREV_BUFFER (ip))
872 if (ip->fname != NULL)
873 true_indepth++;
874
875 CPP_RESERVE (pfile, 10);
876 sprintf (CPP_PWRITTEN (pfile), "%d", true_indepth);
877 CPP_ADJUST_WRITTEN (pfile, strlen (CPP_PWRITTEN (pfile)));
878 return;
879 }
880
881 case T_VERSION:
882 len = strlen (version_string);
883 CPP_RESERVE (pfile, 3 + len);
884 CPP_PUTC_Q (pfile, '"');
885 CPP_PUTS_Q (pfile, version_string, len);
886 CPP_PUTC_Q (pfile, '"');
887 CPP_NUL_TERMINATE_Q (pfile);
888 return;
889
890 case T_CONST:
891 buf = hp->value.cpval;
892 if (!buf)
893 return;
894 if (*buf == '\0')
895 buf = "\r ";
896
897 len = strlen (buf);
898 CPP_RESERVE (pfile, len + 1);
899 CPP_PUTS_Q (pfile, buf, len);
900 CPP_NUL_TERMINATE_Q (pfile);
901 return;
902
903 case T_STDC:
904 CPP_RESERVE (pfile, 2);
905 #ifdef STDC_0_IN_SYSTEM_HEADERS
906 ip = CPP_BUFFER (pfile);
907 while (!ip->nominal_fname && ip != CPP_NULL_BUFFER (pfile))
908 ip = CPP_PREV_BUFFER (ip);
909 if (ip->system_header_p
910 && !cpp_lookup (pfile, (U_CHAR *) "__STRICT_ANSI__", 15, -1))
911 CPP_PUTC_Q (pfile, '0');
912 else
913 #endif
914 CPP_PUTC_Q (pfile, '1');
915 CPP_NUL_TERMINATE_Q (pfile);
916 return;
917
918 case T_SPECLINE:
919 {
920 long line;
921 cpp_buf_line_and_col (cpp_file_buffer (pfile), &line, NULL);
922
923 CPP_RESERVE (pfile, 10);
924 sprintf (CPP_PWRITTEN (pfile), "%ld", line);
925 CPP_ADJUST_WRITTEN (pfile, strlen (CPP_PWRITTEN (pfile)));
926 return;
927 }
928
929 case T_DATE:
930 case T_TIME:
931 {
932 struct tm *timebuf;
933
934 CPP_RESERVE (pfile, 20);
935 timebuf = timestamp (pfile);
936 if (hp->type == T_DATE)
937 sprintf (CPP_PWRITTEN (pfile), "\"%s %2d %4d\"",
938 monthnames[timebuf->tm_mon],
939 timebuf->tm_mday, timebuf->tm_year + 1900);
940 else
941 sprintf (CPP_PWRITTEN (pfile), "\"%02d:%02d:%02d\"",
942 timebuf->tm_hour, timebuf->tm_min, timebuf->tm_sec);
943
944 CPP_ADJUST_WRITTEN (pfile, strlen (CPP_PWRITTEN (pfile)));
945 return;
946 }
947
948 case T_POISON:
949 cpp_error (pfile, "attempt to use poisoned `%s'.", hp->name);
950 CPP_RESERVE (pfile, 1);
951 CPP_PUTC_Q (pfile, '0');
952 CPP_NUL_TERMINATE_Q (pfile);
953 break;
954
955 default:
956 cpp_ice (pfile, "invalid special hash type");
957 return;
958 }
959 }
960
961 /* Expand a macro call.
962 HP points to the symbol that is the macro being called.
963 Put the result of expansion onto the input stack
964 so that subsequent input by our caller will use it.
965
966 If macro wants arguments, caller has already verified that
967 an argument list follows; arguments come from the input stack. */
968
969 void
970 macroexpand (pfile, hp)
971 cpp_reader *pfile;
972 HASHNODE *hp;
973 {
974 int nargs;
975 DEFINITION *defn;
976 register U_CHAR *xbuf;
977 long start_line, start_column;
978 int xbuf_len;
979 struct argdata *args = 0;
980 long old_written = CPP_WRITTEN (pfile);
981 int rest_args, rest_zero = 0;
982 register int i;
983
984 cpp_buf_line_and_col (cpp_file_buffer (pfile), &start_line, &start_column);
985
986 /* Check for and handle special symbols. */
987 if (hp->type != T_MACRO)
988 {
989 special_symbol (hp, pfile);
990 xbuf_len = CPP_WRITTEN (pfile) - old_written;
991 xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
992 CPP_SET_WRITTEN (pfile, old_written);
993 bcopy (CPP_PWRITTEN (pfile), xbuf, xbuf_len + 1);
994 push_macro_expansion (pfile, xbuf, xbuf_len, hp);
995 CPP_BUFFER (pfile)->has_escapes = 1;
996 return;
997 }
998
999 defn = hp->value.defn;
1000 nargs = defn->nargs;
1001 pfile->output_escapes++;
1002
1003 if (nargs >= 0)
1004 {
1005 enum cpp_token token;
1006
1007 args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
1008
1009 for (i = 0; i < nargs; i++)
1010 {
1011 args[i].raw = args[i].expanded = 0;
1012 args[i].raw_length = 0;
1013 args[i].expand_length = args[i].stringified_length = -1;
1014 }
1015
1016 /* Parse all the macro args that are supplied. I counts them.
1017 The first NARGS args are stored in ARGS.
1018 The rest are discarded. If rest_args is set then we assume
1019 macarg absorbed the rest of the args. */
1020 i = 0;
1021 rest_args = 0;
1022
1023 /* Skip over the opening parenthesis. */
1024 CPP_OPTIONS (pfile)->discard_comments++;
1025 CPP_OPTIONS (pfile)->no_line_commands++;
1026 pfile->no_macro_expand++;
1027 pfile->no_directives++;
1028
1029 token = cpp_get_non_space_token (pfile);
1030 if (token != CPP_LPAREN)
1031 cpp_ice (pfile, "macroexpand: unexpected token %d (wanted LPAREN)",
1032 token);
1033 CPP_ADJUST_WRITTEN (pfile, -1);
1034
1035 token = CPP_EOF;
1036 do
1037 {
1038 if (rest_args)
1039 continue;
1040 if (i < nargs || (nargs == 0 && i == 0))
1041 {
1042 /* if we are working on last arg which absorbs rest of args... */
1043 if (i == nargs - 1 && defn->rest_args)
1044 rest_args = 1;
1045 args[i].raw = CPP_WRITTEN (pfile);
1046 token = macarg (pfile, rest_args);
1047 args[i].raw_length = CPP_WRITTEN (pfile) - args[i].raw;
1048 }
1049 else
1050 token = macarg (pfile, 0);
1051 if (token == CPP_EOF || token == CPP_POP)
1052 cpp_error_with_line (pfile, start_line, start_column,
1053 "unterminated macro call");
1054 i++;
1055 }
1056 while (token == CPP_COMMA);
1057 CPP_OPTIONS (pfile)->discard_comments--;
1058 CPP_OPTIONS (pfile)->no_line_commands--;
1059 pfile->no_macro_expand--;
1060 pfile->no_directives--;
1061 if (token != CPP_RPAREN)
1062 return;
1063
1064 /* If we got one arg but it was just whitespace, call that 0 args. */
1065 if (i == 1)
1066 {
1067 register U_CHAR *bp = ARG_BASE + args[0].raw;
1068 register U_CHAR *lim = bp + args[0].raw_length;
1069 /* cpp.texi says for foo ( ) we provide one argument.
1070 However, if foo wants just 0 arguments, treat this as 0. */
1071 if (nargs == 0)
1072 while (bp != lim && is_space(*bp))
1073 bp++;
1074 if (bp == lim)
1075 i = 0;
1076 }
1077
1078 /* Don't output an error message if we have already output one for
1079 a parse error above. */
1080 rest_zero = 0;
1081 if (nargs == 0 && i > 0)
1082 {
1083 cpp_error (pfile, "arguments given to macro `%s'", hp->name);
1084 }
1085 else if (i < nargs)
1086 {
1087 /* traditional C allows foo() if foo wants one argument. */
1088 if (nargs == 1 && i == 0 && CPP_TRADITIONAL (pfile))
1089 ;
1090 /* the rest args token is allowed to absorb 0 tokens */
1091 else if (i == nargs - 1 && defn->rest_args)
1092 rest_zero = 1;
1093 else if (i == 0)
1094 cpp_error (pfile, "macro `%s' used without args", hp->name);
1095 else if (i == 1)
1096 cpp_error (pfile, "macro `%s' used with just one arg", hp->name);
1097 else
1098 cpp_error (pfile, "macro `%s' used with only %d args",
1099 hp->name, i);
1100 }
1101 else if (i > nargs)
1102 {
1103 cpp_error (pfile,
1104 "macro `%s' used with too many (%d) args", hp->name, i);
1105 }
1106 }
1107
1108 /* If macro wants zero args, we parsed the arglist for checking only.
1109 Read directly from the macro definition. */
1110 if (nargs <= 0)
1111 {
1112 xbuf = defn->expansion;
1113 xbuf_len = defn->length;
1114 }
1115 else
1116 {
1117 register U_CHAR *exp = defn->expansion;
1118 register int offset; /* offset in expansion,
1119 copied a piece at a time */
1120 register int totlen; /* total amount of exp buffer filled so far */
1121
1122 register struct reflist *ap, *last_ap;
1123
1124 /* Macro really takes args. Compute the expansion of this call. */
1125
1126 /* Compute length in characters of the macro's expansion.
1127 Also count number of times each arg is used. */
1128 xbuf_len = defn->length;
1129 for (ap = defn->pattern; ap != NULL; ap = ap->next)
1130 {
1131 if (ap->stringify)
1132 {
1133 register struct argdata *arg = &args[ap->argno];
1134 /* Stringify if it hasn't already been */
1135 if (arg->stringified_length < 0)
1136 {
1137 int arglen = arg->raw_length;
1138 int escaped = 0;
1139 int in_string = 0;
1140 int c;
1141 /* Initially need_space is -1. Otherwise, 1 means the
1142 previous character was a space, but we suppressed it;
1143 0 means the previous character was a non-space. */
1144 int need_space = -1;
1145 i = 0;
1146 arg->stringified = CPP_WRITTEN (pfile);
1147 if (!CPP_TRADITIONAL (pfile))
1148 CPP_PUTC (pfile, '\"'); /* insert beginning quote */
1149 for (; i < arglen; i++)
1150 {
1151 c = (ARG_BASE + arg->raw)[i];
1152
1153 if (!in_string)
1154 {
1155 /* Delete "\r " and "\r-" escapes. */
1156 if (c == '\r')
1157 {
1158 i++;
1159 continue;
1160 }
1161 /* Internal sequences of whitespace are
1162 replaced by one space except within
1163 a string or char token. */
1164 else if (is_space(c))
1165 {
1166 if (need_space == 0)
1167 need_space = 1;
1168 continue;
1169 }
1170 else if (need_space > 0)
1171 CPP_PUTC (pfile, ' ');
1172 need_space = 0;
1173 }
1174
1175 if (escaped)
1176 escaped = 0;
1177 else
1178 {
1179 if (c == '\\')
1180 escaped = 1;
1181 if (in_string)
1182 {
1183 if (c == in_string)
1184 in_string = 0;
1185 }
1186 else if (c == '\"' || c == '\'')
1187 in_string = c;
1188 }
1189
1190 /* Escape these chars */
1191 if (c == '\"' || (in_string && c == '\\'))
1192 CPP_PUTC (pfile, '\\');
1193 if (ISPRINT (c))
1194 CPP_PUTC (pfile, c);
1195 else
1196 {
1197 CPP_RESERVE (pfile, 4);
1198 sprintf ((char *) CPP_PWRITTEN (pfile), "\\%03o",
1199 (unsigned int) c);
1200 CPP_ADJUST_WRITTEN (pfile, 4);
1201 }
1202 }
1203 if (!CPP_TRADITIONAL (pfile))
1204 CPP_PUTC (pfile, '\"'); /* insert ending quote */
1205 arg->stringified_length
1206 = CPP_WRITTEN (pfile) - arg->stringified;
1207 }
1208 xbuf_len += args[ap->argno].stringified_length;
1209 }
1210 else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL (pfile))
1211 /* Add 4 for two \r-space markers to prevent
1212 token concatenation. */
1213 xbuf_len += args[ap->argno].raw_length + 4;
1214 else
1215 {
1216 /* We have an ordinary (expanded) occurrence of the arg.
1217 So compute its expansion, if we have not already. */
1218 if (args[ap->argno].expand_length < 0)
1219 {
1220 args[ap->argno].expanded = CPP_WRITTEN (pfile);
1221 cpp_expand_to_buffer (pfile,
1222 ARG_BASE + args[ap->argno].raw,
1223 args[ap->argno].raw_length);
1224
1225 args[ap->argno].expand_length
1226 = CPP_WRITTEN (pfile) - args[ap->argno].expanded;
1227 }
1228
1229 /* Add 4 for two \r-space markers to prevent
1230 token concatenation. */
1231 xbuf_len += args[ap->argno].expand_length + 4;
1232 }
1233 }
1234
1235 xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
1236
1237 /* Generate in XBUF the complete expansion
1238 with arguments substituted in.
1239 TOTLEN is the total size generated so far.
1240 OFFSET is the index in the definition
1241 of where we are copying from. */
1242 offset = totlen = 0;
1243 for (last_ap = NULL, ap = defn->pattern; ap != NULL;
1244 last_ap = ap, ap = ap->next)
1245 {
1246 register struct argdata *arg = &args[ap->argno];
1247 int count_before = totlen;
1248
1249 /* Add chars to XBUF. */
1250 for (i = 0; i < ap->nchars; i++, offset++)
1251 xbuf[totlen++] = exp[offset];
1252
1253 /* If followed by an empty rest arg with concatenation,
1254 delete the last run of nonwhite chars. */
1255 if (rest_zero && totlen > count_before
1256 && ((ap->rest_args && ap->raw_before)
1257 || (last_ap != NULL && last_ap->rest_args
1258 && last_ap->raw_after)))
1259 {
1260 /* Delete final whitespace. */
1261 while (totlen > count_before && is_space(xbuf[totlen - 1]))
1262 totlen--;
1263
1264 /* Delete the nonwhites before them. */
1265 while (totlen > count_before && !is_space(xbuf[totlen - 1]))
1266 totlen--;
1267 }
1268
1269 if (ap->stringify != 0)
1270 {
1271 bcopy (ARG_BASE + arg->stringified,
1272 xbuf + totlen, arg->stringified_length);
1273 totlen += arg->stringified_length;
1274 }
1275 else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL (pfile))
1276 {
1277 U_CHAR *p1 = ARG_BASE + arg->raw;
1278 U_CHAR *l1 = p1 + arg->raw_length;
1279 if (ap->raw_before)
1280 {
1281 /* Arg is concatenated before: delete leading whitespace,
1282 whitespace markers, and no-reexpansion markers. */
1283 while (p1 != l1)
1284 {
1285 if (is_space(p1[0]))
1286 p1++;
1287 else if (p1[0] == '\r')
1288 p1 += 2;
1289 else
1290 break;
1291 }
1292 }
1293 if (ap->raw_after)
1294 {
1295 /* Arg is concatenated after: delete trailing whitespace,
1296 whitespace markers, and no-reexpansion markers. */
1297 while (p1 != l1)
1298 {
1299 if (is_space(l1[-1]))
1300 l1--;
1301 else if (l1[-1] == '\r')
1302 l1--;
1303 else if (l1[-1] == '-')
1304 {
1305 if (l1 != p1 + 1 && l1[-2] == '\r')
1306 l1 -= 2;
1307 else
1308 break;
1309 }
1310 else
1311 break;
1312 }
1313 }
1314
1315 /* Delete any no-reexpansion marker that precedes
1316 an identifier at the beginning of the argument. */
1317 if (p1[0] == '\r' && p1[1] == '-')
1318 p1 += 2;
1319
1320 bcopy (p1, xbuf + totlen, l1 - p1);
1321 totlen += l1 - p1;
1322 }
1323 else
1324 {
1325 U_CHAR *expanded = ARG_BASE + arg->expanded;
1326 if (!ap->raw_before && totlen > 0 && arg->expand_length
1327 && !CPP_TRADITIONAL (pfile)
1328 && unsafe_chars (xbuf[totlen - 1], expanded[0]))
1329 {
1330 xbuf[totlen++] = '\r';
1331 xbuf[totlen++] = ' ';
1332 }
1333
1334 bcopy (expanded, xbuf + totlen, arg->expand_length);
1335 totlen += arg->expand_length;
1336
1337 if (!ap->raw_after && totlen > 0 && offset < defn->length
1338 && !CPP_TRADITIONAL (pfile)
1339 && unsafe_chars (xbuf[totlen - 1], exp[offset]))
1340 {
1341 xbuf[totlen++] = '\r';
1342 xbuf[totlen++] = ' ';
1343 }
1344 }
1345
1346 if (totlen > xbuf_len)
1347 {
1348 cpp_ice (pfile, "buffer overrun in macroexpand");
1349 return;
1350 }
1351 }
1352
1353 /* if there is anything left of the definition
1354 after handling the arg list, copy that in too. */
1355
1356 for (i = offset; i < defn->length; i++)
1357 {
1358 /* if we've reached the end of the macro */
1359 if (exp[i] == ')')
1360 rest_zero = 0;
1361 if (!(rest_zero && last_ap != NULL && last_ap->rest_args
1362 && last_ap->raw_after))
1363 xbuf[totlen++] = exp[i];
1364 }
1365
1366 xbuf[totlen] = 0;
1367 xbuf_len = totlen;
1368
1369 }
1370
1371 pfile->output_escapes--;
1372
1373 /* Now put the expansion on the input stack
1374 so our caller will commence reading from it. */
1375 push_macro_expansion (pfile, xbuf, xbuf_len, hp);
1376 CPP_BUFFER (pfile)->has_escapes = 1;
1377
1378 /* Pop the space we've used in the token_buffer for argument expansion. */
1379 CPP_SET_WRITTEN (pfile, old_written);
1380
1381 /* Recursive macro use sometimes works traditionally.
1382 #define foo(x,y) bar (x (y,0), y)
1383 foo (foo, baz) */
1384
1385 if (!CPP_TRADITIONAL (pfile))
1386 hp->type = T_DISABLED;
1387 }
1388
1389 /* Return 1 iff a token ending in C1 followed directly by a token C2
1390 could cause mis-tokenization. */
1391
1392 static int
1393 unsafe_chars (c1, c2)
1394 int c1, c2;
1395 {
1396 switch (c1)
1397 {
1398 case '+': case '-':
1399 if (c2 == c1 || c2 == '=')
1400 return 1;
1401 goto letter;
1402
1403 case 'e': case 'E': case 'p': case 'P':
1404 if (c2 == '-' || c2 == '+')
1405 return 1; /* could extend a pre-processing number */
1406 goto letter;
1407
1408 case 'L':
1409 if (c2 == '\'' || c2 == '\"')
1410 return 1; /* Could turn into L"xxx" or L'xxx'. */
1411 goto letter;
1412
1413 case '.': case '0': case '1': case '2': case '3':
1414 case '4': case '5': case '6': case '7': case '8': case '9':
1415 case '_': case 'a': case 'b': case 'c': case 'd': case 'f':
1416 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
1417 case 'm': case 'n': case 'o': case 'q': case 'r': case 's':
1418 case 't': case 'u': case 'v': case 'w': case 'x': case 'y':
1419 case 'z': case 'A': case 'B': case 'C': case 'D': case 'F':
1420 case 'G': case 'H': case 'I': case 'J': case 'K': case 'M':
1421 case 'N': case 'O': case 'Q': case 'R': case 'S': case 'T':
1422 case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z':
1423 letter:
1424 /* We're in the middle of either a name or a pre-processing number. */
1425 return (is_idchar(c2) || c2 == '.');
1426
1427 case '<': case '>': case '!': case '%': case '#': case ':':
1428 case '^': case '&': case '|': case '*': case '/': case '=':
1429 return (c2 == c1 || c2 == '=');
1430 }
1431 return 0;
1432 }
1433
1434 static void
1435 push_macro_expansion (pfile, xbuf, xbuf_len, hp)
1436 cpp_reader *pfile;
1437 register U_CHAR *xbuf;
1438 int xbuf_len;
1439 HASHNODE *hp;
1440 {
1441 register cpp_buffer *mbuf = cpp_push_buffer (pfile, xbuf, xbuf_len);
1442 if (mbuf == NULL)
1443 return;
1444 mbuf->cleanup = macro_cleanup;
1445 mbuf->data = hp;
1446
1447 /* The first chars of the expansion should be a "\r " added by
1448 collect_expansion. This is to prevent accidental token-pasting
1449 between the text preceding the macro invocation, and the macro
1450 expansion text.
1451
1452 We would like to avoid adding unneeded spaces (for the sake of
1453 tools that use cpp, such as imake). In some common cases we can
1454 tell that it is safe to omit the space.
1455
1456 The character before the macro invocation cannot have been an
1457 idchar (or else it would have been pasted with the idchars of
1458 the macro name). Therefore, if the first non-space character
1459 of the expansion is an idchar, we do not need the extra space
1460 to prevent token pasting.
1461
1462 Also, we don't need the extra space if the first char is '(',
1463 or some other (less common) characters. */
1464
1465 if (xbuf[0] == '\r' && xbuf[1] == ' '
1466 && (is_idchar(xbuf[2]) || xbuf[2] == '(' || xbuf[2] == '\''
1467 || xbuf[2] == '\"'))
1468 mbuf->cur += 2;
1469
1470 /* Likewise, avoid the extra space at the end of the macro expansion
1471 if this is safe. We can do a better job here since we can know
1472 what the next char will be. */
1473 if (xbuf_len >= 3
1474 && mbuf->rlimit[-2] == '\r'
1475 && mbuf->rlimit[-1] == ' ')
1476 {
1477 int c1 = mbuf->rlimit[-3];
1478 int c2 = CPP_BUF_PEEK (CPP_PREV_BUFFER (CPP_BUFFER (pfile)));
1479 if (c2 == EOF || !unsafe_chars (c1, c2))
1480 mbuf->rlimit -= 2;
1481 }
1482 }
1483
1484 /* Return zero if two DEFINITIONs are isomorphic. */
1485
1486 int
1487 compare_defs (pfile, d1, d2)
1488 cpp_reader *pfile;
1489 DEFINITION *d1, *d2;
1490 {
1491 register struct reflist *a1, *a2;
1492 register U_CHAR *p1 = d1->expansion;
1493 register U_CHAR *p2 = d2->expansion;
1494 int first = 1;
1495
1496 if (d1->nargs != d2->nargs)
1497 return 1;
1498 if (CPP_PEDANTIC (pfile)
1499 && strcmp ((char *) d1->argnames, (char *) d2->argnames))
1500 return 1;
1501 for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
1502 a1 = a1->next, a2 = a2->next)
1503 {
1504 if (!((a1->nchars == a2->nchars && !strncmp (p1, p2, a1->nchars))
1505 || !comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
1506 || a1->argno != a2->argno
1507 || a1->stringify != a2->stringify
1508 || a1->raw_before != a2->raw_before
1509 || a1->raw_after != a2->raw_after)
1510 return 1;
1511 first = 0;
1512 p1 += a1->nchars;
1513 p2 += a2->nchars;
1514 }
1515 if (a1 != a2)
1516 return 1;
1517
1518 return comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
1519 p2, d2->length - (p2 - d2->expansion), 1);
1520 }
1521
1522 /* Return 1 if two parts of two macro definitions are effectively different.
1523 One of the parts starts at BEG1 and has LEN1 chars;
1524 the other has LEN2 chars at BEG2.
1525 Any sequence of whitespace matches any other sequence of whitespace.
1526 FIRST means these parts are the first of a macro definition;
1527 so ignore leading whitespace entirely.
1528 LAST means these parts are the last of a macro definition;
1529 so ignore trailing whitespace entirely. */
1530
1531 static int
1532 comp_def_part (first, beg1, len1, beg2, len2, last)
1533 int first;
1534 U_CHAR *beg1, *beg2;
1535 int len1, len2;
1536 int last;
1537 {
1538 register U_CHAR *end1 = beg1 + len1;
1539 register U_CHAR *end2 = beg2 + len2;
1540 if (first)
1541 {
1542 while (beg1 != end1 && is_space(*beg1))
1543 beg1++;
1544 while (beg2 != end2 && is_space(*beg2))
1545 beg2++;
1546 }
1547 if (last)
1548 {
1549 while (beg1 != end1 && is_space(end1[-1]))
1550 end1--;
1551 while (beg2 != end2 && is_space(end2[-1]))
1552 end2--;
1553 }
1554 while (beg1 != end1 && beg2 != end2)
1555 {
1556 if (is_space(*beg1) && is_space(*beg2))
1557 {
1558 while (beg1 != end1 && is_space(*beg1))
1559 beg1++;
1560 while (beg2 != end2 && is_space(*beg2))
1561 beg2++;
1562 }
1563 else if (*beg1 == *beg2)
1564 {
1565 beg1++;
1566 beg2++;
1567 }
1568 else
1569 break;
1570 }
1571 return (beg1 != end1) || (beg2 != end2);
1572 }
1573
1574 /* Dump the definition of macro MACRO on stdout. The format is suitable
1575 to be read back in again. */
1576
1577 void
1578 dump_definition (pfile, macro)
1579 cpp_reader *pfile;
1580 MACRODEF macro;
1581 {
1582 DEFINITION *defn = macro.defn;
1583
1584 CPP_RESERVE (pfile, macro.symlen + sizeof "#define ");
1585 CPP_PUTS_Q (pfile, "#define ", sizeof "#define " -1);
1586 CPP_PUTS_Q (pfile, macro.symnam, macro.symlen);
1587
1588 if (defn->nargs == -1)
1589 {
1590 CPP_PUTC_Q (pfile, ' ');
1591
1592 /* The first and last two characters of a macro expansion are
1593 always "\r "; this needs to be trimmed out.
1594 So we need length-4 chars of space, plus one for the NUL. */
1595 CPP_RESERVE (pfile, defn->length - 4 + 1);
1596 CPP_PUTS_Q (pfile, defn->expansion + 2, defn->length - 4);
1597 CPP_NUL_TERMINATE_Q (pfile);
1598 }
1599 else
1600 {
1601 struct reflist *r;
1602 unsigned char *argnames = (unsigned char *) xstrdup (defn->argnames);
1603 unsigned char **argv = (unsigned char **) alloca (defn->nargs *
1604 sizeof(char *));
1605 int *argl = (int *) alloca (defn->nargs * sizeof(int));
1606 unsigned char *x;
1607 int i;
1608
1609 /* First extract the argument list. */
1610 x = argnames;
1611 i = defn->nargs;
1612 while (i--)
1613 {
1614 argv[i] = x;
1615 while (*x != ',' && *x != '\0') x++;
1616 argl[i] = x - argv[i];
1617 if (*x == ',')
1618 {
1619 *x = '\0';
1620 x += 2; /* skip the space after the comma */
1621 }
1622 }
1623
1624 /* Now print out the argument list. */
1625 CPP_PUTC_Q (pfile, '(');
1626 for (i = 0; i < defn->nargs; i++)
1627 {
1628 CPP_RESERVE (pfile, argl[i] + 2);
1629 CPP_PUTS_Q (pfile, argv[i], argl[i]);
1630 if (i < defn->nargs-1)
1631 CPP_PUTS_Q (pfile, ", ", 2);
1632 }
1633
1634 if (defn->rest_args)
1635 CPP_PUTS (pfile, "...) ", 5);
1636 else
1637 CPP_PUTS (pfile, ") ", 2);
1638
1639 /* Now the definition. */
1640 x = defn->expansion;
1641 for (r = defn->pattern; r; r = r->next)
1642 {
1643 i = r->nchars;
1644 if (*x == '\r') x += 2, i -= 2;
1645 /* i chars for macro text, plus the length of the macro
1646 argument name, plus one for a stringify marker, plus two for
1647 each concatenation marker. */
1648 CPP_RESERVE (pfile,
1649 i + argl[r->argno] + r->stringify
1650 + (r->raw_before + r->raw_after) * 2);
1651
1652 if (i > 0) CPP_PUTS_Q (pfile, x, i);
1653 if (r->raw_before)
1654 CPP_PUTS_Q (pfile, "##", 2);
1655 if (r->stringify)
1656 CPP_PUTC_Q (pfile, '#');
1657 CPP_PUTS_Q (pfile, argv[r->argno], argl[r->argno]);
1658 if (r->raw_after && !(r->next && r->next->nchars == 0
1659 && r->next->raw_before))
1660 CPP_PUTS_Q (pfile, "##", 2);
1661
1662 x += i;
1663 }
1664
1665 i = defn->length - (x - defn->expansion) - 2;
1666 if (*x == '\r') x += 2, i -= 2;
1667 if (i > 0) CPP_PUTS (pfile, x, i);
1668 CPP_NUL_TERMINATE (pfile);
1669 }
1670 }
This page took 0.121614 seconds and 5 git commands to generate.