* lcm.c (optimize_mode_switching): Revert previous change.
[official-gcc.git] / gcc / tradcpp.c
blobe5ed07ef647bc3ade9d4a7913c9ac224c34435ac
1 /* C Compatible Compiler Preprocessor (CCCP)
2 Copyright (C) 1986, 1987, 1989, 2000, 2001 Free Software Foundation, Inc.
3 Written by Paul Rubin, June 1986
4 Adapted to ANSI C, Richard Stallman, Jan 1987
5 Dusted off, polished, and adapted for use as traditional
6 preprocessor only, Zack Weinberg, Jul 2000
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.
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.
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. */
22 #include "config.h"
23 #include "system.h"
24 #include "version.h"
25 #include "cppdefault.h"
26 #include "tradcpp.h"
27 #include "mkdeps.h"
28 #include "intl.h"
30 typedef unsigned char U_CHAR;
32 /* Name under which this program was invoked. */
34 static const char *progname;
36 /* Current maximum length of directory names in the search path
37 for include files. (Altered as we get more of them.) */
39 size_t max_include_len;
41 /* Nonzero means copy comments into the output file. */
43 int put_out_comments = 0;
45 /* mkdeps.h opaque structure that encapsulates dependency information. */
46 struct deps *deps;
48 /* Nonzero means print the names of included files rather than
49 the preprocessed output. 1 means just the #include "...",
50 2 means #include <...> as well. */
52 int print_deps = 0;
54 /* Nonzero means print dummy targets for each header file. */
56 int print_deps_phony_targets = 0;
58 /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
60 int deps_append = 0;
62 /* File name which deps are being written to. This is 0 if deps are
63 being written to stdout. */
65 const char *deps_file = 0;
67 /* Nonzero if missing .h files in -M output are assumed to be
68 generated files and not errors. */
70 int deps_missing_files = 0;
72 /* Nonzero means don't output line number information. */
74 int no_line_commands;
76 /* Nonzero means inhibit output of the preprocessed text
77 and instead output the definitions of all user-defined macros
78 in a form suitable for use as input to cccp. */
80 int dump_macros;
82 /* Nonzero means don't print warning messages. -w. */
84 int inhibit_warnings = 0;
86 /* Non-0 means don't output the preprocessed program. */
87 int inhibit_output = 0;
89 /* Nonzero means chars are signed. */
90 #if DEFAULT_SIGNED_CHAR
91 int flag_signed_char = 1;
92 #else
93 int flag_signed_char = 0;
94 #endif
96 /* Nonzero means warn if slash-star appears in a comment. */
98 int warn_comments;
100 /* Nonzero causes output not to be done,
101 but directives such as #define that have side effects
102 are still obeyed. */
104 int no_output;
106 /* I/O buffer structure.
107 The `fname' field is nonzero for source files and #include files
108 and for the dummy text used for -D and -U.
109 It is zero for rescanning results of macro expansion
110 and for expanding macro arguments. */
111 #define INPUT_STACK_MAX 200
112 struct file_name_list;
113 struct file_buf {
114 const char *fname;
115 int lineno;
116 int length;
117 U_CHAR *buf;
118 U_CHAR *bufp;
119 /* Macro that this level is the expansion of.
120 Included so that we can reenable the macro
121 at the end of this level. */
122 struct hashnode *macro;
123 /* Value of if_stack at start of this file.
124 Used to prohibit unmatched #endif (etc) in an include file. */
125 struct if_stack *if_stack;
126 /* Object to be freed at end of input at this level. */
127 U_CHAR *free_ptr;
128 /* Position to start scanning for #include_next in this file. */
129 struct file_name_list *next_header_dir;
130 } instack[INPUT_STACK_MAX];
132 typedef struct file_buf FILE_BUF;
134 /* Current nesting level of input sources.
135 `instack[indepth]' is the level currently being read. */
136 int indepth = -1;
137 #define CHECK_DEPTH(code) \
138 if (indepth >= (INPUT_STACK_MAX - 1)) \
140 error_with_line (line_for_error (instack[indepth].lineno), \
141 "macro or #include recursion too deep"); \
142 code; \
145 /* Current depth in #include directives that use <...>. */
146 int system_include_depth = 0;
148 /* The output buffer. Its LENGTH field is the amount of room allocated
149 for the buffer, not the number of chars actually present. To get
150 that, subtract outbuf.buf from outbuf.bufp. */
152 #define OUTBUF_SIZE 10 /* initial size of output buffer */
153 FILE_BUF outbuf;
155 /* Grow output buffer OBUF points at
156 so it can hold at least NEEDED more chars. */
158 #define check_expand(OBUF, NEEDED) do { \
159 if ((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \
160 grow_outbuf ((OBUF), (NEEDED)); \
161 } while (0)
163 struct file_name_list
165 struct file_name_list *next;
166 const char *fname;
169 struct file_name_list *include = 0; /* First dir to search */
170 /* First dir to search for <file> */
171 struct file_name_list *first_bracket_include = 0;
172 struct file_name_list *last_include = 0; /* Last in chain */
174 /* List of included files that contained #once. */
175 struct file_name_list *dont_repeat_files = 0;
177 /* List of other included files. */
178 struct file_name_list *all_include_files = 0;
180 /* Structure allocated for every #define. For a simple replacement
181 such as
182 #define foo bar ,
183 nargs = -1, the `pattern' list is null, and the expansion is just
184 the replacement text. Nargs = 0 means a functionlike macro with no args,
185 e.g.,
186 #define getchar() getc (stdin) .
187 When there are args, the expansion is the replacement text with the
188 args squashed out, and the reflist is a list describing how to
189 build the output from the input: e.g., "3 chars, then the 1st arg,
190 then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
191 The chars here come from the expansion. Whatever is left of the
192 expansion after the last arg-occurrence is copied after that arg.
193 Note that the reflist can be arbitrarily long---
194 its length depends on the number of times the arguments appear in
195 the replacement text, not how many args there are. Example:
196 #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
197 pattern list
198 { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
199 where (x, y) means (nchars, argno). */
201 typedef struct definition DEFINITION;
202 struct definition {
203 int nargs;
204 int length; /* length of expansion string */
205 U_CHAR *expansion;
206 struct reflist {
207 struct reflist *next;
208 char stringify; /* nonzero if this arg was preceded by a
209 # operator. */
210 char raw_before; /* Nonzero if a ## operator before arg. */
211 char raw_after; /* Nonzero if a ## operator after arg. */
212 int nchars; /* Number of literal chars to copy before
213 this arg occurrence. */
214 int argno; /* Number of arg to substitute (origin-0) */
215 } *pattern;
216 /* Names of macro args, concatenated in reverse order
217 with comma-space between them.
218 The only use of this is that we warn on redefinition
219 if this differs between the old and new definitions. */
220 const U_CHAR *argnames;
223 /* Chained list of answers to an assertion. */
224 struct answer
226 struct answer *next;
227 const unsigned char *answer;
228 size_t len;
231 /* different kinds of things that can appear in the value field
232 of a hash node. Actually, this may be useless now. */
233 union hashval {
234 const char *cpval;
235 DEFINITION *defn;
236 struct answer *answers;
239 /* The structure of a node in the hash table. The hash table
240 has entries for all tokens defined by #define commands (type T_MACRO),
241 plus some special tokens like __LINE__ (these each have their own
242 type, and the appropriate code is run when that type of node is seen.
243 It does not contain control words like "#define", which are recognized
244 by a separate piece of code. */
246 /* different flavors of hash nodes --- also used in keyword table */
247 enum node_type {
248 T_DEFINE = 1, /* `#define' */
249 T_INCLUDE, /* `#include' */
250 T_INCLUDE_NEXT,/* `#include_next' */
251 T_IFDEF, /* `#ifdef' */
252 T_IFNDEF, /* `#ifndef' */
253 T_IF, /* `#if' */
254 T_ELSE, /* `#else' */
255 T_ELIF, /* `#elif' */
256 T_UNDEF, /* `#undef' */
257 T_LINE, /* `#line' */
258 T_ENDIF, /* `#endif' */
259 T_ERROR, /* `#error' */
260 T_WARNING, /* `#warning' */
261 T_ASSERT, /* `#assert' */
262 T_UNASSERT, /* `#unassert' */
263 T_SPECLINE, /* special symbol `__LINE__' */
264 T_DATE, /* `__DATE__' */
265 T_FILE, /* `__FILE__' */
266 T_BASE_FILE, /* `__BASE_FILE__' */
267 T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
268 T_VERSION, /* `__VERSION__' */
269 T_TIME, /* `__TIME__' */
270 T_CONST, /* Constant value, used by `__STDC__' */
271 T_MACRO, /* macro defined by `#define' */
272 T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
273 T_UNUSED /* Used for something not defined. */
276 struct hashnode {
277 struct hashnode *next; /* double links for easy deletion */
278 struct hashnode *prev;
279 struct hashnode **bucket_hdr; /* also, a back pointer to this node's hash
280 chain is kept, in case the node is the head
281 of the chain and gets deleted. */
282 enum node_type type; /* type of special token */
283 int length; /* length of token, for quick comparison */
284 U_CHAR *name; /* the actual name */
285 union hashval value; /* pointer to expansion, or whatever */
288 typedef struct hashnode HASHNODE;
290 static HASHNODE *parse_assertion PARAMS ((const unsigned char *,
291 const unsigned char *,
292 struct answer **, int));
293 static struct answer **find_answer PARAMS ((HASHNODE *,
294 const struct answer *));
295 static int parse_answer PARAMS ((const unsigned char *, const unsigned char *,
296 struct answer **, int));
297 static unsigned char *canonicalize_text PARAMS ((const unsigned char *,
298 const unsigned char *,
299 const unsigned char **));
301 /* Some definitions for the hash table. The hash function MUST be
302 computed as shown in hashf () below. That is because the rescan
303 loop computes the hash value `on the fly' for most tokens,
304 in order to avoid the overhead of a lot of procedure calls to
305 the hashf () function. Hashf () only exists for the sake of
306 politeness, for use when speed isn't so important. */
308 #define HASHSIZE 1403
309 HASHNODE *hashtab[HASHSIZE];
310 #define HASHSTEP(old, c) ((old << 2) + c)
311 #define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
313 /* `struct directive' defines one #-directive, including how to handle it. */
315 struct directive {
316 const int length; /* Length of name */
317 void (*const func) PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
318 /* Function to handle directive */
319 const char *const name; /* Name of directive */
320 const enum node_type type; /* Code which describes which directive. */
323 /* Last arg to output_line_command. */
324 enum file_change_code {same_file, enter_file, leave_file};
326 /* This structure represents one parsed argument in a macro call.
327 `raw' points to the argument text as written (`raw_length' is its length).
328 `expanded' points to the argument's macro-expansion
329 (its length is `expand_length').
330 `stringified_length' is the length the argument would have
331 if stringified.
332 `free1' and `free2', if nonzero, point to blocks to be freed
333 when the macro argument data is no longer needed. */
335 struct argdata {
336 U_CHAR *raw, *expanded;
337 int raw_length, expand_length;
338 int stringified_length;
339 U_CHAR *free1, *free2;
340 char newlines;
341 char comments;
344 /* The arglist structure is built by do_define to tell
345 collect_definition where the argument names begin. That
346 is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
347 would contain pointers to the strings x, y, and z.
348 Collect_definition would then build a DEFINITION node,
349 with reflist nodes pointing to the places x, y, and z had
350 appeared. So the arglist is just convenience data passed
351 between these two routines. It is not kept around after
352 the current #define has been processed and entered into the
353 hash table. */
355 struct arglist {
356 struct arglist *next;
357 U_CHAR *name;
358 int length;
359 int argno;
362 /* Function prototypes. */
364 static void do_define PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
365 static void do_error PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
366 static void do_warning PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
367 static void do_line PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
368 static void do_include PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
369 static void do_include_next PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
370 static void do_undef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
371 static void do_if PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
372 static void do_ifdef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
373 static void do_ifndef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
374 static void do_else PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
375 static void do_elif PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
376 static void do_endif PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
377 static void do_assert PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
378 static void do_unassert PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
379 static void do_xifdef PARAMS ((U_CHAR *, U_CHAR *, enum node_type));
381 static struct hashnode *install PARAMS ((const U_CHAR *, int, enum node_type, int));
382 static int hashf PARAMS ((const U_CHAR *, int, int));
383 static int compare_defs PARAMS ((DEFINITION *, DEFINITION *));
384 static int comp_def_part PARAMS ((int, const U_CHAR *, int,
385 const U_CHAR *, int, int));
386 static void delete_macro PARAMS ((HASHNODE *));
388 /* First arg to v_message. */
389 enum msgtype { MT_WARNING = 0, MT_ERROR, MT_FATAL };
390 static void v_message PARAMS ((enum msgtype mtype, int line,
391 const char *msgid, va_list ap))
392 ATTRIBUTE_PRINTF (3, 0);
394 static int line_for_error PARAMS ((int));
396 /* We know perfectly well which file this is, so we don't need to
397 use __FILE__. */
398 #undef abort
399 #if (GCC_VERSION >= 2007)
400 #define abort() fancy_abort(__LINE__, __FUNCTION__)
401 #else
402 #define abort() fancy_abort(__LINE__, 0);
403 #endif
405 static void macroexpand PARAMS ((HASHNODE *, FILE_BUF *));
406 static void special_symbol PARAMS ((HASHNODE *, FILE_BUF *));
407 static void dump_all_macros PARAMS ((void));
408 static void dump_defn_1 PARAMS ((const U_CHAR *, int, int));
409 static void dump_arg_n PARAMS ((DEFINITION *, int));
410 static void conditional_skip PARAMS ((FILE_BUF *, int, enum node_type));
411 static void skip_if_group PARAMS ((FILE_BUF *, int));
412 static void output_line_command PARAMS ((FILE_BUF *, FILE_BUF *,
413 int, enum file_change_code));
415 static int eval_if_expression PARAMS ((const U_CHAR *, int));
417 static void output_deps PARAMS ((void));
418 static void initialize_builtins PARAMS ((void));
419 static void run_directive PARAMS ((const char *, size_t,
420 enum node_type));
421 static void make_definition PARAMS ((const char *));
422 static void make_undef PARAMS ((const char *));
423 static void make_assertion PARAMS ((const char *));
425 static void grow_outbuf PARAMS ((FILE_BUF *, int));
426 static int handle_directive PARAMS ((FILE_BUF *, FILE_BUF *));
427 static void process_include PARAMS ((struct file_name_list *,
428 const U_CHAR *, int, int, FILE_BUF *));
429 static void fixup_newlines PARAMS ((FILE_BUF *));
430 static void finclude PARAMS ((int, const char *,
431 struct file_name_list *, FILE_BUF *));
432 static void init_dependency_output PARAMS ((void));
433 static void rescan PARAMS ((FILE_BUF *, int));
434 static void newline_fix PARAMS ((U_CHAR *));
435 static void name_newline_fix PARAMS ((U_CHAR *));
436 static U_CHAR *macarg1 PARAMS ((U_CHAR *, const U_CHAR *, int *,
437 int *, int *));
438 static const char *macarg PARAMS ((struct argdata *));
439 static int discard_comments PARAMS ((U_CHAR *, int, int));
440 static int file_size_and_mode PARAMS ((int, int *, long *));
442 static U_CHAR *skip_to_end_of_comment PARAMS ((FILE_BUF *, int *));
443 static U_CHAR *skip_quoted_string PARAMS ((const U_CHAR *, const U_CHAR *,
444 int, int *, int *, int *));
446 int main PARAMS ((int, char **));
448 /* Convenience. Write U"string" to get an unsigned string constant. */
449 #define U (const unsigned char *)
451 /* Here is the actual list of #-directives, most-often-used first. */
453 static const struct directive directive_table[] = {
454 { 6, do_define, "define", T_DEFINE },
455 { 7, do_include, "include", T_INCLUDE },
456 { 5, do_endif, "endif", T_ENDIF },
457 { 5, do_ifdef, "ifdef", T_IFDEF },
458 { 2, do_if, "if", T_IF, },
459 { 4, do_else, "else", T_ELSE },
460 { 6, do_ifndef, "ifndef", T_IFNDEF },
461 { 5, do_undef, "undef", T_UNDEF },
462 { 4, do_line, "line", T_LINE },
463 { 4, do_elif, "elif", T_ELIF },
464 { 5, do_error, "error", T_ERROR },
465 { 7, do_warning, "warning", T_WARNING },
466 { 12, do_include_next, "include_next", T_INCLUDE_NEXT },
467 { 6, do_assert, "assert", T_ASSERT },
468 { 8, do_unassert,"unassert",T_UNASSERT},
469 { -1, 0, "", T_UNUSED},
472 #define SKIP_WHITE_SPACE(p) do { while (is_nvspace(*p)) p++; } while (0)
473 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space(*p)) p++; } while (0)
475 int errors = 0; /* Error counter for exit code */
477 static FILE_BUF expand_to_temp_buffer PARAMS ((const U_CHAR *, const U_CHAR *, int));
478 static DEFINITION *collect_expansion PARAMS ((U_CHAR *, U_CHAR *, int,
479 struct arglist *));
481 /* Stack of conditionals currently in progress
482 (including both successful and failing conditionals). */
484 struct if_stack {
485 struct if_stack *next; /* for chaining to the next stack frame */
486 const char *fname; /* copied from input when frame is made */
487 int lineno; /* similarly */
488 int if_succeeded; /* true if a leg of this if-group
489 has been passed through rescan */
490 enum node_type type; /* type of last directive seen in this group */
492 typedef struct if_stack IF_STACK_FRAME;
493 IF_STACK_FRAME *if_stack = NULL;
495 /* Nonzero means -I- has been seen,
496 so don't look for #include "foo" the source-file directory. */
497 int ignore_srcdir;
499 /* Pending directives. */
500 enum pending_dir_t {PD_NONE = 0, PD_DEFINE, PD_UNDEF, PD_ASSERTION, PD_FILE};
502 typedef struct pending_dir pending_dir;
503 struct pending_dir
505 const char *arg;
506 enum pending_dir_t type;
510 main (argc, argv)
511 int argc;
512 char **argv;
514 int st_mode;
515 long st_size;
516 const char *in_fname, *out_fname;
517 int f, i;
518 FILE_BUF *fp;
519 pending_dir *pend = (pending_dir *) xcalloc (argc, sizeof (pending_dir));
520 int no_standard_includes = 0;
522 hex_init ();
524 #ifdef RLIMIT_STACK
525 /* Get rid of any avoidable limit on stack size. */
527 struct rlimit rlim;
529 /* Set the stack limit huge so that alloca (particularly stringtab
530 * in dbxread.c) does not fail. */
531 getrlimit (RLIMIT_STACK, &rlim);
532 rlim.rlim_cur = rlim.rlim_max;
533 setrlimit (RLIMIT_STACK, &rlim);
535 #endif /* RLIMIT_STACK defined */
537 progname = argv[0];
539 in_fname = NULL;
540 out_fname = NULL;
542 no_line_commands = 0;
543 dump_macros = 0;
544 no_output = 0;
546 max_include_len = cpp_GCC_INCLUDE_DIR_len + 7; /* ??? */
548 gcc_init_libintl ();
550 /* It's simplest to just create this struct whether or not it will
551 be needed. */
552 deps = deps_init ();
554 /* Process switches and find input file name. */
556 for (i = 1; i < argc; i++) {
557 if (argv[i][0] != '-') {
558 if (out_fname != NULL)
559 fatal ("usage: %s [switches] input output", argv[0]);
560 else if (in_fname != NULL)
561 out_fname = argv[i];
562 else
563 in_fname = argv[i];
564 } else {
565 int c = argv[i][1];
567 switch (c) {
568 case 'E':
569 case '$':
570 break; /* Ignore for compatibility with ISO/extended cpp. */
572 case 'l':
573 if (!strcmp (argv[i], "-lang-c++")
574 || !strcmp (argv[i], "-lang-objc++"))
575 fatal ("-traditional is not supported in C++");
576 else if (!strcmp (argv[i], "-lang-c89"))
577 fatal ("-traditional and -ansi are mutually exclusive");
578 else if (!strcmp (argv[i], "-lang-objc"))
579 pend[i].type = PD_DEFINE, pend[i].arg = "__OBJC__";
580 else if (!strcmp (argv[i], "-lang-asm"))
581 pend[i].type = PD_DEFINE, pend[i].arg = "__ASSEMBLER__";
582 else if (!strcmp (argv[i], "-lang-fortran"))
583 pend[i].type = PD_DEFINE, pend[i].arg = "_LANGUAGE_FORTRAN";
584 /* All other possibilities ignored. */
585 break;
587 case 'i':
588 if (!strcmp (argv[i], "-include"))
590 if (i + 1 == argc)
591 fatal ("filename missing after -i option");
592 else
593 pend[i].type = PD_FILE, pend[i].arg = argv[i + 1], i++;
595 else if (!strcmp (argv[i], "-iprefix"))
596 i++; /* Ignore for compatibility */
597 else if (!strcmp (argv[i], "-isystem")
598 || !strcmp (argv[i], "-iwithprefix")
599 || !strcmp (argv[i], "-iwithprefixbefore")
600 || !strcmp (argv[i], "-idirafter"))
601 goto add_include; /* best we can do */
603 break;
605 case 'o':
606 if (out_fname != NULL)
607 fatal ("output filename specified twice");
608 if (i + 1 == argc)
609 fatal ("filename missing after -o option");
610 out_fname = argv[++i];
611 if (!strcmp (out_fname, "-"))
612 out_fname = "";
613 break;
615 case 'w':
616 inhibit_warnings = 1;
617 break;
619 case 'W':
620 if (!strcmp (argv[i], "-Wcomments"))
621 warn_comments = 1;
622 else if (!strcmp (argv[i], "-Wcomment"))
623 warn_comments = 1;
624 else if (!strcmp (argv[i], "-Wall")) {
625 warn_comments = 1;
627 break;
629 case 'f':
630 if (!strcmp (argv[i], "-fsigned-char"))
631 flag_signed_char = 1;
632 else if (!strcmp (argv[i], "-funsigned-char"))
633 flag_signed_char = 0;
634 break;
636 /* Ignore target-specific and optimization flags. */
637 case 'm':
638 case 'O':
639 break;
641 case 'M':
643 char *p = NULL;
645 /* -MD and -MMD for tradcpp are deprecated and undocumented
646 (use -M or -MM with -MF instead), and probably should be
647 removed with the next major GCC version. For the moment
648 we allow these for the benefit of Automake 1.4, which
649 uses these when dependency tracking is enabled. Automake
650 1.5 will fix this. */
651 if (!strncmp (argv[i], "-MD", 3)) {
652 p = argv[i] + 3;
653 print_deps = 2;
654 } else if (!strncmp (argv[i], "-MMD", 4)) {
655 p = argv[i] + 4;
656 print_deps = 1;
657 } else if (!strcmp (argv[i], "-M")) {
658 print_deps = 2;
659 } else if (!strcmp (argv[i], "-MM")) {
660 print_deps = 1;
661 } else if (!strcmp (argv[i], "-MG")) {
662 deps_missing_files = 1;
663 } else if (!strcmp (argv[i], "-MF")) {
664 p = argv[i] + 3;
665 } else if (!strcmp (argv[i], "-MP")) {
666 print_deps_phony_targets = 1;
667 } else if (!strcmp (argv[i], "-MQ") || !strcmp (argv[i], "-MT")) {
668 /* Add a target. -MQ quotes for Make. */
669 const char *tgt = argv[i] + 3;
670 int quoted = argv[i][2] == 'Q';
672 if (*tgt == '\0' && i + 1 == argc)
673 fatal ("target missing after %s option", argv[i]);
674 else
676 if (*tgt == '\0')
677 tgt = argv[++i];
679 deps_add_target (deps, tgt, quoted);
683 if (p) {
684 if (*p)
685 deps_file = p;
686 else if (i + 1 == argc)
687 fatal ("filename missing after %s option", argv[i]);
688 else
689 deps_file = argv[++i];
692 break;
694 case 'd':
695 dump_macros = 1;
696 no_output = 1;
697 break;
699 case 'v':
700 fprintf (stderr, "GNU traditional CPP version %s\n", version_string);
701 break;
703 case 'D':
704 case 'U':
705 case 'A':
707 char *p;
709 if (argv[i][2] != 0)
710 p = argv[i] + 2;
711 else if (i + 1 == argc)
712 fatal ("macro name missing after -%c option", c);
713 else
714 p = argv[++i];
716 if (c == 'D')
717 pend[i].type = PD_DEFINE;
718 else if (c == 'U')
719 pend[i].type = PD_UNDEF;
720 else
721 pend[i].type = PD_ASSERTION;
722 pend[i].arg = p;
724 break;
726 case 'C':
727 put_out_comments = 1;
728 break;
730 case 'p':
731 if (!strcmp (argv[i], "-pedantic"))
732 fatal ("-pedantic and -traditional are mutually exclusive");
733 break;
735 case 't':
736 if (!strcmp (argv[i], "-trigraphs"))
737 fatal ("-trigraphs and -traditional are mutually exclusive");
738 break;
740 case 'P':
741 no_line_commands = 1;
742 break;
744 case 'I': /* Add directory to path for includes. */
745 add_include:
747 struct file_name_list *dirtmp;
749 if (! ignore_srcdir && !strcmp (argv[i] + 2, "-"))
750 ignore_srcdir = 1;
751 else {
752 dirtmp = (struct file_name_list *)
753 xmalloc (sizeof (struct file_name_list));
754 dirtmp->next = 0; /* New one goes on the end */
755 if (include == 0)
756 include = dirtmp;
757 else
758 last_include->next = dirtmp;
759 last_include = dirtmp; /* Tail follows the last one */
760 if (argv[i][1] == 'I' && argv[i][2] != 0)
761 dirtmp->fname = argv[i] + 2;
762 else if (i + 1 == argc)
763 fatal ("directory name missing after -I option");
764 else
765 dirtmp->fname = argv[++i];
766 if (strlen (dirtmp->fname) > max_include_len)
767 max_include_len = strlen (dirtmp->fname);
768 if (ignore_srcdir && first_bracket_include == 0)
769 first_bracket_include = dirtmp;
772 break;
774 case 'n':
775 /* -nostdinc causes no default include directories.
776 You must specify all include-file directories with -I. */
777 no_standard_includes = 1;
778 break;
780 case 'q':
781 /* Accept -quiet silently. */
782 break;
784 case '\0': /* JF handle '-' as file name meaning stdin or stdout */
785 if (in_fname == NULL) {
786 in_fname = "";
787 break;
788 } else if (out_fname == NULL) {
789 out_fname = "";
790 break;
791 } /* else fall through into error */
793 default:
794 fatal ("invalid option `%s'", argv[i]);
799 init_dependency_output ();
801 /* After checking the environment variables, check if -M or -MM has
802 not been specified, but other -M options have. */
803 if (print_deps == 0
804 && (deps_missing_files || deps_file || print_deps_phony_targets))
805 fatal ("you must additionally specify either -M or -MM");
807 if (print_deps)
809 /* Set the default target (if there is none already), and
810 the dependency on the main file. */
811 deps_add_default_target (deps, in_fname);
813 deps_add_dep (deps, in_fname);
816 /* Install __LINE__, etc. Must follow option processing. */
817 initialize_builtins ();
819 /* Do defines specified with -D and undefines specified with -U. */
820 for (i = 1; i < argc; i++)
821 if (pend[i].type == PD_DEFINE)
822 make_definition (pend[i].arg);
823 else if (pend[i].type == PD_UNDEF)
824 make_undef (pend[i].arg);
825 else if (pend[i].type == PD_ASSERTION)
826 make_assertion (pend[i].arg);
828 /* Unless -fnostdinc,
829 tack on the standard include file dirs to the specified list */
830 if (!no_standard_includes) {
831 const struct default_include *di;
832 struct file_name_list *old_last_include = last_include;
833 struct file_name_list *dirtmp;
834 for (di = cpp_include_defaults; di->fname; di++) {
835 if (di->cplusplus)
836 continue;
837 dirtmp = (struct file_name_list *)
838 xmalloc (sizeof (struct file_name_list));
839 dirtmp->next = 0; /* New one goes on the end */
840 if (include == 0)
841 include = dirtmp;
842 else
843 last_include->next = dirtmp;
844 last_include = dirtmp; /* Tail follows the last one */
845 dirtmp->fname = di->fname;
846 if (strlen (dirtmp->fname) > max_include_len)
847 max_include_len = strlen (dirtmp->fname);
850 if (ignore_srcdir && first_bracket_include == 0)
851 first_bracket_include = old_last_include->next;
854 /* Initialize output buffer */
856 outbuf.buf = (U_CHAR *) xmalloc (OUTBUF_SIZE);
857 outbuf.bufp = outbuf.buf;
858 outbuf.length = OUTBUF_SIZE;
860 /* Scan the -i files before the main input.
861 Much like #including them, but with no_output set
862 so that only their macro definitions matter. */
864 no_output++;
865 indepth++;
866 for (i = 1; i < argc; i++)
867 if (pend[i].type == PD_FILE)
869 int fd = open (pend[i].arg, O_RDONLY, 0666);
870 if (fd < 0)
872 perror_with_name (pend[i].arg);
873 return FATAL_EXIT_CODE;
876 /* For -M, add this file to the dependencies. */
877 if (print_deps)
878 deps_add_dep (deps, pend[i].arg);
880 finclude (fd, pend[i].arg, 0, &outbuf);
882 indepth--;
883 no_output--;
885 /* Pending directives no longer needed. */
886 free ((PTR) pend);
888 /* Create an input stack level for the main input file
889 and copy the entire contents of the file into it. */
891 fp = &instack[++indepth];
893 /* JF check for stdin */
894 if (in_fname == NULL || *in_fname == 0) {
895 in_fname = "";
896 f = 0;
897 } else if ((f = open (in_fname, O_RDONLY, 0666)) < 0)
898 goto sys_error;
900 if (file_size_and_mode (f, &st_mode, &st_size))
901 goto sys_error;
902 fp->fname = in_fname;
903 fp->lineno = 1;
904 /* JF all this is mine about reading pipes and ttys */
905 if (!S_ISREG (st_mode)) {
906 /* Read input from a file that is not a normal disk file.
907 We cannot preallocate a buffer with the correct size,
908 so we must read in the file a piece at the time and make it bigger. */
909 int size;
910 int bsize;
911 int cnt;
912 U_CHAR *bufp;
914 bsize = 2000;
915 size = 0;
916 fp->buf = (U_CHAR *) xmalloc (bsize + 2);
917 bufp = fp->buf;
918 for (;;) {
919 cnt = read (f, bufp, bsize - size);
920 if (cnt < 0) goto sys_error; /* error! */
921 if (cnt == 0) break; /* End of file */
922 size += cnt;
923 bufp += cnt;
924 if (bsize == size) { /* Buffer is full! */
925 bsize *= 2;
926 fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
927 bufp = fp->buf + size; /* May have moved */
930 fp->length = size;
931 } else {
932 /* Read a file whose size we can determine in advance.
933 For the sake of VMS, st_size is just an upper bound. */
934 long i;
935 fp->length = 0;
936 fp->buf = (U_CHAR *) xmalloc (st_size + 2);
938 while (st_size > 0) {
939 i = read (f, fp->buf + fp->length, st_size);
940 if (i <= 0) {
941 if (i == 0) break;
942 goto sys_error;
944 fp->length += i;
945 st_size -= i;
948 fp->bufp = fp->buf;
949 fp->if_stack = if_stack;
950 fixup_newlines (fp);
952 /* Make sure data ends with a newline. And put a null after it. */
954 if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
955 fp->buf[fp->length++] = '\n';
956 fp->buf[fp->length] = '\0';
958 /* Now that we know the input file is valid, open the output. */
960 if (!out_fname || !strcmp (out_fname, ""))
961 out_fname = "stdout";
962 else if (! freopen (out_fname, "w", stdout))
963 pfatal_with_name (out_fname);
965 output_line_command (fp, &outbuf, 0, same_file);
967 /* Scan the input, processing macros and directives. */
969 rescan (&outbuf, 0);
971 /* Now we have processed the entire input
972 Write whichever kind of output has been requested. */
975 if (dump_macros)
976 dump_all_macros ();
977 else if (! inhibit_output)
978 if (write (fileno (stdout), outbuf.buf, outbuf.bufp - outbuf.buf) < 0)
979 fatal ("I/O error on output");
981 /* Don't write the deps file if preprocessing has failed. */
982 if (print_deps && errors == 0)
983 output_deps ();
985 /* Destruct the deps object. */
986 deps_free (deps);
988 if (ferror (stdout))
989 fatal ("I/O error on output");
991 if (errors)
992 exit (FATAL_EXIT_CODE);
993 exit (SUCCESS_EXIT_CODE);
995 sys_error:
996 pfatal_with_name (in_fname);
999 /* Set up dependency-file output. */
1000 static void
1001 init_dependency_output ()
1003 char *spec, *s, *output_file;
1005 /* Either of two environment variables can specify output of deps.
1006 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
1007 where OUTPUT_FILE is the file to write deps info to
1008 and DEPS_TARGET is the target to mention in the deps. */
1010 if (print_deps == 0)
1012 spec = getenv ("DEPENDENCIES_OUTPUT");
1013 if (spec)
1014 print_deps = 1;
1015 else
1017 spec = getenv ("SUNPRO_DEPENDENCIES");
1018 if (spec)
1019 print_deps = 2;
1020 else
1021 return;
1024 /* Find the space before the DEPS_TARGET, if there is one. */
1025 s = strchr (spec, ' ');
1026 if (s)
1028 /* Let the caller perform MAKE quoting. */
1029 deps_add_target (deps, s + 1, 0);
1030 output_file = (char *) xmalloc (s - spec + 1);
1031 memcpy (output_file, spec, s - spec);
1032 output_file[s - spec] = 0;
1034 else
1035 output_file = spec;
1037 /* Command line overrides environment variables. */
1038 if (deps_file == 0)
1039 deps_file = output_file;
1040 deps_append = 1;
1043 /* If dependencies go to standard output, or -MG is used, we should
1044 suppress output. The user may be requesting other stuff to
1045 stdout, with -dM, -v etc. We let them shoot themselves in the
1046 foot. */
1047 if (deps_file == 0 || deps_missing_files)
1048 inhibit_output = 1;
1051 /* Use mkdeps.c to output dependency information. */
1052 static void
1053 output_deps ()
1055 /* Stream on which to print the dependency information. */
1056 FILE *deps_stream = 0;
1057 const char *const deps_mode = deps_append ? "a" : "w";
1059 if (deps_file == 0)
1060 deps_stream = stdout;
1061 else
1063 deps_stream = fopen (deps_file, deps_mode);
1064 if (deps_stream == 0)
1066 error_from_errno (deps_file);
1067 return;
1071 deps_write (deps, deps_stream, 72);
1073 if (print_deps_phony_targets)
1074 deps_phony_targets (deps, deps_stream);
1076 /* Don't close stdout. */
1077 if (deps_file)
1079 if (ferror (deps_stream) || fclose (deps_stream) != 0)
1080 fatal ("I/O error on output");
1084 /* Move all backslash-newline pairs out of embarrassing places.
1085 Exchange all such pairs following BP
1086 with any potentially-embarrasing characters that follow them.
1087 Potentially-embarrassing characters are / and *
1088 (because a backslash-newline inside a comment delimiter
1089 would cause it not to be recognized). */
1090 static void
1091 newline_fix (bp)
1092 U_CHAR *bp;
1094 U_CHAR *p = bp;
1095 int count = 0;
1097 /* First count the backslash-newline pairs here. */
1099 while (*p++ == '\\' && *p++ == '\n')
1100 count++;
1102 p = bp + count * 2;
1104 /* Exit if what follows the backslash-newlines is not embarrassing. */
1106 if (count == 0 || (*p != '/' && *p != '*'))
1107 return;
1109 /* Copy all potentially embarrassing characters
1110 that follow the backslash-newline pairs
1111 down to where the pairs originally started. */
1113 while (*p == '*' || *p == '/')
1114 *bp++ = *p++;
1116 /* Now write the same number of pairs after the embarrassing chars. */
1117 while (count-- > 0) {
1118 *bp++ = '\\';
1119 *bp++ = '\n';
1123 /* Like newline_fix but for use within a directive-name.
1124 Move any backslash-newlines up past any following symbol constituents. */
1125 static void
1126 name_newline_fix (bp)
1127 U_CHAR *bp;
1129 U_CHAR *p = bp;
1130 int count = 0;
1132 /* First count the backslash-newline pairs here. */
1134 while (*p++ == '\\' && *p++ == '\n')
1135 count++;
1137 p = bp + count * 2;
1139 /* What follows the backslash-newlines is not embarrassing. */
1141 if (count == 0 || !is_idchar (*p))
1142 return;
1144 /* Copy all potentially embarrassing characters
1145 that follow the backslash-newline pairs
1146 down to where the pairs originally started. */
1148 while (is_idchar (*p))
1149 *bp++ = *p++;
1151 /* Now write the same number of pairs after the embarrassing chars. */
1152 while (count-- > 0) {
1153 *bp++ = '\\';
1154 *bp++ = '\n';
1159 * The main loop of the program.
1161 * Read characters from the input stack, transferring them to the
1162 * output buffer OP.
1164 * Macros are expanded and push levels on the input stack.
1165 * At the end of such a level it is popped off and we keep reading.
1166 * At the end of any other kind of level, we return.
1167 * #-directives are handled, except within macros.
1169 * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input
1170 * and insert them when appropriate. This is set while scanning macro
1171 * arguments before substitution. It is zero when scanning for final output.
1172 * There are three types of Newline markers:
1173 * * Newline - follows a macro name that was not expanded
1174 * because it appeared inside an expansion of the same macro.
1175 * This marker prevents future expansion of that identifier.
1176 * When the input is rescanned into the final output, these are deleted.
1177 * These are also deleted by ## concatenation.
1178 * * Newline Space (or Newline and any other whitespace character)
1179 * stands for a place that tokens must be separated or whitespace
1180 * is otherwise desirable, but where the ANSI standard specifies there
1181 * is no whitespace. This marker turns into a Space (or whichever other
1182 * whitespace char appears in the marker) in the final output,
1183 * but it turns into nothing in an argument that is stringified with #.
1184 * Such stringified arguments are the only place where the ANSI standard
1185 * specifies with precision that whitespace may not appear.
1187 * During this function, IP->bufp is kept cached in IBP for speed of access.
1188 * Likewise, OP->bufp is kept in OBP. Before calling a subroutine
1189 * IBP, IP and OBP must be copied back to memory. IP and IBP are
1190 * copied back with the RECACHE macro. OBP must be copied back from OP->bufp
1191 * explicitly, and before RECACHE, since RECACHE uses OBP.
1194 static void
1195 rescan (op, output_marks)
1196 FILE_BUF *op;
1197 int output_marks;
1199 /* Character being scanned in main loop. */
1200 U_CHAR c;
1202 /* Length of pending accumulated identifier. */
1203 int ident_length = 0;
1205 /* Hash code of pending accumulated identifier. */
1206 int hash = 0;
1208 /* Current input level (&instack[indepth]). */
1209 FILE_BUF *ip;
1211 /* Pointer for scanning input. */
1212 U_CHAR *ibp;
1214 /* Pointer to end of input. End of scan is controlled by LIMIT. */
1215 U_CHAR *limit;
1217 /* Pointer for storing output. */
1218 U_CHAR *obp;
1220 /* REDO_CHAR is nonzero if we are processing an identifier
1221 after backing up over the terminating character.
1222 Sometimes we process an identifier without backing up over
1223 the terminating character, if the terminating character
1224 is not special. Backing up is done so that the terminating character
1225 will be dispatched on again once the identifier is dealt with. */
1226 int redo_char = 0;
1228 /* 1 if within an identifier inside of which a concatenation
1229 marker (Newline -) has been seen. */
1230 int concatenated = 0;
1232 /* While scanning a comment or a string constant,
1233 this records the line it started on, for error messages. */
1234 int start_line;
1236 /* Record position of last `real' newline. */
1237 U_CHAR *beg_of_line;
1239 /* This has to be a global bacause of RECACHE. */
1240 U_CHAR *obufp_before_macroname = NULL;
1242 /* Pop the innermost input stack level, assuming it is a macro expansion. */
1244 #define POPMACRO \
1245 do { ip->macro->type = T_MACRO; \
1246 if (ip->free_ptr) free (ip->free_ptr); \
1247 --indepth; } while (0)
1249 /* Reload `rescan's local variables that describe the current
1250 level of the input stack. */
1252 #define RECACHE \
1253 do { ip = &instack[indepth]; \
1254 ibp = ip->bufp; \
1255 limit = ip->buf + ip->length; \
1256 op->bufp = obp; \
1257 check_expand (op, limit - ibp); \
1258 beg_of_line = 0; \
1259 obufp_before_macroname += op->bufp - obp; \
1260 obp = op->bufp; } while (0)
1262 if (no_output && instack[indepth].fname != 0)
1263 skip_if_group (&instack[indepth], 1);
1265 obp = op->bufp;
1266 RECACHE;
1267 beg_of_line = ibp;
1269 /* Our caller must always put a null after the end of
1270 the input at each input stack level. */
1271 if (*limit != 0)
1272 abort ();
1274 while (1) {
1275 c = *ibp++;
1276 *obp++ = c;
1278 switch (c) {
1279 case '\\':
1280 if (ibp >= limit)
1281 break;
1282 if (*ibp == '\n') {
1283 /* Always merge lines ending with backslash-newline,
1284 even in middle of identifier. */
1285 ++ibp;
1286 ++ip->lineno;
1287 --obp; /* remove backslash from obuf */
1288 break;
1290 /* Otherwise, backslash suppresses specialness of following char,
1291 so copy it here to prevent the switch from seeing it.
1292 But first get any pending identifier processed. */
1293 if (ident_length > 0)
1294 goto specialchar;
1295 *obp++ = *ibp++;
1296 break;
1298 case '#':
1299 /* If this is expanding a macro definition, don't recognize
1300 preprocessor directives. */
1301 if (ip->macro != 0)
1302 goto randomchar;
1303 if (ident_length)
1304 goto specialchar;
1306 /* # keyword: a # must be the first char on the line */
1307 if (beg_of_line == 0)
1308 goto randomchar;
1309 if (beg_of_line + 1 != ibp)
1310 goto randomchar;
1312 /* This # can start a directive. */
1314 --obp; /* Don't copy the '#' */
1316 ip->bufp = ibp;
1317 op->bufp = obp;
1318 if (! handle_directive (ip, op)) {
1319 #ifdef USE_C_ALLOCA
1320 alloca (0);
1321 #endif
1322 /* Not a known directive: treat it as ordinary text.
1323 IP, OP, IBP, etc. have not been changed. */
1324 if (no_output && instack[indepth].fname) {
1325 /* If not generating expanded output,
1326 what we do with ordinary text is skip it.
1327 Discard everything until next # directive. */
1328 skip_if_group (&instack[indepth], 1);
1329 RECACHE;
1330 beg_of_line = ibp;
1331 break;
1333 ++obp; /* Copy the '#' after all */
1334 goto randomchar;
1336 #ifdef USE_C_ALLOCA
1337 alloca (0);
1338 #endif
1339 /* A # directive has been successfully processed. */
1340 /* If not generating expanded output, ignore everything until
1341 next # directive. */
1342 if (no_output && instack[indepth].fname)
1343 skip_if_group (&instack[indepth], 1);
1344 obp = op->bufp;
1345 RECACHE;
1346 beg_of_line = ibp;
1347 break;
1349 case '\"': /* skip quoted string */
1350 case '\'':
1351 /* A single quoted string is treated like a double -- some
1352 programs (e.g., troff) are perverse this way */
1354 if (ident_length)
1355 goto specialchar;
1357 start_line = ip->lineno;
1359 /* Skip ahead to a matching quote. */
1361 while (1) {
1362 if (ibp >= limit) {
1363 if (ip->macro != 0) {
1364 /* try harder: this string crosses a macro expansion boundary */
1365 POPMACRO;
1366 RECACHE;
1367 continue;
1369 break;
1371 *obp++ = *ibp;
1372 switch (*ibp++) {
1373 case '\n':
1374 ++ip->lineno;
1375 ++op->lineno;
1376 /* Traditionally, end of line ends a string constant with no error.
1377 So exit the loop and record the new line. */
1378 beg_of_line = ibp;
1379 goto while2end;
1381 case '\\':
1382 if (ibp >= limit)
1383 break;
1384 if (*ibp == '\n') {
1385 /* Backslash newline is replaced by nothing at all,
1386 but keep the line counts correct. */
1387 --obp;
1388 ++ibp;
1389 ++ip->lineno;
1390 } else {
1391 /* ANSI stupidly requires that in \\ the second \
1392 is *not* prevented from combining with a newline. */
1393 while (*ibp == '\\' && ibp[1] == '\n') {
1394 ibp += 2;
1395 ++ip->lineno;
1397 *obp++ = *ibp++;
1399 break;
1401 case '\"':
1402 case '\'':
1403 if (ibp[-1] == c)
1404 goto while2end;
1405 break;
1408 while2end:
1409 break;
1411 case '/':
1412 if (*ibp == '\\' && ibp[1] == '\n')
1413 newline_fix (ibp);
1414 /* Don't look for comments inside a macro definition. */
1415 if (ip->macro != 0)
1416 goto randomchar;
1417 /* A comment constitutes white space, so it can terminate an identifier.
1418 Process the identifier, if any. */
1419 if (ident_length)
1420 goto specialchar;
1422 if (*ibp != '*')
1423 goto randomchar;
1425 /* We have a comment. Skip it, optionally copying it to output. */
1427 start_line = ip->lineno;
1429 ++ibp; /* Skip the star. */
1431 /* In K+R C, a comment is equivalent to nothing. Note that we
1432 already output the slash; we might not want it. */
1433 if (! put_out_comments)
1434 obp--;
1435 else
1436 *obp++ = '*';
1439 U_CHAR *before_bp = ibp;
1441 while (ibp < limit) {
1442 switch (*ibp++) {
1443 case '/':
1444 if (warn_comments && ibp < limit && *ibp == '*')
1445 warning("`/*' within comment");
1446 break;
1447 case '*':
1448 if (*ibp == '\\' && ibp[1] == '\n')
1449 newline_fix (ibp);
1450 if (ibp >= limit || *ibp == '/')
1451 goto comment_end;
1452 break;
1453 case '\n':
1454 ++ip->lineno;
1455 /* Copy the newline into the output buffer, in order to
1456 avoid the pain of a #line every time a multiline comment
1457 is seen. */
1458 if (!put_out_comments)
1459 *obp++ = '\n';
1460 ++op->lineno;
1463 comment_end:
1465 if (ibp >= limit)
1466 error_with_line (line_for_error (start_line),
1467 "unterminated comment");
1468 else {
1469 ibp++;
1470 if (put_out_comments) {
1471 memcpy (obp, before_bp, ibp - before_bp);
1472 obp += ibp - before_bp;
1476 break;
1478 case '0': case '1': case '2': case '3': case '4':
1479 case '5': case '6': case '7': case '8': case '9':
1480 /* If digit is not part of identifier, it starts a number,
1481 which means that following letters are not an identifier.
1482 "0x5" does not refer to an identifier "x5".
1483 So copy all alphanumerics that follow without accumulating
1484 as an identifier. Periods also, for sake of "3.e7". */
1486 if (ident_length == 0) {
1487 while (ibp < limit) {
1488 while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
1489 ++ip->lineno;
1490 ibp += 2;
1492 c = *ibp++;
1493 if (! ISIDNUM (c) && c != '.') {
1494 --ibp;
1495 break;
1497 *obp++ = c;
1498 /* A sign can be part of a preprocessing number
1499 if it follows an e. */
1500 if (c == 'e' || c == 'E') {
1501 while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
1502 ++ip->lineno;
1503 ibp += 2;
1505 if (ibp < limit && (*ibp == '+' || *ibp == '-')) {
1506 *obp++ = *ibp++;
1507 /* Traditional C does not let the token go past the sign. */
1508 break;
1512 break;
1514 /* fall through */
1516 case '_':
1517 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
1518 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
1519 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
1520 case 's': case 't': case 'u': case 'v': case 'w': case 'x':
1521 case 'y': case 'z':
1522 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
1523 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
1524 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
1525 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
1526 case 'Y': case 'Z':
1527 ident_length++;
1528 /* Compute step of hash function, to avoid a proc call on every token */
1529 hash = HASHSTEP (hash, c);
1530 break;
1532 case '\n':
1533 /* If reprocessing a macro expansion, newline is a special marker. */
1534 if (ip->macro != 0) {
1535 /* Newline White is a "funny space" to separate tokens that are
1536 supposed to be separate but without space between.
1537 Here White means any horizontal whitespace character.
1538 Newline - marks a recursive macro use that is not
1539 supposed to be expandable. */
1541 if (*ibp == '-') {
1542 /* Newline - inhibits expansion of preceding token.
1543 If expanding a macro arg, we keep the newline -.
1544 In final output, it is deleted. */
1545 if (! concatenated) {
1546 ident_length = 0;
1547 hash = 0;
1549 ibp++;
1550 if (!output_marks) {
1551 obp--;
1552 } else {
1553 /* If expanding a macro arg, keep the newline -. */
1554 *obp++ = '-';
1556 } else if (is_space (*ibp)) {
1557 /* Newline Space does not prevent expansion of preceding token
1558 so expand the preceding token and then come back. */
1559 if (ident_length > 0)
1560 goto specialchar;
1562 /* If generating final output, newline space makes a space. */
1563 if (!output_marks) {
1564 obp[-1] = *ibp++;
1565 /* And Newline Newline makes a newline, so count it. */
1566 if (obp[-1] == '\n')
1567 op->lineno++;
1568 } else {
1569 /* If expanding a macro arg, keep the newline space.
1570 If the arg gets stringified, newline space makes nothing. */
1571 *obp++ = *ibp++;
1573 } else abort (); /* Newline followed by something random? */
1574 break;
1577 /* If there is a pending identifier, handle it and come back here. */
1578 if (ident_length > 0)
1579 goto specialchar;
1581 beg_of_line = ibp;
1583 /* Update the line counts and output a #line if necessary. */
1584 ++ip->lineno;
1585 ++op->lineno;
1586 if (ip->lineno != op->lineno) {
1587 op->bufp = obp;
1588 output_line_command (ip, op, 1, same_file);
1589 check_expand (op, ip->length - (ip->bufp - ip->buf));
1590 obp = op->bufp;
1592 break;
1594 /* Come here either after (1) a null character that is part of the input
1595 or (2) at the end of the input, because there is a null there. */
1596 case 0:
1597 if (ibp <= limit)
1598 /* Our input really contains a null character. */
1599 goto randomchar;
1601 /* At end of a macro-expansion level, pop it and read next level. */
1602 if (ip->macro != 0) {
1603 obp--;
1604 ibp--;
1605 /* If we have an identifier that ends here, process it now, so
1606 we get the right error for recursion. */
1607 if (ident_length && ! is_idchar (*instack[indepth - 1].bufp)) {
1608 redo_char = 1;
1609 goto randomchar;
1611 POPMACRO;
1612 RECACHE;
1613 break;
1616 /* If we don't have a pending identifier,
1617 return at end of input. */
1618 if (ident_length == 0) {
1619 obp--;
1620 ibp--;
1621 op->bufp = obp;
1622 ip->bufp = ibp;
1623 goto ending;
1626 /* If we do have a pending identifier, just consider this null
1627 a special character and arrange to dispatch on it again.
1628 The second time, IDENT_LENGTH will be zero so we will return. */
1630 /* Fall through */
1632 specialchar:
1634 /* Handle the case of a character such as /, ', " or null
1635 seen following an identifier. Back over it so that
1636 after the identifier is processed the special char
1637 will be dispatched on again. */
1639 ibp--;
1640 obp--;
1641 redo_char = 1;
1643 default:
1645 randomchar:
1647 if (ident_length > 0) {
1648 HASHNODE *hp;
1650 /* We have just seen an identifier end. If it's a macro, expand it.
1652 IDENT_LENGTH is the length of the identifier
1653 and HASH is its hash code.
1655 The identifier has already been copied to the output,
1656 so if it is a macro we must remove it.
1658 If REDO_CHAR is 0, the char that terminated the identifier
1659 has been skipped in the output and the input.
1660 OBP-IDENT_LENGTH-1 points to the identifier.
1661 If the identifier is a macro, we must back over the terminator.
1663 If REDO_CHAR is 1, the terminating char has already been
1664 backed over. OBP-IDENT_LENGTH points to the identifier. */
1666 for (hp = hashtab[MAKE_POS (hash) % HASHSIZE]; hp != NULL;
1667 hp = hp->next) {
1669 if (hp->length == ident_length) {
1670 /* obufp_before_macroname is used only in this block,
1671 but it has to be global because of RECACHE. */
1672 int op_lineno_before_macroname;
1673 int i = ident_length;
1674 U_CHAR *p = hp->name;
1675 U_CHAR *q = obp - i;
1677 if (! redo_char)
1678 q--;
1680 do { /* All this to avoid a strncmp () */
1681 if (*p++ != *q++)
1682 goto hashcollision;
1683 } while (--i);
1685 /* We found a use of a macro name.
1686 see if the context shows it is a macro call. */
1688 /* Back up over terminating character if not already done. */
1689 if (! redo_char) {
1690 ibp--;
1691 obp--;
1694 obufp_before_macroname = obp - ident_length;
1695 op_lineno_before_macroname = op->lineno;
1697 /* If macro wants an arglist, verify that a '(' follows.
1698 first skip all whitespace, copying it to the output
1699 after the macro name. Then, if there is no '(',
1700 decide this is not a macro call and leave things that way. */
1701 if (hp->type == T_MACRO && hp->value.defn->nargs >= 0)
1703 while (1) {
1704 /* Scan forward over whitespace, copying it to the output. */
1705 if (ibp == limit && ip->macro != 0) {
1706 POPMACRO;
1707 RECACHE;
1709 /* A comment: copy it unchanged or discard it. */
1710 else if (*ibp == '/' && ibp+1 != limit && ibp[1] == '*') {
1711 if (put_out_comments) {
1712 *obp++ = '/';
1713 *obp++ = '*';
1715 ibp += 2;
1716 while (ibp + 1 != limit
1717 && !(ibp[0] == '*' && ibp[1] == '/')) {
1718 /* We need not worry about newline-marks,
1719 since they are never found in comments. */
1720 if (*ibp == '\n') {
1721 /* Newline in a file. Count it. */
1722 ++ip->lineno;
1723 ++op->lineno;
1725 if (put_out_comments)
1726 *obp++ = *ibp++;
1727 else
1728 ibp++;
1730 ibp += 2;
1731 if (put_out_comments) {
1732 *obp++ = '*';
1733 *obp++ = '/';
1736 else if (is_space (*ibp)) {
1737 *obp++ = *ibp++;
1738 if (ibp[-1] == '\n') {
1739 if (ip->macro == 0) {
1740 /* Newline in a file. Count it. */
1741 ++ip->lineno;
1742 ++op->lineno;
1743 } else if (!output_marks) {
1744 /* A newline mark, and we don't want marks
1745 in the output. If it is newline-hyphen,
1746 discard it entirely. Otherwise, it is
1747 newline-whitechar, so keep the whitechar. */
1748 obp--;
1749 if (*ibp == '-')
1750 ibp++;
1751 else {
1752 if (*ibp == '\n')
1753 ++op->lineno;
1754 *obp++ = *ibp++;
1756 } else {
1757 /* A newline mark; copy both chars to the output. */
1758 *obp++ = *ibp++;
1762 else break;
1764 if (*ibp != '(')
1765 break;
1768 /* This is now known to be a macro call.
1769 Discard the macro name from the output,
1770 along with any following whitespace just copied. */
1771 obp = obufp_before_macroname;
1772 op->lineno = op_lineno_before_macroname;
1774 /* Expand the macro, reading arguments as needed,
1775 and push the expansion on the input stack. */
1776 ip->bufp = ibp;
1777 op->bufp = obp;
1778 macroexpand (hp, op);
1780 /* Reexamine input stack, since macroexpand has pushed
1781 a new level on it. */
1782 obp = op->bufp;
1783 RECACHE;
1784 break;
1786 hashcollision:
1788 } /* End hash-table-search loop */
1789 ident_length = hash = 0; /* Stop collecting identifier */
1790 redo_char = 0;
1791 concatenated = 0;
1792 } /* End if (ident_length > 0) */
1793 } /* End switch */
1794 } /* End per-char loop */
1796 /* Come here to return -- but first give an error message
1797 if there was an unterminated successful conditional. */
1798 ending:
1799 if (if_stack != ip->if_stack) {
1800 const char *str;
1801 switch (if_stack->type) {
1802 case T_IF:
1803 str = "if";
1804 break;
1805 case T_IFDEF:
1806 str = "ifdef";
1807 break;
1808 case T_IFNDEF:
1809 str = "ifndef";
1810 break;
1811 case T_ELSE:
1812 str = "else";
1813 break;
1814 case T_ELIF:
1815 str = "elif";
1816 break;
1817 default:
1818 abort ();
1820 error_with_line (line_for_error (if_stack->lineno),
1821 "unterminated #%s conditional", str);
1823 if_stack = ip->if_stack;
1827 * Rescan a string into a temporary buffer and return the result
1828 * as a FILE_BUF. Note this function returns a struct, not a pointer.
1830 * OUTPUT_MARKS nonzero means keep Newline markers found in the input
1831 * and insert such markers when appropriate. See `rescan' for details.
1832 * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
1833 * before substitution; it is 0 for other uses.
1835 static FILE_BUF
1836 expand_to_temp_buffer (buf, limit, output_marks)
1837 const U_CHAR *buf, *limit;
1838 int output_marks;
1840 FILE_BUF *ip;
1841 FILE_BUF obuf;
1842 int length = limit - buf;
1843 U_CHAR *buf1;
1844 int odepth = indepth;
1846 if (length < 0)
1847 abort ();
1849 /* Set up the input on the input stack. */
1851 buf1 = (U_CHAR *) alloca (length + 1);
1853 const U_CHAR *p1 = buf;
1854 U_CHAR *p2 = buf1;
1856 while (p1 != limit)
1857 *p2++ = *p1++;
1859 buf1[length] = 0;
1861 /* Set up to receive the output. */
1863 obuf.length = length * 2 + 100; /* Usually enough. Why be stingy? */
1864 obuf.bufp = obuf.buf = (U_CHAR *) xmalloc (obuf.length);
1865 obuf.fname = 0;
1866 obuf.macro = 0;
1867 obuf.free_ptr = 0;
1869 CHECK_DEPTH ({return obuf;});
1871 ++indepth;
1873 ip = &instack[indepth];
1874 ip->fname = 0;
1875 ip->macro = 0;
1876 ip->free_ptr = 0;
1877 ip->length = length;
1878 ip->buf = ip->bufp = buf1;
1879 ip->if_stack = if_stack;
1881 ip->lineno = obuf.lineno = 1;
1883 /* Scan the input, create the output. */
1885 rescan (&obuf, output_marks);
1887 /* Pop input stack to original state. */
1888 --indepth;
1890 if (indepth != odepth)
1891 abort ();
1893 /* Record the output. */
1894 obuf.length = obuf.bufp - obuf.buf;
1896 return obuf;
1900 * Process a # directive. Expects IP->bufp to point to the '#', as in
1901 * `#define foo bar'. Passes to the command handler
1902 * (do_define, do_include, etc.): the addresses of the 1st and
1903 * last chars of the command (starting immediately after the #
1904 * keyword), plus op and the keyword table pointer. If the command
1905 * contains comments it is copied into a temporary buffer sans comments
1906 * and the temporary buffer is passed to the command handler instead.
1907 * Likewise for backslash-newlines.
1909 * Returns nonzero if this was a known # directive.
1910 * Otherwise, returns zero, without advancing the input pointer.
1913 static int
1914 handle_directive (ip, op)
1915 FILE_BUF *ip, *op;
1917 U_CHAR *bp, *cp;
1918 const struct directive *kt;
1919 int ident_length;
1920 U_CHAR *resume_p;
1922 /* Nonzero means we must copy the entire command
1923 to get rid of comments or backslash-newlines. */
1924 int copy_command = 0;
1926 U_CHAR *ident, *after_ident;
1928 bp = ip->bufp;
1929 /* Skip whitespace and \-newline. */
1930 while (1) {
1931 if (is_nvspace (*bp))
1932 bp++;
1933 else if (*bp == '/' && (newline_fix (bp + 1), bp[1]) == '*') {
1934 ip->bufp = bp;
1935 skip_to_end_of_comment (ip, &ip->lineno);
1936 bp = ip->bufp;
1937 } else if (*bp == '\\' && bp[1] == '\n') {
1938 bp += 2; ip->lineno++;
1939 } else break;
1942 /* Now find end of directive name.
1943 If we encounter a backslash-newline, exchange it with any following
1944 symbol-constituents so that we end up with a contiguous name. */
1946 cp = bp;
1947 while (1) {
1948 if (is_idchar (*cp))
1949 cp++;
1950 else {
1951 if (*cp == '\\' && cp[1] == '\n')
1952 name_newline_fix (cp);
1953 if (is_idchar (*cp))
1954 cp++;
1955 else break;
1958 ident_length = cp - bp;
1959 ident = bp;
1960 after_ident = cp;
1962 /* A line of just `#' becomes blank. */
1964 if (ident_length == 0 && *after_ident == '\n') {
1965 ip->bufp = after_ident;
1966 return 1;
1970 * Decode the keyword and call the appropriate expansion
1971 * routine, after moving the input pointer up to the next line.
1973 for (kt = directive_table; kt->length > 0; kt++) {
1974 if (kt->length == ident_length
1975 && !strncmp (kt->name, (const char *)ident, ident_length)) {
1976 U_CHAR *buf;
1977 U_CHAR *limit = ip->buf + ip->length;
1978 int unterminated = 0;
1980 /* Nonzero means do not delete comments within the directive.
1981 #define needs this to detect traditional token paste. */
1982 int keep_comments = kt->type == T_DEFINE;
1984 /* Find the end of this command (first newline not backslashed
1985 and not in a string or comment).
1986 Set COPY_COMMAND if the command must be copied
1987 (it contains a backslash-newline or a comment). */
1989 buf = bp = after_ident;
1990 while (bp < limit) {
1991 U_CHAR c = *bp++;
1992 switch (c) {
1993 case '\\':
1994 if (bp < limit) {
1995 if (*bp == '\n') {
1996 ip->lineno++;
1997 copy_command = 1;
1999 bp++;
2001 break;
2003 case '\'':
2004 case '\"':
2005 bp = skip_quoted_string (bp - 1, limit, ip->lineno, &ip->lineno, &copy_command, &unterminated);
2006 if (unterminated) {
2007 /* Traditional preprocessing permits unterminated strings. */
2008 ip->bufp = bp;
2009 goto endloop1;
2011 break;
2013 /* <...> is special for #include. */
2014 case '<':
2015 if (kt->type != T_INCLUDE)
2016 break;
2017 while (*bp && *bp != '>') bp++;
2018 break;
2020 case '/':
2021 if (*bp == '\\' && bp[1] == '\n')
2022 newline_fix (bp);
2023 if (*bp == '*') {
2024 U_CHAR *obp = bp - 1;
2025 ip->bufp = bp + 1;
2026 skip_to_end_of_comment (ip, &ip->lineno);
2027 bp = ip->bufp;
2028 /* No need to copy the command because of a comment at the end;
2029 just don't include the comment in the directive. */
2030 if (bp == limit || *bp == '\n') {
2031 bp = obp;
2032 goto endloop1;
2034 /* Don't remove the comments if this is #define. */
2035 if (! keep_comments)
2036 copy_command++;
2038 break;
2040 case '\n':
2041 --bp; /* Point to the newline */
2042 ip->bufp = bp;
2043 goto endloop1;
2046 ip->bufp = bp;
2048 endloop1:
2049 resume_p = ip->bufp;
2050 /* BP is the end of the directive.
2051 RESUME_P is the next interesting data after the directive.
2052 A comment may come between. */
2054 if (copy_command) {
2055 U_CHAR *xp = buf;
2056 /* Need to copy entire command into temp buffer before dispatching */
2058 cp = (U_CHAR *) alloca (bp - buf + 5); /* room for cmd plus
2059 some slop */
2060 buf = cp;
2062 /* Copy to the new buffer, deleting comments
2063 and backslash-newlines (and whitespace surrounding the latter). */
2065 while (xp < bp) {
2066 U_CHAR c = *xp++;
2067 *cp++ = c;
2069 switch (c) {
2070 case '\n':
2071 break;
2073 /* <...> is special for #include. */
2074 case '<':
2075 if (kt->type != T_INCLUDE)
2076 break;
2077 while (xp < bp && c != '>') {
2078 c = *xp++;
2079 if (c == '\\' && xp < bp && *xp == '\n')
2080 xp++, ip->lineno++;
2081 else
2082 *cp++ = c;
2084 break;
2086 case '\\':
2087 if (*xp == '\n') {
2088 xp++;
2089 cp--;
2090 if (cp != buf && is_space (cp[-1])) {
2091 while (cp != buf && is_space(cp[-1])) cp--;
2092 cp++;
2093 SKIP_WHITE_SPACE (xp);
2094 } else if (is_nvspace (*xp)) {
2095 *cp++ = *xp++;
2096 SKIP_WHITE_SPACE (xp);
2098 } else {
2099 *cp++ = *xp++;
2101 break;
2103 case '\'':
2104 case '\"':
2106 const U_CHAR *bp1
2107 = skip_quoted_string (xp - 1, limit, ip->lineno, 0, 0, 0);
2108 while (xp != bp1)
2109 *cp++ = *xp++;
2111 break;
2113 case '/':
2114 if (*xp == '*') {
2115 ip->bufp = xp + 1;
2116 skip_to_end_of_comment (ip, 0);
2117 if (keep_comments)
2118 while (xp != ip->bufp)
2119 *cp++ = *xp++;
2120 /* Delete the slash. */
2121 else
2122 cp--;
2123 xp = ip->bufp;
2128 /* Null-terminate the copy. */
2130 *cp = 0;
2132 else
2133 cp = bp;
2135 ip->bufp = resume_p;
2137 /* Call the appropriate command handler. buf now points to
2138 either the appropriate place in the input buffer, or to
2139 the temp buffer if it was necessary to make one. cp
2140 points to the first char after the contents of the (possibly
2141 copied) command, in either case. */
2142 (*kt->func) (buf, cp, op);
2143 check_expand (op, ip->length - (ip->bufp - ip->buf));
2145 return 1;
2149 return 0;
2152 static const char *const
2153 monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
2154 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
2157 * expand things like __FILE__. Place the expansion into the output
2158 * buffer *without* rescanning.
2160 static void
2161 special_symbol (hp, op)
2162 HASHNODE *hp;
2163 FILE_BUF *op;
2165 const char *buf;
2166 time_t t;
2167 int i, len;
2168 int true_indepth;
2169 FILE_BUF *ip = NULL;
2170 static struct tm *timebuf = NULL;
2172 int paren = 0; /* For special `defined' keyword */
2174 for (i = indepth; i >= 0; i--)
2175 if (instack[i].fname != NULL) {
2176 ip = &instack[i];
2177 break;
2179 if (ip == NULL)
2180 fatal ("not in any file?!");
2182 switch (hp->type) {
2183 case T_FILE:
2184 case T_BASE_FILE:
2186 const char *string;
2187 if (hp->type == T_FILE)
2188 string = ip->fname;
2189 else
2190 string = instack[0].fname;
2192 if (string)
2194 char *tmp = (char *) alloca (3 + strlen (string));
2195 sprintf (tmp, "\"%s\"", string);
2196 buf = tmp;
2198 else
2199 buf = "";
2201 break;
2204 case T_INCLUDE_LEVEL:
2206 char *tmp = (char *) alloca (8); /* Eigth bytes ought to be more than enough */
2207 true_indepth = 0;
2208 for (i = indepth; i >= 0; i--)
2209 if (instack[i].fname != NULL)
2210 true_indepth++;
2212 sprintf (tmp, "%d", true_indepth - 1);
2213 buf = tmp;
2214 break;
2217 case T_VERSION:
2219 char *tmp = (char *) alloca (3 + strlen (version_string));
2220 sprintf (tmp, "\"%s\"", version_string);
2221 buf = tmp;
2222 break;
2225 case T_CONST:
2226 buf = hp->value.cpval;
2227 break;
2229 case T_SPECLINE:
2231 char *tmp = (char *) alloca (10);
2232 sprintf (tmp, "%d", ip->lineno);
2233 buf = tmp;
2234 break;
2237 case T_DATE:
2238 case T_TIME:
2240 char *tmp = (char *) alloca (20);
2242 if (timebuf == NULL) {
2243 t = time (0);
2244 timebuf = localtime (&t);
2246 if (hp->type == T_DATE)
2247 sprintf (tmp, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
2248 timebuf->tm_mday, timebuf->tm_year + 1900);
2249 else
2250 sprintf (tmp, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
2251 timebuf->tm_sec);
2252 buf = tmp;
2253 break;
2256 case T_SPEC_DEFINED:
2257 buf = " 0 "; /* Assume symbol is not defined */
2258 ip = &instack[indepth];
2259 SKIP_WHITE_SPACE (ip->bufp);
2260 if (*ip->bufp == '(') {
2261 paren++;
2262 ip->bufp++; /* Skip over the paren */
2263 SKIP_WHITE_SPACE (ip->bufp);
2266 if (!is_idstart (*ip->bufp))
2267 goto oops;
2269 HASHNODE *hp = lookup (ip->bufp, -1, -1);
2271 if (hp && hp->type != T_UNUSED && hp->type != T_SPEC_DEFINED)
2272 buf = " 1 ";
2274 while (is_idchar (*ip->bufp))
2275 ++ip->bufp;
2276 SKIP_WHITE_SPACE (ip->bufp);
2277 if (paren) {
2278 if (*ip->bufp != ')')
2279 goto oops;
2280 ++ip->bufp;
2282 break;
2284 oops:
2286 error ("`defined' must be followed by ident or (ident)");
2287 break;
2289 default:
2290 error ("cccp error: invalid special hash type"); /* time for gdb */
2291 abort ();
2293 len = strlen (buf);
2294 check_expand (op, len);
2295 memcpy (op->bufp, buf, len);
2296 op->bufp += len;
2300 /* Routines to handle #directives */
2303 * Process include file by reading it in and calling rescan.
2304 * Expects to see "fname" or <fname> on the input.
2306 static void
2307 do_include (buf, limit, op)
2308 U_CHAR *buf, *limit;
2309 FILE_BUF *op;
2311 U_CHAR *fbeg, *fend; /* Beginning and end of fname */
2313 struct file_name_list *stackp = include; /* Chain of dirs to search */
2314 struct file_name_list dsp[1]; /* First in chain, if #include "..." */
2315 int flen;
2317 int retried = 0; /* Have already tried macro
2318 expanding the include line*/
2319 FILE_BUF trybuf; /* It got expanded into here */
2320 int system_header_p = 0; /* 0 for "...", 1 for <...> */
2322 get_filename:
2324 fbeg = buf;
2325 SKIP_WHITE_SPACE (fbeg);
2326 /* Discard trailing whitespace so we can easily see
2327 if we have parsed all the significant chars we were given. */
2328 while (limit != fbeg && is_nvspace (limit[-1])) limit--;
2330 switch (*fbeg++) {
2331 case '\"':
2332 fend = fbeg;
2333 while (fend != limit && *fend != '\"')
2334 fend++;
2335 if (*fend == '\"' && fend + 1 == limit) {
2336 FILE_BUF *fp;
2338 /* We have "filename". Figure out directory this source
2339 file is coming from and put it on the front of the list. */
2341 /* If -I- was specified, don't search current dir, only spec'd ones. */
2342 if (ignore_srcdir) break;
2344 for (fp = &instack[indepth]; fp >= instack; fp--)
2346 size_t n;
2347 const char *ep, *nam;
2349 if ((nam = fp->fname) != NULL) {
2350 /* Found a named file. Figure out dir of the file,
2351 and put it in front of the search list. */
2352 dsp[0].next = stackp;
2353 stackp = dsp;
2354 ep = strrchr (nam, '/');
2355 if (ep != NULL) {
2356 char *f;
2357 n = ep - nam;
2358 f = (char *) alloca (n + 1);
2359 strncpy (f, nam, n);
2360 f[n] = '\0';
2361 dsp[0].fname = f;
2362 if (n > max_include_len) max_include_len = n;
2363 } else {
2364 dsp[0].fname = 0; /* Current directory */
2366 break;
2369 break;
2371 goto fail;
2373 case '<':
2374 fend = fbeg;
2375 while (fend != limit && *fend != '>') fend++;
2376 if (*fend == '>' && fend + 1 == limit) {
2377 system_header_p = 1;
2378 /* If -I-, start with the first -I dir after the -I-. */
2379 if (first_bracket_include)
2380 stackp = first_bracket_include;
2381 break;
2383 goto fail;
2385 default:
2386 fail:
2387 if (retried) {
2388 error ("#include expects \"fname\" or <fname>");
2389 return;
2390 } else {
2391 trybuf = expand_to_temp_buffer (buf, limit, 0);
2392 buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
2393 memcpy (buf, trybuf.buf, trybuf.bufp - trybuf.buf);
2394 limit = buf + (trybuf.bufp - trybuf.buf);
2395 free (trybuf.buf);
2396 retried++;
2397 goto get_filename;
2401 flen = fend - fbeg;
2402 process_include (stackp, fbeg, flen, system_header_p, op);
2405 static void
2406 do_include_next (buf, limit, op)
2407 U_CHAR *buf, *limit;
2408 FILE_BUF *op;
2410 U_CHAR *fbeg, *fend; /* Beginning and end of fname */
2412 struct file_name_list *stackp; /* Chain of dirs to search */
2413 int flen;
2415 int retried = 0; /* Have already tried macro
2416 expanding the include line*/
2417 FILE_BUF trybuf; /* It got expanded into here */
2418 int system_header_p = 0; /* 0 for "...", 1 for <...> */
2420 /* Treat as plain #include if we don't know where to start
2421 looking. */
2422 stackp = instack[indepth].next_header_dir;
2423 if (stackp == 0)
2425 do_include (buf, limit, op);
2426 return;
2429 get_filename:
2431 fbeg = buf;
2432 SKIP_WHITE_SPACE (fbeg);
2433 /* Discard trailing whitespace so we can easily see
2434 if we have parsed all the significant chars we were given. */
2435 while (limit != fbeg && is_nvspace (limit[-1])) limit--;
2437 switch (*fbeg++) {
2438 case '\"':
2439 fend = fbeg;
2440 while (fend != limit && *fend != '\"')
2441 fend++;
2442 if (*fend == '\"' && fend + 1 == limit)
2443 break;
2444 goto fail;
2446 case '<':
2447 fend = fbeg;
2448 while (fend != limit && *fend != '>') fend++;
2449 if (*fend == '>' && fend + 1 == limit) {
2450 system_header_p = 1;
2451 break;
2453 goto fail;
2455 default:
2456 fail:
2457 if (retried) {
2458 error ("#include expects \"fname\" or <fname>");
2459 return;
2460 } else {
2461 trybuf = expand_to_temp_buffer (buf, limit, 0);
2462 buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
2463 memcpy (buf, trybuf.buf, trybuf.bufp - trybuf.buf);
2464 limit = buf + (trybuf.bufp - trybuf.buf);
2465 free (trybuf.buf);
2466 retried++;
2467 goto get_filename;
2471 flen = fend - fbeg;
2472 process_include (stackp, fbeg, flen, system_header_p, op);
2475 static void
2476 process_include (stackp, fbeg, flen, system_header_p, op)
2477 struct file_name_list *stackp;
2478 const U_CHAR *fbeg;
2479 int flen;
2480 int system_header_p;
2481 FILE_BUF *op;
2483 char *fname;
2484 int f = -1; /* file number */
2486 fname = (char *) alloca (max_include_len + flen + 2);
2487 /* + 2 above for slash and terminating null. */
2489 /* If specified file name is absolute, just open it. */
2491 if (IS_ABSOLUTE_PATHNAME (fbeg)) {
2492 strncpy (fname, (const char *)fbeg, flen);
2493 fname[flen] = 0;
2494 f = open (fname, O_RDONLY, 0666);
2495 } else {
2496 /* Search directory path, trying to open the file.
2497 Copy each filename tried into FNAME. */
2499 for (; stackp; stackp = stackp->next) {
2500 if (stackp->fname) {
2501 strcpy (fname, stackp->fname);
2502 strcat (fname, "/");
2503 fname[strlen (fname) + flen] = 0;
2504 } else {
2505 fname[0] = 0;
2507 strncat (fname, (const char *)fbeg, flen);
2508 if ((f = open (fname, O_RDONLY, 0666)) >= 0)
2509 break;
2513 if (f < 0) {
2514 strncpy (fname, (const char *)fbeg, flen);
2515 fname[flen] = 0;
2516 if (deps_missing_files
2517 && print_deps > (system_header_p || (system_include_depth > 0))) {
2519 /* If requested as a system header, assume it belongs in
2520 the first system header directory. */
2521 if (first_bracket_include)
2522 stackp = first_bracket_include;
2523 else
2524 stackp = include;
2526 if (!system_header_p || IS_ABSOLUTE_PATHNAME (fbeg) || !stackp->fname)
2527 deps_add_dep (deps, fname);
2528 else {
2529 char *p;
2530 int len = strlen(stackp->fname);
2532 p = (char *) alloca (len + flen + 2);
2533 memcpy (p, stackp->fname, len);
2534 p[len++] = '/';
2535 memcpy (p + len, fbeg, flen);
2536 len += flen;
2537 p[len] = '\0';
2538 deps_add_dep (deps, p);
2540 } else if (print_deps
2541 && print_deps <= (system_header_p
2542 || (system_include_depth > 0)))
2543 warning ("no include path in which to find %.*s", flen, fbeg);
2544 else
2545 error_from_errno (fname);
2547 } else {
2549 /* Check to see if this include file is a once-only include file.
2550 If so, give up. */
2552 struct file_name_list* ptr;
2554 for (ptr = dont_repeat_files; ptr; ptr = ptr->next) {
2555 if (!strcmp (ptr->fname, fname)) {
2556 close (f);
2557 return; /* This file was once'd. */
2561 for (ptr = all_include_files; ptr; ptr = ptr->next) {
2562 if (!strcmp (ptr->fname, fname))
2563 break; /* This file was included before. */
2566 if (ptr == 0) {
2567 /* This is the first time for this file. */
2568 /* Add it to list of files included. */
2570 ptr = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
2571 ptr->next = all_include_files;
2572 all_include_files = ptr;
2573 ptr->fname = xstrdup (fname);
2575 /* For -M, add this file to the dependencies. */
2576 if (print_deps > (system_header_p || (system_include_depth > 0)))
2577 deps_add_dep (deps, fname);
2580 if (system_header_p)
2581 system_include_depth++;
2583 /* Actually process the file. */
2584 finclude (f, fname, stackp->next, op);
2586 if (system_header_p)
2587 system_include_depth--;
2589 close (f);
2593 /* Replace all CR NL, NL CR and CR sequences with NL. */
2595 static void
2596 fixup_newlines (FILE_BUF *fp)
2598 U_CHAR *p, *q, *end;
2600 if (fp->length <= 0)
2601 return;
2603 end = fp->buf + fp->length;
2604 *end = '\r';
2605 p = (U_CHAR *) strchr ((const char *) fp->buf, '\r');
2606 *end = '\0';
2607 if (p == end)
2608 return;
2610 if (p > fp->buf && p[-1] == '\n')
2611 p--;
2612 q = p;
2613 while (p < end)
2614 switch (*p)
2616 default:
2617 *q++ = *p++;
2618 break;
2619 case '\n':
2620 case '\r':
2621 p += 1 + (p[0] + p[1] == '\n' + '\r');
2622 *q++ = '\n';
2623 break;
2626 fp->length = q - fp->buf;
2629 /* Process the contents of include file FNAME, already open on descriptor F,
2630 with output to OP. */
2632 static void
2633 finclude (f, fname, nhd, op)
2634 int f;
2635 const char *fname;
2636 struct file_name_list *nhd;
2637 FILE_BUF *op;
2639 int st_mode;
2640 long st_size;
2641 long i;
2642 FILE_BUF *fp; /* For input stack frame */
2644 CHECK_DEPTH (return;);
2646 if (file_size_and_mode (f, &st_mode, &st_size))
2647 goto nope;
2649 fp = &instack[indepth + 1];
2650 memset (fp, 0, sizeof (FILE_BUF));
2651 fp->fname = fname;
2652 fp->length = 0;
2653 fp->lineno = 1;
2654 fp->if_stack = if_stack;
2655 fp->next_header_dir = nhd;
2657 if (S_ISREG (st_mode)) {
2658 fp->buf = (U_CHAR *) xmalloc (st_size + 2);
2659 fp->bufp = fp->buf;
2661 /* Read the file contents, knowing that st_size is an upper bound
2662 on the number of bytes we can read. */
2663 while (st_size > 0) {
2664 i = read (f, fp->buf + fp->length, st_size);
2665 if (i <= 0) {
2666 if (i == 0) break;
2667 goto nope;
2669 fp->length += i;
2670 st_size -= i;
2673 else {
2674 /* Cannot count its file size before reading. */
2676 U_CHAR *bufp;
2677 U_CHAR *basep;
2678 int bsize = 2000;
2680 st_size = 0;
2681 basep = (U_CHAR *) xmalloc (bsize + 2);
2682 bufp = basep;
2684 for (;;) {
2685 i = read (f, bufp, bsize - st_size);
2686 if (i < 0)
2687 goto nope; /* error! */
2688 if (i == 0)
2689 break; /* End of file */
2690 st_size += i;
2691 bufp += i;
2692 if (bsize == st_size) { /* Buffer is full! */
2693 bsize *= 2;
2694 basep = (U_CHAR *) xrealloc (basep, bsize + 2);
2695 bufp = basep + st_size; /* May have moved */
2698 fp->buf = basep;
2699 fp->bufp = fp->buf;
2700 fp->length = st_size;
2702 close (f);
2703 fixup_newlines (fp);
2705 /* Make sure data ends with a newline. And put a null after it. */
2707 if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
2708 fp->buf[fp->length++] = '\n';
2709 fp->buf[fp->length] = '\0';
2711 indepth++;
2712 output_line_command (fp, op, 0, enter_file);
2713 rescan (op, 0);
2714 indepth--;
2715 instack[indepth].lineno++;
2716 instack[indepth].bufp++; /* Skip the new line. */
2717 output_line_command (&instack[indepth], op, 0, leave_file);
2718 free (fp->buf);
2719 return;
2721 nope:
2722 perror_with_name (fname);
2723 close (f);
2727 /* Process a #define command.
2728 BUF points to the contents of the #define command, as a continguous string.
2729 LIMIT points to the first character past the end of the definition.
2730 KEYWORD is the keyword-table entry for #define. */
2732 static void
2733 do_define (buf, limit, op)
2734 U_CHAR *buf, *limit;
2735 FILE_BUF *op ATTRIBUTE_UNUSED;
2737 U_CHAR *bp; /* temp ptr into input buffer */
2738 U_CHAR *symname; /* remember where symbol name starts */
2739 int sym_length; /* and how long it is */
2741 DEFINITION *defn;
2742 int arglengths = 0; /* Accumulate lengths of arg names
2743 plus number of args. */
2744 int hashcode;
2746 bp = buf;
2748 while (is_nvspace (*bp))
2749 bp++;
2751 symname = bp; /* remember where it starts */
2752 while (is_idchar (*bp) && bp < limit) {
2753 bp++;
2755 sym_length = bp - symname;
2756 if (sym_length == 0)
2758 error ("invalid macro name");
2759 return;
2761 else if (!is_idstart (*symname)) {
2762 U_CHAR *msg; /* what pain... */
2763 msg = (U_CHAR *) alloca (sym_length + 1);
2764 memcpy (msg, symname, sym_length);
2765 msg[sym_length] = 0;
2766 error ("invalid macro name `%s'", msg);
2767 return;
2768 } else {
2769 if (! strncmp ((const char *)symname, "defined", 7) && sym_length == 7)
2771 error ("\"defined\" cannot be used as a macro name");
2772 return;
2776 /* lossage will occur if identifiers or control keywords are broken
2777 across lines using backslash. This is not the right place to take
2778 care of that. */
2780 if (*bp == '(') {
2781 struct arglist *arg_ptrs = NULL;
2782 int argno = 0;
2784 bp++; /* skip '(' */
2785 SKIP_WHITE_SPACE (bp);
2787 /* Loop over macro argument names. */
2788 while (*bp != ')') {
2789 struct arglist *temp;
2791 temp = (struct arglist *) alloca (sizeof (struct arglist));
2792 temp->name = bp;
2793 temp->next = arg_ptrs;
2794 temp->argno = argno++;
2795 arg_ptrs = temp;
2797 if (!is_idstart (*bp))
2798 warning ("parameter name starts with a digit in #define");
2800 /* Find the end of the arg name. */
2801 while (is_idchar (*bp)) {
2802 bp++;
2804 temp->length = bp - temp->name;
2805 arglengths += temp->length + 2;
2806 SKIP_WHITE_SPACE (bp);
2807 if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
2808 error ("badly punctuated parameter list in #define");
2809 return;
2811 if (*bp == ',') {
2812 bp++;
2813 SKIP_WHITE_SPACE (bp);
2815 if (bp >= limit) {
2816 error ("unterminated parameter list in #define");
2817 return;
2821 ++bp; /* skip paren */
2822 while (is_nvspace (*bp) && bp < limit) /* and leading whitespace */
2823 ++bp;
2824 /* now everything from bp before limit is the definition. */
2825 defn = collect_expansion (bp, limit, argno, arg_ptrs);
2827 /* Now set defn->argnames to the result of concatenating
2828 the argument names in reverse order
2829 with comma-space between them. */
2831 struct arglist *temp;
2832 int i = 0;
2833 U_CHAR *tmp = (U_CHAR *) xmalloc (arglengths + 1);
2835 for (temp = arg_ptrs; temp; temp = temp->next) {
2836 memcpy (&tmp[i], temp->name, temp->length);
2837 i += temp->length;
2838 if (temp->next != 0) {
2839 tmp[i++] = ',';
2840 tmp[i++] = ' ';
2843 tmp[i] = 0;
2844 defn->argnames = tmp;
2847 } else {
2848 /* simple expansion or empty definition; skip leading whitespace */
2849 while (is_nvspace (*bp) && bp < limit)
2850 ++bp;
2851 /* now everything from bp before limit is the definition. */
2852 defn = collect_expansion (bp, limit, -1, 0);
2853 defn->argnames = (const U_CHAR *) "";
2856 hashcode = hashf (symname, sym_length, HASHSIZE);
2859 HASHNODE *hp;
2860 if ((hp = lookup (symname, sym_length, hashcode)) == NULL)
2861 hp = install (symname, sym_length, T_MACRO, hashcode);
2862 else {
2863 if (hp->type != T_MACRO || compare_defs (defn, hp->value.defn))
2864 warning ("\"%.*s\" redefined", sym_length, symname);
2866 /* Replace the old definition. */
2867 hp->type = T_MACRO;
2870 hp->value.defn = defn;
2875 * return zero if two DEFINITIONs are isomorphic
2877 static int
2878 compare_defs (d1, d2)
2879 DEFINITION *d1, *d2;
2881 struct reflist *a1, *a2;
2882 U_CHAR *p1 = d1->expansion;
2883 U_CHAR *p2 = d2->expansion;
2884 int first = 1;
2886 if (d1->nargs != d2->nargs)
2887 return 1;
2888 if (strcmp ((const char *)d1->argnames, (const char *)d2->argnames))
2889 return 1;
2890 for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
2891 a1 = a1->next, a2 = a2->next) {
2892 if (!((a1->nchars == a2->nchars
2893 && ! strncmp ((const char *)p1, (const char *)p2, a1->nchars))
2894 || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
2895 || a1->argno != a2->argno
2896 || a1->stringify != a2->stringify
2897 || a1->raw_before != a2->raw_before
2898 || a1->raw_after != a2->raw_after)
2899 return 1;
2900 first = 0;
2901 p1 += a1->nchars;
2902 p2 += a2->nchars;
2904 if (a1 != a2)
2905 return 1;
2906 if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
2907 p2, d2->length - (p2 - d2->expansion), 1))
2908 return 1;
2909 return 0;
2912 /* Return 1 if two parts of two macro definitions are effectively different.
2913 One of the parts starts at BEG1 and has LEN1 chars;
2914 the other has LEN2 chars at BEG2.
2915 Any sequence of whitespace matches any other sequence of whitespace.
2916 FIRST means these parts are the first of a macro definition;
2917 so ignore leading whitespace entirely.
2918 LAST means these parts are the last of a macro definition;
2919 so ignore trailing whitespace entirely. */
2920 static int
2921 comp_def_part (first, beg1, len1, beg2, len2, last)
2922 int first;
2923 const U_CHAR *beg1, *beg2;
2924 int len1, len2;
2925 int last;
2927 const U_CHAR *end1 = beg1 + len1;
2928 const U_CHAR *end2 = beg2 + len2;
2929 if (first) {
2930 while (beg1 != end1 && is_space (*beg1)) beg1++;
2931 while (beg2 != end2 && is_space (*beg2)) beg2++;
2933 if (last) {
2934 while (beg1 != end1 && is_space (end1[-1])) end1--;
2935 while (beg2 != end2 && is_space (end2[-1])) end2--;
2937 while (beg1 != end1 && beg2 != end2) {
2938 if (is_space (*beg1) && is_space (*beg2)) {
2939 while (beg1 != end1 && is_space (*beg1)) beg1++;
2940 while (beg2 != end2 && is_space (*beg2)) beg2++;
2941 } else if (*beg1 == *beg2) {
2942 beg1++; beg2++;
2943 } else break;
2945 return (beg1 != end1) || (beg2 != end2);
2948 /* Read a replacement list for a macro with parameters.
2949 Build the DEFINITION structure.
2950 Reads characters of text starting at BUF until LIMIT.
2951 ARGLIST specifies the formal parameters to look for
2952 in the text of the definition; NARGS is the number of args
2953 in that list, or -1 for a macro name that wants no argument list.
2954 MACRONAME is the macro name itself (so we can avoid recursive expansion)
2955 and NAMELEN is its length in characters.
2957 Note that comments and backslash-newlines have already been deleted
2958 from the argument. */
2960 /* Leading and trailing Space, Tab, etc. are converted to markers
2961 Newline Space, Newline Tab, etc.
2962 Newline Space makes a space in the final output
2963 but is discarded if stringified. (Newline Tab is similar but
2964 makes a Tab instead.)
2966 If there is no trailing whitespace, a Newline Space is added at the end
2967 to prevent concatenation that would be contrary to the standard. */
2969 static DEFINITION *
2970 collect_expansion (buf, end, nargs, arglist)
2971 U_CHAR *buf, *end;
2972 int nargs;
2973 struct arglist *arglist;
2975 DEFINITION *defn;
2976 U_CHAR *p, *limit, *lastp, *exp_p;
2977 struct reflist *endpat = NULL;
2978 /* Pointer to first nonspace after last ## seen. */
2979 U_CHAR *concat = 0;
2980 /* Pointer to first nonspace after last single-# seen. */
2981 U_CHAR *stringify = 0;
2982 int maxsize;
2983 int expected_delimiter = '\0';
2985 /* Scan thru the replacement list, ignoring comments and quoted
2986 strings, picking up on the macro calls. It does a linear search
2987 thru the arg list on every potential symbol. Profiling might say
2988 that something smarter should happen. */
2990 if (end < buf)
2991 abort ();
2993 /* Find the beginning of the trailing whitespace. */
2994 /* Find end of leading whitespace. */
2995 limit = end;
2996 p = buf;
2997 while (p < limit && is_space (limit[-1])) limit--;
2998 while (p < limit && is_space (*p)) p++;
3000 /* Allocate space for the text in the macro definition.
3001 Leading and trailing whitespace chars need 2 bytes each.
3002 Each other input char may or may not need 1 byte,
3003 so this is an upper bound.
3004 The extra 2 are for invented trailing newline-marker and final null. */
3005 maxsize = (sizeof (DEFINITION)
3006 + 2 * (end - limit) + 2 * (p - buf)
3007 + (limit - p) + 3);
3008 defn = (DEFINITION *) xcalloc (1, maxsize);
3010 defn->nargs = nargs;
3011 exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
3012 lastp = exp_p;
3014 p = buf;
3016 /* Convert leading whitespace to Newline-markers. */
3017 while (p < limit && is_space (*p)) {
3018 *exp_p++ = '\n';
3019 *exp_p++ = *p++;
3022 /* Process the main body of the definition. */
3023 while (p < limit) {
3024 int skipped_arg = 0;
3025 U_CHAR c = *p++;
3027 *exp_p++ = c;
3029 /* In -traditional mode, recognize arguments inside strings and
3030 and character constants, and ignore special properties of #.
3031 Arguments inside strings are considered "stringified", but no
3032 extra quote marks are supplied. */
3033 switch (c) {
3034 case '\'':
3035 case '\"':
3036 if (expected_delimiter != '\0') {
3037 if (c == expected_delimiter)
3038 expected_delimiter = '\0';
3039 } else
3040 expected_delimiter = c;
3041 break;
3043 case '\\':
3044 /* Backslash quotes delimiters and itself, but not macro args. */
3045 if (expected_delimiter != 0 && p < limit
3046 && (*p == expected_delimiter || *p == '\\')) {
3047 *exp_p++ = *p++;
3048 continue;
3050 break;
3052 case '/':
3053 if (expected_delimiter != '\0') /* No comments inside strings. */
3054 break;
3055 if (*p == '*') {
3056 /* If we find a comment that wasn't removed by handle_directive,
3057 this must be -traditional. So replace the comment with
3058 nothing at all. */
3059 exp_p--;
3060 p += 1;
3061 while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
3062 p++;
3064 break;
3067 if (is_idchar (c) && nargs > 0) {
3068 U_CHAR *id_beg = p - 1;
3069 int id_len;
3071 --exp_p;
3072 while (p != limit && is_idchar (*p)) p++;
3073 id_len = p - id_beg;
3075 if (is_idstart (c)) {
3076 struct arglist *arg;
3078 for (arg = arglist; arg != NULL; arg = arg->next) {
3079 struct reflist *tpat;
3081 if (arg->name[0] == c
3082 && arg->length == id_len
3083 && strncmp ((const char *)arg->name,
3084 (const char *)id_beg, id_len) == 0) {
3085 /* make a pat node for this arg and append it to the end of
3086 the pat list */
3087 tpat = (struct reflist *) xmalloc (sizeof (struct reflist));
3088 tpat->next = NULL;
3089 tpat->raw_before = concat == id_beg;
3090 tpat->raw_after = 0;
3091 tpat->stringify = expected_delimiter != '\0';
3093 if (endpat == NULL)
3094 defn->pattern = tpat;
3095 else
3096 endpat->next = tpat;
3097 endpat = tpat;
3099 tpat->argno = arg->argno;
3100 tpat->nchars = exp_p - lastp;
3102 U_CHAR *p1 = p;
3103 SKIP_WHITE_SPACE (p1);
3104 if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
3105 tpat->raw_after = 1;
3107 lastp = exp_p; /* place to start copying from next time */
3108 skipped_arg = 1;
3109 break;
3114 /* If this was not a macro arg, copy it into the expansion. */
3115 if (! skipped_arg) {
3116 U_CHAR *lim1 = p;
3117 p = id_beg;
3118 while (p != lim1)
3119 *exp_p++ = *p++;
3120 if (stringify == id_beg)
3121 error ("# operator should be followed by a macro argument name");
3126 if (limit < end) {
3127 /* Convert trailing whitespace to Newline-markers. */
3128 while (limit < end && is_space (*limit)) {
3129 *exp_p++ = '\n';
3130 *exp_p++ = *limit++;
3133 *exp_p = '\0';
3135 defn->length = exp_p - defn->expansion;
3137 /* Crash now if we overrun the allocated size. */
3138 if (defn->length + 1 > maxsize)
3139 abort ();
3141 return defn;
3145 * interpret #line command. Remembers previously seen fnames
3146 * in its very own hash table.
3148 #define FNAME_HASHSIZE 37
3149 static void
3150 do_line (buf, limit, op)
3151 U_CHAR *buf, *limit;
3152 FILE_BUF *op;
3154 U_CHAR *bp;
3155 FILE_BUF *ip = &instack[indepth];
3156 FILE_BUF tem;
3157 int new_lineno;
3158 enum file_change_code file_change = same_file;
3160 /* Expand any macros. */
3161 tem = expand_to_temp_buffer (buf, limit, 0);
3163 /* Point to macroexpanded line, which is null-terminated now. */
3164 bp = tem.buf;
3165 SKIP_WHITE_SPACE (bp);
3167 if (!ISDIGIT (*bp)) {
3168 error ("invalid format #line command");
3169 return;
3172 /* The Newline at the end of this line remains to be processed.
3173 To put the next line at the specified line number,
3174 we must store a line number now that is one less. */
3175 new_lineno = atoi ((const char *)bp);
3177 /* skip over the line number. */
3178 while (ISDIGIT (*bp))
3179 bp++;
3181 SKIP_WHITE_SPACE (bp);
3183 if (*bp == '\"') {
3184 static HASHNODE *fname_table[FNAME_HASHSIZE];
3185 HASHNODE *hp, **hash_bucket;
3186 U_CHAR *fname;
3187 int fname_length;
3189 fname = ++bp;
3191 while (*bp && *bp != '\"')
3192 bp++;
3193 if (*bp != '\"') {
3194 error ("invalid format #line command");
3195 return;
3198 fname_length = bp - fname;
3200 bp++;
3201 SKIP_WHITE_SPACE (bp);
3202 if (*bp) {
3203 if (*bp == '1')
3204 file_change = enter_file;
3205 else if (*bp == '2')
3206 file_change = leave_file;
3207 else {
3208 error ("invalid format #line command");
3209 return;
3212 bp++;
3213 SKIP_WHITE_SPACE (bp);
3214 if (*bp) {
3215 error ("invalid format #line command");
3216 return;
3220 hash_bucket =
3221 &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)];
3222 for (hp = *hash_bucket; hp != NULL; hp = hp->next)
3223 if (hp->length == fname_length &&
3224 strncmp (hp->value.cpval, (const char *)fname, fname_length) == 0) {
3225 ip->fname = hp->value.cpval;
3226 break;
3228 if (hp == 0) {
3229 char *q;
3230 /* Didn't find it; cons up a new one. */
3231 hp = (HASHNODE *) xcalloc (1, sizeof (HASHNODE) + fname_length + 1);
3232 hp->next = *hash_bucket;
3233 *hash_bucket = hp;
3235 hp->length = fname_length;
3236 ip->fname = hp->value.cpval = q = ((char *) hp) + sizeof (HASHNODE);
3237 memcpy (q, fname, fname_length);
3239 } else if (*bp) {
3240 error ("invalid format #line command");
3241 return;
3244 ip->lineno = new_lineno;
3245 output_line_command (ip, op, 0, file_change);
3246 ip->bufp++; /* Skip the new line. */
3247 check_expand (op, ip->length - (ip->bufp - ip->buf));
3251 * remove all definitions of symbol from symbol table.
3252 * according to un*x /lib/cpp, it is not an error to undef
3253 * something that has no definitions, so it isn't one here either.
3255 static void
3256 do_undef (buf, limit, op)
3257 U_CHAR *buf;
3258 U_CHAR *limit ATTRIBUTE_UNUSED;
3259 FILE_BUF *op ATTRIBUTE_UNUSED;
3261 HASHNODE *hp;
3263 SKIP_WHITE_SPACE (buf);
3265 if (! strncmp ((const char *)buf, "defined", 7) && ! is_idchar (buf[7]))
3266 warning ("undefining `defined'");
3268 while ((hp = lookup (buf, -1, -1)) != NULL) {
3269 if (hp->type != T_MACRO)
3270 warning ("undefining `%s'", hp->name);
3271 delete_macro (hp);
3275 /* Read the tokens of the answer into the macro pool. Only commit the
3276 memory if we intend it as permanent storage, i.e. the #assert case.
3277 Returns 0 on success. */
3279 static int
3280 parse_answer (buf, limit, answerp, type)
3281 const unsigned char *buf, *limit;
3282 struct answer **answerp;
3283 int type;
3285 const unsigned char *start;
3287 /* Skip leading whitespace. */
3288 if (buf < limit && *buf == ' ')
3289 buf++;
3291 /* Parentheses are optional here. */
3292 if (buf == limit && type == T_UNASSERT)
3293 return 0;
3295 if (buf == limit || *buf++ != '(')
3297 if (type == T_IF)
3298 return 0;
3300 error ("missing '(' after predicate");
3301 return 1;
3304 /* Drop whitespace at start. */
3305 while (buf < limit && *buf == ' ')
3306 buf++;
3308 start = buf;
3309 while (buf < limit && *buf != ')')
3310 buf++;
3312 if (buf == limit)
3314 error ("missing ')' to complete answer");
3315 return 1;
3318 if (buf == start)
3320 error ("predicate's answer is empty");
3321 return 1;
3324 if ((type == T_ASSERT || type == T_UNASSERT) && buf + 1 != limit)
3326 error ("extra text at end of directive");
3327 return 1;
3330 /* Lose trailing whitespace. */
3331 if (buf[-1] == ' ')
3332 buf--;
3334 *answerp = (struct answer *) xmalloc (sizeof (struct answer));
3335 (*answerp)->answer = start;
3336 (*answerp)->len = buf - start;
3338 return 0;
3341 /* Parses an assertion, returning a pointer to the hash node of the
3342 predicate, or 0 on error. If an answer was supplied, it is placed
3343 in ANSWERP, otherwise it is set to 0. */
3344 static HASHNODE *
3345 parse_assertion (buf, limit, answerp, type)
3346 const unsigned char *buf, *limit;
3347 struct answer **answerp;
3348 int type;
3350 HASHNODE *result = 0;
3351 const unsigned char *climit;
3352 unsigned char *bp, *symname = canonicalize_text (buf, limit, &climit);
3353 unsigned int len;
3355 bp = symname;
3356 if (bp < climit && is_idstart (*bp))
3359 bp++;
3360 while (bp < climit && is_idchar (*bp));
3362 len = bp - symname;
3364 *answerp = 0;
3365 if (len == 0)
3367 if (symname == climit)
3368 error ("assertion without predicate");
3369 else
3370 error ("predicate must be an identifier");
3372 /* Unfortunately, because of the way we handle #if, we don't avoid
3373 macro expansion in answers. This is not easy to fix. */
3374 else if (parse_answer (bp, climit, answerp, type) == 0)
3376 unsigned char *sym = alloca (len + 1);
3377 int hashcode;
3379 /* Prefix '#' to get it out of macro namespace. */
3380 sym[0] = '#';
3381 memcpy (sym + 1, symname, len);
3383 hashcode = hashf (sym, len + 1, HASHSIZE);
3384 result = lookup (sym, len + 1, hashcode);
3385 if (result == 0)
3386 result = install (sym, len + 1, T_UNUSED, hashcode);
3389 return result;
3392 /* Test an assertion within a preprocessor conditional. Returns zero
3393 on error or failure, one on success. */
3395 test_assertion (pbuf)
3396 unsigned char **pbuf; /* NUL-terminated. */
3398 unsigned char *buf = *pbuf;
3399 unsigned char *limit = buf + strlen ((char *) buf);
3400 struct answer *answer;
3401 HASHNODE *node;
3402 int result = 0;
3404 node = parse_assertion (buf, limit, &answer, T_IF);
3405 if (node)
3407 result = (node->type == T_ASSERT &&
3408 (answer == 0 || *find_answer (node, answer) != 0));
3410 /* Yuk. We update pbuf to point after the assertion test.
3411 First, move past the identifier. */
3412 if (is_space (*buf))
3413 buf++;
3414 while (is_idchar (*buf))
3415 buf++;
3416 /* If we have an answer, we need to move past the parentheses. */
3417 if (answer)
3418 while (*buf++ != ')')
3420 *pbuf = buf;
3423 return result;
3426 /* Handle a #error directive. */
3427 static void
3428 do_error (buf, limit, op)
3429 U_CHAR *buf;
3430 U_CHAR *limit;
3431 FILE_BUF *op ATTRIBUTE_UNUSED;
3433 error ("#error%.*s", (int) (limit - buf), buf);
3436 /* Handle a #warning directive. */
3437 static void
3438 do_warning (buf, limit, op)
3439 U_CHAR *buf;
3440 U_CHAR *limit;
3441 FILE_BUF *op ATTRIBUTE_UNUSED;
3443 warning ("#warning%.*s", (int) (limit - buf), buf);
3446 /* Handle a #assert directive. */
3447 static void
3448 do_assert (buf, limit, op)
3449 U_CHAR *buf;
3450 U_CHAR *limit;
3451 FILE_BUF *op ATTRIBUTE_UNUSED;
3453 struct answer *new_answer;
3454 HASHNODE *node;
3456 node = parse_assertion (buf, limit, &new_answer, T_ASSERT);
3457 if (node)
3459 /* Place the new answer in the answer list. First check there
3460 is not a duplicate. */
3461 new_answer->next = 0;
3462 if (node->type == T_ASSERT)
3464 if (*find_answer (node, new_answer))
3466 free (new_answer);
3467 warning ("\"%s\" re-asserted", node->name + 1);
3468 return;
3470 new_answer->next = node->value.answers;
3472 node->type = T_ASSERT;
3473 node->value.answers = new_answer;
3477 /* Function body to be provided later. */
3478 static void
3479 do_unassert (buf, limit, op)
3480 U_CHAR *buf;
3481 U_CHAR *limit;
3482 FILE_BUF *op ATTRIBUTE_UNUSED;
3484 HASHNODE *node;
3485 struct answer *answer;
3487 node = parse_assertion (buf, limit, &answer, T_UNASSERT);
3488 /* It isn't an error to #unassert something that isn't asserted. */
3489 if (node)
3491 if (node->type == T_ASSERT)
3493 if (answer)
3495 struct answer **p = find_answer (node, answer), *temp;
3497 /* Remove the answer from the list. */
3498 temp = *p;
3499 if (temp)
3500 *p = temp->next;
3502 /* Did we free the last answer? */
3503 if (node->value.answers == 0)
3504 delete_macro (node);
3506 else
3507 delete_macro (node);
3510 free (answer);
3514 /* Returns a pointer to the pointer to the answer in the answer chain,
3515 or a pointer to NULL if the answer is not in the chain. */
3516 static struct answer **
3517 find_answer (node, candidate)
3518 HASHNODE *node;
3519 const struct answer *candidate;
3521 struct answer **result;
3523 for (result = &node->value.answers; *result; result = &(*result)->next)
3525 struct answer *answer = *result;
3527 if (answer->len == candidate->len
3528 && !memcmp (answer->answer, candidate->answer, answer->len))
3529 break;
3532 return result;
3535 /* Return a malloced buffer with leading and trailing whitespace
3536 removed, and all instances of internal whitespace reduced to a
3537 single space. */
3538 static unsigned char *
3539 canonicalize_text (buf, limit, climit)
3540 const unsigned char *buf, *limit, **climit;
3542 unsigned int len = limit - buf;
3543 unsigned char *result = (unsigned char *) xmalloc (len), *dest;
3545 for (dest = result; buf < limit;)
3547 if (! is_space (*buf))
3548 *dest++ = *buf++;
3549 else
3551 while (++buf < limit && is_space (*buf))
3553 if (dest != result && buf != limit)
3554 *dest++ = ' ';
3558 *climit = dest;
3559 return result;
3563 * handle #if command by
3564 * 1) inserting special `defined' keyword into the hash table
3565 * that gets turned into 0 or 1 by special_symbol (thus,
3566 * if the luser has a symbol called `defined' already, it won't
3567 * work inside the #if command)
3568 * 2) rescan the input into a temporary output buffer
3569 * 3) pass the output buffer to the yacc parser and collect a value
3570 * 4) clean up the mess left from steps 1 and 2.
3571 * 5) call conditional_skip to skip til the next #endif (etc.),
3572 * or not, depending on the value from step 3.
3574 static void
3575 do_if (buf, limit, op)
3576 U_CHAR *buf, *limit;
3577 FILE_BUF *op ATTRIBUTE_UNUSED;
3579 int value;
3580 FILE_BUF *ip = &instack[indepth];
3582 value = eval_if_expression (buf, limit - buf);
3583 conditional_skip (ip, value == 0, T_IF);
3587 * handle a #elif directive by not changing if_stack either.
3588 * see the comment above do_else.
3590 static void
3591 do_elif (buf, limit, op)
3592 U_CHAR *buf, *limit;
3593 FILE_BUF *op;
3595 int value;
3596 FILE_BUF *ip = &instack[indepth];
3598 if (if_stack == instack[indepth].if_stack) {
3599 error ("#elif not within a conditional");
3600 return;
3601 } else {
3602 if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
3603 error ("#elif after #else");
3604 fprintf (stderr, " (matches line %d", if_stack->lineno);
3605 if (if_stack->fname != NULL && ip->fname != NULL &&
3606 strcmp (if_stack->fname, ip->fname) != 0)
3607 fprintf (stderr, ", file %s", if_stack->fname);
3608 fprintf (stderr, ")\n");
3610 if_stack->type = T_ELIF;
3613 if (if_stack->if_succeeded)
3614 skip_if_group (ip, 0);
3615 else {
3616 value = eval_if_expression (buf, limit - buf);
3617 if (value == 0)
3618 skip_if_group (ip, 0);
3619 else {
3620 ++if_stack->if_succeeded; /* continue processing input */
3621 output_line_command (ip, op, 1, same_file);
3627 * evaluate a #if expression in BUF, of length LENGTH,
3628 * then parse the result as a C expression and return the value as an int.
3630 static int
3631 eval_if_expression (buf, length)
3632 const U_CHAR *buf;
3633 int length;
3635 FILE_BUF temp_obuf;
3636 HASHNODE *save_defined;
3637 int value;
3639 save_defined = install (U"defined", -1, T_SPEC_DEFINED, -1);
3640 temp_obuf = expand_to_temp_buffer (buf, buf + length, 0);
3641 delete_macro (save_defined); /* clean up special symbol */
3643 value = parse_c_expression ((const char *)temp_obuf.buf);
3645 free (temp_obuf.buf);
3647 return value;
3651 * routine to handle ifdef/ifndef. Try to look up the symbol,
3652 * then do or don't skip to the #endif/#else/#elif depending
3653 * on what directive is actually being processed.
3655 static void
3656 do_xifdef (buf, limit, type)
3657 U_CHAR *buf, *limit;
3658 enum node_type type;
3660 int skip;
3661 FILE_BUF *ip = &instack[indepth];
3662 U_CHAR *end;
3664 /* Discard leading and trailing whitespace. */
3665 SKIP_WHITE_SPACE (buf);
3666 while (limit != buf && is_nvspace (limit[-1])) limit--;
3668 /* Find the end of the identifier at the beginning. */
3669 for (end = buf; is_idchar (*end); end++);
3671 if (end == buf)
3672 skip = (type == T_IFDEF);
3673 else
3674 skip = (lookup (buf, end-buf, -1) == NULL) ^ (type == T_IFNDEF);
3676 conditional_skip (ip, skip, T_IF);
3679 static void
3680 do_ifdef (buf, limit, op)
3681 U_CHAR *buf, *limit;
3682 FILE_BUF *op ATTRIBUTE_UNUSED;
3684 do_xifdef (buf, limit, T_IFDEF);
3687 static void
3688 do_ifndef (buf, limit, op)
3689 U_CHAR *buf, *limit;
3690 FILE_BUF *op ATTRIBUTE_UNUSED;
3692 do_xifdef (buf, limit, T_IFNDEF);
3696 * push TYPE on stack; then, if SKIP is nonzero, skip ahead.
3698 static void
3699 conditional_skip (ip, skip, type)
3700 FILE_BUF *ip;
3701 int skip;
3702 enum node_type type;
3704 IF_STACK_FRAME *temp;
3706 temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
3707 temp->fname = ip->fname;
3708 temp->lineno = ip->lineno;
3709 temp->next = if_stack;
3710 if_stack = temp;
3712 if_stack->type = type;
3714 if (skip != 0) {
3715 skip_if_group (ip, 0);
3716 return;
3717 } else {
3718 ++if_stack->if_succeeded;
3719 output_line_command (ip, &outbuf, 1, same_file);
3724 * skip to #endif, #else, or #elif. adjust line numbers, etc.
3725 * leaves input ptr at the sharp sign found.
3726 * If ANY is nonzero, return at next directive of any sort.
3728 static void
3729 skip_if_group (ip, any)
3730 FILE_BUF *ip;
3731 int any;
3733 U_CHAR *bp = ip->bufp, *cp;
3734 U_CHAR *endb = ip->buf + ip->length;
3735 const struct directive *kt;
3736 IF_STACK_FRAME *save_if_stack = if_stack; /* don't pop past here */
3737 U_CHAR *beg_of_line = bp;
3739 while (bp < endb) {
3740 switch (*bp++) {
3741 case '/': /* possible comment */
3742 if (*bp == '\\' && bp[1] == '\n')
3743 newline_fix (bp);
3744 if (*bp == '*') {
3745 ip->bufp = ++bp;
3746 bp = skip_to_end_of_comment (ip, &ip->lineno);
3748 break;
3749 case '\"':
3750 case '\'':
3751 bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno, 0, 0);
3752 break;
3753 case '\\':
3754 /* Char after backslash loses its special meaning. */
3755 if (bp < endb) {
3756 if (*bp == '\n')
3757 ++ip->lineno; /* But do update the line-count. */
3758 bp++;
3760 break;
3761 case '\n':
3762 ++ip->lineno;
3763 beg_of_line = bp;
3764 break;
3765 case '#':
3766 ip->bufp = bp - 1;
3768 /* # keyword: a # must be first nonblank char on the line */
3769 if (beg_of_line == 0)
3770 break;
3771 /* Scan from start of line, skipping whitespace, comments
3772 and backslash-newlines, and see if we reach this #.
3773 If not, this # is not special. */
3774 bp = beg_of_line;
3775 while (1) {
3776 if (is_nvspace (*bp))
3777 bp++;
3778 else if (*bp == '\\' && bp[1] == '\n')
3779 bp += 2;
3780 else if (*bp == '/' && bp[1] == '*') {
3781 bp += 2;
3782 while (!(*bp == '*' && bp[1] == '/')) {
3783 if (*bp == '\n')
3784 ip->lineno++;
3785 bp++;
3787 bp += 2;
3789 else break;
3791 if (bp != ip->bufp) {
3792 bp = ip->bufp + 1; /* Reset bp to after the #. */
3793 break;
3796 bp = ip->bufp + 1; /* Point after '#'. */
3798 /* Skip whitespace and \-newline. */
3799 while (1) {
3800 if (is_nvspace (*bp))
3801 bp++;
3802 else if (*bp == '\\' && bp[1] == '\n')
3803 bp += 2;
3804 else if (*bp == '/' && bp[1] == '*') {
3805 bp += 2;
3806 while (!(*bp == '*' && bp[1] == '/'))
3807 bp++;
3808 bp += 2;
3810 else break;
3813 cp = bp;
3815 /* Now find end of directive name.
3816 If we encounter a backslash-newline, exchange it with any following
3817 symbol-constituents so that we end up with a contiguous name. */
3819 while (1) {
3820 if (is_idchar (*bp))
3821 bp++;
3822 else {
3823 if (*bp == '\\' && bp[1] == '\n')
3824 name_newline_fix (bp);
3825 if (is_idchar (*bp))
3826 bp++;
3827 else break;
3831 for (kt = directive_table; kt->length >= 0; kt++) {
3832 IF_STACK_FRAME *temp;
3833 if (strncmp ((const char *)cp, kt->name, kt->length) == 0
3834 && !is_idchar (cp[kt->length])) {
3836 /* If we are asked to return on next directive,
3837 do so now. */
3838 if (any)
3839 return;
3841 switch (kt->type) {
3842 case T_IF:
3843 case T_IFDEF:
3844 case T_IFNDEF:
3845 temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
3846 temp->next = if_stack;
3847 if_stack = temp;
3848 temp->lineno = ip->lineno;
3849 temp->fname = ip->fname;
3850 temp->type = kt->type;
3851 break;
3852 case T_ELSE:
3853 case T_ENDIF:
3854 case T_ELIF:
3855 if (if_stack == instack[indepth].if_stack) {
3856 error ("#%s not within a conditional", kt->name);
3857 break;
3859 else if (if_stack == save_if_stack)
3860 return; /* found what we came for */
3862 if (kt->type != T_ENDIF) {
3863 if (if_stack->type == T_ELSE)
3864 error ("#else or #elif after #else");
3865 if_stack->type = kt->type;
3866 break;
3869 temp = if_stack;
3870 if_stack = if_stack->next;
3871 free (temp);
3872 break;
3874 default:
3875 /* Anything else is ignored. */
3876 break;
3878 break;
3883 ip->bufp = bp;
3884 /* after this returns, rescan will exit because ip->bufp
3885 now points to the end of the buffer.
3886 rescan is responsible for the error message also. */
3890 * handle a #else directive. Do this by just continuing processing
3891 * without changing if_stack ; this is so that the error message
3892 * for missing #endif's etc. will point to the original #if. It
3893 * is possible that something different would be better.
3895 static void
3896 do_else (buf, limit, op)
3897 U_CHAR *buf ATTRIBUTE_UNUSED;
3898 U_CHAR *limit ATTRIBUTE_UNUSED;
3899 FILE_BUF *op;
3901 FILE_BUF *ip = &instack[indepth];
3903 if (if_stack == instack[indepth].if_stack) {
3904 error ("#else not within a conditional");
3905 return;
3906 } else {
3907 if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
3908 error ("#else after #else");
3909 fprintf (stderr, " (matches line %d", if_stack->lineno);
3910 if (strcmp (if_stack->fname, ip->fname) != 0)
3911 fprintf (stderr, ", file %s", if_stack->fname);
3912 fprintf (stderr, ")\n");
3914 if_stack->type = T_ELSE;
3917 if (if_stack->if_succeeded)
3918 skip_if_group (ip, 0);
3919 else {
3920 ++if_stack->if_succeeded; /* continue processing input */
3921 output_line_command (ip, op, 1, same_file);
3926 * unstack after #endif command
3928 static void
3929 do_endif (buf, limit, op)
3930 U_CHAR *buf ATTRIBUTE_UNUSED;
3931 U_CHAR *limit ATTRIBUTE_UNUSED;
3932 FILE_BUF *op;
3934 if (if_stack == instack[indepth].if_stack)
3935 error ("unbalanced #endif");
3936 else {
3937 IF_STACK_FRAME *temp = if_stack;
3938 if_stack = if_stack->next;
3939 free (temp);
3940 output_line_command (&instack[indepth], op, 1, same_file);
3945 * Skip a comment, assuming the input ptr immediately follows the
3946 * initial slash-star. Bump line counter as necessary.
3947 * (The canonical line counter is &ip->lineno).
3948 * Don't use this routine (or the next one) if bumping the line
3949 * counter is not sufficient to deal with newlines in the string.
3951 static U_CHAR *
3952 skip_to_end_of_comment (ip, line_counter)
3953 FILE_BUF *ip;
3954 int *line_counter; /* place to remember newlines, or NULL */
3956 U_CHAR *limit = ip->buf + ip->length;
3957 U_CHAR *bp = ip->bufp;
3958 FILE_BUF *op = &outbuf; /* JF */
3959 int output = put_out_comments && !line_counter;
3961 /* JF this line_counter stuff is a crock to make sure the
3962 comment is only put out once, no matter how many times
3963 the comment is skipped. It almost works */
3964 if (output) {
3965 *op->bufp++ = '/';
3966 *op->bufp++ = '*';
3968 while (bp < limit) {
3969 if (output)
3970 *op->bufp++ = *bp;
3971 switch (*bp++) {
3972 case '/':
3973 if (warn_comments && bp < limit && *bp == '*')
3974 warning("`/*' within comment");
3975 break;
3976 case '\n':
3977 if (line_counter != NULL)
3978 ++*line_counter;
3979 if (output)
3980 ++op->lineno;
3981 break;
3982 case '*':
3983 if (*bp == '\\' && bp[1] == '\n')
3984 newline_fix (bp);
3985 if (*bp == '/') {
3986 if (output)
3987 *op->bufp++ = '/';
3988 ip->bufp = ++bp;
3989 return bp;
3991 break;
3994 ip->bufp = bp;
3995 return bp;
3999 * Skip over a quoted string. BP points to the opening quote.
4000 * Returns a pointer after the closing quote. Don't go past LIMIT.
4001 * START_LINE is the line number of the starting point (but it need
4002 * not be valid if the starting point is inside a macro expansion).
4004 * The input stack state is not changed.
4006 * If COUNT_NEWLINES is nonzero, it points to an int to increment
4007 * for each newline passed.
4009 * If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
4010 * if we pass a backslash-newline.
4012 * If EOFP is nonzero, set *EOFP to 1 if the string is unterminated.
4014 static U_CHAR *
4015 skip_quoted_string (bp, limit, start_line, count_newlines, backslash_newlines_p, eofp)
4016 const U_CHAR *bp;
4017 const U_CHAR *limit;
4018 int start_line;
4019 int *count_newlines;
4020 int *backslash_newlines_p;
4021 int *eofp;
4023 U_CHAR c, match;
4025 match = *bp++;
4026 while (1) {
4027 if (bp >= limit) {
4028 error_with_line (line_for_error (start_line),
4029 "unterminated string or character constant");
4030 if (eofp)
4031 *eofp = 1;
4032 break;
4034 c = *bp++;
4035 if (c == '\\') {
4036 while (*bp == '\\' && bp[1] == '\n') {
4037 if (backslash_newlines_p)
4038 *backslash_newlines_p = 1;
4039 if (count_newlines)
4040 ++*count_newlines;
4041 bp += 2;
4043 if (*bp == '\n' && count_newlines) {
4044 if (backslash_newlines_p)
4045 *backslash_newlines_p = 1;
4046 ++*count_newlines;
4048 bp++;
4049 } else if (c == '\n') {
4050 /* Unterminated strings and character constants are 'legal'. */
4051 bp--; /* Don't consume the newline. */
4052 if (eofp)
4053 *eofp = 1;
4054 break;
4055 } else if (c == match)
4056 break;
4058 return (U_CHAR *) bp;
4062 * write out a #line command, for instance, after an #include file.
4063 * If CONDITIONAL is nonzero, we can omit the #line if it would
4064 * appear to be a no-op, and we can output a few newlines instead
4065 * if we want to increase the line number by a small amount.
4066 * FILE_CHANGE says whether we are entering a file, leaving, or neither.
4069 static void
4070 output_line_command (ip, op, conditional, file_change)
4071 FILE_BUF *ip, *op;
4072 int conditional;
4073 enum file_change_code file_change;
4075 int len;
4076 char line_cmd_buf[500];
4078 if (no_line_commands
4079 || ip->fname == NULL
4080 || no_output) {
4081 op->lineno = ip->lineno;
4082 return;
4085 if (conditional) {
4086 if (ip->lineno == op->lineno)
4087 return;
4089 /* If the inherited line number is a little too small,
4090 output some newlines instead of a #line command. */
4091 if (ip->lineno > op->lineno && ip->lineno < op->lineno + 8) {
4092 check_expand (op, 10);
4093 while (ip->lineno > op->lineno) {
4094 *op->bufp++ = '\n';
4095 op->lineno++;
4097 return;
4101 sprintf (line_cmd_buf, "# %d \"%s\"", ip->lineno, ip->fname);
4102 if (file_change != same_file)
4103 strcat (line_cmd_buf, file_change == enter_file ? " 1" : " 2");
4104 if (system_include_depth > 0)
4105 strcat (line_cmd_buf, " 3");
4106 len = strlen (line_cmd_buf);
4107 line_cmd_buf[len++] = '\n';
4108 check_expand (op, len + 1);
4109 if (op->bufp > op->buf && op->bufp[-1] != '\n')
4110 *op->bufp++ = '\n';
4111 memcpy (op->bufp, line_cmd_buf, len);
4112 op->bufp += len;
4113 op->lineno = ip->lineno;
4117 /* Expand a macro call.
4118 HP points to the symbol that is the macro being called.
4119 Put the result of expansion onto the input stack
4120 so that subsequent input by our caller will use it.
4122 If macro wants arguments, caller has already verified that
4123 an argument list follows; arguments come from the input stack. */
4125 static void
4126 macroexpand (hp, op)
4127 HASHNODE *hp;
4128 FILE_BUF *op;
4130 int nargs;
4131 DEFINITION *defn = hp->value.defn;
4132 U_CHAR *xbuf;
4133 int xbuf_len;
4134 int start_line = instack[indepth].lineno;
4136 CHECK_DEPTH (return;);
4138 /* it might not actually be a macro. */
4139 if (hp->type != T_MACRO) {
4140 special_symbol (hp, op);
4141 return;
4144 nargs = defn->nargs;
4146 if (nargs >= 0) {
4147 int i;
4148 struct argdata *args;
4149 const char *parse_error = 0;
4151 args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
4153 for (i = 0; i < nargs; i++) {
4154 args[i].raw = args[i].expanded = (U_CHAR *) "";
4155 args[i].raw_length = args[i].expand_length
4156 = args[i].stringified_length = 0;
4157 args[i].free1 = args[i].free2 = 0;
4160 /* Parse all the macro args that are supplied. I counts them.
4161 The first NARGS args are stored in ARGS.
4162 The rest are discarded. */
4163 i = 0;
4164 do {
4165 /* Discard the open-parenthesis or comma before the next arg. */
4166 ++instack[indepth].bufp;
4167 parse_error
4168 = macarg ((i < nargs || (nargs == 0 && i == 0)) ? &args[i] : 0);
4169 if (parse_error)
4171 error_with_line (line_for_error (start_line), "%s", parse_error);
4172 break;
4174 i++;
4175 } while (*instack[indepth].bufp != ')');
4177 /* If we got one arg but it was just whitespace, call that 0 args. */
4178 if (i == 1) {
4179 const U_CHAR *bp = args[0].raw;
4180 const U_CHAR *lim = bp + args[0].raw_length;
4181 while (bp != lim && is_space (*bp)) bp++;
4182 if (bp == lim)
4183 i = 0;
4186 if (nargs == 0 && i > 0)
4187 error ("arguments given to macro `%s'", hp->name);
4188 else if (i < nargs) {
4189 /* traditional C allows foo() if foo wants one argument. */
4190 if (nargs == 1 && i == 0)
4192 else if (i == 0)
4193 error ("no args to macro `%s'", hp->name);
4194 else if (i == 1)
4195 error ("only 1 arg to macro `%s'", hp->name);
4196 else
4197 error ("only %d args to macro `%s'", i, hp->name);
4198 } else if (i > nargs)
4199 error ("too many (%d) args to macro `%s'", i, hp->name);
4201 /* Swallow the closeparen. */
4202 ++instack[indepth].bufp;
4204 /* If macro wants zero args, we parsed the arglist for checking only.
4205 Read directly from the macro definition. */
4206 if (nargs == 0) {
4207 xbuf = defn->expansion;
4208 xbuf_len = defn->length;
4209 } else {
4210 U_CHAR *exp = defn->expansion;
4211 int offset; /* offset in expansion,
4212 copied a piece at a time */
4213 int totlen; /* total amount of exp buffer filled so far */
4215 struct reflist *ap;
4217 /* Macro really takes args. Compute the expansion of this call. */
4219 /* Compute length in characters of the macro's expansion. */
4220 xbuf_len = defn->length;
4221 for (ap = defn->pattern; ap != NULL; ap = ap->next) {
4222 if (ap->stringify)
4223 xbuf_len += args[ap->argno].stringified_length;
4224 else
4225 xbuf_len += args[ap->argno].raw_length;
4228 xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
4230 /* Generate in XBUF the complete expansion
4231 with arguments substituted in.
4232 TOTLEN is the total size generated so far.
4233 OFFSET is the index in the definition
4234 of where we are copying from. */
4235 offset = totlen = 0;
4236 for (ap = defn->pattern; ap != NULL; ap = ap->next) {
4237 struct argdata *arg = &args[ap->argno];
4239 for (i = 0; i < ap->nchars; i++)
4240 xbuf[totlen++] = exp[offset++];
4242 if (ap->stringify != 0) {
4243 int arglen = arg->raw_length;
4244 int escaped = 0;
4245 int in_string = 0;
4246 int c;
4247 i = 0;
4248 while (i < arglen
4249 && (c = arg->raw[i], is_space (c)))
4250 i++;
4251 while (i < arglen
4252 && (c = arg->raw[arglen - 1], is_space (c)))
4253 arglen--;
4254 for (; i < arglen; i++) {
4255 c = arg->raw[i];
4257 /* Special markers Newline Space
4258 generate nothing for a stringified argument. */
4259 if (c == '\n' && arg->raw[i+1] != '\n') {
4260 i++;
4261 continue;
4264 /* Internal sequences of whitespace are replaced by one space
4265 except within an string or char token. */
4266 if (! in_string
4267 && (c == '\n' ? arg->raw[i+1] == '\n' : is_space (c))) {
4268 while (1) {
4269 /* Note that Newline Space does occur within whitespace
4270 sequences; consider it part of the sequence. */
4271 if (c == '\n' && is_space (arg->raw[i+1]))
4272 i += 2;
4273 else if (c != '\n' && is_space (c))
4274 i++;
4275 else break;
4276 c = arg->raw[i];
4278 i--;
4279 c = ' ';
4282 if (escaped)
4283 escaped = 0;
4284 else {
4285 if (c == '\\')
4286 escaped = 1;
4287 if (in_string) {
4288 if (c == in_string)
4289 in_string = 0;
4290 } else if (c == '\"' || c == '\'')
4291 in_string = c;
4294 /* Escape these chars */
4295 if (c == '\"' || (in_string && c == '\\'))
4296 xbuf[totlen++] = '\\';
4297 if (ISPRINT (c))
4298 xbuf[totlen++] = c;
4299 else {
4300 sprintf ((char *) &xbuf[totlen], "\\%03o", (unsigned int) c);
4301 totlen += 4;
4304 } else {
4305 const U_CHAR *p1 = arg->raw;
4306 const U_CHAR *l1 = p1 + arg->raw_length;
4308 if (ap->raw_before) {
4309 while (p1 != l1 && is_space (*p1)) p1++;
4310 while (p1 != l1 && is_idchar (*p1))
4311 xbuf[totlen++] = *p1++;
4312 /* Delete any no-reexpansion marker that follows
4313 an identifier at the beginning of the argument
4314 if the argument is concatenated with what precedes it. */
4315 if (p1[0] == '\n' && p1[1] == '-')
4316 p1 += 2;
4318 if (ap->raw_after) {
4319 /* Arg is concatenated after: delete trailing whitespace,
4320 whitespace markers, and no-reexpansion markers. */
4321 while (p1 != l1) {
4322 if (is_space (l1[-1])) l1--;
4323 else if (l1[-1] == '-') {
4324 const U_CHAR *p2 = l1 - 1;
4325 /* If a `-' is preceded by an odd number of newlines then it
4326 and the last newline are a no-reexpansion marker. */
4327 while (p2 != p1 && p2[-1] == '\n') p2--;
4328 if ((l1 - 1 - p2) & 1) {
4329 l1 -= 2;
4331 else break;
4333 else break;
4336 memmove (xbuf + totlen, p1, l1 - p1);
4337 totlen += l1 - p1;
4340 if (totlen > xbuf_len)
4341 abort ();
4344 /* if there is anything left of the definition
4345 after handling the arg list, copy that in too. */
4347 for (i = offset; i < defn->length; i++)
4348 xbuf[totlen++] = exp[i];
4350 xbuf[totlen] = 0;
4351 xbuf_len = totlen;
4353 for (i = 0; i < nargs; i++) {
4354 if (args[i].free1 != 0)
4355 free (args[i].free1);
4356 if (args[i].free2 != 0)
4357 free (args[i].free2);
4360 } else {
4361 xbuf = defn->expansion;
4362 xbuf_len = defn->length;
4365 /* Now put the expansion on the input stack
4366 so our caller will commence reading from it. */
4368 FILE_BUF *ip2;
4370 ip2 = &instack[++indepth];
4372 ip2->fname = 0;
4373 ip2->lineno = 0;
4374 ip2->buf = xbuf;
4375 ip2->length = xbuf_len;
4376 ip2->bufp = xbuf;
4377 ip2->free_ptr = (nargs > 0) ? xbuf : 0;
4378 ip2->macro = hp;
4379 ip2->if_stack = if_stack;
4384 * Parse a macro argument and store the info on it into *ARGPTR.
4385 * Return nonzero to indicate a syntax error.
4388 static const char *
4389 macarg (argptr)
4390 struct argdata *argptr;
4392 FILE_BUF *ip = &instack[indepth];
4393 int paren = 0;
4394 int newlines = 0;
4395 int comments = 0;
4397 /* Try to parse as much of the argument as exists at this
4398 input stack level. */
4399 U_CHAR *bp = macarg1 (ip->bufp, ip->buf + ip->length,
4400 &paren, &newlines, &comments);
4402 /* If we find the end of the argument at this level,
4403 set up *ARGPTR to point at it in the input stack. */
4404 if (!(ip->fname != 0 && (newlines != 0 || comments != 0))
4405 && bp != ip->buf + ip->length) {
4406 if (argptr != 0) {
4407 argptr->raw = ip->bufp;
4408 argptr->raw_length = bp - ip->bufp;
4410 ip->bufp = bp;
4411 } else {
4412 /* This input stack level ends before the macro argument does.
4413 We must pop levels and keep parsing.
4414 Therefore, we must allocate a temporary buffer and copy
4415 the macro argument into it. */
4416 int bufsize = bp - ip->bufp;
4417 int extra = newlines;
4418 U_CHAR *buffer = (U_CHAR *) xmalloc (bufsize + extra + 1);
4419 int final_start = 0;
4421 memcpy (buffer, ip->bufp, bufsize);
4422 ip->bufp = bp;
4423 ip->lineno += newlines;
4425 while (bp == ip->buf + ip->length) {
4426 if (instack[indepth].macro == 0) {
4427 free (buffer);
4428 return "unterminated macro call";
4430 ip->macro->type = T_MACRO;
4431 if (ip->free_ptr)
4432 free (ip->free_ptr);
4433 ip = &instack[--indepth];
4434 newlines = 0;
4435 comments = 0;
4436 bp = macarg1 (ip->bufp, ip->buf + ip->length, &paren,
4437 &newlines, &comments);
4438 final_start = bufsize;
4439 bufsize += bp - ip->bufp;
4440 extra += newlines;
4441 buffer = (U_CHAR *) xrealloc (buffer, bufsize + extra + 1);
4442 memcpy (buffer + bufsize - (bp - ip->bufp), ip->bufp, bp - ip->bufp);
4443 ip->bufp = bp;
4444 ip->lineno += newlines;
4447 /* Now, if arg is actually wanted, record its raw form,
4448 discarding comments and duplicating newlines in whatever
4449 part of it did not come from a macro expansion.
4450 EXTRA space has been preallocated for duplicating the newlines.
4451 FINAL_START is the index of the start of that part. */
4452 if (argptr != 0) {
4453 argptr->raw = buffer;
4454 argptr->raw_length = bufsize;
4455 argptr->free1 = buffer;
4456 argptr->newlines = newlines;
4457 argptr->comments = comments;
4458 if ((newlines || comments) && ip->fname != 0)
4459 argptr->raw_length
4460 = final_start +
4461 discard_comments (argptr->raw + final_start,
4462 argptr->raw_length - final_start,
4463 newlines);
4464 argptr->raw[argptr->raw_length] = 0;
4465 if (argptr->raw_length > bufsize + extra)
4466 abort ();
4470 /* If we are not discarding this argument,
4471 macroexpand it and compute its length as stringified.
4472 All this info goes into *ARGPTR. */
4474 if (argptr != 0) {
4475 FILE_BUF obuf;
4476 const U_CHAR *buf, *lim;
4477 int totlen;
4479 obuf = expand_to_temp_buffer (argptr->raw,
4480 argptr->raw + argptr->raw_length,
4483 argptr->expanded = obuf.buf;
4484 argptr->expand_length = obuf.length;
4485 argptr->free2 = obuf.buf;
4487 buf = argptr->raw;
4488 lim = buf + argptr->raw_length;
4490 totlen = 0;
4491 while (buf != lim) {
4492 U_CHAR c = *buf++;
4493 totlen++;
4494 /* Internal sequences of whitespace are replaced by one space
4495 in most cases, but not always. So count all the whitespace
4496 in case we need to keep it all. */
4497 if (c == '\"' || c == '\\') /* escape these chars */
4498 totlen++;
4499 else if (!ISPRINT (c))
4500 totlen += 3;
4502 argptr->stringified_length = totlen;
4504 return 0;
4507 /* Scan text from START (inclusive) up to LIMIT (exclusive),
4508 counting parens in *DEPTHPTR,
4509 and return if reach LIMIT
4510 or before a `)' that would make *DEPTHPTR negative
4511 or before a comma when *DEPTHPTR is zero.
4512 Single and double quotes are matched and termination
4513 is inhibited within them. Comments also inhibit it.
4514 Value returned is pointer to stopping place.
4516 Increment *NEWLINES each time a newline is passed.
4517 Set *COMMENTS to 1 if a comment is seen. */
4519 static U_CHAR *
4520 macarg1 (start, limit, depthptr, newlines, comments)
4521 U_CHAR *start;
4522 const U_CHAR *limit;
4523 int *depthptr, *newlines, *comments;
4525 U_CHAR *bp = start;
4527 while (bp < limit) {
4528 switch (*bp) {
4529 case '(':
4530 (*depthptr)++;
4531 break;
4532 case ')':
4533 if (--(*depthptr) < 0)
4534 return bp;
4535 break;
4536 case '\\':
4537 /* Traditionally, backslash makes following char not special. */
4538 if (bp + 1 < limit)
4540 bp++;
4541 /* But count source lines anyway. */
4542 if (*bp == '\n')
4543 ++*newlines;
4545 break;
4546 case '\n':
4547 ++*newlines;
4548 break;
4549 case '/':
4550 if (bp[1] == '\\' && bp[2] == '\n')
4551 newline_fix (bp + 1);
4552 if (bp[1] != '*' || bp + 1 >= limit)
4553 break;
4554 *comments = 1;
4555 bp += 2;
4556 while (bp + 1 < limit) {
4557 if (bp[0] == '*'
4558 && bp[1] == '\\' && bp[2] == '\n')
4559 newline_fix (bp + 1);
4560 if (bp[0] == '*' && bp[1] == '/')
4561 break;
4562 if (*bp == '\n') ++*newlines;
4563 bp++;
4565 bp += 1;
4566 break;
4567 case '\'':
4568 case '\"':
4570 int quotec;
4571 for (quotec = *bp++; bp + 1 < limit && *bp != quotec; bp++) {
4572 if (*bp == '\\') {
4573 bp++;
4574 if (*bp == '\n')
4575 ++*newlines;
4576 while (*bp == '\\' && bp[1] == '\n') {
4577 bp += 2;
4579 } else if (*bp == '\n') {
4580 ++*newlines;
4581 if (quotec == '\'')
4582 break;
4586 break;
4587 case ',':
4588 if ((*depthptr) == 0)
4589 return bp;
4590 break;
4592 bp++;
4595 return bp;
4598 /* Discard comments and duplicate newlines
4599 in the string of length LENGTH at START,
4600 except inside of string constants.
4601 The string is copied into itself with its beginning staying fixed.
4603 NEWLINES is the number of newlines that must be duplicated.
4604 We assume that that much extra space is available past the end
4605 of the string. */
4607 static int
4608 discard_comments (start, length, newlines)
4609 U_CHAR *start;
4610 int length;
4611 int newlines;
4613 U_CHAR *ibp;
4614 U_CHAR *obp;
4615 const U_CHAR *limit;
4616 int c;
4618 /* If we have newlines to duplicate, copy everything
4619 that many characters up. Then, in the second part,
4620 we will have room to insert the newlines
4621 while copying down.
4622 NEWLINES may actually be too large, because it counts
4623 newlines in string constants, and we don't duplicate those.
4624 But that does no harm. */
4625 if (newlines > 0) {
4626 ibp = start + length;
4627 obp = ibp + newlines;
4628 limit = start;
4629 while (limit != ibp)
4630 *--obp = *--ibp;
4633 ibp = start + newlines;
4634 limit = start + length + newlines;
4635 obp = start;
4637 while (ibp < limit) {
4638 *obp++ = c = *ibp++;
4639 switch (c) {
4640 case '\n':
4641 /* Duplicate the newline. */
4642 *obp++ = '\n';
4643 break;
4645 case '\\':
4646 if (*ibp == '\n') {
4647 obp--;
4648 ibp++;
4650 break;
4652 case '/':
4653 if (*ibp == '\\' && ibp[1] == '\n')
4654 newline_fix (ibp);
4655 /* Delete any comment. */
4656 if (ibp[0] != '*' || ibp + 1 >= limit)
4657 break;
4658 obp--;
4659 ibp++;
4660 while (ibp + 1 < limit) {
4661 if (ibp[0] == '*'
4662 && ibp[1] == '\\' && ibp[2] == '\n')
4663 newline_fix (ibp + 1);
4664 if (ibp[0] == '*' && ibp[1] == '/')
4665 break;
4666 ibp++;
4668 ibp += 2;
4669 break;
4671 case '\'':
4672 case '\"':
4673 /* Notice and skip strings, so that we don't
4674 think that comments start inside them,
4675 and so we don't duplicate newlines in them. */
4677 int quotec = c;
4678 while (ibp < limit) {
4679 *obp++ = c = *ibp++;
4680 if (c == quotec)
4681 break;
4682 if (c == '\n' && quotec == '\'')
4683 break;
4684 if (c == '\\' && ibp < limit) {
4685 while (*ibp == '\\' && ibp[1] == '\n')
4686 ibp += 2;
4687 *obp++ = *ibp++;
4691 break;
4695 return obp - start;
4699 /* Core error handling routine. */
4700 static void
4701 v_message (mtype, line, msgid, ap)
4702 enum msgtype mtype;
4703 int line;
4704 const char *msgid;
4705 va_list ap;
4707 const char *fname = 0;
4708 int i;
4710 if (mtype == MT_WARNING && inhibit_warnings)
4711 return;
4713 for (i = indepth; i >= 0; i--)
4714 if (instack[i].fname != NULL) {
4715 if (line == 0)
4716 line = instack[i].lineno;
4717 fname = instack[i].fname;
4718 break;
4721 if (fname)
4722 fprintf (stderr, "%s:%d: ", fname, line);
4723 else
4724 fprintf (stderr, "%s: ", progname);
4726 if (mtype == MT_WARNING)
4727 fputs (_("warning: "), stderr);
4729 vfprintf (stderr, _(msgid), ap);
4730 putc ('\n', stderr);
4732 if (mtype == MT_ERROR)
4733 errors++;
4737 * error - print error message and increment count of errors.
4739 void
4740 error VPARAMS ((const char *msgid, ...))
4742 VA_OPEN(ap, msgid);
4743 VA_FIXEDARG (ap, const char *, msgid);
4745 v_message (MT_ERROR, 0, msgid, ap);
4746 VA_CLOSE (ap);
4749 void
4750 error_with_line VPARAMS ((int line, const char *msgid, ...))
4752 VA_OPEN(ap, msgid);
4753 VA_FIXEDARG (ap, int, line);
4754 VA_FIXEDARG (ap, const char *, msgid);
4756 v_message (MT_ERROR, line, msgid, ap);
4757 VA_CLOSE (ap);
4760 /* Error including a message from `errno'. */
4761 void
4762 error_from_errno (name)
4763 const char *name;
4765 error ("%s: %s", name, strerror (errno));
4768 /* Print error message but don't count it. */
4769 void
4770 warning VPARAMS ((const char *msgid, ...))
4772 VA_OPEN(ap, msgid);
4773 VA_FIXEDARG (ap, const char *, msgid);
4775 v_message (MT_WARNING, 0, msgid, ap);
4776 VA_CLOSE (ap);
4779 void
4780 fatal VPARAMS ((const char *msgid, ...))
4782 VA_OPEN(ap, msgid);
4783 VA_FIXEDARG (ap, const char *, msgid);
4785 v_message (MT_FATAL, 0, msgid, ap);
4786 VA_CLOSE (ap);
4787 exit (FATAL_EXIT_CODE);
4790 /* More 'friendly' abort that prints the location at which we died. */
4791 void
4792 fancy_abort (line, func)
4793 int line;
4794 const char *func;
4796 fatal ("internal error in %s, at tradcpp.c:%d\n\
4797 Please submit a full bug report.\n\
4798 See %s for instructions.", func, line, GCCBUGURL);
4801 void
4802 perror_with_name (name)
4803 const char *name;
4805 fprintf (stderr, "%s: %s: %s\n", progname, name, strerror (errno));
4806 errors++;
4809 void
4810 pfatal_with_name (name)
4811 const char *name;
4813 perror_with_name (name);
4814 exit (FATAL_EXIT_CODE);
4817 /* Return the line at which an error occurred.
4818 The error is not necessarily associated with the current spot
4819 in the input stack, so LINE says where. LINE will have been
4820 copied from ip->lineno for the current input level.
4821 If the current level is for a file, we return LINE.
4822 But if the current level is not for a file, LINE is meaningless.
4823 In that case, we return the lineno of the innermost file. */
4824 static int
4825 line_for_error (line)
4826 int line;
4828 int i;
4829 int line1 = line;
4831 for (i = indepth; i >= 0; ) {
4832 if (instack[i].fname != 0)
4833 return line1;
4834 i--;
4835 if (i < 0)
4836 return 0;
4837 line1 = instack[i].lineno;
4839 return 0;
4843 * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
4845 * As things stand, nothing is ever placed in the output buffer to be
4846 * removed again except when it's KNOWN to be part of an identifier,
4847 * so flushing and moving down everything left, instead of expanding,
4848 * should work ok.
4851 static void
4852 grow_outbuf (obuf, needed)
4853 FILE_BUF *obuf;
4854 int needed;
4856 U_CHAR *p;
4857 int minsize;
4859 if (obuf->length - (obuf->bufp - obuf->buf) > needed)
4860 return;
4862 /* Make it at least twice as big as it is now. */
4863 obuf->length *= 2;
4864 /* Make it have at least 150% of the free space we will need. */
4865 minsize = (3 * needed) / 2 + (obuf->bufp - obuf->buf);
4866 if (minsize > obuf->length)
4867 obuf->length = minsize;
4869 p = (U_CHAR *) xrealloc (obuf->buf, obuf->length);
4870 obuf->bufp = p + (obuf->bufp - obuf->buf);
4871 obuf->buf = p;
4874 /* Symbol table for macro names and special symbols */
4877 * install a name in the main hash table, even if it is already there.
4878 * name stops with first non alphanumeric, except leading '#'.
4879 * caller must check against redefinition if that is desired.
4880 * delete_macro () removes things installed by install () in fifo order.
4881 * this is important because of the `defined' special symbol used
4882 * in #if, and also if pushdef/popdef directives are ever implemented.
4884 * If LEN is >= 0, it is the length of the name.
4885 * Otherwise, compute the length by scanning the entire name.
4887 * If HASH is >= 0, it is the precomputed hash code.
4888 * Otherwise, compute the hash code.
4890 * caller must set the value, if any is desired.
4892 static HASHNODE *
4893 install (name, len, type, hash)
4894 const U_CHAR *name;
4895 int len;
4896 enum node_type type;
4897 int hash;
4898 /* watch out here if sizeof (U_CHAR *) != sizeof (int) */
4900 HASHNODE *hp;
4901 int bucket;
4902 const U_CHAR *p;
4903 U_CHAR *q;
4905 if (len < 0) {
4906 p = name;
4907 while (is_idchar (*p))
4908 p++;
4909 len = p - name;
4912 if (hash < 0)
4913 hash = hashf (name, len, HASHSIZE);
4915 hp = (HASHNODE *) xmalloc (sizeof (HASHNODE) + len + 1);
4916 bucket = hash;
4917 hp->bucket_hdr = &hashtab[bucket];
4918 hp->next = hashtab[bucket];
4919 hashtab[bucket] = hp;
4920 hp->prev = NULL;
4921 if (hp->next != NULL)
4922 hp->next->prev = hp;
4923 hp->type = type;
4924 hp->length = len;
4925 hp->name = q = ((U_CHAR *) hp) + sizeof (HASHNODE);
4926 memcpy (q, name, len);
4927 q[len] = 0;
4928 return hp;
4932 * find the most recent hash node for name name (ending with first
4933 * non-identifier char) installed by install
4935 * If LEN is >= 0, it is the length of the name.
4936 * Otherwise, compute the length by scanning the entire name.
4938 * If HASH is >= 0, it is the precomputed hash code.
4939 * Otherwise, compute the hash code.
4941 HASHNODE *
4942 lookup (name, len, hash)
4943 const U_CHAR *name;
4944 int len;
4945 int hash;
4947 const U_CHAR *bp;
4948 HASHNODE *bucket;
4950 if (len < 0) {
4951 for (bp = name; is_idchar (*bp); bp++) ;
4952 len = bp - name;
4955 if (hash < 0)
4956 hash = hashf (name, len, HASHSIZE);
4958 bucket = hashtab[hash];
4959 while (bucket) {
4960 if (bucket->length == len
4961 && strncmp ((const char *)bucket->name, (const char *)name, len) == 0)
4962 return bucket;
4963 bucket = bucket->next;
4965 return NULL;
4969 * Delete a hash node. Some weirdness to free junk from macros.
4970 * More such weirdness will have to be added if you define more hash
4971 * types that need it.
4974 /* Note that the DEFINITION of a macro is removed from the hash table
4975 but its storage is not freed. This would be a storage leak
4976 except that it is not reasonable to keep undefining and redefining
4977 large numbers of macros many times.
4978 In any case, this is necessary, because a macro can be #undef'd
4979 in the middle of reading the arguments to a call to it.
4980 If #undef freed the DEFINITION, that would crash. */
4981 static void
4982 delete_macro (hp)
4983 HASHNODE *hp;
4986 if (hp->prev != NULL)
4987 hp->prev->next = hp->next;
4988 if (hp->next != NULL)
4989 hp->next->prev = hp->prev;
4991 /* make sure that the bucket chain header that
4992 the deleted guy was on points to the right thing afterwards. */
4993 if (hp == *hp->bucket_hdr)
4994 *hp->bucket_hdr = hp->next;
4996 free (hp);
5000 * return hash function on name. must be compatible with the one
5001 * computed a step at a time, elsewhere
5003 static int
5004 hashf (name, len, hashsize)
5005 const U_CHAR *name;
5006 int len;
5007 int hashsize;
5009 int r = 0;
5011 while (len--)
5012 r = HASHSTEP (r, *name++);
5014 return MAKE_POS (r) % hashsize;
5017 /* Dump all macro definitions as #defines to stdout. */
5019 static void
5020 dump_all_macros ()
5022 int bucket;
5024 for (bucket = 0; bucket < HASHSIZE; bucket++) {
5025 HASHNODE *hp;
5027 for (hp = hashtab[bucket]; hp; hp= hp->next) {
5028 if (hp->type == T_MACRO) {
5029 DEFINITION *defn = hp->value.defn;
5030 struct reflist *ap;
5031 int offset;
5032 int concat;
5035 /* Print the definition of the macro HP. */
5037 printf ("#define %s", hp->name);
5038 if (defn->nargs >= 0) {
5039 int i;
5041 printf ("(");
5042 for (i = 0; i < defn->nargs; i++) {
5043 dump_arg_n (defn, i);
5044 if (i + 1 < defn->nargs)
5045 printf (", ");
5047 printf (")");
5050 printf (" ");
5052 offset = 0;
5053 concat = 0;
5054 for (ap = defn->pattern; ap != NULL; ap = ap->next) {
5055 dump_defn_1 (defn->expansion, offset, ap->nchars);
5056 if (ap->nchars != 0)
5057 concat = 0;
5058 offset += ap->nchars;
5059 if (ap->stringify)
5060 printf (" #");
5061 if (ap->raw_before && !concat)
5062 printf (" ## ");
5063 concat = 0;
5064 dump_arg_n (defn, ap->argno);
5065 if (ap->raw_after) {
5066 printf (" ## ");
5067 concat = 1;
5070 dump_defn_1 (defn->expansion, offset, defn->length - offset);
5071 printf ("\n");
5077 /* Output to stdout a substring of a macro definition.
5078 BASE is the beginning of the definition.
5079 Output characters START thru LENGTH.
5080 Discard newlines outside of strings, thus
5081 converting funny-space markers to ordinary spaces. */
5082 static void
5083 dump_defn_1 (base, start, length)
5084 const U_CHAR *base;
5085 int start;
5086 int length;
5088 const U_CHAR *p = base + start;
5089 const U_CHAR *limit = base + start + length;
5091 while (p < limit) {
5092 if (*p != '\n')
5093 putchar (*p);
5094 else if (*p == '\"' || *p =='\'') {
5095 const U_CHAR *p1 = skip_quoted_string (p, limit, 0, 0, 0, 0);
5096 fwrite (p, p1 - p, 1, stdout);
5097 p = p1 - 1;
5099 p++;
5103 /* Print the name of argument number ARGNUM of macro definition DEFN.
5104 Recall that DEFN->argnames contains all the arg names
5105 concatenated in reverse order with comma-space in between. */
5106 static void
5107 dump_arg_n (defn, argnum)
5108 DEFINITION *defn;
5109 int argnum;
5111 const U_CHAR *p = defn->argnames;
5112 while (argnum + 1 < defn->nargs) {
5113 p = (const U_CHAR *) strchr ((const char *)p, ' ') + 1;
5114 argnum++;
5117 while (*p && *p != ',') {
5118 putchar (*p);
5119 p++;
5123 /* Initialize the built-in macros. */
5124 #define DSC(x) U x, sizeof x - 1
5125 #define install_spec(name, type) \
5126 install(DSC(name), type, -1);
5127 #define install_value(name, val) do { \
5128 hp = install(DSC(name), T_CONST, -1); hp->value.cpval = val; \
5129 } while (0)
5130 static void
5131 initialize_builtins ()
5133 HASHNODE *hp;
5135 install_spec ("__BASE_FILE__", T_BASE_FILE);
5136 install_spec ("__DATE__", T_DATE);
5137 install_spec ("__FILE__", T_FILE);
5138 install_spec ("__TIME__", T_TIME);
5139 install_spec ("__VERSION__", T_VERSION);
5140 install_spec ("__INCLUDE_LEVEL__", T_INCLUDE_LEVEL);
5141 install_spec ("__LINE__", T_SPECLINE);
5143 if (flag_signed_char == 0)
5144 install_value ("__CHAR_UNSIGNED__", "1");
5146 #undef DSC
5147 #undef install_spec
5148 #undef install_value
5150 /* Common handler of command line directives -U, -D and -A. */
5151 static void
5152 run_directive (str, len, type)
5153 const char *str;
5154 size_t len;
5155 enum node_type type;
5157 const struct directive *kt;
5158 FILE_BUF *ip = &instack[++indepth];
5159 ip->fname = "*command line*";
5161 ip->buf = ip->bufp = (U_CHAR *) str;
5162 ip->length = len;
5163 ip->lineno = 1;
5164 ip->macro = 0;
5165 ip->free_ptr = 0;
5166 ip->if_stack = if_stack;
5168 for (kt = directive_table; kt->type != type; kt++)
5171 (*kt->func) ((U_CHAR *) str, (U_CHAR *) str + len, NULL);
5172 --indepth;
5175 /* Handle the -D option. If STR is just an identifier, define it with
5176 * value 1. If STR has anything after the identifier, then it should
5177 * be identifier-space-definition. */
5178 static void
5179 make_definition (str)
5180 const char *str;
5182 char *buf, *p;
5183 size_t count;
5185 /* Copy the entire option so we can modify it.
5186 Change the first "=" in the string to a space. If there is none,
5187 tack " 1" on the end. */
5189 /* Length including the null. */
5190 count = strlen (str);
5191 buf = (char *) alloca (count + 2);
5192 memcpy (buf, str, count);
5194 p = strchr (str, '=');
5195 if (p)
5196 buf[p - str] = ' ';
5197 else
5199 buf[count++] = ' ';
5200 buf[count++] = '1';
5203 run_directive (buf, count, T_DEFINE);
5206 /* Handle the -U option. */
5207 static void
5208 make_undef (str)
5209 const char *str;
5211 run_directive (str, strlen (str), T_UNDEF);
5214 /* Handles the #assert (-A) and #unassert (-A-) command line options. */
5215 static void
5216 make_assertion (str)
5217 const char *str;
5219 enum node_type type = T_ASSERT;
5220 size_t count;
5221 const char *p;
5223 if (*str == '-')
5225 str++;
5226 type = T_UNASSERT;
5229 count = strlen (str);
5230 p = strchr (str, '=');
5231 if (p)
5233 /* Copy the entire option so we can modify it. Change the first
5234 "=" in the string to a '(', and tack a ')' on the end. */
5235 char *buf = (char *) alloca (count + 1);
5237 memcpy (buf, str, count);
5238 buf[p - str] = '(';
5239 buf[count++] = ')';
5240 str = buf;
5243 run_directive (str, count, type);
5246 /* Get the file-mode and data size of the file open on FD
5247 and store them in *MODE_POINTER and *SIZE_POINTER. */
5249 static int
5250 file_size_and_mode (fd, mode_pointer, size_pointer)
5251 int fd;
5252 int *mode_pointer;
5253 long *size_pointer;
5255 struct stat sbuf;
5257 if (fstat (fd, &sbuf) < 0) return -1;
5258 if (mode_pointer) *mode_pointer = sbuf.st_mode;
5259 if (size_pointer) *size_pointer = sbuf.st_size;
5260 return 0;