1 /* C Compatible Compiler Preprocessor (CCCP)
2 Copyright (C) 1986, 1987, 1989, 2000 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
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. */
25 #include "cppdefault.h"
28 typedef unsigned char U_CHAR;
30 /* Name under which this program was invoked. */
32 static const char *progname;
34 /* Current maximum length of directory names in the search path
35 for include files. (Altered as we get more of them.) */
37 size_t max_include_len;
39 /* Nonzero means copy comments into the output file. */
41 int put_out_comments = 0;
43 /* Nonzero means print the names of included files rather than
44 the preprocessed output. 1 means just the #include "...",
45 2 means #include <...> as well. */
49 /* Nonzero means don't output line number information. */
53 /* Nonzero means inhibit output of the preprocessed text
54 and instead output the definitions of all user-defined macros
55 in a form suitable for use as input to cccp. */
59 /* Nonzero means don't print warning messages. -w. */
61 int inhibit_warnings = 0;
63 /* Nonzero means warn if slash-star appears in a comment. */
67 /* Nonzero causes output not to be done,
68 but directives such as #define that have side effects
73 /* Value of __USER_LABEL_PREFIX__. Target-dependent, also controlled
74 by -f(no-)leading-underscore. */
75 static const char *user_label_prefix;
77 /* I/O buffer structure.
78 The `fname' field is nonzero for source files and #include files
79 and for the dummy text used for -D and -U.
80 It is zero for rescanning results of macro expansion
81 and for expanding macro arguments. */
82 #define INPUT_STACK_MAX 200
89 /* Macro that this level is the expansion of.
90 Included so that we can reenable the macro
91 at the end of this level. */
92 struct hashnode *macro;
93 /* Value of if_stack at start of this file.
94 Used to prohibit unmatched #endif (etc) in an include file. */
95 struct if_stack *if_stack;
96 /* Object to be freed at end of input at this level. */
98 } instack[INPUT_STACK_MAX];
100 typedef struct file_buf FILE_BUF;
102 /* Current nesting level of input sources.
103 `instack[indepth]' is the level currently being read. */
105 #define CHECK_DEPTH(code) \
106 if (indepth >= (INPUT_STACK_MAX - 1)) \
108 error_with_line (line_for_error (instack[indepth].lineno), \
109 "macro or #include recursion too deep"); \
113 /* Current depth in #include directives that use <...>. */
114 int system_include_depth = 0;
116 /* The output buffer. Its LENGTH field is the amount of room allocated
117 for the buffer, not the number of chars actually present. To get
118 that, subtract outbuf.buf from outbuf.bufp. */
120 #define OUTBUF_SIZE 10 /* initial size of output buffer */
123 /* Grow output buffer OBUF points at
124 so it can hold at least NEEDED more chars. */
126 #define check_expand(OBUF, NEEDED) do { \
127 if ((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \
128 grow_outbuf ((OBUF), (NEEDED)); \
131 struct file_name_list
133 struct file_name_list *next;
137 struct file_name_list *include = 0; /* First dir to search */
138 /* First dir to search for <file> */
139 struct file_name_list *first_bracket_include = 0;
140 struct file_name_list *last_include = 0; /* Last in chain */
142 /* List of included files that contained #once. */
143 struct file_name_list *dont_repeat_files = 0;
145 /* List of other included files. */
146 struct file_name_list *all_include_files = 0;
148 /* Structure allocated for every #define. For a simple replacement
151 nargs = -1, the `pattern' list is null, and the expansion is just
152 the replacement text. Nargs = 0 means a functionlike macro with no args,
154 #define getchar() getc (stdin) .
155 When there are args, the expansion is the replacement text with the
156 args squashed out, and the reflist is a list describing how to
157 build the output from the input: e.g., "3 chars, then the 1st arg,
158 then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
159 The chars here come from the expansion. Whatever is left of the
160 expansion after the last arg-occurrence is copied after that arg.
161 Note that the reflist can be arbitrarily long---
162 its length depends on the number of times the arguments appear in
163 the replacement text, not how many args there are. Example:
164 #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
166 { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
167 where (x, y) means (nchars, argno). */
169 typedef struct definition DEFINITION;
172 int length; /* length of expansion string */
175 struct reflist *next;
176 char stringify; /* nonzero if this arg was preceded by a
178 char raw_before; /* Nonzero if a ## operator before arg. */
179 char raw_after; /* Nonzero if a ## operator after arg. */
180 int nchars; /* Number of literal chars to copy before
181 this arg occurrence. */
182 int argno; /* Number of arg to substitute (origin-0) */
184 /* Names of macro args, concatenated in reverse order
185 with comma-space between them.
186 The only use of this is that we warn on redefinition
187 if this differs between the old and new definitions. */
188 const U_CHAR *argnames;
191 /* Chained list of answers to an assertion. */
195 const unsigned char *answer;
199 /* different kinds of things that can appear in the value field
200 of a hash node. Actually, this may be useless now. */
204 struct answer *answers;
207 /* The structure of a node in the hash table. The hash table
208 has entries for all tokens defined by #define commands (type T_MACRO),
209 plus some special tokens like __LINE__ (these each have their own
210 type, and the appropriate code is run when that type of node is seen.
211 It does not contain control words like "#define", which are recognized
212 by a separate piece of code. */
214 /* different flavors of hash nodes --- also used in keyword table */
216 T_DEFINE = 1, /* `#define' */
217 T_INCLUDE, /* `#include' */
218 T_IFDEF, /* `#ifdef' */
219 T_IFNDEF, /* `#ifndef' */
221 T_ELSE, /* `#else' */
222 T_ELIF, /* `#elif' */
223 T_UNDEF, /* `#undef' */
224 T_ERROR, /* `#error' */
225 T_LINE, /* `#line' */
226 T_ENDIF, /* `#endif' */
227 T_ASSERT, /* `#assert' */
228 T_UNASSERT, /* `#unassert' */
229 T_SPECLINE, /* special symbol `__LINE__' */
230 T_DATE, /* `__DATE__' */
231 T_FILE, /* `__FILE__' */
232 T_BASE_FILE, /* `__BASE_FILE__' */
233 T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
234 T_VERSION, /* `__VERSION__' */
235 T_TIME, /* `__TIME__' */
236 T_CONST, /* Constant value, used by `__STDC__' */
237 T_MACRO, /* macro defined by `#define' */
238 T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
239 T_UNUSED /* Used for something not defined. */
243 struct hashnode *next; /* double links for easy deletion */
244 struct hashnode *prev;
245 struct hashnode **bucket_hdr; /* also, a back pointer to this node's hash
246 chain is kept, in case the node is the head
247 of the chain and gets deleted. */
248 enum node_type type; /* type of special token */
249 int length; /* length of token, for quick comparison */
250 U_CHAR *name; /* the actual name */
251 union hashval value; /* pointer to expansion, or whatever */
254 typedef struct hashnode HASHNODE;
256 static HASHNODE *parse_assertion PARAMS ((const unsigned char *,
257 const unsigned char *,
258 struct answer **, int));
259 static struct answer **find_answer PARAMS ((HASHNODE *,
260 const struct answer *));
261 static int parse_answer PARAMS ((const unsigned char *, const unsigned char *,
262 struct answer **, int));
263 static unsigned char *canonicalize_text PARAMS ((const unsigned char *,
264 const unsigned char *,
265 const unsigned char **));
267 /* Some definitions for the hash table. The hash function MUST be
268 computed as shown in hashf () below. That is because the rescan
269 loop computes the hash value `on the fly' for most tokens,
270 in order to avoid the overhead of a lot of procedure calls to
271 the hashf () function. Hashf () only exists for the sake of
272 politeness, for use when speed isn't so important. */
274 #define HASHSIZE 1403
275 HASHNODE *hashtab[HASHSIZE];
276 #define HASHSTEP(old, c) ((old << 2) + c)
277 #define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
279 /* `struct directive' defines one #-directive, including how to handle it. */
282 int length; /* Length of name */
283 void (*func) PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
284 /* Function to handle directive */
285 const char *name; /* Name of directive */
286 enum node_type type; /* Code which describes which directive. */
289 /* Last arg to output_line_command. */
290 enum file_change_code {same_file, enter_file, leave_file};
292 /* This structure represents one parsed argument in a macro call.
293 `raw' points to the argument text as written (`raw_length' is its length).
294 `expanded' points to the argument's macro-expansion
295 (its length is `expand_length').
296 `stringified_length' is the length the argument would have
298 `free1' and `free2', if nonzero, point to blocks to be freed
299 when the macro argument data is no longer needed. */
302 U_CHAR *raw, *expanded;
303 int raw_length, expand_length;
304 int stringified_length;
305 U_CHAR *free1, *free2;
310 /* The arglist structure is built by do_define to tell
311 collect_definition where the argument names begin. That
312 is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
313 would contain pointers to the strings x, y, and z.
314 Collect_definition would then build a DEFINITION node,
315 with reflist nodes pointing to the places x, y, and z had
316 appeared. So the arglist is just convenience data passed
317 between these two routines. It is not kept around after
318 the current #define has been processed and entered into the
322 struct arglist *next;
328 /* Function prototypes. */
330 static void do_define PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
331 static void do_error PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
332 static void do_line PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
333 static void do_include PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
334 static void do_undef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
335 static void do_if PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
336 static void do_ifdef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
337 static void do_ifndef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
338 static void do_else PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
339 static void do_elif PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
340 static void do_endif PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
341 static void do_assert PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
342 static void do_unassert PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
343 static void do_xifdef PARAMS ((U_CHAR *, U_CHAR *, enum node_type));
345 static struct hashnode *install PARAMS ((const U_CHAR *, int, enum node_type, int));
346 static int hashf PARAMS ((const U_CHAR *, int, int));
347 static int compare_defs PARAMS ((DEFINITION *, DEFINITION *));
348 static int comp_def_part PARAMS ((int, const U_CHAR *, int,
349 const U_CHAR *, int, int));
350 static void delete_macro PARAMS ((HASHNODE *));
352 /* First arg to v_message. */
353 enum msgtype { WARNING = 0, ERROR, FATAL };
354 static void v_message PARAMS ((enum msgtype mtype, int line,
355 const char *msgid, va_list ap))
356 ATTRIBUTE_PRINTF (3, 0);
358 static int line_for_error PARAMS ((int));
360 /* We know perfectly well which file this is, so we don't need to
363 #if (GCC_VERSION >= 2007)
364 #define abort() fancy_abort(__LINE__, __FUNCTION__)
366 #define abort() fancy_abort(__LINE__, 0);
369 static void macroexpand PARAMS ((HASHNODE *, FILE_BUF *));
370 static void special_symbol PARAMS ((HASHNODE *, FILE_BUF *));
371 static void dump_all_macros PARAMS ((void));
372 static void dump_defn_1 PARAMS ((const U_CHAR *, int, int));
373 static void dump_arg_n PARAMS ((DEFINITION *, int));
374 static void conditional_skip PARAMS ((FILE_BUF *, int, enum node_type));
375 static void skip_if_group PARAMS ((FILE_BUF *, int));
376 static void output_line_command PARAMS ((FILE_BUF *, FILE_BUF *,
377 int, enum file_change_code));
379 static int eval_if_expression PARAMS ((const U_CHAR *, int));
381 static void initialize_builtins PARAMS ((void));
382 static void run_directive PARAMS ((const char *, size_t,
384 static void make_definition PARAMS ((const char *));
385 static void make_undef PARAMS ((const char *));
386 static void make_assertion PARAMS ((const char *));
388 static void grow_outbuf PARAMS ((FILE_BUF *, int));
389 static int handle_directive PARAMS ((FILE_BUF *, FILE_BUF *));
390 static void finclude PARAMS ((int, const char *, FILE_BUF *));
391 static void deps_output PARAMS ((const char *, int));
392 static void rescan PARAMS ((FILE_BUF *, int));
393 static void newline_fix PARAMS ((U_CHAR *));
394 static void name_newline_fix PARAMS ((U_CHAR *));
395 static U_CHAR *macarg1 PARAMS ((U_CHAR *, const U_CHAR *, int *,
397 static const char *macarg PARAMS ((struct argdata *));
398 static int discard_comments PARAMS ((U_CHAR *, int, int));
399 static int file_size_and_mode PARAMS ((int, int *, long *));
401 static U_CHAR *skip_to_end_of_comment PARAMS ((FILE_BUF *, int *));
402 static U_CHAR *skip_quoted_string PARAMS ((const U_CHAR *, const U_CHAR *,
403 int, int *, int *, int *));
405 int main PARAMS ((int, char **));
407 /* Convenience. Write U"string" to get an unsigned string constant. */
408 #define U (const unsigned char *)
410 /* Here is the actual list of #-directives, most-often-used first. */
412 struct directive directive_table[] = {
413 { 6, do_define, "define", T_DEFINE },
414 { 7, do_include, "include", T_INCLUDE },
415 { 5, do_endif, "endif", T_ENDIF },
416 { 5, do_ifdef, "ifdef", T_IFDEF },
417 { 2, do_if, "if", T_IF, },
418 { 4, do_else, "else", T_ELSE },
419 { 6, do_ifndef, "ifndef", T_IFNDEF },
420 { 5, do_undef, "undef", T_UNDEF },
421 { 5, do_error, "error", T_ERROR },
422 { 4, do_line, "line", T_LINE },
423 { 4, do_elif, "elif", T_ELIF },
424 { 6, do_assert, "assert", T_ASSERT },
425 { 8, do_unassert,"unassert",T_UNASSERT},
426 { -1, 0, "", T_UNUSED},
429 #define SKIP_WHITE_SPACE(p) do { while (is_nvspace(*p)) p++; } while (0)
430 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space(*p)) p++; } while (0)
432 int errors = 0; /* Error counter for exit code */
434 static FILE_BUF expand_to_temp_buffer PARAMS ((const U_CHAR *, const U_CHAR *, int));
435 static DEFINITION *collect_expansion PARAMS ((U_CHAR *, U_CHAR *, int,
438 /* Stack of conditionals currently in progress
439 (including both successful and failing conditionals). */
442 struct if_stack *next; /* for chaining to the next stack frame */
443 const char *fname; /* copied from input when frame is made */
444 int lineno; /* similarly */
445 int if_succeeded; /* true if a leg of this if-group
446 has been passed through rescan */
447 enum node_type type; /* type of last directive seen in this group */
449 typedef struct if_stack IF_STACK_FRAME;
450 IF_STACK_FRAME *if_stack = NULL;
452 /* Buffer of -M output. */
456 /* Number of bytes allocated in above. */
457 int deps_allocated_size;
459 /* Number of bytes used. */
462 /* Number of bytes since the last newline. */
465 /* Nonzero means -I- has been seen,
466 so don't look for #include "foo" the source-file directory. */
469 /* Pending directives. */
470 enum pending_dir_t {PD_NONE = 0, PD_DEFINE, PD_UNDEF, PD_ASSERTION, PD_FILE};
472 typedef struct pending_dir pending_dir;
476 enum pending_dir_t type;
486 const char *in_fname, *out_fname;
489 pending_dir *pend = (pending_dir *) xcalloc (argc, sizeof (pending_dir));
490 int no_standard_includes = 0;
492 /* Non-0 means don't output the preprocessed program. */
493 int inhibit_output = 0;
495 /* Stream on which to print the dependency information. */
496 FILE *deps_stream = 0;
497 /* Target-name to write with the dependency information. */
498 char *deps_target = 0;
501 /* Get rid of any avoidable limit on stack size. */
505 /* Set the stack limit huge so that alloca (particularly stringtab
506 * in dbxread.c) does not fail. */
507 getrlimit (RLIMIT_STACK, &rlim);
508 rlim.rlim_cur = rlim.rlim_max;
509 setrlimit (RLIMIT_STACK, &rlim);
511 #endif /* RLIMIT_STACK defined */
518 no_line_commands = 0;
522 max_include_len = cpp_GCC_INCLUDE_DIR_len + 7; /* ??? */
524 /* Process switches and find input file name. */
526 for (i = 1; i < argc; i++) {
527 if (argv[i][0] != '-') {
528 if (out_fname != NULL)
529 fatal ("Usage: %s [switches] input output", argv[0]);
530 else if (in_fname != NULL)
541 break; /* Ignore for compatibility with ISO/extended cpp. */
544 if (!strcmp (argv[i], "-lang-c++")
545 || !strcmp (argv[i], "-lang-objc++"))
546 fatal ("-traditional is not supported in C++");
547 else if (!strcmp (argv[i], "-lang-c89"))
548 fatal ("-traditional and -ansi are mutually exclusive");
549 else if (!strcmp (argv[i], "-lang-objc"))
550 pend[i].type = PD_DEFINE, pend[i].arg = "__OBJC__";
551 else if (!strcmp (argv[i], "-lang-asm"))
552 pend[i].type = PD_DEFINE, pend[i].arg = "__ASSEMBLER__";
553 else if (!strcmp (argv[i], "-lang-fortran"))
554 pend[i].type = PD_DEFINE, pend[i].arg = "_LANGUAGE_FORTRAN";
555 /* All other possibilities ignored. */
559 if (!strcmp (argv[i], "-include"))
562 fatal ("Filename missing after -i option");
564 pend[i].type = PD_FILE, pend[i].arg = argv[i + 1], i++;
566 else if (!strcmp (argv[i], "-iprefix"))
567 i++; /* Ignore for compatibility */
568 else if (!strcmp (argv[i], "-isystem")
569 || !strcmp (argv[i], "-iwithprefix")
570 || !strcmp (argv[i], "-iwithprefixbefore")
571 || !strcmp (argv[i], "-idirafter"))
572 goto add_include; /* best we can do */
577 if (out_fname != NULL)
578 fatal ("Output filename specified twice");
580 fatal ("Filename missing after -o option");
581 out_fname = argv[++i];
582 if (!strcmp (out_fname, "-"))
587 inhibit_warnings = 1;
591 if (!strcmp (argv[i], "-Wcomments"))
593 else if (!strcmp (argv[i], "-Wcomment"))
595 else if (!strcmp (argv[i], "-Wall")) {
601 if (!strcmp (argv[i], "-fleading-underscore"))
602 user_label_prefix = "_";
603 else if (!strcmp (argv[i], "-fno-leading-underscore"))
604 user_label_prefix = "";
608 if (!strcmp (argv[i], "-M"))
610 else if (!strcmp (argv[i], "-MM"))
621 fprintf (stderr, "GNU traditional CPP version %s\n", version_string);
632 else if (i + 1 == argc)
633 fatal ("Macro name missing after -%c option", c);
638 pend[i].type = PD_DEFINE;
640 pend[i].type = PD_UNDEF;
642 pend[i].type = PD_ASSERTION;
648 put_out_comments = 1;
652 if (!strcmp (argv[i], "-pedantic"))
653 fatal ("-pedantic and -traditional are mutually exclusive");
657 if (!strcmp (argv[i], "-trigraphs"))
658 fatal ("-trigraphs and -traditional are mutually exclusive");
662 no_line_commands = 1;
665 case 'I': /* Add directory to path for includes. */
668 struct file_name_list *dirtmp;
670 if (! ignore_srcdir && !strcmp (argv[i] + 2, "-"))
673 dirtmp = (struct file_name_list *)
674 xmalloc (sizeof (struct file_name_list));
675 dirtmp->next = 0; /* New one goes on the end */
679 last_include->next = dirtmp;
680 last_include = dirtmp; /* Tail follows the last one */
681 if (argv[i][1] == 'I' && argv[i][2] != 0)
682 dirtmp->fname = argv[i] + 2;
683 else if (i + 1 == argc)
684 fatal ("Directory name missing after -I option");
686 dirtmp->fname = argv[++i];
687 if (strlen (dirtmp->fname) > max_include_len)
688 max_include_len = strlen (dirtmp->fname);
689 if (ignore_srcdir && first_bracket_include == 0)
690 first_bracket_include = dirtmp;
696 /* -nostdinc causes no default include directories.
697 You must specify all include-file directories with -I. */
698 no_standard_includes = 1;
701 case '\0': /* JF handle '-' as file name meaning stdin or stdout */
702 if (in_fname == NULL) {
705 } else if (out_fname == NULL) {
708 } /* else fall through into error */
711 fatal ("Invalid option `%s'", argv[i]);
716 if (user_label_prefix == 0)
717 user_label_prefix = USER_LABEL_PREFIX;
719 /* Install __LINE__, etc. Must follow option processing. */
720 initialize_builtins ();
722 /* Do defines specified with -D and undefines specified with -U. */
723 for (i = 1; i < argc; i++)
724 if (pend[i].type == PD_DEFINE)
725 make_definition (pend[i].arg);
726 else if (pend[i].type == PD_UNDEF)
727 make_undef (pend[i].arg);
728 else if (pend[i].type == PD_ASSERTION)
729 make_assertion (pend[i].arg);
731 /* Unless -fnostdinc,
732 tack on the standard include file dirs to the specified list */
733 if (!no_standard_includes) {
734 const struct default_include *di;
735 struct file_name_list *old_last_include = last_include;
736 struct file_name_list *dirtmp;
737 for (di = cpp_include_defaults; di->fname; di++) {
740 dirtmp = (struct file_name_list *)
741 xmalloc (sizeof (struct file_name_list));
742 dirtmp->next = 0; /* New one goes on the end */
746 last_include->next = dirtmp;
747 last_include = dirtmp; /* Tail follows the last one */
748 dirtmp->fname = di->fname;
749 if (strlen (dirtmp->fname) > max_include_len)
750 max_include_len = strlen (dirtmp->fname);
753 if (ignore_srcdir && first_bracket_include == 0)
754 first_bracket_include = old_last_include->next;
757 /* Initialize output buffer */
759 outbuf.buf = (U_CHAR *) xmalloc (OUTBUF_SIZE);
760 outbuf.bufp = outbuf.buf;
761 outbuf.length = OUTBUF_SIZE;
763 /* Scan the -i files before the main input.
764 Much like #including them, but with no_output set
765 so that only their macro definitions matter. */
768 for (i = 1; i < argc; i++)
769 if (pend[i].type == PD_FILE)
771 int fd = open (pend[i].arg, O_RDONLY, 0666);
774 perror_with_name (pend[i].arg);
775 return FATAL_EXIT_CODE;
777 finclude (fd, pend[i].arg, &outbuf);
781 /* Pending directives no longer needed. */
784 /* Create an input stack level for the main input file
785 and copy the entire contents of the file into it. */
787 fp = &instack[++indepth];
789 /* JF check for stdin */
790 if (in_fname == NULL || *in_fname == 0) {
793 } else if ((f = open (in_fname, O_RDONLY, 0666)) < 0)
796 /* Either of two environment variables can specify output of deps.
797 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
798 where OUTPUT_FILE is the file to write deps info to
799 and DEPS_TARGET is the target to mention in the deps. */
802 && (getenv ("SUNPRO_DEPENDENCIES") != 0
803 || getenv ("DEPENDENCIES_OUTPUT") != 0))
805 char *spec = getenv ("DEPENDENCIES_OUTPUT");
811 spec = getenv ("SUNPRO_DEPENDENCIES");
817 /* Find the space before the DEPS_TARGET, if there is one. */
818 s = strchr (spec, ' ');
822 output_file = (char *) xmalloc (s - spec + 1);
823 memcpy (output_file, spec, s - spec);
824 output_file[s - spec] = 0;
832 deps_stream = fopen (output_file, "a");
833 if (deps_stream == 0)
834 pfatal_with_name (output_file);
836 /* If the -M option was used, output the deps to standard output. */
838 deps_stream = stdout;
840 /* For -M, print the expected object file name
841 as the target of this Make-rule. */
843 deps_allocated_size = 200;
844 deps_buffer = (char *) xmalloc (deps_allocated_size);
850 deps_output (deps_target, 0);
851 deps_output (":", 0);
852 } else if (*in_fname == 0)
853 deps_output ("-: ", 0);
856 const char *p = in_fname;
858 /* Discard all directory prefixes from P. */
864 /* Output P, but remove known suffixes. */
866 if (p[len - 2] == '.'
867 && (p[len - 1] == 'c' || p[len - 1] == 'C' || p[len - 1] == 'S'))
868 deps_output (p, len - 2);
869 else if (p[len - 3] == '.'
871 && p[len - 1] == 'c')
872 deps_output (p, len - 3);
875 /* Supply our own suffix. */
876 deps_output (".o : ", 0);
877 deps_output (in_fname, 0);
878 deps_output (" ", 0);
882 if (file_size_and_mode (f, &st_mode, &st_size))
884 fp->fname = in_fname;
886 /* JF all this is mine about reading pipes and ttys */
887 if (!S_ISREG (st_mode)) {
888 /* Read input from a file that is not a normal disk file.
889 We cannot preallocate a buffer with the correct size,
890 so we must read in the file a piece at the time and make it bigger. */
898 fp->buf = (U_CHAR *) xmalloc (bsize + 2);
901 cnt = read (f, bufp, bsize - size);
902 if (cnt < 0) goto sys_error; /* error! */
903 if (cnt == 0) break; /* End of file */
906 if (bsize == size) { /* Buffer is full! */
908 fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
909 bufp = fp->buf + size; /* May have moved */
914 /* Read a file whose size we can determine in advance.
915 For the sake of VMS, st_size is just an upper bound. */
918 fp->buf = (U_CHAR *) xmalloc (st_size + 2);
920 while (st_size > 0) {
921 i = read (f, fp->buf + fp->length, st_size);
931 fp->if_stack = if_stack;
933 /* Make sure data ends with a newline. And put a null after it. */
935 if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
936 fp->buf[fp->length++] = '\n';
937 fp->buf[fp->length] = '\0';
939 /* Now that we know the input file is valid, open the output. */
941 if (!out_fname || !strcmp (out_fname, ""))
942 out_fname = "stdout";
943 else if (! freopen (out_fname, "w", stdout))
944 pfatal_with_name (out_fname);
946 output_line_command (fp, &outbuf, 0, same_file);
948 /* Scan the input, processing macros and directives. */
952 /* Now we have processed the entire input
953 Write whichever kind of output has been requested. */
958 else if (! inhibit_output && deps_stream != stdout) {
959 if (write (fileno (stdout), outbuf.buf, outbuf.bufp - outbuf.buf) < 0)
960 fatal ("I/O error on output");
964 fputs (deps_buffer, deps_stream);
965 putc ('\n', deps_stream);
966 if (deps_stream != stdout) {
967 fclose (deps_stream);
968 if (ferror (deps_stream))
969 fatal ("I/O error on output");
974 fatal ("I/O error on output");
977 exit (FATAL_EXIT_CODE);
978 exit (SUCCESS_EXIT_CODE);
981 pfatal_with_name (in_fname);
984 /* Move all backslash-newline pairs out of embarrassing places.
985 Exchange all such pairs following BP
986 with any potentially-embarrasing characters that follow them.
987 Potentially-embarrassing characters are / and *
988 (because a backslash-newline inside a comment delimiter
989 would cause it not to be recognized). */
994 register U_CHAR *p = bp;
995 register int count = 0;
997 /* First count the backslash-newline pairs here. */
999 while (*p++ == '\\' && *p++ == '\n')
1004 /* Exit if what follows the backslash-newlines is not embarrassing. */
1006 if (count == 0 || (*p != '/' && *p != '*'))
1009 /* Copy all potentially embarrassing characters
1010 that follow the backslash-newline pairs
1011 down to where the pairs originally started. */
1013 while (*p == '*' || *p == '/')
1016 /* Now write the same number of pairs after the embarrassing chars. */
1017 while (count-- > 0) {
1023 /* Like newline_fix but for use within a directive-name.
1024 Move any backslash-newlines up past any following symbol constituents. */
1026 name_newline_fix (bp)
1029 register U_CHAR *p = bp;
1030 register int count = 0;
1032 /* First count the backslash-newline pairs here. */
1034 while (*p++ == '\\' && *p++ == '\n')
1039 /* What follows the backslash-newlines is not embarrassing. */
1041 if (count == 0 || !is_idchar (*p))
1044 /* Copy all potentially embarrassing characters
1045 that follow the backslash-newline pairs
1046 down to where the pairs originally started. */
1048 while (is_idchar (*p))
1051 /* Now write the same number of pairs after the embarrassing chars. */
1052 while (count-- > 0) {
1059 * The main loop of the program.
1061 * Read characters from the input stack, transferring them to the
1064 * Macros are expanded and push levels on the input stack.
1065 * At the end of such a level it is popped off and we keep reading.
1066 * At the end of any other kind of level, we return.
1067 * #-directives are handled, except within macros.
1069 * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input
1070 * and insert them when appropriate. This is set while scanning macro
1071 * arguments before substitution. It is zero when scanning for final output.
1072 * There are three types of Newline markers:
1073 * * Newline - follows a macro name that was not expanded
1074 * because it appeared inside an expansion of the same macro.
1075 * This marker prevents future expansion of that identifier.
1076 * When the input is rescanned into the final output, these are deleted.
1077 * These are also deleted by ## concatenation.
1078 * * Newline Space (or Newline and any other whitespace character)
1079 * stands for a place that tokens must be separated or whitespace
1080 * is otherwise desirable, but where the ANSI standard specifies there
1081 * is no whitespace. This marker turns into a Space (or whichever other
1082 * whitespace char appears in the marker) in the final output,
1083 * but it turns into nothing in an argument that is stringified with #.
1084 * Such stringified arguments are the only place where the ANSI standard
1085 * specifies with precision that whitespace may not appear.
1087 * During this function, IP->bufp is kept cached in IBP for speed of access.
1088 * Likewise, OP->bufp is kept in OBP. Before calling a subroutine
1089 * IBP, IP and OBP must be copied back to memory. IP and IBP are
1090 * copied back with the RECACHE macro. OBP must be copied back from OP->bufp
1091 * explicitly, and before RECACHE, since RECACHE uses OBP.
1095 rescan (op, output_marks)
1099 /* Character being scanned in main loop. */
1102 /* Length of pending accumulated identifier. */
1103 register int ident_length = 0;
1105 /* Hash code of pending accumulated identifier. */
1106 register int hash = 0;
1108 /* Current input level (&instack[indepth]). */
1111 /* Pointer for scanning input. */
1112 register U_CHAR *ibp;
1114 /* Pointer to end of input. End of scan is controlled by LIMIT. */
1115 register U_CHAR *limit;
1117 /* Pointer for storing output. */
1118 register U_CHAR *obp;
1120 /* REDO_CHAR is nonzero if we are processing an identifier
1121 after backing up over the terminating character.
1122 Sometimes we process an identifier without backing up over
1123 the terminating character, if the terminating character
1124 is not special. Backing up is done so that the terminating character
1125 will be dispatched on again once the identifier is dealt with. */
1128 /* 1 if within an identifier inside of which a concatenation
1129 marker (Newline -) has been seen. */
1130 int concatenated = 0;
1132 /* While scanning a comment or a string constant,
1133 this records the line it started on, for error messages. */
1136 /* Record position of last `real' newline. */
1137 U_CHAR *beg_of_line;
1139 /* Pop the innermost input stack level, assuming it is a macro expansion. */
1142 do { ip->macro->type = T_MACRO; \
1143 if (ip->free_ptr) free (ip->free_ptr); \
1144 --indepth; } while (0)
1146 /* Reload `rescan's local variables that describe the current
1147 level of the input stack. */
1150 do { ip = &instack[indepth]; \
1152 limit = ip->buf + ip->length; \
1154 check_expand (op, limit - ibp); \
1156 obp = op->bufp; } while (0)
1158 if (no_output && instack[indepth].fname != 0)
1159 skip_if_group (&instack[indepth], 1);
1165 /* Our caller must always put a null after the end of
1166 the input at each input stack level. */
1179 /* Always merge lines ending with backslash-newline,
1180 even in middle of identifier. */
1183 --obp; /* remove backslash from obuf */
1186 /* Otherwise, backslash suppresses specialness of following char,
1187 so copy it here to prevent the switch from seeing it.
1188 But first get any pending identifier processed. */
1189 if (ident_length > 0)
1195 /* If this is expanding a macro definition, don't recognize
1196 preprocessor directives. */
1202 /* # keyword: a # must be the first char on the line */
1203 if (beg_of_line == 0)
1205 if (beg_of_line + 1 != ibp)
1208 /* This # can start a directive. */
1210 --obp; /* Don't copy the '#' */
1214 if (! handle_directive (ip, op)) {
1218 /* Not a known directive: treat it as ordinary text.
1219 IP, OP, IBP, etc. have not been changed. */
1220 if (no_output && instack[indepth].fname) {
1221 /* If not generating expanded output,
1222 what we do with ordinary text is skip it.
1223 Discard everything until next # directive. */
1224 skip_if_group (&instack[indepth], 1);
1229 ++obp; /* Copy the '#' after all */
1235 /* A # directive has been successfully processed. */
1236 /* If not generating expanded output, ignore everything until
1237 next # directive. */
1238 if (no_output && instack[indepth].fname)
1239 skip_if_group (&instack[indepth], 1);
1245 case '\"': /* skip quoted string */
1247 /* A single quoted string is treated like a double -- some
1248 programs (e.g., troff) are perverse this way */
1253 start_line = ip->lineno;
1255 /* Skip ahead to a matching quote. */
1259 if (ip->macro != 0) {
1260 /* try harder: this string crosses a macro expansion boundary */
1272 /* Traditionally, end of line ends a string constant with no error.
1273 So exit the loop and record the new line. */
1281 /* Backslash newline is replaced by nothing at all,
1282 but keep the line counts correct. */
1287 /* ANSI stupidly requires that in \\ the second \
1288 is *not* prevented from combining with a newline. */
1289 while (*ibp == '\\' && ibp[1] == '\n') {
1308 if (*ibp == '\\' && ibp[1] == '\n')
1310 /* Don't look for comments inside a macro definition. */
1313 /* A comment constitutes white space, so it can terminate an identifier.
1314 Process the identifier, if any. */
1321 /* We have a comment. Skip it, optionally copying it to output. */
1323 start_line = ip->lineno;
1325 ++ibp; /* Skip the star. */
1327 /* In K+R C, a comment is equivalent to nothing. Note that we
1328 already output the slash; we might not want it. */
1329 if (! put_out_comments)
1335 U_CHAR *before_bp = ibp;
1337 while (ibp < limit) {
1340 if (warn_comments && ibp < limit && *ibp == '*')
1341 warning("`/*' within comment");
1344 if (*ibp == '\\' && ibp[1] == '\n')
1346 if (ibp >= limit || *ibp == '/')
1351 /* Copy the newline into the output buffer, in order to
1352 avoid the pain of a #line every time a multiline comment
1354 if (!put_out_comments)
1362 error_with_line (line_for_error (start_line),
1363 "unterminated comment");
1366 if (put_out_comments) {
1367 memcpy (obp, before_bp, ibp - before_bp);
1368 obp += ibp - before_bp;
1374 case '0': case '1': case '2': case '3': case '4':
1375 case '5': case '6': case '7': case '8': case '9':
1376 /* If digit is not part of identifier, it starts a number,
1377 which means that following letters are not an identifier.
1378 "0x5" does not refer to an identifier "x5".
1379 So copy all alphanumerics that follow without accumulating
1380 as an identifier. Periods also, for sake of "3.e7". */
1382 if (ident_length == 0) {
1383 while (ibp < limit) {
1384 while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
1389 if (!ISALNUM (c) && c != '.' && c != '_') {
1394 /* A sign can be part of a preprocessing number
1395 if it follows an e. */
1396 if (c == 'e' || c == 'E') {
1397 while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
1401 if (ibp < limit && (*ibp == '+' || *ibp == '-')) {
1403 /* Traditional C does not let the token go past the sign. */
1413 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
1414 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
1415 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
1416 case 's': case 't': case 'u': case 'v': case 'w': case 'x':
1418 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
1419 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
1420 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
1421 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
1424 /* Compute step of hash function, to avoid a proc call on every token */
1425 hash = HASHSTEP (hash, c);
1429 /* If reprocessing a macro expansion, newline is a special marker. */
1430 if (ip->macro != 0) {
1431 /* Newline White is a "funny space" to separate tokens that are
1432 supposed to be separate but without space between.
1433 Here White means any horizontal whitespace character.
1434 Newline - marks a recursive macro use that is not
1435 supposed to be expandable. */
1438 /* Newline - inhibits expansion of preceding token.
1439 If expanding a macro arg, we keep the newline -.
1440 In final output, it is deleted. */
1441 if (! concatenated) {
1446 if (!output_marks) {
1449 /* If expanding a macro arg, keep the newline -. */
1452 } else if (is_space (*ibp)) {
1453 /* Newline Space does not prevent expansion of preceding token
1454 so expand the preceding token and then come back. */
1455 if (ident_length > 0)
1458 /* If generating final output, newline space makes a space. */
1459 if (!output_marks) {
1461 /* And Newline Newline makes a newline, so count it. */
1462 if (obp[-1] == '\n')
1465 /* If expanding a macro arg, keep the newline space.
1466 If the arg gets stringified, newline space makes nothing. */
1469 } else abort (); /* Newline followed by something random? */
1473 /* If there is a pending identifier, handle it and come back here. */
1474 if (ident_length > 0)
1479 /* Update the line counts and output a #line if necessary. */
1482 if (ip->lineno != op->lineno) {
1484 output_line_command (ip, op, 1, same_file);
1485 check_expand (op, ip->length - (ip->bufp - ip->buf));
1490 /* Come here either after (1) a null character that is part of the input
1491 or (2) at the end of the input, because there is a null there. */
1494 /* Our input really contains a null character. */
1497 /* At end of a macro-expansion level, pop it and read next level. */
1498 if (ip->macro != 0) {
1501 /* If we have an identifier that ends here, process it now, so
1502 we get the right error for recursion. */
1503 if (ident_length && ! is_idchar (*instack[indepth - 1].bufp)) {
1512 /* If we don't have a pending identifier,
1513 return at end of input. */
1514 if (ident_length == 0) {
1522 /* If we do have a pending identifier, just consider this null
1523 a special character and arrange to dispatch on it again.
1524 The second time, IDENT_LENGTH will be zero so we will return. */
1530 /* Handle the case of a character such as /, ', " or null
1531 seen following an identifier. Back over it so that
1532 after the identifier is processed the special char
1533 will be dispatched on again. */
1543 if (ident_length > 0) {
1544 register HASHNODE *hp;
1546 /* We have just seen an identifier end. If it's a macro, expand it.
1548 IDENT_LENGTH is the length of the identifier
1549 and HASH is its hash code.
1551 The identifier has already been copied to the output,
1552 so if it is a macro we must remove it.
1554 If REDO_CHAR is 0, the char that terminated the identifier
1555 has been skipped in the output and the input.
1556 OBP-IDENT_LENGTH-1 points to the identifier.
1557 If the identifier is a macro, we must back over the terminator.
1559 If REDO_CHAR is 1, the terminating char has already been
1560 backed over. OBP-IDENT_LENGTH points to the identifier. */
1562 for (hp = hashtab[MAKE_POS (hash) % HASHSIZE]; hp != NULL;
1565 if (hp->length == ident_length) {
1566 U_CHAR *obufp_before_macroname;
1567 int op_lineno_before_macroname;
1568 register int i = ident_length;
1569 register U_CHAR *p = hp->name;
1570 register U_CHAR *q = obp - i;
1575 do { /* All this to avoid a strncmp () */
1580 /* We found a use of a macro name.
1581 see if the context shows it is a macro call. */
1583 /* Back up over terminating character if not already done. */
1589 obufp_before_macroname = obp - ident_length;
1590 op_lineno_before_macroname = op->lineno;
1592 /* If macro wants an arglist, verify that a '(' follows.
1593 first skip all whitespace, copying it to the output
1594 after the macro name. Then, if there is no '(',
1595 decide this is not a macro call and leave things that way. */
1596 if (hp->type == T_MACRO && hp->value.defn->nargs >= 0)
1599 /* Scan forward over whitespace, copying it to the output. */
1600 if (ibp == limit && ip->macro != 0) {
1604 /* A comment: copy it unchanged or discard it. */
1605 else if (*ibp == '/' && ibp+1 != limit && ibp[1] == '*') {
1606 if (put_out_comments) {
1611 while (ibp + 1 != limit
1612 && !(ibp[0] == '*' && ibp[1] == '/')) {
1613 /* We need not worry about newline-marks,
1614 since they are never found in comments. */
1616 /* Newline in a file. Count it. */
1620 if (put_out_comments)
1626 if (put_out_comments) {
1631 else if (is_space (*ibp)) {
1633 if (ibp[-1] == '\n') {
1634 if (ip->macro == 0) {
1635 /* Newline in a file. Count it. */
1638 } else if (!output_marks) {
1639 /* A newline mark, and we don't want marks
1640 in the output. If it is newline-hyphen,
1641 discard it entirely. Otherwise, it is
1642 newline-whitechar, so keep the whitechar. */
1652 /* A newline mark; copy both chars to the output. */
1663 /* This is now known to be a macro call.
1664 Discard the macro name from the output,
1665 along with any following whitespace just copied. */
1666 obp = obufp_before_macroname;
1667 op->lineno = op_lineno_before_macroname;
1669 /* Expand the macro, reading arguments as needed,
1670 and push the expansion on the input stack. */
1673 macroexpand (hp, op);
1675 /* Reexamine input stack, since macroexpand has pushed
1676 a new level on it. */
1683 } /* End hash-table-search loop */
1684 ident_length = hash = 0; /* Stop collecting identifier */
1687 } /* End if (ident_length > 0) */
1689 } /* End per-char loop */
1691 /* Come here to return -- but first give an error message
1692 if there was an unterminated successful conditional. */
1694 if (if_stack != ip->if_stack) {
1696 switch (if_stack->type) {
1715 error_with_line (line_for_error (if_stack->lineno),
1716 "unterminated #%s conditional", str);
1718 if_stack = ip->if_stack;
1722 * Rescan a string into a temporary buffer and return the result
1723 * as a FILE_BUF. Note this function returns a struct, not a pointer.
1725 * OUTPUT_MARKS nonzero means keep Newline markers found in the input
1726 * and insert such markers when appropriate. See `rescan' for details.
1727 * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
1728 * before substitution; it is 0 for other uses.
1731 expand_to_temp_buffer (buf, limit, output_marks)
1732 const U_CHAR *buf, *limit;
1735 register FILE_BUF *ip;
1737 int length = limit - buf;
1739 int odepth = indepth;
1744 /* Set up the input on the input stack. */
1746 buf1 = (U_CHAR *) alloca (length + 1);
1748 register const U_CHAR *p1 = buf;
1749 register U_CHAR *p2 = buf1;
1756 /* Set up to receive the output. */
1758 obuf.length = length * 2 + 100; /* Usually enough. Why be stingy? */
1759 obuf.bufp = obuf.buf = (U_CHAR *) xmalloc (obuf.length);
1764 CHECK_DEPTH ({return obuf;});
1768 ip = &instack[indepth];
1772 ip->length = length;
1773 ip->buf = ip->bufp = buf1;
1774 ip->if_stack = if_stack;
1776 ip->lineno = obuf.lineno = 1;
1778 /* Scan the input, create the output. */
1780 rescan (&obuf, output_marks);
1782 /* Pop input stack to original state. */
1785 if (indepth != odepth)
1788 /* Record the output. */
1789 obuf.length = obuf.bufp - obuf.buf;
1795 * Process a # directive. Expects IP->bufp to point to the '#', as in
1796 * `#define foo bar'. Passes to the command handler
1797 * (do_define, do_include, etc.): the addresses of the 1st and
1798 * last chars of the command (starting immediately after the #
1799 * keyword), plus op and the keyword table pointer. If the command
1800 * contains comments it is copied into a temporary buffer sans comments
1801 * and the temporary buffer is passed to the command handler instead.
1802 * Likewise for backslash-newlines.
1804 * Returns nonzero if this was a known # directive.
1805 * Otherwise, returns zero, without advancing the input pointer.
1809 handle_directive (ip, op)
1812 register U_CHAR *bp, *cp;
1813 register struct directive *kt;
1814 register int ident_length;
1817 /* Nonzero means we must copy the entire command
1818 to get rid of comments or backslash-newlines. */
1819 int copy_command = 0;
1821 U_CHAR *ident, *after_ident;
1824 /* Skip whitespace and \-newline. */
1826 if (is_nvspace (*bp))
1828 else if (*bp == '/' && (newline_fix (bp + 1), bp[1]) == '*') {
1830 skip_to_end_of_comment (ip, &ip->lineno);
1832 } else if (*bp == '\\' && bp[1] == '\n') {
1833 bp += 2; ip->lineno++;
1837 /* Now find end of directive name.
1838 If we encounter a backslash-newline, exchange it with any following
1839 symbol-constituents so that we end up with a contiguous name. */
1843 if (is_idchar (*cp))
1846 if (*cp == '\\' && cp[1] == '\n')
1847 name_newline_fix (cp);
1848 if (is_idchar (*cp))
1853 ident_length = cp - bp;
1857 /* A line of just `#' becomes blank. */
1859 if (ident_length == 0 && *after_ident == '\n') {
1860 ip->bufp = after_ident;
1865 * Decode the keyword and call the appropriate expansion
1866 * routine, after moving the input pointer up to the next line.
1868 for (kt = directive_table; kt->length > 0; kt++) {
1869 if (kt->length == ident_length
1870 && !strncmp (kt->name, (const char *)ident, ident_length)) {
1871 register U_CHAR *buf;
1872 register U_CHAR *limit = ip->buf + ip->length;
1873 int unterminated = 0;
1875 /* Nonzero means do not delete comments within the directive.
1876 #define needs this to detect traditional token paste. */
1877 int keep_comments = kt->type == T_DEFINE;
1879 /* Find the end of this command (first newline not backslashed
1880 and not in a string or comment).
1881 Set COPY_COMMAND if the command must be copied
1882 (it contains a backslash-newline or a comment). */
1884 buf = bp = after_ident;
1885 while (bp < limit) {
1886 register U_CHAR c = *bp++;
1900 bp = skip_quoted_string (bp - 1, limit, ip->lineno, &ip->lineno, ©_command, &unterminated);
1902 /* Traditional preprocessing permits unterminated strings. */
1908 /* <...> is special for #include. */
1910 if (kt->type != T_INCLUDE)
1912 while (*bp && *bp != '>') bp++;
1916 if (*bp == '\\' && bp[1] == '\n')
1919 U_CHAR *obp = bp - 1;
1921 skip_to_end_of_comment (ip, &ip->lineno);
1923 /* No need to copy the command because of a comment at the end;
1924 just don't include the comment in the directive. */
1925 if (bp == limit || *bp == '\n') {
1929 /* Don't remove the comments if this is #define. */
1930 if (! keep_comments)
1936 --bp; /* Point to the newline */
1944 resume_p = ip->bufp;
1945 /* BP is the end of the directive.
1946 RESUME_P is the next interesting data after the directive.
1947 A comment may come between. */
1950 register U_CHAR *xp = buf;
1951 /* Need to copy entire command into temp buffer before dispatching */
1953 cp = (U_CHAR *) alloca (bp - buf + 5); /* room for cmd plus
1957 /* Copy to the new buffer, deleting comments
1958 and backslash-newlines (and whitespace surrounding the latter). */
1961 register U_CHAR c = *xp++;
1968 /* <...> is special for #include. */
1970 if (kt->type != T_INCLUDE)
1972 while (xp < bp && c != '>') {
1974 if (c == '\\' && xp < bp && *xp == '\n')
1985 if (cp != buf && is_space (cp[-1])) {
1986 while (cp != buf && is_space(cp[-1])) cp--;
1988 SKIP_WHITE_SPACE (xp);
1989 } else if (is_space (*xp)) {
1991 SKIP_WHITE_SPACE (xp);
2001 register const U_CHAR *bp1
2002 = skip_quoted_string (xp - 1, limit, ip->lineno, 0, 0, 0);
2011 skip_to_end_of_comment (ip, 0);
2013 while (xp != ip->bufp)
2015 /* Delete the slash. */
2023 /* Null-terminate the copy. */
2030 ip->bufp = resume_p;
2032 /* Call the appropriate command handler. buf now points to
2033 either the appropriate place in the input buffer, or to
2034 the temp buffer if it was necessary to make one. cp
2035 points to the first char after the contents of the (possibly
2036 copied) command, in either case. */
2037 (*kt->func) (buf, cp, op);
2038 check_expand (op, ip->length - (ip->bufp - ip->buf));
2047 static const char *const
2048 monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
2049 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
2052 * expand things like __FILE__. Place the expansion into the output
2053 * buffer *without* rescanning.
2056 special_symbol (hp, op)
2064 FILE_BUF *ip = NULL;
2065 static struct tm *timebuf = NULL;
2067 int paren = 0; /* For special `defined' keyword */
2069 for (i = indepth; i >= 0; i--)
2070 if (instack[i].fname != NULL) {
2075 fatal ("not in any file?!");
2082 if (hp->type == T_FILE)
2085 string = instack[0].fname;
2089 char *tmp = (char *) alloca (3 + strlen (string));
2090 sprintf (tmp, "\"%s\"", string);
2099 case T_INCLUDE_LEVEL:
2101 char *tmp = (char *) alloca (8); /* Eigth bytes ought to be more than enough */
2103 for (i = indepth; i >= 0; i--)
2104 if (instack[i].fname != NULL)
2107 sprintf (tmp, "%d", true_indepth - 1);
2114 char *tmp = (char *) alloca (3 + strlen (version_string));
2115 sprintf (tmp, "\"%s\"", version_string);
2121 buf = hp->value.cpval;
2126 char *tmp = (char *) alloca (10);
2127 sprintf (tmp, "%d", ip->lineno);
2135 char *tmp = (char *) alloca (20);
2137 if (timebuf == NULL) {
2139 timebuf = localtime (&t);
2141 if (hp->type == T_DATE)
2142 sprintf (tmp, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
2143 timebuf->tm_mday, timebuf->tm_year + 1900);
2145 sprintf (tmp, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
2151 case T_SPEC_DEFINED:
2152 buf = " 0 "; /* Assume symbol is not defined */
2153 ip = &instack[indepth];
2154 SKIP_WHITE_SPACE (ip->bufp);
2155 if (*ip->bufp == '(') {
2157 ip->bufp++; /* Skip over the paren */
2158 SKIP_WHITE_SPACE (ip->bufp);
2161 if (!is_idstart (*ip->bufp))
2163 if (lookup (ip->bufp, -1, -1))
2165 while (is_idchar (*ip->bufp))
2167 SKIP_WHITE_SPACE (ip->bufp);
2169 if (*ip->bufp != ')')
2177 error ("`defined' must be followed by ident or (ident)");
2181 error ("cccp error: invalid special hash type"); /* time for gdb */
2185 check_expand (op, len);
2186 memcpy (op->bufp, buf, len);
2191 /* Routines to handle #directives */
2194 * Process include file by reading it in and calling rescan.
2195 * Expects to see "fname" or <fname> on the input.
2198 do_include (buf, limit, op)
2199 U_CHAR *buf, *limit;
2202 char *fname; /* Dynamically allocated fname buffer */
2203 U_CHAR *fbeg, *fend; /* Beginning and end of fname */
2205 struct file_name_list *stackp = include; /* Chain of dirs to search */
2206 struct file_name_list dsp[1]; /* First in chain, if #include "..." */
2209 int f; /* file number */
2211 int retried = 0; /* Have already tried macro
2212 expanding the include line*/
2213 FILE_BUF trybuf; /* It got expanded into here */
2214 int system_header_p = 0; /* 0 for "...", 1 for <...> */
2216 f= -1; /* JF we iz paranoid! */
2221 SKIP_WHITE_SPACE (fbeg);
2222 /* Discard trailing whitespace so we can easily see
2223 if we have parsed all the significant chars we were given. */
2224 while (limit != fbeg && is_nvspace (limit[-1])) limit--;
2229 while (fend != limit && *fend != '\"')
2231 if (*fend == '\"' && fend + 1 == limit) {
2234 /* We have "filename". Figure out directory this source
2235 file is coming from and put it on the front of the list. */
2237 /* If -I- was specified, don't search current dir, only spec'd ones. */
2238 if (ignore_srcdir) break;
2240 for (fp = &instack[indepth]; fp >= instack; fp--)
2243 const char *ep, *nam;
2245 if ((nam = fp->fname) != NULL) {
2246 /* Found a named file. Figure out dir of the file,
2247 and put it in front of the search list. */
2248 dsp[0].next = stackp;
2250 ep = strrchr (nam, '/');
2254 f = (char *) alloca (n + 1);
2255 strncpy (f, nam, n);
2258 if (n > max_include_len) max_include_len = n;
2260 dsp[0].fname = 0; /* Current directory */
2271 while (fend != limit && *fend != '>') fend++;
2272 if (*fend == '>' && fend + 1 == limit) {
2273 system_header_p = 1;
2274 /* If -I-, start with the first -I dir after the -I-. */
2275 if (first_bracket_include)
2276 stackp = first_bracket_include;
2284 error ("#include expects \"fname\" or <fname>");
2287 trybuf = expand_to_temp_buffer (buf, limit, 0);
2288 buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
2289 memcpy (buf, trybuf.buf, trybuf.bufp - trybuf.buf);
2290 limit = buf + (trybuf.bufp - trybuf.buf);
2298 fname = (char *) alloca (max_include_len + flen + 2);
2299 /* + 2 above for slash and terminating null. */
2301 /* If specified file name is absolute, just open it. */
2304 strncpy (fname, (const char *)fbeg, flen);
2306 f = open (fname, O_RDONLY, 0666);
2308 /* Search directory path, trying to open the file.
2309 Copy each filename tried into FNAME. */
2311 for (; stackp; stackp = stackp->next) {
2312 if (stackp->fname) {
2313 strcpy (fname, stackp->fname);
2314 strcat (fname, "/");
2315 fname[strlen (fname) + flen] = 0;
2319 strncat (fname, (const char *)fbeg, flen);
2320 if ((f = open (fname, O_RDONLY, 0666)) >= 0)
2326 strncpy (fname, (const char *)fbeg, flen);
2328 error_from_errno (fname);
2330 /* For -M, add this file to the dependencies. */
2331 if (print_deps > (system_header_p || (system_include_depth > 0))) {
2332 if (system_header_p)
2333 warning ("nonexistent file <%.*s> omitted from dependency output",
2337 deps_output ((const char *)fbeg, flen);
2338 deps_output (" ", 0);
2343 /* Check to see if this include file is a once-only include file.
2346 struct file_name_list* ptr;
2348 for (ptr = dont_repeat_files; ptr; ptr = ptr->next) {
2349 if (!strcmp (ptr->fname, fname)) {
2351 return; /* This file was once'd. */
2355 for (ptr = all_include_files; ptr; ptr = ptr->next) {
2356 if (!strcmp (ptr->fname, fname))
2357 break; /* This file was included before. */
2361 /* This is the first time for this file. */
2362 /* Add it to list of files included. */
2364 ptr = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
2365 ptr->next = all_include_files;
2366 all_include_files = ptr;
2367 ptr->fname = xstrdup (fname);
2369 /* For -M, add this file to the dependencies. */
2370 if (print_deps > (system_header_p || (system_include_depth > 0))) {
2371 deps_output (fname, strlen (fname));
2372 deps_output (" ", 0);
2376 if (system_header_p)
2377 system_include_depth++;
2379 /* Actually process the file. */
2380 finclude (f, fname, op);
2382 if (system_header_p)
2383 system_include_depth--;
2389 /* Process the contents of include file FNAME, already open on descriptor F,
2390 with output to OP. */
2393 finclude (f, fname, op)
2401 FILE_BUF *fp; /* For input stack frame */
2403 CHECK_DEPTH (return;);
2405 if (file_size_and_mode (f, &st_mode, &st_size))
2408 fp = &instack[indepth + 1];
2409 memset (fp, 0, sizeof (FILE_BUF));
2413 fp->if_stack = if_stack;
2415 if (S_ISREG (st_mode)) {
2416 fp->buf = (U_CHAR *) xmalloc (st_size + 2);
2419 /* Read the file contents, knowing that st_size is an upper bound
2420 on the number of bytes we can read. */
2421 while (st_size > 0) {
2422 i = read (f, fp->buf + fp->length, st_size);
2432 /* Cannot count its file size before reading. */
2439 basep = (U_CHAR *) xmalloc (bsize + 2);
2443 i = read (f, bufp, bsize - st_size);
2445 goto nope; /* error! */
2447 break; /* End of file */
2450 if (bsize == st_size) { /* Buffer is full! */
2452 basep = (U_CHAR *) xrealloc (basep, bsize + 2);
2453 bufp = basep + st_size; /* May have moved */
2458 fp->length = st_size;
2462 /* Make sure data ends with a newline. And put a null after it. */
2464 if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
2465 fp->buf[fp->length++] = '\n';
2466 fp->buf[fp->length] = '\0';
2469 output_line_command (fp, op, 0, enter_file);
2472 output_line_command (&instack[indepth], op, 0, leave_file);
2477 perror_with_name (fname);
2482 /* Process a #define command.
2483 BUF points to the contents of the #define command, as a continguous string.
2484 LIMIT points to the first character past the end of the definition.
2485 KEYWORD is the keyword-table entry for #define. */
2488 do_define (buf, limit, op)
2489 U_CHAR *buf, *limit;
2490 FILE_BUF *op ATTRIBUTE_UNUSED;
2492 U_CHAR *bp; /* temp ptr into input buffer */
2493 U_CHAR *symname; /* remember where symbol name starts */
2494 int sym_length; /* and how long it is */
2497 int arglengths = 0; /* Accumulate lengths of arg names
2498 plus number of args. */
2503 while (is_nvspace (*bp))
2506 symname = bp; /* remember where it starts */
2507 while (is_idchar (*bp) && bp < limit) {
2510 sym_length = bp - symname;
2511 if (sym_length == 0)
2512 error ("invalid macro name");
2513 else if (!is_idstart (*symname)) {
2514 U_CHAR *msg; /* what pain... */
2515 msg = (U_CHAR *) alloca (sym_length + 1);
2516 memcpy (msg, symname, sym_length);
2517 msg[sym_length] = 0;
2518 error ("invalid macro name `%s'", msg);
2520 if (! strncmp ((const char *)symname, "defined", 7) && sym_length == 7)
2521 error ("defining `defined' as a macro");
2524 /* lossage will occur if identifiers or control keywords are broken
2525 across lines using backslash. This is not the right place to take
2529 struct arglist *arg_ptrs = NULL;
2532 bp++; /* skip '(' */
2533 SKIP_WHITE_SPACE (bp);
2535 /* Loop over macro argument names. */
2536 while (*bp != ')') {
2537 struct arglist *temp;
2539 temp = (struct arglist *) alloca (sizeof (struct arglist));
2541 temp->next = arg_ptrs;
2542 temp->argno = argno++;
2545 if (!is_idstart (*bp))
2546 warning ("parameter name starts with a digit in #define");
2548 /* Find the end of the arg name. */
2549 while (is_idchar (*bp)) {
2552 temp->length = bp - temp->name;
2553 arglengths += temp->length + 2;
2554 SKIP_WHITE_SPACE (bp);
2555 if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
2556 error ("badly punctuated parameter list in #define");
2561 SKIP_WHITE_SPACE (bp);
2564 error ("unterminated parameter list in #define");
2569 ++bp; /* skip paren */
2570 while (is_nvspace (*bp)) /* and leading whitespace */
2572 /* now everything from bp before limit is the definition. */
2573 defn = collect_expansion (bp, limit, argno, arg_ptrs);
2575 /* Now set defn->argnames to the result of concatenating
2576 the argument names in reverse order
2577 with comma-space between them. */
2579 struct arglist *temp;
2581 U_CHAR *tmp = (U_CHAR *) xmalloc (arglengths + 1);
2583 for (temp = arg_ptrs; temp; temp = temp->next) {
2584 memcpy (&tmp[i], temp->name, temp->length);
2586 if (temp->next != 0) {
2592 defn->argnames = tmp;
2596 /* simple expansion or empty definition; skip leading whitespace */
2597 while (is_nvspace (*bp))
2599 /* now everything from bp before limit is the definition. */
2600 defn = collect_expansion (bp, limit, -1, 0);
2601 defn->argnames = (const U_CHAR *) "";
2604 hashcode = hashf (symname, sym_length, HASHSIZE);
2608 if ((hp = lookup (symname, sym_length, hashcode)) == NULL)
2609 hp = install (symname, sym_length, T_MACRO, hashcode);
2611 if (hp->type != T_MACRO || compare_defs (defn, hp->value.defn))
2612 warning ("\"%.*s\" redefined", sym_length, symname);
2614 /* Replace the old definition. */
2618 hp->value.defn = defn;
2623 * return zero if two DEFINITIONs are isomorphic
2626 compare_defs (d1, d2)
2627 DEFINITION *d1, *d2;
2629 register struct reflist *a1, *a2;
2630 register U_CHAR *p1 = d1->expansion;
2631 register U_CHAR *p2 = d2->expansion;
2634 if (d1->nargs != d2->nargs)
2636 if (strcmp ((const char *)d1->argnames, (const char *)d2->argnames))
2638 for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
2639 a1 = a1->next, a2 = a2->next) {
2640 if (!((a1->nchars == a2->nchars
2641 && ! strncmp ((const char *)p1, (const char *)p2, a1->nchars))
2642 || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
2643 || a1->argno != a2->argno
2644 || a1->stringify != a2->stringify
2645 || a1->raw_before != a2->raw_before
2646 || a1->raw_after != a2->raw_after)
2654 if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
2655 p2, d2->length - (p2 - d2->expansion), 1))
2660 /* Return 1 if two parts of two macro definitions are effectively different.
2661 One of the parts starts at BEG1 and has LEN1 chars;
2662 the other has LEN2 chars at BEG2.
2663 Any sequence of whitespace matches any other sequence of whitespace.
2664 FIRST means these parts are the first of a macro definition;
2665 so ignore leading whitespace entirely.
2666 LAST means these parts are the last of a macro definition;
2667 so ignore trailing whitespace entirely. */
2669 comp_def_part (first, beg1, len1, beg2, len2, last)
2671 const U_CHAR *beg1, *beg2;
2675 register const U_CHAR *end1 = beg1 + len1;
2676 register const U_CHAR *end2 = beg2 + len2;
2678 while (beg1 != end1 && is_space (*beg1)) beg1++;
2679 while (beg2 != end2 && is_space (*beg2)) beg2++;
2682 while (beg1 != end1 && is_space (end1[-1])) end1--;
2683 while (beg2 != end2 && is_space (end2[-1])) end2--;
2685 while (beg1 != end1 && beg2 != end2) {
2686 if (is_space (*beg1) && is_space (*beg2)) {
2687 while (beg1 != end1 && is_space (*beg1)) beg1++;
2688 while (beg2 != end2 && is_space (*beg2)) beg2++;
2689 } else if (*beg1 == *beg2) {
2693 return (beg1 != end1) || (beg2 != end2);
2696 /* Read a replacement list for a macro with parameters.
2697 Build the DEFINITION structure.
2698 Reads characters of text starting at BUF until LIMIT.
2699 ARGLIST specifies the formal parameters to look for
2700 in the text of the definition; NARGS is the number of args
2701 in that list, or -1 for a macro name that wants no argument list.
2702 MACRONAME is the macro name itself (so we can avoid recursive expansion)
2703 and NAMELEN is its length in characters.
2705 Note that comments and backslash-newlines have already been deleted
2706 from the argument. */
2708 /* Leading and trailing Space, Tab, etc. are converted to markers
2709 Newline Space, Newline Tab, etc.
2710 Newline Space makes a space in the final output
2711 but is discarded if stringified. (Newline Tab is similar but
2712 makes a Tab instead.)
2714 If there is no trailing whitespace, a Newline Space is added at the end
2715 to prevent concatenation that would be contrary to the standard. */
2718 collect_expansion (buf, end, nargs, arglist)
2721 struct arglist *arglist;
2724 register U_CHAR *p, *limit, *lastp, *exp_p;
2725 struct reflist *endpat = NULL;
2726 /* Pointer to first nonspace after last ## seen. */
2728 /* Pointer to first nonspace after last single-# seen. */
2729 U_CHAR *stringify = 0;
2731 int expected_delimiter = '\0';
2733 /* Scan thru the replacement list, ignoring comments and quoted
2734 strings, picking up on the macro calls. It does a linear search
2735 thru the arg list on every potential symbol. Profiling might say
2736 that something smarter should happen. */
2741 /* Find the beginning of the trailing whitespace. */
2742 /* Find end of leading whitespace. */
2745 while (p < limit && is_space (limit[-1])) limit--;
2746 while (p < limit && is_space (*p)) p++;
2748 /* Allocate space for the text in the macro definition.
2749 Leading and trailing whitespace chars need 2 bytes each.
2750 Each other input char may or may not need 1 byte,
2751 so this is an upper bound.
2752 The extra 2 are for invented trailing newline-marker and final null. */
2753 maxsize = (sizeof (DEFINITION)
2754 + 2 * (end - limit) + 2 * (p - buf)
2756 defn = (DEFINITION *) xcalloc (1, maxsize);
2758 defn->nargs = nargs;
2759 exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
2764 /* Convert leading whitespace to Newline-markers. */
2765 while (p < limit && is_space (*p)) {
2770 /* Process the main body of the definition. */
2772 int skipped_arg = 0;
2773 register U_CHAR c = *p++;
2777 /* In -traditional mode, recognize arguments inside strings and
2778 and character constants, and ignore special properties of #.
2779 Arguments inside strings are considered "stringified", but no
2780 extra quote marks are supplied. */
2784 if (expected_delimiter != '\0') {
2785 if (c == expected_delimiter)
2786 expected_delimiter = '\0';
2788 expected_delimiter = c;
2792 /* Backslash quotes delimiters and itself, but not macro args. */
2793 if (expected_delimiter != 0 && p < limit
2794 && (*p == expected_delimiter || *p == '\\')) {
2801 if (expected_delimiter != '\0') /* No comments inside strings. */
2804 /* If we find a comment that wasn't removed by handle_directive,
2805 this must be -traditional. So replace the comment with
2809 while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
2815 if (is_idchar (c) && nargs > 0) {
2816 U_CHAR *id_beg = p - 1;
2820 while (p != limit && is_idchar (*p)) p++;
2821 id_len = p - id_beg;
2823 if (is_idstart (c)) {
2824 register struct arglist *arg;
2826 for (arg = arglist; arg != NULL; arg = arg->next) {
2827 struct reflist *tpat;
2829 if (arg->name[0] == c
2830 && arg->length == id_len
2831 && strncmp ((const char *)arg->name,
2832 (const char *)id_beg, id_len) == 0) {
2833 /* make a pat node for this arg and append it to the end of
2835 tpat = (struct reflist *) xmalloc (sizeof (struct reflist));
2837 tpat->raw_before = concat == id_beg;
2838 tpat->raw_after = 0;
2839 tpat->stringify = expected_delimiter != '\0';
2842 defn->pattern = tpat;
2844 endpat->next = tpat;
2847 tpat->argno = arg->argno;
2848 tpat->nchars = exp_p - lastp;
2850 register U_CHAR *p1 = p;
2851 SKIP_WHITE_SPACE (p1);
2852 if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
2853 tpat->raw_after = 1;
2855 lastp = exp_p; /* place to start copying from next time */
2862 /* If this was not a macro arg, copy it into the expansion. */
2863 if (! skipped_arg) {
2864 register U_CHAR *lim1 = p;
2868 if (stringify == id_beg)
2869 error ("# operator should be followed by a macro argument name");
2875 /* Convert trailing whitespace to Newline-markers. */
2876 while (limit < end && is_space (*limit)) {
2878 *exp_p++ = *limit++;
2883 defn->length = exp_p - defn->expansion;
2885 /* Crash now if we overrun the allocated size. */
2886 if (defn->length + 1 > maxsize)
2893 * interpret #line command. Remembers previously seen fnames
2894 * in its very own hash table.
2896 #define FNAME_HASHSIZE 37
2898 do_line (buf, limit, op)
2899 U_CHAR *buf, *limit;
2902 register U_CHAR *bp;
2903 FILE_BUF *ip = &instack[indepth];
2906 enum file_change_code file_change = same_file;
2908 /* Expand any macros. */
2909 tem = expand_to_temp_buffer (buf, limit, 0);
2911 /* Point to macroexpanded line, which is null-terminated now. */
2913 SKIP_WHITE_SPACE (bp);
2915 if (!ISDIGIT (*bp)) {
2916 error ("invalid format #line command");
2920 /* The Newline at the end of this line remains to be processed.
2921 To put the next line at the specified line number,
2922 we must store a line number now that is one less. */
2923 new_lineno = atoi ((const char *)bp) - 1;
2925 /* skip over the line number. */
2926 while (ISDIGIT (*bp))
2929 #if 0 /* #line 10"foo.c" is supposed to be allowed. */
2930 if (*bp && !is_space (*bp)) {
2931 error ("invalid format #line command");
2936 SKIP_WHITE_SPACE (bp);
2939 static HASHNODE *fname_table[FNAME_HASHSIZE];
2940 HASHNODE *hp, **hash_bucket;
2946 while (*bp && *bp != '\"')
2949 error ("invalid format #line command");
2953 fname_length = bp - fname;
2956 SKIP_WHITE_SPACE (bp);
2959 file_change = enter_file;
2960 else if (*bp == '2')
2961 file_change = leave_file;
2963 error ("invalid format #line command");
2968 SKIP_WHITE_SPACE (bp);
2970 error ("invalid format #line command");
2976 &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)];
2977 for (hp = *hash_bucket; hp != NULL; hp = hp->next)
2978 if (hp->length == fname_length &&
2979 strncmp (hp->value.cpval, (const char *)fname, fname_length) == 0) {
2980 ip->fname = hp->value.cpval;
2985 /* Didn't find it; cons up a new one. */
2986 hp = (HASHNODE *) xcalloc (1, sizeof (HASHNODE) + fname_length + 1);
2987 hp->next = *hash_bucket;
2990 hp->length = fname_length;
2991 ip->fname = hp->value.cpval = q = ((char *) hp) + sizeof (HASHNODE);
2992 memcpy (q, fname, fname_length);
2995 error ("invalid format #line command");
2999 ip->lineno = new_lineno;
3000 output_line_command (ip, op, 0, file_change);
3001 check_expand (op, ip->length - (ip->bufp - ip->buf));
3005 * remove all definitions of symbol from symbol table.
3006 * according to un*x /lib/cpp, it is not an error to undef
3007 * something that has no definitions, so it isn't one here either.
3010 do_undef (buf, limit, op)
3012 U_CHAR *limit ATTRIBUTE_UNUSED;
3013 FILE_BUF *op ATTRIBUTE_UNUSED;
3017 SKIP_WHITE_SPACE (buf);
3019 if (! strncmp ((const char *)buf, "defined", 7) && ! is_idchar (buf[7]))
3020 warning ("undefining `defined'");
3022 while ((hp = lookup (buf, -1, -1)) != NULL) {
3023 if (hp->type != T_MACRO)
3024 warning ("undefining `%s'", hp->name);
3029 /* Read the tokens of the answer into the macro pool. Only commit the
3030 memory if we intend it as permanent storage, i.e. the #assert case.
3031 Returns 0 on success. */
3034 parse_answer (buf, limit, answerp, type)
3035 const unsigned char *buf, *limit;
3036 struct answer **answerp;
3039 const unsigned char *start;
3041 /* Skip leading whitespace. */
3042 if (buf < limit && *buf == ' ')
3045 /* Parentheses are optional here. */
3046 if (buf == limit && type == T_UNASSERT)
3049 if (buf == limit || *buf++ != '(')
3054 error ("missing '(' after predicate");
3058 /* Drop whitespace at start. */
3059 while (buf < limit && *buf == ' ')
3063 while (buf < limit && *buf != ')')
3068 error ("missing ')' to complete answer");
3074 error ("predicate's answer is empty");
3078 if ((type == T_ASSERT || type == T_UNASSERT) && buf + 1 != limit)
3080 error ("extra text at end of directive");
3084 /* Lose trailing whitespace. */
3088 *answerp = (struct answer *) xmalloc (sizeof (struct answer));
3089 (*answerp)->answer = start;
3090 (*answerp)->len = buf - start;
3095 /* Parses an assertion, returning a pointer to the hash node of the
3096 predicate, or 0 on error. If an answer was supplied, it is placed
3097 in ANSWERP, otherwise it is set to 0. */
3099 parse_assertion (buf, limit, answerp, type)
3100 const unsigned char *buf, *limit;
3101 struct answer **answerp;
3104 HASHNODE *result = 0;
3105 const unsigned char *climit;
3106 unsigned char *bp, *symname = canonicalize_text (buf, limit, &climit);
3110 if (bp < climit && is_idstart (*bp))
3114 while (bp < climit && is_idchar (*bp));
3121 if (symname == climit)
3122 error ("assertion without predicate");
3124 error ("predicate must be an identifier");
3126 /* Unfortunately, because of the way we handle #if, we don't avoid
3127 macro expansion in answers. This is not easy to fix. */
3128 else if (parse_answer (bp, climit, answerp, type) == 0)
3130 unsigned char *sym = alloca (len + 1);
3133 /* Prefix '#' to get it out of macro namespace. */
3135 memcpy (sym + 1, symname, len);
3137 hashcode = hashf (sym, len + 1, HASHSIZE);
3138 result = lookup (sym, len + 1, hashcode);
3140 result = install (sym, len + 1, T_UNUSED, hashcode);
3146 /* Test an assertion within a preprocessor conditional. Returns zero
3147 on error or failure, one on success. */
3149 test_assertion (pbuf)
3150 unsigned char **pbuf; /* NUL-terminated. */
3152 unsigned char *buf = *pbuf;
3153 unsigned char *limit = buf + strlen ((char *) buf);
3154 struct answer *answer;
3158 node = parse_assertion (buf, limit, &answer, T_IF);
3161 result = (node->type == T_ASSERT &&
3162 (answer == 0 || *find_answer (node, answer) != 0));
3164 /* Yuk. We update pbuf to point after the assertion test.
3165 First, move past the identifier. */
3166 if (is_space (*buf))
3168 while (is_idchar (*buf))
3170 /* If we have an answer, we need to move past the parentheses. */
3172 while (*buf++ != ')')
3180 /* Handle a #error directive. */
3182 do_error (buf, limit, op)
3185 FILE_BUF *op ATTRIBUTE_UNUSED;
3187 error ("#error%.*s", limit - buf, buf);
3190 /* Handle a #assert directive. */
3192 do_assert (buf, limit, op)
3195 FILE_BUF *op ATTRIBUTE_UNUSED;
3197 struct answer *new_answer;
3200 node = parse_assertion (buf, limit, &new_answer, T_ASSERT);
3203 /* Place the new answer in the answer list. First check there
3204 is not a duplicate. */
3205 new_answer->next = 0;
3206 if (node->type == T_ASSERT)
3208 if (*find_answer (node, new_answer))
3211 warning ("\"%s\" re-asserted", node->name + 1);
3214 new_answer->next = node->value.answers;
3216 node->type = T_ASSERT;
3217 node->value.answers = new_answer;
3221 /* Function body to be provided later. */
3223 do_unassert (buf, limit, op)
3226 FILE_BUF *op ATTRIBUTE_UNUSED;
3229 struct answer *answer;
3231 node = parse_assertion (buf, limit, &answer, T_UNASSERT);
3232 /* It isn't an error to #unassert something that isn't asserted. */
3235 if (node->type == T_ASSERT)
3239 struct answer **p = find_answer (node, answer), *temp;
3241 /* Remove the answer from the list. */
3246 /* Did we free the last answer? */
3247 if (node->value.answers == 0)
3248 delete_macro (node);
3251 delete_macro (node);
3258 /* Returns a pointer to the pointer to the answer in the answer chain,
3259 or a pointer to NULL if the answer is not in the chain. */
3260 static struct answer **
3261 find_answer (node, candidate)
3263 const struct answer *candidate;
3265 struct answer **result;
3267 for (result = &node->value.answers; *result; result = &(*result)->next)
3269 struct answer *answer = *result;
3271 if (answer->len == candidate->len
3272 && !memcmp (answer->answer, candidate->answer, answer->len))
3279 /* Return a malloced buffer with leading and trailing whitespace
3280 removed, and all instances of internal whitespace reduced to a
3282 static unsigned char *
3283 canonicalize_text (buf, limit, climit)
3284 const unsigned char *buf, *limit, **climit;
3286 unsigned int len = limit - buf;
3287 unsigned char *result = (unsigned char *) xmalloc (len), *dest;
3289 for (dest = result; buf < limit;)
3291 if (! is_space (*buf))
3295 while (++buf < limit && is_space (*buf))
3297 if (dest != result && buf != limit)
3307 * handle #if command by
3308 * 1) inserting special `defined' keyword into the hash table
3309 * that gets turned into 0 or 1 by special_symbol (thus,
3310 * if the luser has a symbol called `defined' already, it won't
3311 * work inside the #if command)
3312 * 2) rescan the input into a temporary output buffer
3313 * 3) pass the output buffer to the yacc parser and collect a value
3314 * 4) clean up the mess left from steps 1 and 2.
3315 * 5) call conditional_skip to skip til the next #endif (etc.),
3316 * or not, depending on the value from step 3.
3319 do_if (buf, limit, op)
3320 U_CHAR *buf, *limit;
3321 FILE_BUF *op ATTRIBUTE_UNUSED;
3324 FILE_BUF *ip = &instack[indepth];
3326 value = eval_if_expression (buf, limit - buf);
3327 conditional_skip (ip, value == 0, T_IF);
3331 * handle a #elif directive by not changing if_stack either.
3332 * see the comment above do_else.
3335 do_elif (buf, limit, op)
3336 U_CHAR *buf, *limit;
3340 FILE_BUF *ip = &instack[indepth];
3342 if (if_stack == instack[indepth].if_stack) {
3343 error ("#elif not within a conditional");
3346 if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
3347 error ("#elif after #else");
3348 fprintf (stderr, " (matches line %d", if_stack->lineno);
3349 if (if_stack->fname != NULL && ip->fname != NULL &&
3350 strcmp (if_stack->fname, ip->fname) != 0)
3351 fprintf (stderr, ", file %s", if_stack->fname);
3352 fprintf (stderr, ")\n");
3354 if_stack->type = T_ELIF;
3357 if (if_stack->if_succeeded)
3358 skip_if_group (ip, 0);
3360 value = eval_if_expression (buf, limit - buf);
3362 skip_if_group (ip, 0);
3364 ++if_stack->if_succeeded; /* continue processing input */
3365 output_line_command (ip, op, 1, same_file);
3371 * evaluate a #if expression in BUF, of length LENGTH,
3372 * then parse the result as a C expression and return the value as an int.
3375 eval_if_expression (buf, length)
3380 HASHNODE *save_defined;
3383 save_defined = install (U"defined", -1, T_SPEC_DEFINED, -1);
3384 temp_obuf = expand_to_temp_buffer (buf, buf + length, 0);
3385 delete_macro (save_defined); /* clean up special symbol */
3387 value = parse_c_expression ((const char *)temp_obuf.buf);
3389 free (temp_obuf.buf);
3395 * routine to handle ifdef/ifndef. Try to look up the symbol,
3396 * then do or don't skip to the #endif/#else/#elif depending
3397 * on what directive is actually being processed.
3400 do_xifdef (buf, limit, type)
3401 U_CHAR *buf, *limit;
3402 enum node_type type;
3405 FILE_BUF *ip = &instack[indepth];
3408 /* Discard leading and trailing whitespace. */
3409 SKIP_WHITE_SPACE (buf);
3410 while (limit != buf && is_nvspace (limit[-1])) limit--;
3412 /* Find the end of the identifier at the beginning. */
3413 for (end = buf; is_idchar (*end); end++);
3416 skip = (type == T_IFDEF);
3418 skip = (lookup (buf, end-buf, -1) == NULL) ^ (type == T_IFNDEF);
3420 conditional_skip (ip, skip, T_IF);
3424 do_ifdef (buf, limit, op)
3425 U_CHAR *buf, *limit;
3426 FILE_BUF *op ATTRIBUTE_UNUSED;
3428 do_xifdef (buf, limit, T_IFDEF);
3432 do_ifndef (buf, limit, op)
3433 U_CHAR *buf, *limit;
3434 FILE_BUF *op ATTRIBUTE_UNUSED;
3436 do_xifdef (buf, limit, T_IFNDEF);
3440 * push TYPE on stack; then, if SKIP is nonzero, skip ahead.
3443 conditional_skip (ip, skip, type)
3446 enum node_type type;
3448 IF_STACK_FRAME *temp;
3450 temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
3451 temp->fname = ip->fname;
3452 temp->lineno = ip->lineno;
3453 temp->next = if_stack;
3456 if_stack->type = type;
3459 skip_if_group (ip, 0);
3462 ++if_stack->if_succeeded;
3463 output_line_command (ip, &outbuf, 1, same_file);
3468 * skip to #endif, #else, or #elif. adjust line numbers, etc.
3469 * leaves input ptr at the sharp sign found.
3470 * If ANY is nonzero, return at next directive of any sort.
3473 skip_if_group (ip, any)
3477 register U_CHAR *bp = ip->bufp, *cp;
3478 register U_CHAR *endb = ip->buf + ip->length;
3479 struct directive *kt;
3480 IF_STACK_FRAME *save_if_stack = if_stack; /* don't pop past here */
3481 U_CHAR *beg_of_line = bp;
3485 case '/': /* possible comment */
3486 if (*bp == '\\' && bp[1] == '\n')
3490 bp = skip_to_end_of_comment (ip, &ip->lineno);
3495 bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno, 0, 0);
3498 /* Char after backslash loses its special meaning. */
3501 ++ip->lineno; /* But do update the line-count. */
3512 /* # keyword: a # must be first nonblank char on the line */
3513 if (beg_of_line == 0)
3515 /* Scan from start of line, skipping whitespace, comments
3516 and backslash-newlines, and see if we reach this #.
3517 If not, this # is not special. */
3520 if (is_nvspace (*bp))
3522 else if (*bp == '\\' && bp[1] == '\n')
3524 else if (*bp == '/' && bp[1] == '*') {
3526 while (!(*bp == '*' && bp[1] == '/')) {
3535 if (bp != ip->bufp) {
3536 bp = ip->bufp + 1; /* Reset bp to after the #. */
3540 bp = ip->bufp + 1; /* Point after '#'. */
3542 /* Skip whitespace and \-newline. */
3544 if (is_nvspace (*bp))
3546 else if (*bp == '\\' && bp[1] == '\n')
3548 else if (*bp == '/' && bp[1] == '*') {
3550 while (!(*bp == '*' && bp[1] == '/'))
3559 /* Now find end of directive name.
3560 If we encounter a backslash-newline, exchange it with any following
3561 symbol-constituents so that we end up with a contiguous name. */
3564 if (is_idchar (*bp))
3567 if (*bp == '\\' && bp[1] == '\n')
3568 name_newline_fix (bp);
3569 if (is_idchar (*bp))
3575 for (kt = directive_table; kt->length >= 0; kt++) {
3576 IF_STACK_FRAME *temp;
3577 if (strncmp ((const char *)cp, kt->name, kt->length) == 0
3578 && !is_idchar (cp[kt->length])) {
3580 /* If we are asked to return on next directive,
3589 temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
3590 temp->next = if_stack;
3592 temp->lineno = ip->lineno;
3593 temp->fname = ip->fname;
3594 temp->type = kt->type;
3599 if (if_stack == instack[indepth].if_stack) {
3600 error ("#%s not within a conditional", kt->name);
3603 else if (if_stack == save_if_stack)
3604 return; /* found what we came for */
3606 if (kt->type != T_ENDIF) {
3607 if (if_stack->type == T_ELSE)
3608 error ("#else or #elif after #else");
3609 if_stack->type = kt->type;
3614 if_stack = if_stack->next;
3619 /* Anything else is ignored. */
3628 /* after this returns, rescan will exit because ip->bufp
3629 now points to the end of the buffer.
3630 rescan is responsible for the error message also. */
3634 * handle a #else directive. Do this by just continuing processing
3635 * without changing if_stack ; this is so that the error message
3636 * for missing #endif's etc. will point to the original #if. It
3637 * is possible that something different would be better.
3640 do_else (buf, limit, op)
3641 U_CHAR *buf ATTRIBUTE_UNUSED;
3642 U_CHAR *limit ATTRIBUTE_UNUSED;
3645 FILE_BUF *ip = &instack[indepth];
3647 if (if_stack == instack[indepth].if_stack) {
3648 error ("#else not within a conditional");
3651 if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
3652 error ("#else after #else");
3653 fprintf (stderr, " (matches line %d", if_stack->lineno);
3654 if (strcmp (if_stack->fname, ip->fname) != 0)
3655 fprintf (stderr, ", file %s", if_stack->fname);
3656 fprintf (stderr, ")\n");
3658 if_stack->type = T_ELSE;
3661 if (if_stack->if_succeeded)
3662 skip_if_group (ip, 0);
3664 ++if_stack->if_succeeded; /* continue processing input */
3665 output_line_command (ip, op, 1, same_file);
3670 * unstack after #endif command
3673 do_endif (buf, limit, op)
3674 U_CHAR *buf ATTRIBUTE_UNUSED;
3675 U_CHAR *limit ATTRIBUTE_UNUSED;
3678 if (if_stack == instack[indepth].if_stack)
3679 error ("unbalanced #endif");
3681 IF_STACK_FRAME *temp = if_stack;
3682 if_stack = if_stack->next;
3684 output_line_command (&instack[indepth], op, 1, same_file);
3689 * Skip a comment, assuming the input ptr immediately follows the
3690 * initial slash-star. Bump line counter as necessary.
3691 * (The canonical line counter is &ip->lineno).
3692 * Don't use this routine (or the next one) if bumping the line
3693 * counter is not sufficient to deal with newlines in the string.
3696 skip_to_end_of_comment (ip, line_counter)
3697 register FILE_BUF *ip;
3698 int *line_counter; /* place to remember newlines, or NULL */
3700 register U_CHAR *limit = ip->buf + ip->length;
3701 register U_CHAR *bp = ip->bufp;
3702 FILE_BUF *op = &outbuf; /* JF */
3703 int output = put_out_comments && !line_counter;
3705 /* JF this line_counter stuff is a crock to make sure the
3706 comment is only put out once, no matter how many times
3707 the comment is skipped. It almost works */
3712 while (bp < limit) {
3717 if (warn_comments && bp < limit && *bp == '*')
3718 warning("`/*' within comment");
3721 if (line_counter != NULL)
3727 if (*bp == '\\' && bp[1] == '\n')
3743 * Skip over a quoted string. BP points to the opening quote.
3744 * Returns a pointer after the closing quote. Don't go past LIMIT.
3745 * START_LINE is the line number of the starting point (but it need
3746 * not be valid if the starting point is inside a macro expansion).
3748 * The input stack state is not changed.
3750 * If COUNT_NEWLINES is nonzero, it points to an int to increment
3751 * for each newline passed.
3753 * If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
3754 * if we pass a backslash-newline.
3756 * If EOFP is nonzero, set *EOFP to 1 if the string is unterminated.
3759 skip_quoted_string (bp, limit, start_line, count_newlines, backslash_newlines_p, eofp)
3760 register const U_CHAR *bp;
3761 register const U_CHAR *limit;
3763 int *count_newlines;
3764 int *backslash_newlines_p;
3767 register U_CHAR c, match;
3772 error_with_line (line_for_error (start_line),
3773 "unterminated string or character constant");
3780 while (*bp == '\\' && bp[1] == '\n') {
3781 if (backslash_newlines_p)
3782 *backslash_newlines_p = 1;
3787 if (*bp == '\n' && count_newlines) {
3788 if (backslash_newlines_p)
3789 *backslash_newlines_p = 1;
3793 } else if (c == '\n') {
3794 /* Unterminated strings and character constants are 'legal'. */
3795 bp--; /* Don't consume the newline. */
3799 } else if (c == match)
3802 return (U_CHAR *) bp;
3806 * write out a #line command, for instance, after an #include file.
3807 * If CONDITIONAL is nonzero, we can omit the #line if it would
3808 * appear to be a no-op, and we can output a few newlines instead
3809 * if we want to increase the line number by a small amount.
3810 * FILE_CHANGE says whether we are entering a file, leaving, or neither.
3814 output_line_command (ip, op, conditional, file_change)
3817 enum file_change_code file_change;
3820 char line_cmd_buf[500];
3822 if (no_line_commands
3823 || ip->fname == NULL
3825 op->lineno = ip->lineno;
3830 if (ip->lineno == op->lineno)
3833 /* If the inherited line number is a little too small,
3834 output some newlines instead of a #line command. */
3835 if (ip->lineno > op->lineno && ip->lineno < op->lineno + 8) {
3836 check_expand (op, 10);
3837 while (ip->lineno > op->lineno) {
3845 sprintf (line_cmd_buf, "# %d \"%s\"", ip->lineno, ip->fname);
3846 if (file_change != same_file)
3847 strcat (line_cmd_buf, file_change == enter_file ? " 1" : " 2");
3848 if (system_include_depth > 0)
3849 strcat (line_cmd_buf, " 3");
3850 len = strlen (line_cmd_buf);
3851 line_cmd_buf[len++] = '\n';
3852 check_expand (op, len + 1);
3853 if (op->bufp > op->buf && op->bufp[-1] != '\n')
3855 memcpy (op->bufp, line_cmd_buf, len);
3857 op->lineno = ip->lineno;
3861 /* Expand a macro call.
3862 HP points to the symbol that is the macro being called.
3863 Put the result of expansion onto the input stack
3864 so that subsequent input by our caller will use it.
3866 If macro wants arguments, caller has already verified that
3867 an argument list follows; arguments come from the input stack. */
3870 macroexpand (hp, op)
3875 DEFINITION *defn = hp->value.defn;
3876 register U_CHAR *xbuf;
3878 int start_line = instack[indepth].lineno;
3880 CHECK_DEPTH (return;);
3882 /* it might not actually be a macro. */
3883 if (hp->type != T_MACRO) {
3884 special_symbol (hp, op);
3888 nargs = defn->nargs;
3892 struct argdata *args;
3893 const char *parse_error = 0;
3895 args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
3897 for (i = 0; i < nargs; i++) {
3898 args[i].raw = args[i].expanded = (U_CHAR *) "";
3899 args[i].raw_length = args[i].expand_length
3900 = args[i].stringified_length = 0;
3901 args[i].free1 = args[i].free2 = 0;
3904 /* Parse all the macro args that are supplied. I counts them.
3905 The first NARGS args are stored in ARGS.
3906 The rest are discarded. */
3909 /* Discard the open-parenthesis or comma before the next arg. */
3910 ++instack[indepth].bufp;
3912 = macarg ((i < nargs || (nargs == 0 && i == 0)) ? &args[i] : 0);
3915 error_with_line (line_for_error (start_line), parse_error);
3919 } while (*instack[indepth].bufp != ')');
3921 /* If we got one arg but it was just whitespace, call that 0 args. */
3923 register const U_CHAR *bp = args[0].raw;
3924 register const U_CHAR *lim = bp + args[0].raw_length;
3925 while (bp != lim && is_space (*bp)) bp++;
3930 if (nargs == 0 && i > 0)
3931 error ("arguments given to macro `%s'", hp->name);
3932 else if (i < nargs) {
3933 /* traditional C allows foo() if foo wants one argument. */
3934 if (nargs == 1 && i == 0)
3937 error ("no args to macro `%s'", hp->name);
3939 error ("only 1 arg to macro `%s'", hp->name);
3941 error ("only %d args to macro `%s'", i, hp->name);
3942 } else if (i > nargs)
3943 error ("too many (%d) args to macro `%s'", i, hp->name);
3945 /* Swallow the closeparen. */
3946 ++instack[indepth].bufp;
3948 /* If macro wants zero args, we parsed the arglist for checking only.
3949 Read directly from the macro definition. */
3951 xbuf = defn->expansion;
3952 xbuf_len = defn->length;
3954 register U_CHAR *exp = defn->expansion;
3955 register int offset; /* offset in expansion,
3956 copied a piece at a time */
3957 register int totlen; /* total amount of exp buffer filled so far */
3959 register struct reflist *ap;
3961 /* Macro really takes args. Compute the expansion of this call. */
3963 /* Compute length in characters of the macro's expansion. */
3964 xbuf_len = defn->length;
3965 for (ap = defn->pattern; ap != NULL; ap = ap->next) {
3967 xbuf_len += args[ap->argno].stringified_length;
3969 xbuf_len += args[ap->argno].raw_length;
3972 xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
3974 /* Generate in XBUF the complete expansion
3975 with arguments substituted in.
3976 TOTLEN is the total size generated so far.
3977 OFFSET is the index in the definition
3978 of where we are copying from. */
3979 offset = totlen = 0;
3980 for (ap = defn->pattern; ap != NULL; ap = ap->next) {
3981 register struct argdata *arg = &args[ap->argno];
3983 for (i = 0; i < ap->nchars; i++)
3984 xbuf[totlen++] = exp[offset++];
3986 if (ap->stringify != 0) {
3987 int arglen = arg->raw_length;
3993 && (c = arg->raw[i], is_space (c)))
3996 && (c = arg->raw[arglen - 1], is_space (c)))
3998 for (; i < arglen; i++) {
4001 /* Special markers Newline Space
4002 generate nothing for a stringified argument. */
4003 if (c == '\n' && arg->raw[i+1] != '\n') {
4008 /* Internal sequences of whitespace are replaced by one space
4009 except within an string or char token. */
4011 && (c == '\n' ? arg->raw[i+1] == '\n' : is_space (c))) {
4013 /* Note that Newline Space does occur within whitespace
4014 sequences; consider it part of the sequence. */
4015 if (c == '\n' && is_space (arg->raw[i+1]))
4017 else if (c != '\n' && is_space (c))
4034 } else if (c == '\"' || c == '\'')
4038 /* Escape these chars */
4039 if (c == '\"' || (in_string && c == '\\'))
4040 xbuf[totlen++] = '\\';
4044 sprintf ((char *) &xbuf[totlen], "\\%03o", (unsigned int) c);
4049 const U_CHAR *p1 = arg->raw;
4050 const U_CHAR *l1 = p1 + arg->raw_length;
4052 if (ap->raw_before) {
4053 while (p1 != l1 && is_space (*p1)) p1++;
4054 while (p1 != l1 && is_idchar (*p1))
4055 xbuf[totlen++] = *p1++;
4056 /* Delete any no-reexpansion marker that follows
4057 an identifier at the beginning of the argument
4058 if the argument is concatenated with what precedes it. */
4059 if (p1[0] == '\n' && p1[1] == '-')
4062 if (ap->raw_after) {
4063 /* Arg is concatenated after: delete trailing whitespace,
4064 whitespace markers, and no-reexpansion markers. */
4066 if (is_space (l1[-1])) l1--;
4067 else if (l1[-1] == '-') {
4068 const U_CHAR *p2 = l1 - 1;
4069 /* If a `-' is preceded by an odd number of newlines then it
4070 and the last newline are a no-reexpansion marker. */
4071 while (p2 != p1 && p2[-1] == '\n') p2--;
4072 if ((l1 - 1 - p2) & 1) {
4080 memmove (xbuf + totlen, p1, l1 - p1);
4084 if (totlen > xbuf_len)
4088 /* if there is anything left of the definition
4089 after handling the arg list, copy that in too. */
4091 for (i = offset; i < defn->length; i++)
4092 xbuf[totlen++] = exp[i];
4097 for (i = 0; i < nargs; i++) {
4098 if (args[i].free1 != 0)
4099 free (args[i].free1);
4100 if (args[i].free2 != 0)
4101 free (args[i].free2);
4105 xbuf = defn->expansion;
4106 xbuf_len = defn->length;
4109 /* Now put the expansion on the input stack
4110 so our caller will commence reading from it. */
4112 register FILE_BUF *ip2;
4114 ip2 = &instack[++indepth];
4119 ip2->length = xbuf_len;
4121 ip2->free_ptr = (nargs > 0) ? xbuf : 0;
4123 ip2->if_stack = if_stack;
4128 * Parse a macro argument and store the info on it into *ARGPTR.
4129 * Return nonzero to indicate a syntax error.
4134 register struct argdata *argptr;
4136 FILE_BUF *ip = &instack[indepth];
4141 /* Try to parse as much of the argument as exists at this
4142 input stack level. */
4143 U_CHAR *bp = macarg1 (ip->bufp, ip->buf + ip->length,
4144 &paren, &newlines, &comments);
4146 /* If we find the end of the argument at this level,
4147 set up *ARGPTR to point at it in the input stack. */
4148 if (!(ip->fname != 0 && (newlines != 0 || comments != 0))
4149 && bp != ip->buf + ip->length) {
4151 argptr->raw = ip->bufp;
4152 argptr->raw_length = bp - ip->bufp;
4156 /* This input stack level ends before the macro argument does.
4157 We must pop levels and keep parsing.
4158 Therefore, we must allocate a temporary buffer and copy
4159 the macro argument into it. */
4160 int bufsize = bp - ip->bufp;
4161 int extra = newlines;
4162 U_CHAR *buffer = (U_CHAR *) xmalloc (bufsize + extra + 1);
4163 int final_start = 0;
4165 memcpy (buffer, ip->bufp, bufsize);
4167 ip->lineno += newlines;
4169 while (bp == ip->buf + ip->length) {
4170 if (instack[indepth].macro == 0) {
4172 return "unterminated macro call";
4174 ip->macro->type = T_MACRO;
4176 free (ip->free_ptr);
4177 ip = &instack[--indepth];
4180 bp = macarg1 (ip->bufp, ip->buf + ip->length, &paren,
4181 &newlines, &comments);
4182 final_start = bufsize;
4183 bufsize += bp - ip->bufp;
4185 buffer = (U_CHAR *) xrealloc (buffer, bufsize + extra + 1);
4186 memcpy (buffer + bufsize - (bp - ip->bufp), ip->bufp, bp - ip->bufp);
4188 ip->lineno += newlines;
4191 /* Now, if arg is actually wanted, record its raw form,
4192 discarding comments and duplicating newlines in whatever
4193 part of it did not come from a macro expansion.
4194 EXTRA space has been preallocated for duplicating the newlines.
4195 FINAL_START is the index of the start of that part. */
4197 argptr->raw = buffer;
4198 argptr->raw_length = bufsize;
4199 argptr->free1 = buffer;
4200 argptr->newlines = newlines;
4201 argptr->comments = comments;
4202 if ((newlines || comments) && ip->fname != 0)
4205 discard_comments (argptr->raw + final_start,
4206 argptr->raw_length - final_start,
4208 argptr->raw[argptr->raw_length] = 0;
4209 if (argptr->raw_length > bufsize + extra)
4214 /* If we are not discarding this argument,
4215 macroexpand it and compute its length as stringified.
4216 All this info goes into *ARGPTR. */
4220 register const U_CHAR *buf, *lim;
4221 register int totlen;
4223 obuf = expand_to_temp_buffer (argptr->raw,
4224 argptr->raw + argptr->raw_length,
4227 argptr->expanded = obuf.buf;
4228 argptr->expand_length = obuf.length;
4229 argptr->free2 = obuf.buf;
4232 lim = buf + argptr->raw_length;
4235 while (buf != lim) {
4236 register U_CHAR c = *buf++;
4238 /* Internal sequences of whitespace are replaced by one space
4239 in most cases, but not always. So count all the whitespace
4240 in case we need to keep it all. */
4241 if (c == '\"' || c == '\\') /* escape these chars */
4243 else if (!ISPRINT (c))
4246 argptr->stringified_length = totlen;
4251 /* Scan text from START (inclusive) up to LIMIT (exclusive),
4252 counting parens in *DEPTHPTR,
4253 and return if reach LIMIT
4254 or before a `)' that would make *DEPTHPTR negative
4255 or before a comma when *DEPTHPTR is zero.
4256 Single and double quotes are matched and termination
4257 is inhibited within them. Comments also inhibit it.
4258 Value returned is pointer to stopping place.
4260 Increment *NEWLINES each time a newline is passed.
4261 Set *COMMENTS to 1 if a comment is seen. */
4264 macarg1 (start, limit, depthptr, newlines, comments)
4266 register const U_CHAR *limit;
4267 int *depthptr, *newlines, *comments;
4269 register U_CHAR *bp = start;
4271 while (bp < limit) {
4277 if (--(*depthptr) < 0)
4281 /* Traditionally, backslash makes following char not special. */
4285 /* But count source lines anyway. */
4294 if (bp[1] == '\\' && bp[2] == '\n')
4295 newline_fix (bp + 1);
4296 if (bp[1] != '*' || bp + 1 >= limit)
4300 while (bp + 1 < limit) {
4302 && bp[1] == '\\' && bp[2] == '\n')
4303 newline_fix (bp + 1);
4304 if (bp[0] == '*' && bp[1] == '/')
4306 if (*bp == '\n') ++*newlines;
4315 for (quotec = *bp++; bp + 1 < limit && *bp != quotec; bp++) {
4320 while (*bp == '\\' && bp[1] == '\n') {
4323 } else if (*bp == '\n') {
4332 if ((*depthptr) == 0)
4342 /* Discard comments and duplicate newlines
4343 in the string of length LENGTH at START,
4344 except inside of string constants.
4345 The string is copied into itself with its beginning staying fixed.
4347 NEWLINES is the number of newlines that must be duplicated.
4348 We assume that that much extra space is available past the end
4352 discard_comments (start, length, newlines)
4357 register U_CHAR *ibp;
4358 register U_CHAR *obp;
4359 register const U_CHAR *limit;
4362 /* If we have newlines to duplicate, copy everything
4363 that many characters up. Then, in the second part,
4364 we will have room to insert the newlines
4366 NEWLINES may actually be too large, because it counts
4367 newlines in string constants, and we don't duplicate those.
4368 But that does no harm. */
4370 ibp = start + length;
4371 obp = ibp + newlines;
4373 while (limit != ibp)
4377 ibp = start + newlines;
4378 limit = start + length + newlines;
4381 while (ibp < limit) {
4382 *obp++ = c = *ibp++;
4385 /* Duplicate the newline. */
4397 if (*ibp == '\\' && ibp[1] == '\n')
4399 /* Delete any comment. */
4400 if (ibp[0] != '*' || ibp + 1 >= limit)
4404 while (ibp + 1 < limit) {
4406 && ibp[1] == '\\' && ibp[2] == '\n')
4407 newline_fix (ibp + 1);
4408 if (ibp[0] == '*' && ibp[1] == '/')
4417 /* Notice and skip strings, so that we don't
4418 think that comments start inside them,
4419 and so we don't duplicate newlines in them. */
4422 while (ibp < limit) {
4423 *obp++ = c = *ibp++;
4426 if (c == '\n' && quotec == '\'')
4428 if (c == '\\' && ibp < limit) {
4429 while (*ibp == '\\' && ibp[1] == '\n')
4443 /* Core error handling routine. */
4445 v_message (mtype, line, msgid, ap)
4451 const char *fname = 0;
4454 if (mtype == WARNING && inhibit_warnings)
4457 for (i = indepth; i >= 0; i--)
4458 if (instack[i].fname != NULL) {
4460 line = instack[i].lineno;
4461 fname = instack[i].fname;
4466 fprintf (stderr, "%s:%d: ", fname, line);
4468 fprintf (stderr, "%s: ", progname);
4470 if (mtype == WARNING)
4471 fputs ("warning: ", stderr);
4473 vfprintf (stderr, msgid, ap);
4474 putc ('\n', stderr);
4481 * error - print error message and increment count of errors.
4484 error VPARAMS ((const char *msgid, ...))
4486 #ifndef ANSI_PROTOTYPES
4491 VA_START(ap, msgid);
4493 #ifndef ANSI_PROTOTYPES
4494 msgid = va_arg (ap, const char *);
4497 v_message (ERROR, 0, msgid, ap);
4501 error_with_line VPARAMS ((int line, const char *msgid, ...))
4503 #ifndef ANSI_PROTOTYPES
4509 VA_START(ap, msgid);
4511 #ifndef ANSI_PROTOTYPES
4512 line = va_arg (ap, int);
4513 msgid = va_arg (ap, const char *);
4516 v_message (ERROR, line, msgid, ap);
4519 /* Error including a message from `errno'. */
4521 error_from_errno (name)
4524 error ("%s: %s", name, strerror (errno));
4527 /* Print error message but don't count it. */
4529 warning VPARAMS ((const char *msgid, ...))
4531 #ifndef ANSI_PROTOTYPES
4536 VA_START(ap, msgid);
4538 #ifndef ANSI_PROTOTYPES
4539 msgid = va_arg (ap, const char *);
4542 v_message (WARNING, 0, msgid, ap);
4546 fatal VPARAMS ((const char *msgid, ...))
4548 #ifndef ANSI_PROTOTYPES
4553 VA_START(ap, msgid);
4555 #ifndef ANSI_PROTOTYPES
4556 msgid = va_arg (ap, const char *);
4559 v_message (FATAL, 0, msgid, ap);
4560 exit (FATAL_EXIT_CODE);
4563 /* More 'friendly' abort that prints the location at which we died. */
4565 fancy_abort (line, func)
4569 fatal ("Internal error in %s, at tradcpp.c:%d\n\
4570 Please submit a full bug report.\n\
4571 See %s for instructions.", func, line, GCCBUGURL);
4575 perror_with_name (name)
4578 fprintf (stderr, "%s: %s: %s\n", progname, name, strerror (errno));
4583 pfatal_with_name (name)
4586 perror_with_name (name);
4587 exit (FATAL_EXIT_CODE);
4590 /* Return the line at which an error occurred.
4591 The error is not necessarily associated with the current spot
4592 in the input stack, so LINE says where. LINE will have been
4593 copied from ip->lineno for the current input level.
4594 If the current level is for a file, we return LINE.
4595 But if the current level is not for a file, LINE is meaningless.
4596 In that case, we return the lineno of the innermost file. */
4598 line_for_error (line)
4604 for (i = indepth; i >= 0; ) {
4605 if (instack[i].fname != 0)
4610 line1 = instack[i].lineno;
4616 * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
4618 * As things stand, nothing is ever placed in the output buffer to be
4619 * removed again except when it's KNOWN to be part of an identifier,
4620 * so flushing and moving down everything left, instead of expanding,
4625 grow_outbuf (obuf, needed)
4626 register FILE_BUF *obuf;
4627 register int needed;
4632 if (obuf->length - (obuf->bufp - obuf->buf) > needed)
4635 /* Make it at least twice as big as it is now. */
4637 /* Make it have at least 150% of the free space we will need. */
4638 minsize = (3 * needed) / 2 + (obuf->bufp - obuf->buf);
4639 if (minsize > obuf->length)
4640 obuf->length = minsize;
4642 p = (U_CHAR *) xrealloc (obuf->buf, obuf->length);
4643 obuf->bufp = p + (obuf->bufp - obuf->buf);
4647 /* Symbol table for macro names and special symbols */
4650 * install a name in the main hash table, even if it is already there.
4651 * name stops with first non alphanumeric, except leading '#'.
4652 * caller must check against redefinition if that is desired.
4653 * delete_macro () removes things installed by install () in fifo order.
4654 * this is important because of the `defined' special symbol used
4655 * in #if, and also if pushdef/popdef directives are ever implemented.
4657 * If LEN is >= 0, it is the length of the name.
4658 * Otherwise, compute the length by scanning the entire name.
4660 * If HASH is >= 0, it is the precomputed hash code.
4661 * Otherwise, compute the hash code.
4663 * caller must set the value, if any is desired.
4666 install (name, len, type, hash)
4669 enum node_type type;
4671 /* watch out here if sizeof (U_CHAR *) != sizeof (int) */
4673 register HASHNODE *hp;
4674 register int bucket;
4675 register const U_CHAR *p;
4680 while (is_idchar (*p))
4686 hash = hashf (name, len, HASHSIZE);
4688 hp = (HASHNODE *) xmalloc (sizeof (HASHNODE) + len + 1);
4690 hp->bucket_hdr = &hashtab[bucket];
4691 hp->next = hashtab[bucket];
4692 hashtab[bucket] = hp;
4694 if (hp->next != NULL)
4695 hp->next->prev = hp;
4698 hp->name = q = ((U_CHAR *) hp) + sizeof (HASHNODE);
4699 memcpy (q, name, len);
4705 * find the most recent hash node for name name (ending with first
4706 * non-identifier char) installed by install
4708 * If LEN is >= 0, it is the length of the name.
4709 * Otherwise, compute the length by scanning the entire name.
4711 * If HASH is >= 0, it is the precomputed hash code.
4712 * Otherwise, compute the hash code.
4715 lookup (name, len, hash)
4720 register const U_CHAR *bp;
4721 register HASHNODE *bucket;
4724 for (bp = name; is_idchar (*bp); bp++) ;
4729 hash = hashf (name, len, HASHSIZE);
4731 bucket = hashtab[hash];
4733 if (bucket->length == len
4734 && strncmp ((const char *)bucket->name, (const char *)name, len) == 0)
4736 bucket = bucket->next;
4742 * Delete a hash node. Some weirdness to free junk from macros.
4743 * More such weirdness will have to be added if you define more hash
4744 * types that need it.
4747 /* Note that the DEFINITION of a macro is removed from the hash table
4748 but its storage is not freed. This would be a storage leak
4749 except that it is not reasonable to keep undefining and redefining
4750 large numbers of macros many times.
4751 In any case, this is necessary, because a macro can be #undef'd
4752 in the middle of reading the arguments to a call to it.
4753 If #undef freed the DEFINITION, that would crash. */
4759 if (hp->prev != NULL)
4760 hp->prev->next = hp->next;
4761 if (hp->next != NULL)
4762 hp->next->prev = hp->prev;
4764 /* make sure that the bucket chain header that
4765 the deleted guy was on points to the right thing afterwards. */
4766 if (hp == *hp->bucket_hdr)
4767 *hp->bucket_hdr = hp->next;
4773 * return hash function on name. must be compatible with the one
4774 * computed a step at a time, elsewhere
4777 hashf (name, len, hashsize)
4778 register const U_CHAR *name;
4785 r = HASHSTEP (r, *name++);
4787 return MAKE_POS (r) % hashsize;
4790 /* Dump all macro definitions as #defines to stdout. */
4797 for (bucket = 0; bucket < HASHSIZE; bucket++) {
4798 register HASHNODE *hp;
4800 for (hp = hashtab[bucket]; hp; hp= hp->next) {
4801 if (hp->type == T_MACRO) {
4802 register DEFINITION *defn = hp->value.defn;
4808 /* Print the definition of the macro HP. */
4810 printf ("#define %s", hp->name);
4811 if (defn->nargs >= 0) {
4815 for (i = 0; i < defn->nargs; i++) {
4816 dump_arg_n (defn, i);
4817 if (i + 1 < defn->nargs)
4827 for (ap = defn->pattern; ap != NULL; ap = ap->next) {
4828 dump_defn_1 (defn->expansion, offset, ap->nchars);
4829 if (ap->nchars != 0)
4831 offset += ap->nchars;
4834 if (ap->raw_before && !concat)
4837 dump_arg_n (defn, ap->argno);
4838 if (ap->raw_after) {
4843 dump_defn_1 (defn->expansion, offset, defn->length - offset);
4850 /* Output to stdout a substring of a macro definition.
4851 BASE is the beginning of the definition.
4852 Output characters START thru LENGTH.
4853 Discard newlines outside of strings, thus
4854 converting funny-space markers to ordinary spaces. */
4856 dump_defn_1 (base, start, length)
4861 const U_CHAR *p = base + start;
4862 const U_CHAR *limit = base + start + length;
4867 else if (*p == '\"' || *p =='\'') {
4868 const U_CHAR *p1 = skip_quoted_string (p, limit, 0, 0, 0, 0);
4869 fwrite (p, p1 - p, 1, stdout);
4876 /* Print the name of argument number ARGNUM of macro definition DEFN.
4877 Recall that DEFN->argnames contains all the arg names
4878 concatenated in reverse order with comma-space in between. */
4880 dump_arg_n (defn, argnum)
4884 register const U_CHAR *p = defn->argnames;
4885 while (argnum + 1 < defn->nargs) {
4886 p = (const U_CHAR *) strchr ((const char *)p, ' ') + 1;
4890 while (*p && *p != ',') {
4896 /* Initialize the built-in macros. */
4897 #define DSC(x) U x, sizeof x - 1
4898 #define install_spec(name, type) \
4899 install(DSC(name), type, -1);
4900 #define install_value(name, val) \
4901 hp = install(DSC(name), T_CONST, -1); hp->value.cpval = val;
4903 initialize_builtins ()
4907 install_spec ("__BASE_FILE__", T_BASE_FILE);
4908 install_spec ("__DATE__", T_DATE);
4909 install_spec ("__FILE__", T_FILE);
4910 install_spec ("__TIME__", T_TIME);
4911 install_spec ("__VERSION__", T_VERSION);
4912 install_spec ("__INCLUDE_LEVEL__", T_INCLUDE_LEVEL);
4913 install_spec ("__LINE__", T_SPECLINE);
4915 #ifndef NO_BUILTIN_SIZE_TYPE
4916 install_value ("__SIZE_TYPE__", SIZE_TYPE);
4918 #ifndef NO_BUILTIN_PTRDIFF_TYPE
4919 install_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE);
4921 #ifndef NO_BUILTIN_WCHAR_TYPE
4922 install_value ("__WCHAR_TYPE__", WCHAR_TYPE);
4924 #ifndef NO_BUILTIN_WINT_TYPE
4925 install_value ("__WINT_TYPE__", WINT_TYPE);
4927 install_value ("__REGISTER_PREFIX__", REGISTER_PREFIX);
4928 install_value ("__USER_LABEL_PREFIX__", user_label_prefix);
4932 #undef install_value
4934 /* Common handler of command line directives -U, -D and -A. */
4936 run_directive (str, len, type)
4939 enum node_type type;
4941 struct directive *kt;
4942 FILE_BUF *ip = &instack[++indepth];
4943 ip->fname = "*command line*";
4945 ip->buf = ip->bufp = (U_CHAR *) str;
4950 ip->if_stack = if_stack;
4952 for (kt = directive_table; kt->type != type; kt++)
4955 (*kt->func) ((U_CHAR *) str, (U_CHAR *) str + len, NULL);
4959 /* Handle the -D option. If STR is just an identifier, define it with
4960 * value 1. If STR has anything after the identifier, then it should
4961 * be identifier-space-definition. */
4963 make_definition (str)
4969 /* Copy the entire option so we can modify it.
4970 Change the first "=" in the string to a space. If there is none,
4971 tack " 1" on the end. */
4973 /* Length including the null. */
4974 count = strlen (str);
4975 buf = (char *) alloca (count + 2);
4976 memcpy (buf, str, count);
4978 p = strchr (str, '=');
4987 run_directive (buf, count, T_DEFINE);
4990 /* Handle the -U option. */
4995 run_directive (str, strlen (str), T_UNDEF);
4998 /* Handles the #assert (-A) and #unassert (-A-) command line options. */
5000 make_assertion (str)
5003 enum node_type type = T_ASSERT;
5013 count = strlen (str);
5014 p = strchr (str, '=');
5017 /* Copy the entire option so we can modify it. Change the first
5018 "=" in the string to a '(', and tack a ')' on the end. */
5019 char *buf = (char *) alloca (count + 1);
5021 memcpy (buf, str, count);
5027 run_directive (str, count, type);
5030 /* Add output to `deps_buffer' for the -M switch.
5031 STRING points to the text to be output.
5032 SIZE is the number of bytes, or 0 meaning output until a null.
5033 If SIZE is nonzero, we break the line first, if it is long enough. */
5035 deps_output (string, size)
5039 #ifndef MAX_OUTPUT_COLUMNS
5040 #define MAX_OUTPUT_COLUMNS 75
5042 if (size != 0 && deps_column != 0
5043 && size + deps_column > MAX_OUTPUT_COLUMNS) {
5044 deps_output ("\\\n ", 0);
5049 size = strlen (string);
5051 if (deps_size + size + 1 > deps_allocated_size) {
5052 deps_allocated_size = deps_size + size + 50;
5053 deps_allocated_size *= 2;
5054 deps_buffer = (char *) xrealloc (deps_buffer, deps_allocated_size);
5056 memcpy (&deps_buffer[deps_size], string, size);
5058 deps_column += size;
5059 deps_buffer[deps_size] = 0;
5062 /* Get the file-mode and data size of the file open on FD
5063 and store them in *MODE_POINTER and *SIZE_POINTER. */
5066 file_size_and_mode (fd, mode_pointer, size_pointer)
5073 if (fstat (fd, &sbuf) < 0) return -1;
5074 if (mode_pointer) *mode_pointer = sbuf.st_mode;
5075 if (size_pointer) *size_pointer = sbuf.st_size;