1 /* C Compatible Compiler Preprocessor (CCCP)
2 Copyright (C) 1986, 1987, 1989, 2000, 2001 Free Software Foundation, Inc.
3 Written by Paul Rubin, June 1986
4 Adapted to ANSI C, Richard Stallman, Jan 1987
5 Dusted off, polished, and adapted for use as traditional
6 preprocessor only, Zack Weinberg, Jul 2000
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
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"
30 typedef unsigned char U_CHAR
;
32 /* Name under which this program was invoked. */
34 static const char *progname
;
36 /* Current maximum length of directory names in the search path
37 for include files. (Altered as we get more of them.) */
39 size_t max_include_len
;
41 /* Nonzero means copy comments into the output file. */
43 int put_out_comments
= 0;
45 /* mkdeps.h opaque structure that encapsulates dependency information. */
48 /* Nonzero means print the names of included files rather than
49 the preprocessed output. 1 means just the #include "...",
50 2 means #include <...> as well. */
54 /* Nonzero means print dummy targets for each header file. */
56 int print_deps_phony_targets
= 0;
58 /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
62 /* File name which deps are being written to. This is 0 if deps are
63 being written to stdout. */
65 const char *deps_file
= 0;
67 /* Nonzero if missing .h files in -M output are assumed to be
68 generated files and not errors. */
70 int deps_missing_files
= 0;
72 /* Nonzero means don't output line number information. */
76 /* Nonzero means inhibit output of the preprocessed text
77 and instead output the definitions of all user-defined macros
78 in a form suitable for use as input to cccp. */
82 /* Nonzero means don't print warning messages. -w. */
84 int inhibit_warnings
= 0;
86 /* Non-0 means don't output the preprocessed program. */
87 int inhibit_output
= 0;
89 /* Nonzero means chars are signed. */
90 #if DEFAULT_SIGNED_CHAR
91 int flag_signed_char
= 1;
93 int flag_signed_char
= 0;
96 /* Nonzero means warn if slash-star appears in a comment. */
100 /* Nonzero causes output not to be done,
101 but directives such as #define that have side effects
106 /* I/O buffer structure.
107 The `fname' field is nonzero for source files and #include files
108 and for the dummy text used for -D and -U.
109 It is zero for rescanning results of macro expansion
110 and for expanding macro arguments. */
111 #define INPUT_STACK_MAX 200
112 struct file_name_list
;
119 /* Macro that this level is the expansion of.
120 Included so that we can reenable the macro
121 at the end of this level. */
122 struct hashnode
*macro
;
123 /* Value of if_stack at start of this file.
124 Used to prohibit unmatched #endif (etc) in an include file. */
125 struct if_stack
*if_stack
;
126 /* Object to be freed at end of input at this level. */
128 /* Position to start scanning for #include_next in this file. */
129 struct file_name_list
*next_header_dir
;
130 } instack
[INPUT_STACK_MAX
];
132 typedef struct file_buf FILE_BUF
;
134 /* Current nesting level of input sources.
135 `instack[indepth]' is the level currently being read. */
137 #define CHECK_DEPTH(code) \
138 if (indepth >= (INPUT_STACK_MAX - 1)) \
140 error_with_line (line_for_error (instack[indepth].lineno), \
141 "macro or #include recursion too deep"); \
145 /* Current depth in #include directives that use <...>. */
146 int system_include_depth
= 0;
148 /* The output buffer. Its LENGTH field is the amount of room allocated
149 for the buffer, not the number of chars actually present. To get
150 that, subtract outbuf.buf from outbuf.bufp. */
152 #define OUTBUF_SIZE 10 /* initial size of output buffer */
155 /* Grow output buffer OBUF points at
156 so it can hold at least NEEDED more chars. */
158 #define check_expand(OBUF, NEEDED) do { \
159 if ((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \
160 grow_outbuf ((OBUF), (NEEDED)); \
163 struct file_name_list
165 struct file_name_list
*next
;
169 struct file_name_list
*include
= 0; /* First dir to search */
170 /* First dir to search for <file> */
171 struct file_name_list
*first_bracket_include
= 0;
172 struct file_name_list
*last_include
= 0; /* Last in chain */
174 /* List of included files that contained #once. */
175 struct file_name_list
*dont_repeat_files
= 0;
177 /* List of other included files. */
178 struct file_name_list
*all_include_files
= 0;
180 /* Structure allocated for every #define. For a simple replacement
183 nargs = -1, the `pattern' list is null, and the expansion is just
184 the replacement text. Nargs = 0 means a functionlike macro with no args,
186 #define getchar() getc (stdin) .
187 When there are args, the expansion is the replacement text with the
188 args squashed out, and the reflist is a list describing how to
189 build the output from the input: e.g., "3 chars, then the 1st arg,
190 then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
191 The chars here come from the expansion. Whatever is left of the
192 expansion after the last arg-occurrence is copied after that arg.
193 Note that the reflist can be arbitrarily long---
194 its length depends on the number of times the arguments appear in
195 the replacement text, not how many args there are. Example:
196 #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
198 { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
199 where (x, y) means (nchars, argno). */
201 typedef struct definition DEFINITION
;
204 int length
; /* length of expansion string */
207 struct reflist
*next
;
208 char stringify
; /* nonzero if this arg was preceded by a
210 char raw_before
; /* Nonzero if a ## operator before arg. */
211 char raw_after
; /* Nonzero if a ## operator after arg. */
212 int nchars
; /* Number of literal chars to copy before
213 this arg occurrence. */
214 int argno
; /* Number of arg to substitute (origin-0) */
216 /* Names of macro args, concatenated in reverse order
217 with comma-space between them.
218 The only use of this is that we warn on redefinition
219 if this differs between the old and new definitions. */
220 const U_CHAR
*argnames
;
223 /* Chained list of answers to an assertion. */
227 const unsigned char *answer
;
231 /* different kinds of things that can appear in the value field
232 of a hash node. Actually, this may be useless now. */
236 struct answer
*answers
;
239 /* The structure of a node in the hash table. The hash table
240 has entries for all tokens defined by #define commands (type T_MACRO),
241 plus some special tokens like __LINE__ (these each have their own
242 type, and the appropriate code is run when that type of node is seen.
243 It does not contain control words like "#define", which are recognized
244 by a separate piece of code. */
246 /* different flavors of hash nodes --- also used in keyword table */
248 T_DEFINE
= 1, /* `#define' */
249 T_INCLUDE
, /* `#include' */
250 T_INCLUDE_NEXT
,/* `#include_next' */
251 T_IFDEF
, /* `#ifdef' */
252 T_IFNDEF
, /* `#ifndef' */
254 T_ELSE
, /* `#else' */
255 T_ELIF
, /* `#elif' */
256 T_UNDEF
, /* `#undef' */
257 T_LINE
, /* `#line' */
258 T_ENDIF
, /* `#endif' */
259 T_ERROR
, /* `#error' */
260 T_WARNING
, /* `#warning' */
261 T_ASSERT
, /* `#assert' */
262 T_UNASSERT
, /* `#unassert' */
263 T_SPECLINE
, /* special symbol `__LINE__' */
264 T_DATE
, /* `__DATE__' */
265 T_FILE
, /* `__FILE__' */
266 T_BASE_FILE
, /* `__BASE_FILE__' */
267 T_INCLUDE_LEVEL
, /* `__INCLUDE_LEVEL__' */
268 T_VERSION
, /* `__VERSION__' */
269 T_TIME
, /* `__TIME__' */
270 T_CONST
, /* Constant value, used by `__STDC__' */
271 T_MACRO
, /* macro defined by `#define' */
272 T_SPEC_DEFINED
, /* special `defined' macro for use in #if statements */
273 T_UNUSED
/* Used for something not defined. */
277 struct hashnode
*next
; /* double links for easy deletion */
278 struct hashnode
*prev
;
279 struct hashnode
**bucket_hdr
; /* also, a back pointer to this node's hash
280 chain is kept, in case the node is the head
281 of the chain and gets deleted. */
282 enum node_type type
; /* type of special token */
283 int length
; /* length of token, for quick comparison */
284 U_CHAR
*name
; /* the actual name */
285 union hashval value
; /* pointer to expansion, or whatever */
288 typedef struct hashnode HASHNODE
;
290 static HASHNODE
*parse_assertion
PARAMS ((const unsigned char *,
291 const unsigned char *,
292 struct answer
**, int));
293 static struct answer
**find_answer
PARAMS ((HASHNODE
*,
294 const struct answer
*));
295 static int parse_answer
PARAMS ((const unsigned char *, const unsigned char *,
296 struct answer
**, int));
297 static unsigned char *canonicalize_text
PARAMS ((const unsigned char *,
298 const unsigned char *,
299 const unsigned char **));
301 /* Some definitions for the hash table. The hash function MUST be
302 computed as shown in hashf () below. That is because the rescan
303 loop computes the hash value `on the fly' for most tokens,
304 in order to avoid the overhead of a lot of procedure calls to
305 the hashf () function. Hashf () only exists for the sake of
306 politeness, for use when speed isn't so important. */
308 #define HASHSIZE 1403
309 HASHNODE
*hashtab
[HASHSIZE
];
310 #define HASHSTEP(old, c) ((old << 2) + c)
311 #define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
313 /* `struct directive' defines one #-directive, including how to handle it. */
316 const int length
; /* Length of name */
317 void (*const func
) PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
318 /* Function to handle directive */
319 const char *const name
; /* Name of directive */
320 const enum node_type type
; /* Code which describes which directive. */
323 /* Last arg to output_line_command. */
324 enum file_change_code
{same_file
, enter_file
, leave_file
};
326 /* This structure represents one parsed argument in a macro call.
327 `raw' points to the argument text as written (`raw_length' is its length).
328 `expanded' points to the argument's macro-expansion
329 (its length is `expand_length').
330 `stringified_length' is the length the argument would have
332 `free1' and `free2', if nonzero, point to blocks to be freed
333 when the macro argument data is no longer needed. */
336 U_CHAR
*raw
, *expanded
;
337 int raw_length
, expand_length
;
338 int stringified_length
;
339 U_CHAR
*free1
, *free2
;
344 /* The arglist structure is built by do_define to tell
345 collect_definition where the argument names begin. That
346 is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
347 would contain pointers to the strings x, y, and z.
348 Collect_definition would then build a DEFINITION node,
349 with reflist nodes pointing to the places x, y, and z had
350 appeared. So the arglist is just convenience data passed
351 between these two routines. It is not kept around after
352 the current #define has been processed and entered into the
356 struct arglist
*next
;
362 /* Function prototypes. */
364 static void do_define
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
365 static void do_error
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
366 static void do_warning
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
367 static void do_line
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
368 static void do_include
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
369 static void do_include_next
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
370 static void do_undef
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
371 static void do_if
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
372 static void do_ifdef
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
373 static void do_ifndef
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
374 static void do_else
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
375 static void do_elif
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
376 static void do_endif
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
377 static void do_assert
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
378 static void do_unassert
PARAMS ((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
379 static void do_xifdef
PARAMS ((U_CHAR
*, U_CHAR
*, enum node_type
));
381 static struct hashnode
*install
PARAMS ((const U_CHAR
*, int, enum node_type
, int));
382 static int hashf
PARAMS ((const U_CHAR
*, int, int));
383 static int compare_defs
PARAMS ((DEFINITION
*, DEFINITION
*));
384 static int comp_def_part
PARAMS ((int, const U_CHAR
*, int,
385 const U_CHAR
*, int, int));
386 static void delete_macro
PARAMS ((HASHNODE
*));
388 /* First arg to v_message. */
389 enum msgtype
{ MT_WARNING
= 0, MT_ERROR
, MT_FATAL
};
390 static void v_message
PARAMS ((enum msgtype mtype
, int line
,
391 const char *msgid
, va_list ap
))
392 ATTRIBUTE_PRINTF (3, 0);
394 static int line_for_error
PARAMS ((int));
396 /* We know perfectly well which file this is, so we don't need to
399 #if (GCC_VERSION >= 2007)
400 #define abort() fancy_abort(__LINE__, __FUNCTION__)
402 #define abort() fancy_abort(__LINE__, 0);
405 static void macroexpand
PARAMS ((HASHNODE
*, FILE_BUF
*));
406 static void special_symbol
PARAMS ((HASHNODE
*, FILE_BUF
*));
407 static void dump_all_macros
PARAMS ((void));
408 static void dump_defn_1
PARAMS ((const U_CHAR
*, int, int));
409 static void dump_arg_n
PARAMS ((DEFINITION
*, int));
410 static void conditional_skip
PARAMS ((FILE_BUF
*, int, enum node_type
));
411 static void skip_if_group
PARAMS ((FILE_BUF
*, int));
412 static void output_line_command
PARAMS ((FILE_BUF
*, FILE_BUF
*,
413 int, enum file_change_code
));
415 static int eval_if_expression
PARAMS ((const U_CHAR
*, int));
417 static void output_deps
PARAMS ((void));
418 static void initialize_builtins
PARAMS ((void));
419 static void run_directive
PARAMS ((const char *, size_t,
421 static void make_definition
PARAMS ((const char *));
422 static void make_undef
PARAMS ((const char *));
423 static void make_assertion
PARAMS ((const char *));
425 static void grow_outbuf
PARAMS ((FILE_BUF
*, int));
426 static int handle_directive
PARAMS ((FILE_BUF
*, FILE_BUF
*));
427 static void process_include
PARAMS ((struct file_name_list
*,
428 const U_CHAR
*, int, int, FILE_BUF
*));
429 static void fixup_newlines
PARAMS ((FILE_BUF
*));
430 static void finclude
PARAMS ((int, const char *,
431 struct file_name_list
*, FILE_BUF
*));
432 static void init_dependency_output
PARAMS ((void));
433 static void rescan
PARAMS ((FILE_BUF
*, int));
434 static void newline_fix
PARAMS ((U_CHAR
*));
435 static void name_newline_fix
PARAMS ((U_CHAR
*));
436 static U_CHAR
*macarg1
PARAMS ((U_CHAR
*, const U_CHAR
*, int *,
438 static const char *macarg
PARAMS ((struct argdata
*));
439 static int discard_comments
PARAMS ((U_CHAR
*, int, int));
440 static int file_size_and_mode
PARAMS ((int, int *, long *));
442 static U_CHAR
*skip_to_end_of_comment
PARAMS ((FILE_BUF
*, int *));
443 static U_CHAR
*skip_quoted_string
PARAMS ((const U_CHAR
*, const U_CHAR
*,
444 int, int *, int *, int *));
446 int main
PARAMS ((int, char **));
448 /* Convenience. Write U"string" to get an unsigned string constant. */
449 #define U (const unsigned char *)
451 /* Here is the actual list of #-directives, most-often-used first. */
453 static const struct directive directive_table
[] = {
454 { 6, do_define
, "define", T_DEFINE
},
455 { 7, do_include
, "include", T_INCLUDE
},
456 { 5, do_endif
, "endif", T_ENDIF
},
457 { 5, do_ifdef
, "ifdef", T_IFDEF
},
458 { 2, do_if
, "if", T_IF
, },
459 { 4, do_else
, "else", T_ELSE
},
460 { 6, do_ifndef
, "ifndef", T_IFNDEF
},
461 { 5, do_undef
, "undef", T_UNDEF
},
462 { 4, do_line
, "line", T_LINE
},
463 { 4, do_elif
, "elif", T_ELIF
},
464 { 5, do_error
, "error", T_ERROR
},
465 { 7, do_warning
, "warning", T_WARNING
},
466 { 12, do_include_next
, "include_next", T_INCLUDE_NEXT
},
467 { 6, do_assert
, "assert", T_ASSERT
},
468 { 8, do_unassert
,"unassert",T_UNASSERT
},
469 { -1, 0, "", T_UNUSED
},
472 #define SKIP_WHITE_SPACE(p) do { while (is_nvspace(*p)) p++; } while (0)
473 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space(*p)) p++; } while (0)
475 int errors
= 0; /* Error counter for exit code */
477 static FILE_BUF expand_to_temp_buffer
PARAMS ((const U_CHAR
*, const U_CHAR
*, int));
478 static DEFINITION
*collect_expansion
PARAMS ((U_CHAR
*, U_CHAR
*, int,
481 /* Stack of conditionals currently in progress
482 (including both successful and failing conditionals). */
485 struct if_stack
*next
; /* for chaining to the next stack frame */
486 const char *fname
; /* copied from input when frame is made */
487 int lineno
; /* similarly */
488 int if_succeeded
; /* true if a leg of this if-group
489 has been passed through rescan */
490 enum node_type type
; /* type of last directive seen in this group */
492 typedef struct if_stack IF_STACK_FRAME
;
493 IF_STACK_FRAME
*if_stack
= NULL
;
495 /* Nonzero means -I- has been seen,
496 so don't look for #include "foo" the source-file directory. */
499 /* Pending directives. */
500 enum pending_dir_t
{PD_NONE
= 0, PD_DEFINE
, PD_UNDEF
, PD_ASSERTION
, PD_FILE
};
502 typedef struct pending_dir pending_dir
;
506 enum pending_dir_t type
;
516 const char *in_fname
, *out_fname
;
519 pending_dir
*pend
= (pending_dir
*) xcalloc (argc
, sizeof (pending_dir
));
520 int no_standard_includes
= 0;
525 /* Get rid of any avoidable limit on stack size. */
529 /* Set the stack limit huge so that alloca (particularly stringtab
530 * in dbxread.c) does not fail. */
531 getrlimit (RLIMIT_STACK
, &rlim
);
532 rlim
.rlim_cur
= rlim
.rlim_max
;
533 setrlimit (RLIMIT_STACK
, &rlim
);
535 #endif /* RLIMIT_STACK defined */
542 no_line_commands
= 0;
546 max_include_len
= cpp_GCC_INCLUDE_DIR_len
+ 7; /* ??? */
550 /* It's simplest to just create this struct whether or not it will
554 /* Process switches and find input file name. */
556 for (i
= 1; i
< argc
; i
++) {
557 if (argv
[i
][0] != '-') {
558 if (out_fname
!= NULL
)
559 fatal ("usage: %s [switches] input output", argv
[0]);
560 else if (in_fname
!= NULL
)
570 break; /* Ignore for compatibility with ISO/extended cpp. */
573 if (!strcmp (argv
[i
], "-lang-c++")
574 || !strcmp (argv
[i
], "-lang-objc++"))
575 fatal ("-traditional is not supported in C++");
576 else if (!strcmp (argv
[i
], "-lang-c89"))
577 fatal ("-traditional and -ansi are mutually exclusive");
578 else if (!strcmp (argv
[i
], "-lang-objc"))
579 pend
[i
].type
= PD_DEFINE
, pend
[i
].arg
= "__OBJC__";
580 else if (!strcmp (argv
[i
], "-lang-asm"))
581 pend
[i
].type
= PD_DEFINE
, pend
[i
].arg
= "__ASSEMBLER__";
582 else if (!strcmp (argv
[i
], "-lang-fortran"))
583 pend
[i
].type
= PD_DEFINE
, pend
[i
].arg
= "_LANGUAGE_FORTRAN";
584 /* All other possibilities ignored. */
588 if (!strcmp (argv
[i
], "-include"))
591 fatal ("filename missing after -i option");
593 pend
[i
].type
= PD_FILE
, pend
[i
].arg
= argv
[i
+ 1], i
++;
595 else if (!strcmp (argv
[i
], "-iprefix"))
596 i
++; /* Ignore for compatibility */
597 else if (!strcmp (argv
[i
], "-isystem")
598 || !strcmp (argv
[i
], "-iwithprefix")
599 || !strcmp (argv
[i
], "-iwithprefixbefore")
600 || !strcmp (argv
[i
], "-idirafter"))
601 goto add_include
; /* best we can do */
606 if (out_fname
!= NULL
)
607 fatal ("output filename specified twice");
609 fatal ("filename missing after -o option");
610 out_fname
= argv
[++i
];
611 if (!strcmp (out_fname
, "-"))
616 inhibit_warnings
= 1;
620 if (!strcmp (argv
[i
], "-Wcomments"))
622 else if (!strcmp (argv
[i
], "-Wcomment"))
624 else if (!strcmp (argv
[i
], "-Wall")) {
630 if (!strcmp (argv
[i
], "-fsigned-char"))
631 flag_signed_char
= 1;
632 else if (!strcmp (argv
[i
], "-funsigned-char"))
633 flag_signed_char
= 0;
636 /* Ignore target-specific and optimization flags. */
645 /* -MD and -MMD for tradcpp are deprecated and undocumented
646 (use -M or -MM with -MF instead), and probably should be
647 removed with the next major GCC version. For the moment
648 we allow these for the benefit of Automake 1.4, which
649 uses these when dependency tracking is enabled. Automake
650 1.5 will fix this. */
651 if (!strncmp (argv
[i
], "-MD", 3)) {
654 } else if (!strncmp (argv
[i
], "-MMD", 4)) {
657 } else if (!strcmp (argv
[i
], "-M")) {
659 } else if (!strcmp (argv
[i
], "-MM")) {
661 } else if (!strcmp (argv
[i
], "-MG")) {
662 deps_missing_files
= 1;
663 } else if (!strcmp (argv
[i
], "-MF")) {
665 } else if (!strcmp (argv
[i
], "-MP")) {
666 print_deps_phony_targets
= 1;
667 } else if (!strcmp (argv
[i
], "-MQ") || !strcmp (argv
[i
], "-MT")) {
668 /* Add a target. -MQ quotes for Make. */
669 const char *tgt
= argv
[i
] + 3;
670 int quoted
= argv
[i
][2] == 'Q';
672 if (*tgt
== '\0' && i
+ 1 == argc
)
673 fatal ("target missing after %s option", argv
[i
]);
679 deps_add_target (deps
, tgt
, quoted
);
686 else if (i
+ 1 == argc
)
687 fatal ("filename missing after %s option", argv
[i
]);
689 deps_file
= argv
[++i
];
700 fprintf (stderr
, "GNU traditional CPP version %s\n", version_string
);
711 else if (i
+ 1 == argc
)
712 fatal ("macro name missing after -%c option", c
);
717 pend
[i
].type
= PD_DEFINE
;
719 pend
[i
].type
= PD_UNDEF
;
721 pend
[i
].type
= PD_ASSERTION
;
727 put_out_comments
= 1;
731 if (!strcmp (argv
[i
], "-pedantic"))
732 fatal ("-pedantic and -traditional are mutually exclusive");
736 if (!strcmp (argv
[i
], "-trigraphs"))
737 fatal ("-trigraphs and -traditional are mutually exclusive");
741 no_line_commands
= 1;
744 case 'I': /* Add directory to path for includes. */
747 struct file_name_list
*dirtmp
;
749 if (! ignore_srcdir
&& !strcmp (argv
[i
] + 2, "-"))
752 dirtmp
= (struct file_name_list
*)
753 xmalloc (sizeof (struct file_name_list
));
754 dirtmp
->next
= 0; /* New one goes on the end */
758 last_include
->next
= dirtmp
;
759 last_include
= dirtmp
; /* Tail follows the last one */
760 if (argv
[i
][1] == 'I' && argv
[i
][2] != 0)
761 dirtmp
->fname
= argv
[i
] + 2;
762 else if (i
+ 1 == argc
)
763 fatal ("directory name missing after -I option");
765 dirtmp
->fname
= argv
[++i
];
766 if (strlen (dirtmp
->fname
) > max_include_len
)
767 max_include_len
= strlen (dirtmp
->fname
);
768 if (ignore_srcdir
&& first_bracket_include
== 0)
769 first_bracket_include
= dirtmp
;
775 /* -nostdinc causes no default include directories.
776 You must specify all include-file directories with -I. */
777 no_standard_includes
= 1;
781 /* Accept -quiet silently. */
784 case '\0': /* JF handle '-' as file name meaning stdin or stdout */
785 if (in_fname
== NULL
) {
788 } else if (out_fname
== NULL
) {
791 } /* else fall through into error */
794 fatal ("invalid option `%s'", argv
[i
]);
799 init_dependency_output ();
801 /* After checking the environment variables, check if -M or -MM has
802 not been specified, but other -M options have. */
804 && (deps_missing_files
|| deps_file
|| print_deps_phony_targets
))
805 fatal ("you must additionally specify either -M or -MM");
809 /* Set the default target (if there is none already), and
810 the dependency on the main file. */
811 deps_add_default_target (deps
, in_fname
);
813 deps_add_dep (deps
, in_fname
);
816 /* Install __LINE__, etc. Must follow option processing. */
817 initialize_builtins ();
819 /* Do defines specified with -D and undefines specified with -U. */
820 for (i
= 1; i
< argc
; i
++)
821 if (pend
[i
].type
== PD_DEFINE
)
822 make_definition (pend
[i
].arg
);
823 else if (pend
[i
].type
== PD_UNDEF
)
824 make_undef (pend
[i
].arg
);
825 else if (pend
[i
].type
== PD_ASSERTION
)
826 make_assertion (pend
[i
].arg
);
828 /* Unless -fnostdinc,
829 tack on the standard include file dirs to the specified list */
830 if (!no_standard_includes
) {
831 const struct default_include
*di
;
832 struct file_name_list
*old_last_include
= last_include
;
833 struct file_name_list
*dirtmp
;
834 for (di
= cpp_include_defaults
; di
->fname
; di
++) {
837 dirtmp
= (struct file_name_list
*)
838 xmalloc (sizeof (struct file_name_list
));
839 dirtmp
->next
= 0; /* New one goes on the end */
843 last_include
->next
= dirtmp
;
844 last_include
= dirtmp
; /* Tail follows the last one */
845 dirtmp
->fname
= di
->fname
;
846 if (strlen (dirtmp
->fname
) > max_include_len
)
847 max_include_len
= strlen (dirtmp
->fname
);
850 if (ignore_srcdir
&& first_bracket_include
== 0)
851 first_bracket_include
= old_last_include
->next
;
854 /* Initialize output buffer */
856 outbuf
.buf
= (U_CHAR
*) xmalloc (OUTBUF_SIZE
);
857 outbuf
.bufp
= outbuf
.buf
;
858 outbuf
.length
= OUTBUF_SIZE
;
860 /* Scan the -i files before the main input.
861 Much like #including them, but with no_output set
862 so that only their macro definitions matter. */
866 for (i
= 1; i
< argc
; i
++)
867 if (pend
[i
].type
== PD_FILE
)
869 int fd
= open (pend
[i
].arg
, O_RDONLY
, 0666);
872 perror_with_name (pend
[i
].arg
);
873 return FATAL_EXIT_CODE
;
876 /* For -M, add this file to the dependencies. */
878 deps_add_dep (deps
, pend
[i
].arg
);
880 finclude (fd
, pend
[i
].arg
, 0, &outbuf
);
885 /* Pending directives no longer needed. */
888 /* Create an input stack level for the main input file
889 and copy the entire contents of the file into it. */
891 fp
= &instack
[++indepth
];
893 /* JF check for stdin */
894 if (in_fname
== NULL
|| *in_fname
== 0) {
897 } else if ((f
= open (in_fname
, O_RDONLY
, 0666)) < 0)
900 if (file_size_and_mode (f
, &st_mode
, &st_size
))
902 fp
->fname
= in_fname
;
904 /* JF all this is mine about reading pipes and ttys */
905 if (!S_ISREG (st_mode
)) {
906 /* Read input from a file that is not a normal disk file.
907 We cannot preallocate a buffer with the correct size,
908 so we must read in the file a piece at the time and make it bigger. */
916 fp
->buf
= (U_CHAR
*) xmalloc (bsize
+ 2);
919 cnt
= read (f
, bufp
, bsize
- size
);
920 if (cnt
< 0) goto sys_error
; /* error! */
921 if (cnt
== 0) break; /* End of file */
924 if (bsize
== size
) { /* Buffer is full! */
926 fp
->buf
= (U_CHAR
*) xrealloc (fp
->buf
, bsize
+ 2);
927 bufp
= fp
->buf
+ size
; /* May have moved */
932 /* Read a file whose size we can determine in advance.
933 For the sake of VMS, st_size is just an upper bound. */
936 fp
->buf
= (U_CHAR
*) xmalloc (st_size
+ 2);
938 while (st_size
> 0) {
939 i
= read (f
, fp
->buf
+ fp
->length
, st_size
);
949 fp
->if_stack
= if_stack
;
952 /* Make sure data ends with a newline. And put a null after it. */
954 if (fp
->length
> 0 && fp
->buf
[fp
->length
-1] != '\n')
955 fp
->buf
[fp
->length
++] = '\n';
956 fp
->buf
[fp
->length
] = '\0';
958 /* Now that we know the input file is valid, open the output. */
960 if (!out_fname
|| !strcmp (out_fname
, ""))
961 out_fname
= "stdout";
962 else if (! freopen (out_fname
, "w", stdout
))
963 pfatal_with_name (out_fname
);
965 output_line_command (fp
, &outbuf
, 0, same_file
);
967 /* Scan the input, processing macros and directives. */
971 /* Now we have processed the entire input
972 Write whichever kind of output has been requested. */
977 else if (! inhibit_output
)
978 if (write (fileno (stdout
), outbuf
.buf
, outbuf
.bufp
- outbuf
.buf
) < 0)
979 fatal ("I/O error on output");
981 /* Don't write the deps file if preprocessing has failed. */
982 if (print_deps
&& errors
== 0)
985 /* Destruct the deps object. */
989 fatal ("I/O error on output");
992 exit (FATAL_EXIT_CODE
);
993 exit (SUCCESS_EXIT_CODE
);
996 pfatal_with_name (in_fname
);
999 /* Set up dependency-file output. */
1001 init_dependency_output ()
1003 char *spec
, *s
, *output_file
;
1005 /* Either of two environment variables can specify output of deps.
1006 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
1007 where OUTPUT_FILE is the file to write deps info to
1008 and DEPS_TARGET is the target to mention in the deps. */
1010 if (print_deps
== 0)
1012 spec
= getenv ("DEPENDENCIES_OUTPUT");
1017 spec
= getenv ("SUNPRO_DEPENDENCIES");
1024 /* Find the space before the DEPS_TARGET, if there is one. */
1025 s
= strchr (spec
, ' ');
1028 /* Let the caller perform MAKE quoting. */
1029 deps_add_target (deps
, s
+ 1, 0);
1030 output_file
= (char *) xmalloc (s
- spec
+ 1);
1031 memcpy (output_file
, spec
, s
- spec
);
1032 output_file
[s
- spec
] = 0;
1037 /* Command line overrides environment variables. */
1039 deps_file
= output_file
;
1043 /* If dependencies go to standard output, or -MG is used, we should
1044 suppress output. The user may be requesting other stuff to
1045 stdout, with -dM, -v etc. We let them shoot themselves in the
1047 if (deps_file
== 0 || deps_missing_files
)
1051 /* Use mkdeps.c to output dependency information. */
1055 /* Stream on which to print the dependency information. */
1056 FILE *deps_stream
= 0;
1057 const char *const deps_mode
= deps_append
? "a" : "w";
1060 deps_stream
= stdout
;
1063 deps_stream
= fopen (deps_file
, deps_mode
);
1064 if (deps_stream
== 0)
1066 error_from_errno (deps_file
);
1071 deps_write (deps
, deps_stream
, 72);
1073 if (print_deps_phony_targets
)
1074 deps_phony_targets (deps
, deps_stream
);
1076 /* Don't close stdout. */
1079 if (ferror (deps_stream
) || fclose (deps_stream
) != 0)
1080 fatal ("I/O error on output");
1084 /* Move all backslash-newline pairs out of embarrassing places.
1085 Exchange all such pairs following BP
1086 with any potentially-embarrasing characters that follow them.
1087 Potentially-embarrassing characters are / and *
1088 (because a backslash-newline inside a comment delimiter
1089 would cause it not to be recognized). */
1097 /* First count the backslash-newline pairs here. */
1099 while (*p
++ == '\\' && *p
++ == '\n')
1104 /* Exit if what follows the backslash-newlines is not embarrassing. */
1106 if (count
== 0 || (*p
!= '/' && *p
!= '*'))
1109 /* Copy all potentially embarrassing characters
1110 that follow the backslash-newline pairs
1111 down to where the pairs originally started. */
1113 while (*p
== '*' || *p
== '/')
1116 /* Now write the same number of pairs after the embarrassing chars. */
1117 while (count
-- > 0) {
1123 /* Like newline_fix but for use within a directive-name.
1124 Move any backslash-newlines up past any following symbol constituents. */
1126 name_newline_fix (bp
)
1132 /* First count the backslash-newline pairs here. */
1134 while (*p
++ == '\\' && *p
++ == '\n')
1139 /* What follows the backslash-newlines is not embarrassing. */
1141 if (count
== 0 || !is_idchar (*p
))
1144 /* Copy all potentially embarrassing characters
1145 that follow the backslash-newline pairs
1146 down to where the pairs originally started. */
1148 while (is_idchar (*p
))
1151 /* Now write the same number of pairs after the embarrassing chars. */
1152 while (count
-- > 0) {
1159 * The main loop of the program.
1161 * Read characters from the input stack, transferring them to the
1164 * Macros are expanded and push levels on the input stack.
1165 * At the end of such a level it is popped off and we keep reading.
1166 * At the end of any other kind of level, we return.
1167 * #-directives are handled, except within macros.
1169 * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input
1170 * and insert them when appropriate. This is set while scanning macro
1171 * arguments before substitution. It is zero when scanning for final output.
1172 * There are three types of Newline markers:
1173 * * Newline - follows a macro name that was not expanded
1174 * because it appeared inside an expansion of the same macro.
1175 * This marker prevents future expansion of that identifier.
1176 * When the input is rescanned into the final output, these are deleted.
1177 * These are also deleted by ## concatenation.
1178 * * Newline Space (or Newline and any other whitespace character)
1179 * stands for a place that tokens must be separated or whitespace
1180 * is otherwise desirable, but where the ANSI standard specifies there
1181 * is no whitespace. This marker turns into a Space (or whichever other
1182 * whitespace char appears in the marker) in the final output,
1183 * but it turns into nothing in an argument that is stringified with #.
1184 * Such stringified arguments are the only place where the ANSI standard
1185 * specifies with precision that whitespace may not appear.
1187 * During this function, IP->bufp is kept cached in IBP for speed of access.
1188 * Likewise, OP->bufp is kept in OBP. Before calling a subroutine
1189 * IBP, IP and OBP must be copied back to memory. IP and IBP are
1190 * copied back with the RECACHE macro. OBP must be copied back from OP->bufp
1191 * explicitly, and before RECACHE, since RECACHE uses OBP.
1195 rescan (op
, output_marks
)
1199 /* Character being scanned in main loop. */
1202 /* Length of pending accumulated identifier. */
1203 int ident_length
= 0;
1205 /* Hash code of pending accumulated identifier. */
1208 /* Current input level (&instack[indepth]). */
1211 /* Pointer for scanning input. */
1214 /* Pointer to end of input. End of scan is controlled by LIMIT. */
1217 /* Pointer for storing output. */
1220 /* REDO_CHAR is nonzero if we are processing an identifier
1221 after backing up over the terminating character.
1222 Sometimes we process an identifier without backing up over
1223 the terminating character, if the terminating character
1224 is not special. Backing up is done so that the terminating character
1225 will be dispatched on again once the identifier is dealt with. */
1228 /* 1 if within an identifier inside of which a concatenation
1229 marker (Newline -) has been seen. */
1230 int concatenated
= 0;
1232 /* While scanning a comment or a string constant,
1233 this records the line it started on, for error messages. */
1236 /* Record position of last `real' newline. */
1237 U_CHAR
*beg_of_line
;
1239 /* This has to be a global bacause of RECACHE. */
1240 U_CHAR
*obufp_before_macroname
= NULL
;
1242 /* Pop the innermost input stack level, assuming it is a macro expansion. */
1245 do { ip->macro->type = T_MACRO; \
1246 if (ip->free_ptr) free (ip->free_ptr); \
1247 --indepth; } while (0)
1249 /* Reload `rescan's local variables that describe the current
1250 level of the input stack. */
1253 do { ip = &instack[indepth]; \
1255 limit = ip->buf + ip->length; \
1257 check_expand (op, limit - ibp); \
1259 obufp_before_macroname += op->bufp - obp; \
1260 obp = op->bufp; } while (0)
1262 if (no_output
&& instack
[indepth
].fname
!= 0)
1263 skip_if_group (&instack
[indepth
], 1);
1269 /* Our caller must always put a null after the end of
1270 the input at each input stack level. */
1283 /* Always merge lines ending with backslash-newline,
1284 even in middle of identifier. */
1287 --obp
; /* remove backslash from obuf */
1290 /* Otherwise, backslash suppresses specialness of following char,
1291 so copy it here to prevent the switch from seeing it.
1292 But first get any pending identifier processed. */
1293 if (ident_length
> 0)
1299 /* If this is expanding a macro definition, don't recognize
1300 preprocessor directives. */
1306 /* # keyword: a # must be the first char on the line */
1307 if (beg_of_line
== 0)
1309 if (beg_of_line
+ 1 != ibp
)
1312 /* This # can start a directive. */
1314 --obp
; /* Don't copy the '#' */
1318 if (! handle_directive (ip
, op
)) {
1322 /* Not a known directive: treat it as ordinary text.
1323 IP, OP, IBP, etc. have not been changed. */
1324 if (no_output
&& instack
[indepth
].fname
) {
1325 /* If not generating expanded output,
1326 what we do with ordinary text is skip it.
1327 Discard everything until next # directive. */
1328 skip_if_group (&instack
[indepth
], 1);
1333 ++obp
; /* Copy the '#' after all */
1339 /* A # directive has been successfully processed. */
1340 /* If not generating expanded output, ignore everything until
1341 next # directive. */
1342 if (no_output
&& instack
[indepth
].fname
)
1343 skip_if_group (&instack
[indepth
], 1);
1349 case '\"': /* skip quoted string */
1351 /* A single quoted string is treated like a double -- some
1352 programs (e.g., troff) are perverse this way */
1357 start_line
= ip
->lineno
;
1359 /* Skip ahead to a matching quote. */
1363 if (ip
->macro
!= 0) {
1364 /* try harder: this string crosses a macro expansion boundary */
1376 /* Traditionally, end of line ends a string constant with no error.
1377 So exit the loop and record the new line. */
1385 /* Backslash newline is replaced by nothing at all,
1386 but keep the line counts correct. */
1391 /* ANSI stupidly requires that in \\ the second \
1392 is *not* prevented from combining with a newline. */
1393 while (*ibp
== '\\' && ibp
[1] == '\n') {
1412 if (*ibp
== '\\' && ibp
[1] == '\n')
1414 /* Don't look for comments inside a macro definition. */
1417 /* A comment constitutes white space, so it can terminate an identifier.
1418 Process the identifier, if any. */
1425 /* We have a comment. Skip it, optionally copying it to output. */
1427 start_line
= ip
->lineno
;
1429 ++ibp
; /* Skip the star. */
1431 /* In K+R C, a comment is equivalent to nothing. Note that we
1432 already output the slash; we might not want it. */
1433 if (! put_out_comments
)
1439 U_CHAR
*before_bp
= ibp
;
1441 while (ibp
< limit
) {
1444 if (warn_comments
&& ibp
< limit
&& *ibp
== '*')
1445 warning("`/*' within comment");
1448 if (*ibp
== '\\' && ibp
[1] == '\n')
1450 if (ibp
>= limit
|| *ibp
== '/')
1455 /* Copy the newline into the output buffer, in order to
1456 avoid the pain of a #line every time a multiline comment
1458 if (!put_out_comments
)
1466 error_with_line (line_for_error (start_line
),
1467 "unterminated comment");
1470 if (put_out_comments
) {
1471 memcpy (obp
, before_bp
, ibp
- before_bp
);
1472 obp
+= ibp
- before_bp
;
1478 case '0': case '1': case '2': case '3': case '4':
1479 case '5': case '6': case '7': case '8': case '9':
1480 /* If digit is not part of identifier, it starts a number,
1481 which means that following letters are not an identifier.
1482 "0x5" does not refer to an identifier "x5".
1483 So copy all alphanumerics that follow without accumulating
1484 as an identifier. Periods also, for sake of "3.e7". */
1486 if (ident_length
== 0) {
1487 while (ibp
< limit
) {
1488 while (ibp
< limit
&& ibp
[0] == '\\' && ibp
[1] == '\n') {
1493 if (! ISIDNUM (c
) && c
!= '.') {
1498 /* A sign can be part of a preprocessing number
1499 if it follows an e. */
1500 if (c
== 'e' || c
== 'E') {
1501 while (ibp
< limit
&& ibp
[0] == '\\' && ibp
[1] == '\n') {
1505 if (ibp
< limit
&& (*ibp
== '+' || *ibp
== '-')) {
1507 /* Traditional C does not let the token go past the sign. */
1517 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
1518 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
1519 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
1520 case 's': case 't': case 'u': case 'v': case 'w': case 'x':
1522 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
1523 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
1524 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
1525 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
1528 /* Compute step of hash function, to avoid a proc call on every token */
1529 hash
= HASHSTEP (hash
, c
);
1533 /* If reprocessing a macro expansion, newline is a special marker. */
1534 if (ip
->macro
!= 0) {
1535 /* Newline White is a "funny space" to separate tokens that are
1536 supposed to be separate but without space between.
1537 Here White means any horizontal whitespace character.
1538 Newline - marks a recursive macro use that is not
1539 supposed to be expandable. */
1542 /* Newline - inhibits expansion of preceding token.
1543 If expanding a macro arg, we keep the newline -.
1544 In final output, it is deleted. */
1545 if (! concatenated
) {
1550 if (!output_marks
) {
1553 /* If expanding a macro arg, keep the newline -. */
1556 } else if (is_space (*ibp
)) {
1557 /* Newline Space does not prevent expansion of preceding token
1558 so expand the preceding token and then come back. */
1559 if (ident_length
> 0)
1562 /* If generating final output, newline space makes a space. */
1563 if (!output_marks
) {
1565 /* And Newline Newline makes a newline, so count it. */
1566 if (obp
[-1] == '\n')
1569 /* If expanding a macro arg, keep the newline space.
1570 If the arg gets stringified, newline space makes nothing. */
1573 } else abort (); /* Newline followed by something random? */
1577 /* If there is a pending identifier, handle it and come back here. */
1578 if (ident_length
> 0)
1583 /* Update the line counts and output a #line if necessary. */
1586 if (ip
->lineno
!= op
->lineno
) {
1588 output_line_command (ip
, op
, 1, same_file
);
1589 check_expand (op
, ip
->length
- (ip
->bufp
- ip
->buf
));
1594 /* Come here either after (1) a null character that is part of the input
1595 or (2) at the end of the input, because there is a null there. */
1598 /* Our input really contains a null character. */
1601 /* At end of a macro-expansion level, pop it and read next level. */
1602 if (ip
->macro
!= 0) {
1605 /* If we have an identifier that ends here, process it now, so
1606 we get the right error for recursion. */
1607 if (ident_length
&& ! is_idchar (*instack
[indepth
- 1].bufp
)) {
1616 /* If we don't have a pending identifier,
1617 return at end of input. */
1618 if (ident_length
== 0) {
1626 /* If we do have a pending identifier, just consider this null
1627 a special character and arrange to dispatch on it again.
1628 The second time, IDENT_LENGTH will be zero so we will return. */
1634 /* Handle the case of a character such as /, ', " or null
1635 seen following an identifier. Back over it so that
1636 after the identifier is processed the special char
1637 will be dispatched on again. */
1647 if (ident_length
> 0) {
1650 /* We have just seen an identifier end. If it's a macro, expand it.
1652 IDENT_LENGTH is the length of the identifier
1653 and HASH is its hash code.
1655 The identifier has already been copied to the output,
1656 so if it is a macro we must remove it.
1658 If REDO_CHAR is 0, the char that terminated the identifier
1659 has been skipped in the output and the input.
1660 OBP-IDENT_LENGTH-1 points to the identifier.
1661 If the identifier is a macro, we must back over the terminator.
1663 If REDO_CHAR is 1, the terminating char has already been
1664 backed over. OBP-IDENT_LENGTH points to the identifier. */
1666 for (hp
= hashtab
[MAKE_POS (hash
) % HASHSIZE
]; hp
!= NULL
;
1669 if (hp
->length
== ident_length
) {
1670 /* obufp_before_macroname is used only in this block,
1671 but it has to be global because of RECACHE. */
1672 int op_lineno_before_macroname
;
1673 int i
= ident_length
;
1674 U_CHAR
*p
= hp
->name
;
1675 U_CHAR
*q
= obp
- i
;
1680 do { /* All this to avoid a strncmp () */
1685 /* We found a use of a macro name.
1686 see if the context shows it is a macro call. */
1688 /* Back up over terminating character if not already done. */
1694 obufp_before_macroname
= obp
- ident_length
;
1695 op_lineno_before_macroname
= op
->lineno
;
1697 /* If macro wants an arglist, verify that a '(' follows.
1698 first skip all whitespace, copying it to the output
1699 after the macro name. Then, if there is no '(',
1700 decide this is not a macro call and leave things that way. */
1701 if (hp
->type
== T_MACRO
&& hp
->value
.defn
->nargs
>= 0)
1704 /* Scan forward over whitespace, copying it to the output. */
1705 if (ibp
== limit
&& ip
->macro
!= 0) {
1709 /* A comment: copy it unchanged or discard it. */
1710 else if (*ibp
== '/' && ibp
+1 != limit
&& ibp
[1] == '*') {
1711 if (put_out_comments
) {
1716 while (ibp
+ 1 != limit
1717 && !(ibp
[0] == '*' && ibp
[1] == '/')) {
1718 /* We need not worry about newline-marks,
1719 since they are never found in comments. */
1721 /* Newline in a file. Count it. */
1725 if (put_out_comments
)
1731 if (put_out_comments
) {
1736 else if (is_space (*ibp
)) {
1738 if (ibp
[-1] == '\n') {
1739 if (ip
->macro
== 0) {
1740 /* Newline in a file. Count it. */
1743 } else if (!output_marks
) {
1744 /* A newline mark, and we don't want marks
1745 in the output. If it is newline-hyphen,
1746 discard it entirely. Otherwise, it is
1747 newline-whitechar, so keep the whitechar. */
1757 /* A newline mark; copy both chars to the output. */
1768 /* This is now known to be a macro call.
1769 Discard the macro name from the output,
1770 along with any following whitespace just copied. */
1771 obp
= obufp_before_macroname
;
1772 op
->lineno
= op_lineno_before_macroname
;
1774 /* Expand the macro, reading arguments as needed,
1775 and push the expansion on the input stack. */
1778 macroexpand (hp
, op
);
1780 /* Reexamine input stack, since macroexpand has pushed
1781 a new level on it. */
1788 } /* End hash-table-search loop */
1789 ident_length
= hash
= 0; /* Stop collecting identifier */
1792 } /* End if (ident_length > 0) */
1794 } /* End per-char loop */
1796 /* Come here to return -- but first give an error message
1797 if there was an unterminated successful conditional. */
1799 if (if_stack
!= ip
->if_stack
) {
1801 switch (if_stack
->type
) {
1820 error_with_line (line_for_error (if_stack
->lineno
),
1821 "unterminated #%s conditional", str
);
1823 if_stack
= ip
->if_stack
;
1827 * Rescan a string into a temporary buffer and return the result
1828 * as a FILE_BUF. Note this function returns a struct, not a pointer.
1830 * OUTPUT_MARKS nonzero means keep Newline markers found in the input
1831 * and insert such markers when appropriate. See `rescan' for details.
1832 * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
1833 * before substitution; it is 0 for other uses.
1836 expand_to_temp_buffer (buf
, limit
, output_marks
)
1837 const U_CHAR
*buf
, *limit
;
1842 int length
= limit
- buf
;
1844 int odepth
= indepth
;
1849 /* Set up the input on the input stack. */
1851 buf1
= (U_CHAR
*) alloca (length
+ 1);
1853 const U_CHAR
*p1
= buf
;
1861 /* Set up to receive the output. */
1863 obuf
.length
= length
* 2 + 100; /* Usually enough. Why be stingy? */
1864 obuf
.bufp
= obuf
.buf
= (U_CHAR
*) xmalloc (obuf
.length
);
1869 CHECK_DEPTH ({return obuf
;});
1873 ip
= &instack
[indepth
];
1877 ip
->length
= length
;
1878 ip
->buf
= ip
->bufp
= buf1
;
1879 ip
->if_stack
= if_stack
;
1881 ip
->lineno
= obuf
.lineno
= 1;
1883 /* Scan the input, create the output. */
1885 rescan (&obuf
, output_marks
);
1887 /* Pop input stack to original state. */
1890 if (indepth
!= odepth
)
1893 /* Record the output. */
1894 obuf
.length
= obuf
.bufp
- obuf
.buf
;
1900 * Process a # directive. Expects IP->bufp to point to the '#', as in
1901 * `#define foo bar'. Passes to the command handler
1902 * (do_define, do_include, etc.): the addresses of the 1st and
1903 * last chars of the command (starting immediately after the #
1904 * keyword), plus op and the keyword table pointer. If the command
1905 * contains comments it is copied into a temporary buffer sans comments
1906 * and the temporary buffer is passed to the command handler instead.
1907 * Likewise for backslash-newlines.
1909 * Returns nonzero if this was a known # directive.
1910 * Otherwise, returns zero, without advancing the input pointer.
1914 handle_directive (ip
, op
)
1918 const struct directive
*kt
;
1922 /* Nonzero means we must copy the entire command
1923 to get rid of comments or backslash-newlines. */
1924 int copy_command
= 0;
1926 U_CHAR
*ident
, *after_ident
;
1929 /* Skip whitespace and \-newline. */
1931 if (is_nvspace (*bp
))
1933 else if (*bp
== '/' && (newline_fix (bp
+ 1), bp
[1]) == '*') {
1935 skip_to_end_of_comment (ip
, &ip
->lineno
);
1937 } else if (*bp
== '\\' && bp
[1] == '\n') {
1938 bp
+= 2; ip
->lineno
++;
1942 /* Now find end of directive name.
1943 If we encounter a backslash-newline, exchange it with any following
1944 symbol-constituents so that we end up with a contiguous name. */
1948 if (is_idchar (*cp
))
1951 if (*cp
== '\\' && cp
[1] == '\n')
1952 name_newline_fix (cp
);
1953 if (is_idchar (*cp
))
1958 ident_length
= cp
- bp
;
1962 /* A line of just `#' becomes blank. */
1964 if (ident_length
== 0 && *after_ident
== '\n') {
1965 ip
->bufp
= after_ident
;
1970 * Decode the keyword and call the appropriate expansion
1971 * routine, after moving the input pointer up to the next line.
1973 for (kt
= directive_table
; kt
->length
> 0; kt
++) {
1974 if (kt
->length
== ident_length
1975 && !strncmp (kt
->name
, (const char *)ident
, ident_length
)) {
1977 U_CHAR
*limit
= ip
->buf
+ ip
->length
;
1978 int unterminated
= 0;
1980 /* Nonzero means do not delete comments within the directive.
1981 #define needs this to detect traditional token paste. */
1982 int keep_comments
= kt
->type
== T_DEFINE
;
1984 /* Find the end of this command (first newline not backslashed
1985 and not in a string or comment).
1986 Set COPY_COMMAND if the command must be copied
1987 (it contains a backslash-newline or a comment). */
1989 buf
= bp
= after_ident
;
1990 while (bp
< limit
) {
2005 bp
= skip_quoted_string (bp
- 1, limit
, ip
->lineno
, &ip
->lineno
, ©_command
, &unterminated
);
2007 /* Traditional preprocessing permits unterminated strings. */
2013 /* <...> is special for #include. */
2015 if (kt
->type
!= T_INCLUDE
)
2017 while (*bp
&& *bp
!= '>') bp
++;
2021 if (*bp
== '\\' && bp
[1] == '\n')
2024 U_CHAR
*obp
= bp
- 1;
2026 skip_to_end_of_comment (ip
, &ip
->lineno
);
2028 /* No need to copy the command because of a comment at the end;
2029 just don't include the comment in the directive. */
2030 if (bp
== limit
|| *bp
== '\n') {
2034 /* Don't remove the comments if this is #define. */
2035 if (! keep_comments
)
2041 --bp
; /* Point to the newline */
2049 resume_p
= ip
->bufp
;
2050 /* BP is the end of the directive.
2051 RESUME_P is the next interesting data after the directive.
2052 A comment may come between. */
2056 /* Need to copy entire command into temp buffer before dispatching */
2058 cp
= (U_CHAR
*) alloca (bp
- buf
+ 5); /* room for cmd plus
2062 /* Copy to the new buffer, deleting comments
2063 and backslash-newlines (and whitespace surrounding the latter). */
2073 /* <...> is special for #include. */
2075 if (kt
->type
!= T_INCLUDE
)
2077 while (xp
< bp
&& c
!= '>') {
2079 if (c
== '\\' && xp
< bp
&& *xp
== '\n')
2090 if (cp
!= buf
&& is_space (cp
[-1])) {
2091 while (cp
!= buf
&& is_space(cp
[-1])) cp
--;
2093 SKIP_WHITE_SPACE (xp
);
2094 } else if (is_nvspace (*xp
)) {
2096 SKIP_WHITE_SPACE (xp
);
2107 = skip_quoted_string (xp
- 1, limit
, ip
->lineno
, 0, 0, 0);
2116 skip_to_end_of_comment (ip
, 0);
2118 while (xp
!= ip
->bufp
)
2120 /* Delete the slash. */
2128 /* Null-terminate the copy. */
2135 ip
->bufp
= resume_p
;
2137 /* Call the appropriate command handler. buf now points to
2138 either the appropriate place in the input buffer, or to
2139 the temp buffer if it was necessary to make one. cp
2140 points to the first char after the contents of the (possibly
2141 copied) command, in either case. */
2142 (*kt
->func
) (buf
, cp
, op
);
2143 check_expand (op
, ip
->length
- (ip
->bufp
- ip
->buf
));
2152 static const char *const
2153 monthnames
[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
2154 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
2157 * expand things like __FILE__. Place the expansion into the output
2158 * buffer *without* rescanning.
2161 special_symbol (hp
, op
)
2169 FILE_BUF
*ip
= NULL
;
2170 static struct tm
*timebuf
= NULL
;
2172 int paren
= 0; /* For special `defined' keyword */
2174 for (i
= indepth
; i
>= 0; i
--)
2175 if (instack
[i
].fname
!= NULL
) {
2180 fatal ("not in any file?!");
2187 if (hp
->type
== T_FILE
)
2190 string
= instack
[0].fname
;
2194 char *tmp
= (char *) alloca (3 + strlen (string
));
2195 sprintf (tmp
, "\"%s\"", string
);
2204 case T_INCLUDE_LEVEL
:
2206 char *tmp
= (char *) alloca (8); /* Eigth bytes ought to be more than enough */
2208 for (i
= indepth
; i
>= 0; i
--)
2209 if (instack
[i
].fname
!= NULL
)
2212 sprintf (tmp
, "%d", true_indepth
- 1);
2219 char *tmp
= (char *) alloca (3 + strlen (version_string
));
2220 sprintf (tmp
, "\"%s\"", version_string
);
2226 buf
= hp
->value
.cpval
;
2231 char *tmp
= (char *) alloca (10);
2232 sprintf (tmp
, "%d", ip
->lineno
);
2240 char *tmp
= (char *) alloca (20);
2242 if (timebuf
== NULL
) {
2244 timebuf
= localtime (&t
);
2246 if (hp
->type
== T_DATE
)
2247 sprintf (tmp
, "\"%s %2d %4d\"", monthnames
[timebuf
->tm_mon
],
2248 timebuf
->tm_mday
, timebuf
->tm_year
+ 1900);
2250 sprintf (tmp
, "\"%02d:%02d:%02d\"", timebuf
->tm_hour
, timebuf
->tm_min
,
2256 case T_SPEC_DEFINED
:
2257 buf
= " 0 "; /* Assume symbol is not defined */
2258 ip
= &instack
[indepth
];
2259 SKIP_WHITE_SPACE (ip
->bufp
);
2260 if (*ip
->bufp
== '(') {
2262 ip
->bufp
++; /* Skip over the paren */
2263 SKIP_WHITE_SPACE (ip
->bufp
);
2266 if (!is_idstart (*ip
->bufp
))
2269 HASHNODE
*hp
= lookup (ip
->bufp
, -1, -1);
2271 if (hp
&& hp
->type
!= T_UNUSED
&& hp
->type
!= T_SPEC_DEFINED
)
2274 while (is_idchar (*ip
->bufp
))
2276 SKIP_WHITE_SPACE (ip
->bufp
);
2278 if (*ip
->bufp
!= ')')
2286 error ("`defined' must be followed by ident or (ident)");
2290 error ("cccp error: invalid special hash type"); /* time for gdb */
2294 check_expand (op
, len
);
2295 memcpy (op
->bufp
, buf
, len
);
2300 /* Routines to handle #directives */
2303 * Process include file by reading it in and calling rescan.
2304 * Expects to see "fname" or <fname> on the input.
2307 do_include (buf
, limit
, op
)
2308 U_CHAR
*buf
, *limit
;
2311 U_CHAR
*fbeg
, *fend
; /* Beginning and end of fname */
2313 struct file_name_list
*stackp
= include
; /* Chain of dirs to search */
2314 struct file_name_list dsp
[1]; /* First in chain, if #include "..." */
2317 int retried
= 0; /* Have already tried macro
2318 expanding the include line*/
2319 FILE_BUF trybuf
; /* It got expanded into here */
2320 int system_header_p
= 0; /* 0 for "...", 1 for <...> */
2325 SKIP_WHITE_SPACE (fbeg
);
2326 /* Discard trailing whitespace so we can easily see
2327 if we have parsed all the significant chars we were given. */
2328 while (limit
!= fbeg
&& is_nvspace (limit
[-1])) limit
--;
2333 while (fend
!= limit
&& *fend
!= '\"')
2335 if (*fend
== '\"' && fend
+ 1 == limit
) {
2338 /* We have "filename". Figure out directory this source
2339 file is coming from and put it on the front of the list. */
2341 /* If -I- was specified, don't search current dir, only spec'd ones. */
2342 if (ignore_srcdir
) break;
2344 for (fp
= &instack
[indepth
]; fp
>= instack
; fp
--)
2347 const char *ep
, *nam
;
2349 if ((nam
= fp
->fname
) != NULL
) {
2350 /* Found a named file. Figure out dir of the file,
2351 and put it in front of the search list. */
2352 dsp
[0].next
= stackp
;
2354 ep
= strrchr (nam
, '/');
2358 f
= (char *) alloca (n
+ 1);
2359 strncpy (f
, nam
, n
);
2362 if (n
> max_include_len
) max_include_len
= n
;
2364 dsp
[0].fname
= 0; /* Current directory */
2375 while (fend
!= limit
&& *fend
!= '>') fend
++;
2376 if (*fend
== '>' && fend
+ 1 == limit
) {
2377 system_header_p
= 1;
2378 /* If -I-, start with the first -I dir after the -I-. */
2379 if (first_bracket_include
)
2380 stackp
= first_bracket_include
;
2388 error ("#include expects \"fname\" or <fname>");
2391 trybuf
= expand_to_temp_buffer (buf
, limit
, 0);
2392 buf
= (U_CHAR
*) alloca (trybuf
.bufp
- trybuf
.buf
+ 1);
2393 memcpy (buf
, trybuf
.buf
, trybuf
.bufp
- trybuf
.buf
);
2394 limit
= buf
+ (trybuf
.bufp
- trybuf
.buf
);
2402 process_include (stackp
, fbeg
, flen
, system_header_p
, op
);
2406 do_include_next (buf
, limit
, op
)
2407 U_CHAR
*buf
, *limit
;
2410 U_CHAR
*fbeg
, *fend
; /* Beginning and end of fname */
2412 struct file_name_list
*stackp
; /* Chain of dirs to search */
2415 int retried
= 0; /* Have already tried macro
2416 expanding the include line*/
2417 FILE_BUF trybuf
; /* It got expanded into here */
2418 int system_header_p
= 0; /* 0 for "...", 1 for <...> */
2420 /* Treat as plain #include if we don't know where to start
2422 stackp
= instack
[indepth
].next_header_dir
;
2425 do_include (buf
, limit
, op
);
2432 SKIP_WHITE_SPACE (fbeg
);
2433 /* Discard trailing whitespace so we can easily see
2434 if we have parsed all the significant chars we were given. */
2435 while (limit
!= fbeg
&& is_nvspace (limit
[-1])) limit
--;
2440 while (fend
!= limit
&& *fend
!= '\"')
2442 if (*fend
== '\"' && fend
+ 1 == limit
)
2448 while (fend
!= limit
&& *fend
!= '>') fend
++;
2449 if (*fend
== '>' && fend
+ 1 == limit
) {
2450 system_header_p
= 1;
2458 error ("#include expects \"fname\" or <fname>");
2461 trybuf
= expand_to_temp_buffer (buf
, limit
, 0);
2462 buf
= (U_CHAR
*) alloca (trybuf
.bufp
- trybuf
.buf
+ 1);
2463 memcpy (buf
, trybuf
.buf
, trybuf
.bufp
- trybuf
.buf
);
2464 limit
= buf
+ (trybuf
.bufp
- trybuf
.buf
);
2472 process_include (stackp
, fbeg
, flen
, system_header_p
, op
);
2476 process_include (stackp
, fbeg
, flen
, system_header_p
, op
)
2477 struct file_name_list
*stackp
;
2480 int system_header_p
;
2484 int f
= -1; /* file number */
2486 fname
= (char *) alloca (max_include_len
+ flen
+ 2);
2487 /* + 2 above for slash and terminating null. */
2489 /* If specified file name is absolute, just open it. */
2491 if (IS_ABSOLUTE_PATHNAME (fbeg
)) {
2492 strncpy (fname
, (const char *)fbeg
, flen
);
2494 f
= open (fname
, O_RDONLY
, 0666);
2496 /* Search directory path, trying to open the file.
2497 Copy each filename tried into FNAME. */
2499 for (; stackp
; stackp
= stackp
->next
) {
2500 if (stackp
->fname
) {
2501 strcpy (fname
, stackp
->fname
);
2502 strcat (fname
, "/");
2503 fname
[strlen (fname
) + flen
] = 0;
2507 strncat (fname
, (const char *)fbeg
, flen
);
2508 if ((f
= open (fname
, O_RDONLY
, 0666)) >= 0)
2514 strncpy (fname
, (const char *)fbeg
, flen
);
2516 if (deps_missing_files
2517 && print_deps
> (system_header_p
|| (system_include_depth
> 0))) {
2519 /* If requested as a system header, assume it belongs in
2520 the first system header directory. */
2521 if (first_bracket_include
)
2522 stackp
= first_bracket_include
;
2526 if (!system_header_p
|| IS_ABSOLUTE_PATHNAME (fbeg
) || !stackp
->fname
)
2527 deps_add_dep (deps
, fname
);
2530 int len
= strlen(stackp
->fname
);
2532 p
= (char *) alloca (len
+ flen
+ 2);
2533 memcpy (p
, stackp
->fname
, len
);
2535 memcpy (p
+ len
, fbeg
, flen
);
2538 deps_add_dep (deps
, p
);
2540 } else if (print_deps
2541 && print_deps
<= (system_header_p
2542 || (system_include_depth
> 0)))
2543 warning ("no include path in which to find %.*s", flen
, fbeg
);
2545 error_from_errno (fname
);
2549 /* Check to see if this include file is a once-only include file.
2552 struct file_name_list
* ptr
;
2554 for (ptr
= dont_repeat_files
; ptr
; ptr
= ptr
->next
) {
2555 if (!strcmp (ptr
->fname
, fname
)) {
2557 return; /* This file was once'd. */
2561 for (ptr
= all_include_files
; ptr
; ptr
= ptr
->next
) {
2562 if (!strcmp (ptr
->fname
, fname
))
2563 break; /* This file was included before. */
2567 /* This is the first time for this file. */
2568 /* Add it to list of files included. */
2570 ptr
= (struct file_name_list
*) xmalloc (sizeof (struct file_name_list
));
2571 ptr
->next
= all_include_files
;
2572 all_include_files
= ptr
;
2573 ptr
->fname
= xstrdup (fname
);
2575 /* For -M, add this file to the dependencies. */
2576 if (print_deps
> (system_header_p
|| (system_include_depth
> 0)))
2577 deps_add_dep (deps
, fname
);
2580 if (system_header_p
)
2581 system_include_depth
++;
2583 /* Actually process the file. */
2584 finclude (f
, fname
, stackp
->next
, op
);
2586 if (system_header_p
)
2587 system_include_depth
--;
2593 /* Replace all CR NL, NL CR and CR sequences with NL. */
2599 U_CHAR
*p
, *q
, *end
;
2601 if (fp
->length
<= 0)
2604 end
= fp
->buf
+ fp
->length
;
2606 p
= (U_CHAR
*) strchr ((const char *) fp
->buf
, '\r');
2611 if (p
> fp
->buf
&& p
[-1] == '\n')
2622 p
+= 1 + (p
[0] + p
[1] == '\n' + '\r');
2627 fp
->length
= q
- fp
->buf
;
2630 /* Process the contents of include file FNAME, already open on descriptor F,
2631 with output to OP. */
2634 finclude (f
, fname
, nhd
, op
)
2637 struct file_name_list
*nhd
;
2643 FILE_BUF
*fp
; /* For input stack frame */
2645 CHECK_DEPTH (return;);
2647 if (file_size_and_mode (f
, &st_mode
, &st_size
))
2650 fp
= &instack
[indepth
+ 1];
2651 memset (fp
, 0, sizeof (FILE_BUF
));
2655 fp
->if_stack
= if_stack
;
2656 fp
->next_header_dir
= nhd
;
2658 if (S_ISREG (st_mode
)) {
2659 fp
->buf
= (U_CHAR
*) xmalloc (st_size
+ 2);
2662 /* Read the file contents, knowing that st_size is an upper bound
2663 on the number of bytes we can read. */
2664 while (st_size
> 0) {
2665 i
= read (f
, fp
->buf
+ fp
->length
, st_size
);
2675 /* Cannot count its file size before reading. */
2682 basep
= (U_CHAR
*) xmalloc (bsize
+ 2);
2686 i
= read (f
, bufp
, bsize
- st_size
);
2688 goto nope
; /* error! */
2690 break; /* End of file */
2693 if (bsize
== st_size
) { /* Buffer is full! */
2695 basep
= (U_CHAR
*) xrealloc (basep
, bsize
+ 2);
2696 bufp
= basep
+ st_size
; /* May have moved */
2701 fp
->length
= st_size
;
2704 fixup_newlines (fp
);
2706 /* Make sure data ends with a newline. And put a null after it. */
2708 if (fp
->length
> 0 && fp
->buf
[fp
->length
-1] != '\n')
2709 fp
->buf
[fp
->length
++] = '\n';
2710 fp
->buf
[fp
->length
] = '\0';
2713 output_line_command (fp
, op
, 0, enter_file
);
2716 instack
[indepth
].lineno
++;
2717 instack
[indepth
].bufp
++; /* Skip the new line. */
2718 output_line_command (&instack
[indepth
], op
, 0, leave_file
);
2723 perror_with_name (fname
);
2728 /* Process a #define command.
2729 BUF points to the contents of the #define command, as a continguous string.
2730 LIMIT points to the first character past the end of the definition.
2731 KEYWORD is the keyword-table entry for #define. */
2734 do_define (buf
, limit
, op
)
2735 U_CHAR
*buf
, *limit
;
2736 FILE_BUF
*op ATTRIBUTE_UNUSED
;
2738 U_CHAR
*bp
; /* temp ptr into input buffer */
2739 U_CHAR
*symname
; /* remember where symbol name starts */
2740 int sym_length
; /* and how long it is */
2743 int arglengths
= 0; /* Accumulate lengths of arg names
2744 plus number of args. */
2749 while (is_nvspace (*bp
))
2752 symname
= bp
; /* remember where it starts */
2753 while (is_idchar (*bp
) && bp
< limit
) {
2756 sym_length
= bp
- symname
;
2757 if (sym_length
== 0)
2759 error ("invalid macro name");
2762 else if (!is_idstart (*symname
)) {
2763 U_CHAR
*msg
; /* what pain... */
2764 msg
= (U_CHAR
*) alloca (sym_length
+ 1);
2765 memcpy (msg
, symname
, sym_length
);
2766 msg
[sym_length
] = 0;
2767 error ("invalid macro name `%s'", msg
);
2770 if (! strncmp ((const char *)symname
, "defined", 7) && sym_length
== 7)
2772 error ("\"defined\" cannot be used as a macro name");
2777 /* lossage will occur if identifiers or control keywords are broken
2778 across lines using backslash. This is not the right place to take
2782 struct arglist
*arg_ptrs
= NULL
;
2785 bp
++; /* skip '(' */
2786 SKIP_WHITE_SPACE (bp
);
2788 /* Loop over macro argument names. */
2789 while (*bp
!= ')') {
2790 struct arglist
*temp
;
2792 temp
= (struct arglist
*) alloca (sizeof (struct arglist
));
2794 temp
->next
= arg_ptrs
;
2795 temp
->argno
= argno
++;
2798 if (!is_idstart (*bp
))
2799 warning ("parameter name starts with a digit in #define");
2801 /* Find the end of the arg name. */
2802 while (is_idchar (*bp
)) {
2805 temp
->length
= bp
- temp
->name
;
2806 arglengths
+= temp
->length
+ 2;
2807 SKIP_WHITE_SPACE (bp
);
2808 if (temp
->length
== 0 || (*bp
!= ',' && *bp
!= ')')) {
2809 error ("badly punctuated parameter list in #define");
2814 SKIP_WHITE_SPACE (bp
);
2817 error ("unterminated parameter list in #define");
2822 ++bp
; /* skip paren */
2823 while (is_nvspace (*bp
) && bp
< limit
) /* and leading whitespace */
2825 /* now everything from bp before limit is the definition. */
2826 defn
= collect_expansion (bp
, limit
, argno
, arg_ptrs
);
2828 /* Now set defn->argnames to the result of concatenating
2829 the argument names in reverse order
2830 with comma-space between them. */
2832 struct arglist
*temp
;
2834 U_CHAR
*tmp
= (U_CHAR
*) xmalloc (arglengths
+ 1);
2836 for (temp
= arg_ptrs
; temp
; temp
= temp
->next
) {
2837 memcpy (&tmp
[i
], temp
->name
, temp
->length
);
2839 if (temp
->next
!= 0) {
2845 defn
->argnames
= tmp
;
2849 /* simple expansion or empty definition; skip leading whitespace */
2850 while (is_nvspace (*bp
) && bp
< limit
)
2852 /* now everything from bp before limit is the definition. */
2853 defn
= collect_expansion (bp
, limit
, -1, 0);
2854 defn
->argnames
= (const U_CHAR
*) "";
2857 hashcode
= hashf (symname
, sym_length
, HASHSIZE
);
2861 if ((hp
= lookup (symname
, sym_length
, hashcode
)) == NULL
)
2862 hp
= install (symname
, sym_length
, T_MACRO
, hashcode
);
2864 if (hp
->type
!= T_MACRO
|| compare_defs (defn
, hp
->value
.defn
))
2865 warning ("\"%.*s\" redefined", sym_length
, symname
);
2867 /* Replace the old definition. */
2871 hp
->value
.defn
= defn
;
2876 * return zero if two DEFINITIONs are isomorphic
2879 compare_defs (d1
, d2
)
2880 DEFINITION
*d1
, *d2
;
2882 struct reflist
*a1
, *a2
;
2883 U_CHAR
*p1
= d1
->expansion
;
2884 U_CHAR
*p2
= d2
->expansion
;
2887 if (d1
->nargs
!= d2
->nargs
)
2889 if (strcmp ((const char *)d1
->argnames
, (const char *)d2
->argnames
))
2891 for (a1
= d1
->pattern
, a2
= d2
->pattern
; a1
&& a2
;
2892 a1
= a1
->next
, a2
= a2
->next
) {
2893 if (!((a1
->nchars
== a2
->nchars
2894 && ! strncmp ((const char *)p1
, (const char *)p2
, a1
->nchars
))
2895 || ! comp_def_part (first
, p1
, a1
->nchars
, p2
, a2
->nchars
, 0))
2896 || a1
->argno
!= a2
->argno
2897 || a1
->stringify
!= a2
->stringify
2898 || a1
->raw_before
!= a2
->raw_before
2899 || a1
->raw_after
!= a2
->raw_after
)
2907 if (comp_def_part (first
, p1
, d1
->length
- (p1
- d1
->expansion
),
2908 p2
, d2
->length
- (p2
- d2
->expansion
), 1))
2913 /* Return 1 if two parts of two macro definitions are effectively different.
2914 One of the parts starts at BEG1 and has LEN1 chars;
2915 the other has LEN2 chars at BEG2.
2916 Any sequence of whitespace matches any other sequence of whitespace.
2917 FIRST means these parts are the first of a macro definition;
2918 so ignore leading whitespace entirely.
2919 LAST means these parts are the last of a macro definition;
2920 so ignore trailing whitespace entirely. */
2922 comp_def_part (first
, beg1
, len1
, beg2
, len2
, last
)
2924 const U_CHAR
*beg1
, *beg2
;
2928 const U_CHAR
*end1
= beg1
+ len1
;
2929 const U_CHAR
*end2
= beg2
+ len2
;
2931 while (beg1
!= end1
&& is_space (*beg1
)) beg1
++;
2932 while (beg2
!= end2
&& is_space (*beg2
)) beg2
++;
2935 while (beg1
!= end1
&& is_space (end1
[-1])) end1
--;
2936 while (beg2
!= end2
&& is_space (end2
[-1])) end2
--;
2938 while (beg1
!= end1
&& beg2
!= end2
) {
2939 if (is_space (*beg1
) && is_space (*beg2
)) {
2940 while (beg1
!= end1
&& is_space (*beg1
)) beg1
++;
2941 while (beg2
!= end2
&& is_space (*beg2
)) beg2
++;
2942 } else if (*beg1
== *beg2
) {
2946 return (beg1
!= end1
) || (beg2
!= end2
);
2949 /* Read a replacement list for a macro with parameters.
2950 Build the DEFINITION structure.
2951 Reads characters of text starting at BUF until LIMIT.
2952 ARGLIST specifies the formal parameters to look for
2953 in the text of the definition; NARGS is the number of args
2954 in that list, or -1 for a macro name that wants no argument list.
2955 MACRONAME is the macro name itself (so we can avoid recursive expansion)
2956 and NAMELEN is its length in characters.
2958 Note that comments and backslash-newlines have already been deleted
2959 from the argument. */
2961 /* Leading and trailing Space, Tab, etc. are converted to markers
2962 Newline Space, Newline Tab, etc.
2963 Newline Space makes a space in the final output
2964 but is discarded if stringified. (Newline Tab is similar but
2965 makes a Tab instead.)
2967 If there is no trailing whitespace, a Newline Space is added at the end
2968 to prevent concatenation that would be contrary to the standard. */
2971 collect_expansion (buf
, end
, nargs
, arglist
)
2974 struct arglist
*arglist
;
2977 U_CHAR
*p
, *limit
, *lastp
, *exp_p
;
2978 struct reflist
*endpat
= NULL
;
2979 /* Pointer to first nonspace after last ## seen. */
2981 /* Pointer to first nonspace after last single-# seen. */
2982 U_CHAR
*stringify
= 0;
2984 int expected_delimiter
= '\0';
2986 /* Scan thru the replacement list, ignoring comments and quoted
2987 strings, picking up on the macro calls. It does a linear search
2988 thru the arg list on every potential symbol. Profiling might say
2989 that something smarter should happen. */
2994 /* Find the beginning of the trailing whitespace. */
2995 /* Find end of leading whitespace. */
2998 while (p
< limit
&& is_space (limit
[-1])) limit
--;
2999 while (p
< limit
&& is_space (*p
)) p
++;
3001 /* Allocate space for the text in the macro definition.
3002 Leading and trailing whitespace chars need 2 bytes each.
3003 Each other input char may or may not need 1 byte,
3004 so this is an upper bound.
3005 The extra 2 are for invented trailing newline-marker and final null. */
3006 maxsize
= (sizeof (DEFINITION
)
3007 + 2 * (end
- limit
) + 2 * (p
- buf
)
3009 defn
= (DEFINITION
*) xcalloc (1, maxsize
);
3011 defn
->nargs
= nargs
;
3012 exp_p
= defn
->expansion
= (U_CHAR
*) defn
+ sizeof (DEFINITION
);
3017 /* Convert leading whitespace to Newline-markers. */
3018 while (p
< limit
&& is_space (*p
)) {
3023 /* Process the main body of the definition. */
3025 int skipped_arg
= 0;
3030 /* In -traditional mode, recognize arguments inside strings and
3031 and character constants, and ignore special properties of #.
3032 Arguments inside strings are considered "stringified", but no
3033 extra quote marks are supplied. */
3037 if (expected_delimiter
!= '\0') {
3038 if (c
== expected_delimiter
)
3039 expected_delimiter
= '\0';
3041 expected_delimiter
= c
;
3045 /* Backslash quotes delimiters and itself, but not macro args. */
3046 if (expected_delimiter
!= 0 && p
< limit
3047 && (*p
== expected_delimiter
|| *p
== '\\')) {
3054 if (expected_delimiter
!= '\0') /* No comments inside strings. */
3057 /* If we find a comment that wasn't removed by handle_directive,
3058 this must be -traditional. So replace the comment with
3062 while (p
< limit
&& !(p
[-2] == '*' && p
[-1] == '/'))
3068 if (is_idchar (c
) && nargs
> 0) {
3069 U_CHAR
*id_beg
= p
- 1;
3073 while (p
!= limit
&& is_idchar (*p
)) p
++;
3074 id_len
= p
- id_beg
;
3076 if (is_idstart (c
)) {
3077 struct arglist
*arg
;
3079 for (arg
= arglist
; arg
!= NULL
; arg
= arg
->next
) {
3080 struct reflist
*tpat
;
3082 if (arg
->name
[0] == c
3083 && arg
->length
== id_len
3084 && strncmp ((const char *)arg
->name
,
3085 (const char *)id_beg
, id_len
) == 0) {
3086 /* make a pat node for this arg and append it to the end of
3088 tpat
= (struct reflist
*) xmalloc (sizeof (struct reflist
));
3090 tpat
->raw_before
= concat
== id_beg
;
3091 tpat
->raw_after
= 0;
3092 tpat
->stringify
= expected_delimiter
!= '\0';
3095 defn
->pattern
= tpat
;
3097 endpat
->next
= tpat
;
3100 tpat
->argno
= arg
->argno
;
3101 tpat
->nchars
= exp_p
- lastp
;
3104 SKIP_WHITE_SPACE (p1
);
3105 if (p1
+ 2 <= limit
&& p1
[0] == '#' && p1
[1] == '#')
3106 tpat
->raw_after
= 1;
3108 lastp
= exp_p
; /* place to start copying from next time */
3115 /* If this was not a macro arg, copy it into the expansion. */
3116 if (! skipped_arg
) {
3121 if (stringify
== id_beg
)
3122 error ("# operator should be followed by a macro argument name");
3128 /* Convert trailing whitespace to Newline-markers. */
3129 while (limit
< end
&& is_space (*limit
)) {
3131 *exp_p
++ = *limit
++;
3136 defn
->length
= exp_p
- defn
->expansion
;
3138 /* Crash now if we overrun the allocated size. */
3139 if (defn
->length
+ 1 > maxsize
)
3146 * interpret #line command. Remembers previously seen fnames
3147 * in its very own hash table.
3149 #define FNAME_HASHSIZE 37
3151 do_line (buf
, limit
, op
)
3152 U_CHAR
*buf
, *limit
;
3156 FILE_BUF
*ip
= &instack
[indepth
];
3159 enum file_change_code file_change
= same_file
;
3161 /* Expand any macros. */
3162 tem
= expand_to_temp_buffer (buf
, limit
, 0);
3164 /* Point to macroexpanded line, which is null-terminated now. */
3166 SKIP_WHITE_SPACE (bp
);
3168 if (!ISDIGIT (*bp
)) {
3169 error ("invalid format #line command");
3173 /* The Newline at the end of this line remains to be processed.
3174 To put the next line at the specified line number,
3175 we must store a line number now that is one less. */
3176 new_lineno
= atoi ((const char *)bp
);
3178 /* skip over the line number. */
3179 while (ISDIGIT (*bp
))
3182 SKIP_WHITE_SPACE (bp
);
3185 static HASHNODE
*fname_table
[FNAME_HASHSIZE
];
3186 HASHNODE
*hp
, **hash_bucket
;
3192 while (*bp
&& *bp
!= '\"')
3195 error ("invalid format #line command");
3199 fname_length
= bp
- fname
;
3202 SKIP_WHITE_SPACE (bp
);
3205 file_change
= enter_file
;
3206 else if (*bp
== '2')
3207 file_change
= leave_file
;
3209 error ("invalid format #line command");
3214 SKIP_WHITE_SPACE (bp
);
3216 error ("invalid format #line command");
3222 &fname_table
[hashf (fname
, fname_length
, FNAME_HASHSIZE
)];
3223 for (hp
= *hash_bucket
; hp
!= NULL
; hp
= hp
->next
)
3224 if (hp
->length
== fname_length
&&
3225 strncmp (hp
->value
.cpval
, (const char *)fname
, fname_length
) == 0) {
3226 ip
->fname
= hp
->value
.cpval
;
3231 /* Didn't find it; cons up a new one. */
3232 hp
= (HASHNODE
*) xcalloc (1, sizeof (HASHNODE
) + fname_length
+ 1);
3233 hp
->next
= *hash_bucket
;
3236 hp
->length
= fname_length
;
3237 ip
->fname
= hp
->value
.cpval
= q
= ((char *) hp
) + sizeof (HASHNODE
);
3238 memcpy (q
, fname
, fname_length
);
3241 error ("invalid format #line command");
3245 ip
->lineno
= new_lineno
;
3246 output_line_command (ip
, op
, 0, file_change
);
3247 ip
->bufp
++; /* Skip the new line. */
3248 check_expand (op
, ip
->length
- (ip
->bufp
- ip
->buf
));
3252 * remove all definitions of symbol from symbol table.
3253 * according to un*x /lib/cpp, it is not an error to undef
3254 * something that has no definitions, so it isn't one here either.
3257 do_undef (buf
, limit
, op
)
3259 U_CHAR
*limit ATTRIBUTE_UNUSED
;
3260 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3264 SKIP_WHITE_SPACE (buf
);
3266 if (! strncmp ((const char *)buf
, "defined", 7) && ! is_idchar (buf
[7]))
3267 warning ("undefining `defined'");
3269 while ((hp
= lookup (buf
, -1, -1)) != NULL
) {
3270 if (hp
->type
!= T_MACRO
)
3271 warning ("undefining `%s'", hp
->name
);
3276 /* Read the tokens of the answer into the macro pool. Only commit the
3277 memory if we intend it as permanent storage, i.e. the #assert case.
3278 Returns 0 on success. */
3281 parse_answer (buf
, limit
, answerp
, type
)
3282 const unsigned char *buf
, *limit
;
3283 struct answer
**answerp
;
3286 const unsigned char *start
;
3288 /* Skip leading whitespace. */
3289 if (buf
< limit
&& *buf
== ' ')
3292 /* Parentheses are optional here. */
3293 if (buf
== limit
&& type
== T_UNASSERT
)
3296 if (buf
== limit
|| *buf
++ != '(')
3301 error ("missing '(' after predicate");
3305 /* Drop whitespace at start. */
3306 while (buf
< limit
&& *buf
== ' ')
3310 while (buf
< limit
&& *buf
!= ')')
3315 error ("missing ')' to complete answer");
3321 error ("predicate's answer is empty");
3325 if ((type
== T_ASSERT
|| type
== T_UNASSERT
) && buf
+ 1 != limit
)
3327 error ("extra text at end of directive");
3331 /* Lose trailing whitespace. */
3335 *answerp
= (struct answer
*) xmalloc (sizeof (struct answer
));
3336 (*answerp
)->answer
= start
;
3337 (*answerp
)->len
= buf
- start
;
3342 /* Parses an assertion, returning a pointer to the hash node of the
3343 predicate, or 0 on error. If an answer was supplied, it is placed
3344 in ANSWERP, otherwise it is set to 0. */
3346 parse_assertion (buf
, limit
, answerp
, type
)
3347 const unsigned char *buf
, *limit
;
3348 struct answer
**answerp
;
3351 HASHNODE
*result
= 0;
3352 const unsigned char *climit
;
3353 unsigned char *bp
, *symname
= canonicalize_text (buf
, limit
, &climit
);
3357 if (bp
< climit
&& is_idstart (*bp
))
3361 while (bp
< climit
&& is_idchar (*bp
));
3368 if (symname
== climit
)
3369 error ("assertion without predicate");
3371 error ("predicate must be an identifier");
3373 /* Unfortunately, because of the way we handle #if, we don't avoid
3374 macro expansion in answers. This is not easy to fix. */
3375 else if (parse_answer (bp
, climit
, answerp
, type
) == 0)
3377 unsigned char *sym
= alloca (len
+ 1);
3380 /* Prefix '#' to get it out of macro namespace. */
3382 memcpy (sym
+ 1, symname
, len
);
3384 hashcode
= hashf (sym
, len
+ 1, HASHSIZE
);
3385 result
= lookup (sym
, len
+ 1, hashcode
);
3387 result
= install (sym
, len
+ 1, T_UNUSED
, hashcode
);
3393 /* Test an assertion within a preprocessor conditional. Returns zero
3394 on error or failure, one on success. */
3396 test_assertion (pbuf
)
3397 unsigned char **pbuf
; /* NUL-terminated. */
3399 unsigned char *buf
= *pbuf
;
3400 unsigned char *limit
= buf
+ strlen ((char *) buf
);
3401 struct answer
*answer
;
3405 node
= parse_assertion (buf
, limit
, &answer
, T_IF
);
3408 result
= (node
->type
== T_ASSERT
&&
3409 (answer
== 0 || *find_answer (node
, answer
) != 0));
3411 /* Yuk. We update pbuf to point after the assertion test.
3412 First, move past the identifier. */
3413 if (is_space (*buf
))
3415 while (is_idchar (*buf
))
3417 /* If we have an answer, we need to move past the parentheses. */
3419 while (*buf
++ != ')')
3427 /* Handle a #error directive. */
3429 do_error (buf
, limit
, op
)
3432 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3434 error ("#error%.*s", (int) (limit
- buf
), buf
);
3437 /* Handle a #warning directive. */
3439 do_warning (buf
, limit
, op
)
3442 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3444 warning ("#warning%.*s", (int) (limit
- buf
), buf
);
3447 /* Handle a #assert directive. */
3449 do_assert (buf
, limit
, op
)
3452 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3454 struct answer
*new_answer
;
3457 node
= parse_assertion (buf
, limit
, &new_answer
, T_ASSERT
);
3460 /* Place the new answer in the answer list. First check there
3461 is not a duplicate. */
3462 new_answer
->next
= 0;
3463 if (node
->type
== T_ASSERT
)
3465 if (*find_answer (node
, new_answer
))
3468 warning ("\"%s\" re-asserted", node
->name
+ 1);
3471 new_answer
->next
= node
->value
.answers
;
3473 node
->type
= T_ASSERT
;
3474 node
->value
.answers
= new_answer
;
3478 /* Function body to be provided later. */
3480 do_unassert (buf
, limit
, op
)
3483 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3486 struct answer
*answer
;
3488 node
= parse_assertion (buf
, limit
, &answer
, T_UNASSERT
);
3489 /* It isn't an error to #unassert something that isn't asserted. */
3492 if (node
->type
== T_ASSERT
)
3496 struct answer
**p
= find_answer (node
, answer
), *temp
;
3498 /* Remove the answer from the list. */
3503 /* Did we free the last answer? */
3504 if (node
->value
.answers
== 0)
3505 delete_macro (node
);
3508 delete_macro (node
);
3515 /* Returns a pointer to the pointer to the answer in the answer chain,
3516 or a pointer to NULL if the answer is not in the chain. */
3517 static struct answer
**
3518 find_answer (node
, candidate
)
3520 const struct answer
*candidate
;
3522 struct answer
**result
;
3524 for (result
= &node
->value
.answers
; *result
; result
= &(*result
)->next
)
3526 struct answer
*answer
= *result
;
3528 if (answer
->len
== candidate
->len
3529 && !memcmp (answer
->answer
, candidate
->answer
, answer
->len
))
3536 /* Return a malloced buffer with leading and trailing whitespace
3537 removed, and all instances of internal whitespace reduced to a
3539 static unsigned char *
3540 canonicalize_text (buf
, limit
, climit
)
3541 const unsigned char *buf
, *limit
, **climit
;
3543 unsigned int len
= limit
- buf
;
3544 unsigned char *result
= (unsigned char *) xmalloc (len
), *dest
;
3546 for (dest
= result
; buf
< limit
;)
3548 if (! is_space (*buf
))
3552 while (++buf
< limit
&& is_space (*buf
))
3554 if (dest
!= result
&& buf
!= limit
)
3564 * handle #if command by
3565 * 1) inserting special `defined' keyword into the hash table
3566 * that gets turned into 0 or 1 by special_symbol (thus,
3567 * if the luser has a symbol called `defined' already, it won't
3568 * work inside the #if command)
3569 * 2) rescan the input into a temporary output buffer
3570 * 3) pass the output buffer to the yacc parser and collect a value
3571 * 4) clean up the mess left from steps 1 and 2.
3572 * 5) call conditional_skip to skip til the next #endif (etc.),
3573 * or not, depending on the value from step 3.
3576 do_if (buf
, limit
, op
)
3577 U_CHAR
*buf
, *limit
;
3578 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3581 FILE_BUF
*ip
= &instack
[indepth
];
3583 value
= eval_if_expression (buf
, limit
- buf
);
3584 conditional_skip (ip
, value
== 0, T_IF
);
3588 * handle a #elif directive by not changing if_stack either.
3589 * see the comment above do_else.
3592 do_elif (buf
, limit
, op
)
3593 U_CHAR
*buf
, *limit
;
3597 FILE_BUF
*ip
= &instack
[indepth
];
3599 if (if_stack
== instack
[indepth
].if_stack
) {
3600 error ("#elif not within a conditional");
3603 if (if_stack
->type
!= T_IF
&& if_stack
->type
!= T_ELIF
) {
3604 error ("#elif after #else");
3605 fprintf (stderr
, " (matches line %d", if_stack
->lineno
);
3606 if (if_stack
->fname
!= NULL
&& ip
->fname
!= NULL
&&
3607 strcmp (if_stack
->fname
, ip
->fname
) != 0)
3608 fprintf (stderr
, ", file %s", if_stack
->fname
);
3609 fprintf (stderr
, ")\n");
3611 if_stack
->type
= T_ELIF
;
3614 if (if_stack
->if_succeeded
)
3615 skip_if_group (ip
, 0);
3617 value
= eval_if_expression (buf
, limit
- buf
);
3619 skip_if_group (ip
, 0);
3621 ++if_stack
->if_succeeded
; /* continue processing input */
3622 output_line_command (ip
, op
, 1, same_file
);
3628 * evaluate a #if expression in BUF, of length LENGTH,
3629 * then parse the result as a C expression and return the value as an int.
3632 eval_if_expression (buf
, length
)
3637 HASHNODE
*save_defined
;
3640 save_defined
= install (U
"defined", -1, T_SPEC_DEFINED
, -1);
3641 temp_obuf
= expand_to_temp_buffer (buf
, buf
+ length
, 0);
3642 delete_macro (save_defined
); /* clean up special symbol */
3644 value
= parse_c_expression ((const char *)temp_obuf
.buf
);
3646 free (temp_obuf
.buf
);
3652 * routine to handle ifdef/ifndef. Try to look up the symbol,
3653 * then do or don't skip to the #endif/#else/#elif depending
3654 * on what directive is actually being processed.
3657 do_xifdef (buf
, limit
, type
)
3658 U_CHAR
*buf
, *limit
;
3659 enum node_type type
;
3662 FILE_BUF
*ip
= &instack
[indepth
];
3665 /* Discard leading and trailing whitespace. */
3666 SKIP_WHITE_SPACE (buf
);
3667 while (limit
!= buf
&& is_nvspace (limit
[-1])) limit
--;
3669 /* Find the end of the identifier at the beginning. */
3670 for (end
= buf
; is_idchar (*end
); end
++);
3673 skip
= (type
== T_IFDEF
);
3675 skip
= (lookup (buf
, end
-buf
, -1) == NULL
) ^ (type
== T_IFNDEF
);
3677 conditional_skip (ip
, skip
, T_IF
);
3681 do_ifdef (buf
, limit
, op
)
3682 U_CHAR
*buf
, *limit
;
3683 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3685 do_xifdef (buf
, limit
, T_IFDEF
);
3689 do_ifndef (buf
, limit
, op
)
3690 U_CHAR
*buf
, *limit
;
3691 FILE_BUF
*op ATTRIBUTE_UNUSED
;
3693 do_xifdef (buf
, limit
, T_IFNDEF
);
3697 * push TYPE on stack; then, if SKIP is nonzero, skip ahead.
3700 conditional_skip (ip
, skip
, type
)
3703 enum node_type type
;
3705 IF_STACK_FRAME
*temp
;
3707 temp
= (IF_STACK_FRAME
*) xcalloc (1, sizeof (IF_STACK_FRAME
));
3708 temp
->fname
= ip
->fname
;
3709 temp
->lineno
= ip
->lineno
;
3710 temp
->next
= if_stack
;
3713 if_stack
->type
= type
;
3716 skip_if_group (ip
, 0);
3719 ++if_stack
->if_succeeded
;
3720 output_line_command (ip
, &outbuf
, 1, same_file
);
3725 * skip to #endif, #else, or #elif. adjust line numbers, etc.
3726 * leaves input ptr at the sharp sign found.
3727 * If ANY is nonzero, return at next directive of any sort.
3730 skip_if_group (ip
, any
)
3734 U_CHAR
*bp
= ip
->bufp
, *cp
;
3735 U_CHAR
*endb
= ip
->buf
+ ip
->length
;
3736 const struct directive
*kt
;
3737 IF_STACK_FRAME
*save_if_stack
= if_stack
; /* don't pop past here */
3738 U_CHAR
*beg_of_line
= bp
;
3742 case '/': /* possible comment */
3743 if (*bp
== '\\' && bp
[1] == '\n')
3747 bp
= skip_to_end_of_comment (ip
, &ip
->lineno
);
3752 bp
= skip_quoted_string (bp
- 1, endb
, ip
->lineno
, &ip
->lineno
, 0, 0);
3755 /* Char after backslash loses its special meaning. */
3758 ++ip
->lineno
; /* But do update the line-count. */
3769 /* # keyword: a # must be first nonblank char on the line */
3770 if (beg_of_line
== 0)
3772 /* Scan from start of line, skipping whitespace, comments
3773 and backslash-newlines, and see if we reach this #.
3774 If not, this # is not special. */
3777 if (is_nvspace (*bp
))
3779 else if (*bp
== '\\' && bp
[1] == '\n')
3781 else if (*bp
== '/' && bp
[1] == '*') {
3783 while (!(*bp
== '*' && bp
[1] == '/')) {
3792 if (bp
!= ip
->bufp
) {
3793 bp
= ip
->bufp
+ 1; /* Reset bp to after the #. */
3797 bp
= ip
->bufp
+ 1; /* Point after '#'. */
3799 /* Skip whitespace and \-newline. */
3801 if (is_nvspace (*bp
))
3803 else if (*bp
== '\\' && bp
[1] == '\n')
3805 else if (*bp
== '/' && bp
[1] == '*') {
3807 while (!(*bp
== '*' && bp
[1] == '/'))
3816 /* Now find end of directive name.
3817 If we encounter a backslash-newline, exchange it with any following
3818 symbol-constituents so that we end up with a contiguous name. */
3821 if (is_idchar (*bp
))
3824 if (*bp
== '\\' && bp
[1] == '\n')
3825 name_newline_fix (bp
);
3826 if (is_idchar (*bp
))
3832 for (kt
= directive_table
; kt
->length
>= 0; kt
++) {
3833 IF_STACK_FRAME
*temp
;
3834 if (strncmp ((const char *)cp
, kt
->name
, kt
->length
) == 0
3835 && !is_idchar (cp
[kt
->length
])) {
3837 /* If we are asked to return on next directive,
3846 temp
= (IF_STACK_FRAME
*) xcalloc (1, sizeof (IF_STACK_FRAME
));
3847 temp
->next
= if_stack
;
3849 temp
->lineno
= ip
->lineno
;
3850 temp
->fname
= ip
->fname
;
3851 temp
->type
= kt
->type
;
3856 if (if_stack
== instack
[indepth
].if_stack
) {
3857 error ("#%s not within a conditional", kt
->name
);
3860 else if (if_stack
== save_if_stack
)
3861 return; /* found what we came for */
3863 if (kt
->type
!= T_ENDIF
) {
3864 if (if_stack
->type
== T_ELSE
)
3865 error ("#else or #elif after #else");
3866 if_stack
->type
= kt
->type
;
3871 if_stack
= if_stack
->next
;
3876 /* Anything else is ignored. */
3885 /* after this returns, rescan will exit because ip->bufp
3886 now points to the end of the buffer.
3887 rescan is responsible for the error message also. */
3891 * handle a #else directive. Do this by just continuing processing
3892 * without changing if_stack ; this is so that the error message
3893 * for missing #endif's etc. will point to the original #if. It
3894 * is possible that something different would be better.
3897 do_else (buf
, limit
, op
)
3898 U_CHAR
*buf ATTRIBUTE_UNUSED
;
3899 U_CHAR
*limit ATTRIBUTE_UNUSED
;
3902 FILE_BUF
*ip
= &instack
[indepth
];
3904 if (if_stack
== instack
[indepth
].if_stack
) {
3905 error ("#else not within a conditional");
3908 if (if_stack
->type
!= T_IF
&& if_stack
->type
!= T_ELIF
) {
3909 error ("#else after #else");
3910 fprintf (stderr
, " (matches line %d", if_stack
->lineno
);
3911 if (strcmp (if_stack
->fname
, ip
->fname
) != 0)
3912 fprintf (stderr
, ", file %s", if_stack
->fname
);
3913 fprintf (stderr
, ")\n");
3915 if_stack
->type
= T_ELSE
;
3918 if (if_stack
->if_succeeded
)
3919 skip_if_group (ip
, 0);
3921 ++if_stack
->if_succeeded
; /* continue processing input */
3922 output_line_command (ip
, op
, 1, same_file
);
3927 * unstack after #endif command
3930 do_endif (buf
, limit
, op
)
3931 U_CHAR
*buf ATTRIBUTE_UNUSED
;
3932 U_CHAR
*limit ATTRIBUTE_UNUSED
;
3935 if (if_stack
== instack
[indepth
].if_stack
)
3936 error ("unbalanced #endif");
3938 IF_STACK_FRAME
*temp
= if_stack
;
3939 if_stack
= if_stack
->next
;
3941 output_line_command (&instack
[indepth
], op
, 1, same_file
);
3946 * Skip a comment, assuming the input ptr immediately follows the
3947 * initial slash-star. Bump line counter as necessary.
3948 * (The canonical line counter is &ip->lineno).
3949 * Don't use this routine (or the next one) if bumping the line
3950 * counter is not sufficient to deal with newlines in the string.
3953 skip_to_end_of_comment (ip
, line_counter
)
3955 int *line_counter
; /* place to remember newlines, or NULL */
3957 U_CHAR
*limit
= ip
->buf
+ ip
->length
;
3958 U_CHAR
*bp
= ip
->bufp
;
3959 FILE_BUF
*op
= &outbuf
; /* JF */
3960 int output
= put_out_comments
&& !line_counter
;
3962 /* JF this line_counter stuff is a crock to make sure the
3963 comment is only put out once, no matter how many times
3964 the comment is skipped. It almost works */
3969 while (bp
< limit
) {
3974 if (warn_comments
&& bp
< limit
&& *bp
== '*')
3975 warning("`/*' within comment");
3978 if (line_counter
!= NULL
)
3984 if (*bp
== '\\' && bp
[1] == '\n')
4000 * Skip over a quoted string. BP points to the opening quote.
4001 * Returns a pointer after the closing quote. Don't go past LIMIT.
4002 * START_LINE is the line number of the starting point (but it need
4003 * not be valid if the starting point is inside a macro expansion).
4005 * The input stack state is not changed.
4007 * If COUNT_NEWLINES is nonzero, it points to an int to increment
4008 * for each newline passed.
4010 * If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
4011 * if we pass a backslash-newline.
4013 * If EOFP is nonzero, set *EOFP to 1 if the string is unterminated.
4016 skip_quoted_string (bp
, limit
, start_line
, count_newlines
, backslash_newlines_p
, eofp
)
4018 const U_CHAR
*limit
;
4020 int *count_newlines
;
4021 int *backslash_newlines_p
;
4029 error_with_line (line_for_error (start_line
),
4030 "unterminated string or character constant");
4037 while (*bp
== '\\' && bp
[1] == '\n') {
4038 if (backslash_newlines_p
)
4039 *backslash_newlines_p
= 1;
4044 if (*bp
== '\n' && count_newlines
) {
4045 if (backslash_newlines_p
)
4046 *backslash_newlines_p
= 1;
4050 } else if (c
== '\n') {
4051 /* Unterminated strings and character constants are 'legal'. */
4052 bp
--; /* Don't consume the newline. */
4056 } else if (c
== match
)
4059 return (U_CHAR
*) bp
;
4063 * write out a #line command, for instance, after an #include file.
4064 * If CONDITIONAL is nonzero, we can omit the #line if it would
4065 * appear to be a no-op, and we can output a few newlines instead
4066 * if we want to increase the line number by a small amount.
4067 * FILE_CHANGE says whether we are entering a file, leaving, or neither.
4071 output_line_command (ip
, op
, conditional
, file_change
)
4074 enum file_change_code file_change
;
4077 char line_cmd_buf
[500];
4079 if (no_line_commands
4080 || ip
->fname
== NULL
4082 op
->lineno
= ip
->lineno
;
4087 if (ip
->lineno
== op
->lineno
)
4090 /* If the inherited line number is a little too small,
4091 output some newlines instead of a #line command. */
4092 if (ip
->lineno
> op
->lineno
&& ip
->lineno
< op
->lineno
+ 8) {
4093 check_expand (op
, 10);
4094 while (ip
->lineno
> op
->lineno
) {
4102 sprintf (line_cmd_buf
, "# %d \"%s\"", ip
->lineno
, ip
->fname
);
4103 if (file_change
!= same_file
)
4104 strcat (line_cmd_buf
, file_change
== enter_file
? " 1" : " 2");
4105 if (system_include_depth
> 0)
4106 strcat (line_cmd_buf
, " 3");
4107 len
= strlen (line_cmd_buf
);
4108 line_cmd_buf
[len
++] = '\n';
4109 check_expand (op
, len
+ 1);
4110 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n')
4112 memcpy (op
->bufp
, line_cmd_buf
, len
);
4114 op
->lineno
= ip
->lineno
;
4118 /* Expand a macro call.
4119 HP points to the symbol that is the macro being called.
4120 Put the result of expansion onto the input stack
4121 so that subsequent input by our caller will use it.
4123 If macro wants arguments, caller has already verified that
4124 an argument list follows; arguments come from the input stack. */
4127 macroexpand (hp
, op
)
4132 DEFINITION
*defn
= hp
->value
.defn
;
4135 int start_line
= instack
[indepth
].lineno
;
4137 CHECK_DEPTH (return;);
4139 /* it might not actually be a macro. */
4140 if (hp
->type
!= T_MACRO
) {
4141 special_symbol (hp
, op
);
4145 nargs
= defn
->nargs
;
4149 struct argdata
*args
;
4150 const char *parse_error
= 0;
4152 args
= (struct argdata
*) alloca ((nargs
+ 1) * sizeof (struct argdata
));
4154 for (i
= 0; i
< nargs
; i
++) {
4155 args
[i
].raw
= args
[i
].expanded
= (U_CHAR
*) "";
4156 args
[i
].raw_length
= args
[i
].expand_length
4157 = args
[i
].stringified_length
= 0;
4158 args
[i
].free1
= args
[i
].free2
= 0;
4161 /* Parse all the macro args that are supplied. I counts them.
4162 The first NARGS args are stored in ARGS.
4163 The rest are discarded. */
4166 /* Discard the open-parenthesis or comma before the next arg. */
4167 ++instack
[indepth
].bufp
;
4169 = macarg ((i
< nargs
|| (nargs
== 0 && i
== 0)) ? &args
[i
] : 0);
4172 error_with_line (line_for_error (start_line
), "%s", parse_error
);
4176 } while (*instack
[indepth
].bufp
!= ')');
4178 /* If we got one arg but it was just whitespace, call that 0 args. */
4180 const U_CHAR
*bp
= args
[0].raw
;
4181 const U_CHAR
*lim
= bp
+ args
[0].raw_length
;
4182 while (bp
!= lim
&& is_space (*bp
)) bp
++;
4187 if (nargs
== 0 && i
> 0)
4188 error ("arguments given to macro `%s'", hp
->name
);
4189 else if (i
< nargs
) {
4190 /* traditional C allows foo() if foo wants one argument. */
4191 if (nargs
== 1 && i
== 0)
4194 error ("no args to macro `%s'", hp
->name
);
4196 error ("only 1 arg to macro `%s'", hp
->name
);
4198 error ("only %d args to macro `%s'", i
, hp
->name
);
4199 } else if (i
> nargs
)
4200 error ("too many (%d) args to macro `%s'", i
, hp
->name
);
4202 /* Swallow the closeparen. */
4203 ++instack
[indepth
].bufp
;
4205 /* If macro wants zero args, we parsed the arglist for checking only.
4206 Read directly from the macro definition. */
4208 xbuf
= defn
->expansion
;
4209 xbuf_len
= defn
->length
;
4211 U_CHAR
*exp
= defn
->expansion
;
4212 int offset
; /* offset in expansion,
4213 copied a piece at a time */
4214 int totlen
; /* total amount of exp buffer filled so far */
4218 /* Macro really takes args. Compute the expansion of this call. */
4220 /* Compute length in characters of the macro's expansion. */
4221 xbuf_len
= defn
->length
;
4222 for (ap
= defn
->pattern
; ap
!= NULL
; ap
= ap
->next
) {
4224 xbuf_len
+= args
[ap
->argno
].stringified_length
;
4226 xbuf_len
+= args
[ap
->argno
].raw_length
;
4229 xbuf
= (U_CHAR
*) xmalloc (xbuf_len
+ 1);
4231 /* Generate in XBUF the complete expansion
4232 with arguments substituted in.
4233 TOTLEN is the total size generated so far.
4234 OFFSET is the index in the definition
4235 of where we are copying from. */
4236 offset
= totlen
= 0;
4237 for (ap
= defn
->pattern
; ap
!= NULL
; ap
= ap
->next
) {
4238 struct argdata
*arg
= &args
[ap
->argno
];
4240 for (i
= 0; i
< ap
->nchars
; i
++)
4241 xbuf
[totlen
++] = exp
[offset
++];
4243 if (ap
->stringify
!= 0) {
4244 int arglen
= arg
->raw_length
;
4250 && (c
= arg
->raw
[i
], is_space (c
)))
4253 && (c
= arg
->raw
[arglen
- 1], is_space (c
)))
4255 for (; i
< arglen
; i
++) {
4258 /* Special markers Newline Space
4259 generate nothing for a stringified argument. */
4260 if (c
== '\n' && arg
->raw
[i
+1] != '\n') {
4265 /* Internal sequences of whitespace are replaced by one space
4266 except within an string or char token. */
4268 && (c
== '\n' ? arg
->raw
[i
+1] == '\n' : is_space (c
))) {
4270 /* Note that Newline Space does occur within whitespace
4271 sequences; consider it part of the sequence. */
4272 if (c
== '\n' && is_space (arg
->raw
[i
+1]))
4274 else if (c
!= '\n' && is_space (c
))
4291 } else if (c
== '\"' || c
== '\'')
4295 /* Escape these chars */
4296 if (c
== '\"' || (in_string
&& c
== '\\'))
4297 xbuf
[totlen
++] = '\\';
4301 sprintf ((char *) &xbuf
[totlen
], "\\%03o", (unsigned int) c
);
4306 const U_CHAR
*p1
= arg
->raw
;
4307 const U_CHAR
*l1
= p1
+ arg
->raw_length
;
4309 if (ap
->raw_before
) {
4310 while (p1
!= l1
&& is_space (*p1
)) p1
++;
4311 while (p1
!= l1
&& is_idchar (*p1
))
4312 xbuf
[totlen
++] = *p1
++;
4313 /* Delete any no-reexpansion marker that follows
4314 an identifier at the beginning of the argument
4315 if the argument is concatenated with what precedes it. */
4316 if (p1
[0] == '\n' && p1
[1] == '-')
4319 if (ap
->raw_after
) {
4320 /* Arg is concatenated after: delete trailing whitespace,
4321 whitespace markers, and no-reexpansion markers. */
4323 if (is_space (l1
[-1])) l1
--;
4324 else if (l1
[-1] == '-') {
4325 const U_CHAR
*p2
= l1
- 1;
4326 /* If a `-' is preceded by an odd number of newlines then it
4327 and the last newline are a no-reexpansion marker. */
4328 while (p2
!= p1
&& p2
[-1] == '\n') p2
--;
4329 if ((l1
- 1 - p2
) & 1) {
4337 memmove (xbuf
+ totlen
, p1
, l1
- p1
);
4341 if (totlen
> xbuf_len
)
4345 /* if there is anything left of the definition
4346 after handling the arg list, copy that in too. */
4348 for (i
= offset
; i
< defn
->length
; i
++)
4349 xbuf
[totlen
++] = exp
[i
];
4354 for (i
= 0; i
< nargs
; i
++) {
4355 if (args
[i
].free1
!= 0)
4356 free (args
[i
].free1
);
4357 if (args
[i
].free2
!= 0)
4358 free (args
[i
].free2
);
4362 xbuf
= defn
->expansion
;
4363 xbuf_len
= defn
->length
;
4366 /* Now put the expansion on the input stack
4367 so our caller will commence reading from it. */
4371 ip2
= &instack
[++indepth
];
4376 ip2
->length
= xbuf_len
;
4378 ip2
->free_ptr
= (nargs
> 0) ? xbuf
: 0;
4380 ip2
->if_stack
= if_stack
;
4385 * Parse a macro argument and store the info on it into *ARGPTR.
4386 * Return nonzero to indicate a syntax error.
4391 struct argdata
*argptr
;
4393 FILE_BUF
*ip
= &instack
[indepth
];
4398 /* Try to parse as much of the argument as exists at this
4399 input stack level. */
4400 U_CHAR
*bp
= macarg1 (ip
->bufp
, ip
->buf
+ ip
->length
,
4401 &paren
, &newlines
, &comments
);
4403 /* If we find the end of the argument at this level,
4404 set up *ARGPTR to point at it in the input stack. */
4405 if (!(ip
->fname
!= 0 && (newlines
!= 0 || comments
!= 0))
4406 && bp
!= ip
->buf
+ ip
->length
) {
4408 argptr
->raw
= ip
->bufp
;
4409 argptr
->raw_length
= bp
- ip
->bufp
;
4413 /* This input stack level ends before the macro argument does.
4414 We must pop levels and keep parsing.
4415 Therefore, we must allocate a temporary buffer and copy
4416 the macro argument into it. */
4417 int bufsize
= bp
- ip
->bufp
;
4418 int extra
= newlines
;
4419 U_CHAR
*buffer
= (U_CHAR
*) xmalloc (bufsize
+ extra
+ 1);
4420 int final_start
= 0;
4422 memcpy (buffer
, ip
->bufp
, bufsize
);
4424 ip
->lineno
+= newlines
;
4426 while (bp
== ip
->buf
+ ip
->length
) {
4427 if (instack
[indepth
].macro
== 0) {
4429 return "unterminated macro call";
4431 ip
->macro
->type
= T_MACRO
;
4433 free (ip
->free_ptr
);
4434 ip
= &instack
[--indepth
];
4437 bp
= macarg1 (ip
->bufp
, ip
->buf
+ ip
->length
, &paren
,
4438 &newlines
, &comments
);
4439 final_start
= bufsize
;
4440 bufsize
+= bp
- ip
->bufp
;
4442 buffer
= (U_CHAR
*) xrealloc (buffer
, bufsize
+ extra
+ 1);
4443 memcpy (buffer
+ bufsize
- (bp
- ip
->bufp
), ip
->bufp
, bp
- ip
->bufp
);
4445 ip
->lineno
+= newlines
;
4448 /* Now, if arg is actually wanted, record its raw form,
4449 discarding comments and duplicating newlines in whatever
4450 part of it did not come from a macro expansion.
4451 EXTRA space has been preallocated for duplicating the newlines.
4452 FINAL_START is the index of the start of that part. */
4454 argptr
->raw
= buffer
;
4455 argptr
->raw_length
= bufsize
;
4456 argptr
->free1
= buffer
;
4457 argptr
->newlines
= newlines
;
4458 argptr
->comments
= comments
;
4459 if ((newlines
|| comments
) && ip
->fname
!= 0)
4462 discard_comments (argptr
->raw
+ final_start
,
4463 argptr
->raw_length
- final_start
,
4465 argptr
->raw
[argptr
->raw_length
] = 0;
4466 if (argptr
->raw_length
> bufsize
+ extra
)
4471 /* If we are not discarding this argument,
4472 macroexpand it and compute its length as stringified.
4473 All this info goes into *ARGPTR. */
4477 const U_CHAR
*buf
, *lim
;
4480 obuf
= expand_to_temp_buffer (argptr
->raw
,
4481 argptr
->raw
+ argptr
->raw_length
,
4484 argptr
->expanded
= obuf
.buf
;
4485 argptr
->expand_length
= obuf
.length
;
4486 argptr
->free2
= obuf
.buf
;
4489 lim
= buf
+ argptr
->raw_length
;
4492 while (buf
!= lim
) {
4495 /* Internal sequences of whitespace are replaced by one space
4496 in most cases, but not always. So count all the whitespace
4497 in case we need to keep it all. */
4498 if (c
== '\"' || c
== '\\') /* escape these chars */
4500 else if (!ISPRINT (c
))
4503 argptr
->stringified_length
= totlen
;
4508 /* Scan text from START (inclusive) up to LIMIT (exclusive),
4509 counting parens in *DEPTHPTR,
4510 and return if reach LIMIT
4511 or before a `)' that would make *DEPTHPTR negative
4512 or before a comma when *DEPTHPTR is zero.
4513 Single and double quotes are matched and termination
4514 is inhibited within them. Comments also inhibit it.
4515 Value returned is pointer to stopping place.
4517 Increment *NEWLINES each time a newline is passed.
4518 Set *COMMENTS to 1 if a comment is seen. */
4521 macarg1 (start
, limit
, depthptr
, newlines
, comments
)
4523 const U_CHAR
*limit
;
4524 int *depthptr
, *newlines
, *comments
;
4528 while (bp
< limit
) {
4534 if (--(*depthptr
) < 0)
4538 /* Traditionally, backslash makes following char not special. */
4542 /* But count source lines anyway. */
4551 if (bp
[1] == '\\' && bp
[2] == '\n')
4552 newline_fix (bp
+ 1);
4553 if (bp
[1] != '*' || bp
+ 1 >= limit
)
4557 while (bp
+ 1 < limit
) {
4559 && bp
[1] == '\\' && bp
[2] == '\n')
4560 newline_fix (bp
+ 1);
4561 if (bp
[0] == '*' && bp
[1] == '/')
4563 if (*bp
== '\n') ++*newlines
;
4572 for (quotec
= *bp
++; bp
+ 1 < limit
&& *bp
!= quotec
; bp
++) {
4577 while (*bp
== '\\' && bp
[1] == '\n') {
4580 } else if (*bp
== '\n') {
4589 if ((*depthptr
) == 0)
4599 /* Discard comments and duplicate newlines
4600 in the string of length LENGTH at START,
4601 except inside of string constants.
4602 The string is copied into itself with its beginning staying fixed.
4604 NEWLINES is the number of newlines that must be duplicated.
4605 We assume that that much extra space is available past the end
4609 discard_comments (start
, length
, newlines
)
4616 const U_CHAR
*limit
;
4619 /* If we have newlines to duplicate, copy everything
4620 that many characters up. Then, in the second part,
4621 we will have room to insert the newlines
4623 NEWLINES may actually be too large, because it counts
4624 newlines in string constants, and we don't duplicate those.
4625 But that does no harm. */
4627 ibp
= start
+ length
;
4628 obp
= ibp
+ newlines
;
4630 while (limit
!= ibp
)
4634 ibp
= start
+ newlines
;
4635 limit
= start
+ length
+ newlines
;
4638 while (ibp
< limit
) {
4639 *obp
++ = c
= *ibp
++;
4642 /* Duplicate the newline. */
4654 if (*ibp
== '\\' && ibp
[1] == '\n')
4656 /* Delete any comment. */
4657 if (ibp
[0] != '*' || ibp
+ 1 >= limit
)
4661 while (ibp
+ 1 < limit
) {
4663 && ibp
[1] == '\\' && ibp
[2] == '\n')
4664 newline_fix (ibp
+ 1);
4665 if (ibp
[0] == '*' && ibp
[1] == '/')
4674 /* Notice and skip strings, so that we don't
4675 think that comments start inside them,
4676 and so we don't duplicate newlines in them. */
4679 while (ibp
< limit
) {
4680 *obp
++ = c
= *ibp
++;
4683 if (c
== '\n' && quotec
== '\'')
4685 if (c
== '\\' && ibp
< limit
) {
4686 while (*ibp
== '\\' && ibp
[1] == '\n')
4700 /* Core error handling routine. */
4702 v_message (mtype
, line
, msgid
, ap
)
4708 const char *fname
= 0;
4711 if (mtype
== MT_WARNING
&& inhibit_warnings
)
4714 for (i
= indepth
; i
>= 0; i
--)
4715 if (instack
[i
].fname
!= NULL
) {
4717 line
= instack
[i
].lineno
;
4718 fname
= instack
[i
].fname
;
4723 fprintf (stderr
, "%s:%d: ", fname
, line
);
4725 fprintf (stderr
, "%s: ", progname
);
4727 if (mtype
== MT_WARNING
)
4728 fputs (_("warning: "), stderr
);
4730 vfprintf (stderr
, _(msgid
), ap
);
4731 putc ('\n', stderr
);
4733 if (mtype
== MT_ERROR
)
4738 * error - print error message and increment count of errors.
4741 error
VPARAMS ((const char *msgid
, ...))
4744 VA_FIXEDARG (ap
, const char *, msgid
);
4746 v_message (MT_ERROR
, 0, msgid
, ap
);
4751 error_with_line
VPARAMS ((int line
, const char *msgid
, ...))
4754 VA_FIXEDARG (ap
, int, line
);
4755 VA_FIXEDARG (ap
, const char *, msgid
);
4757 v_message (MT_ERROR
, line
, msgid
, ap
);
4761 /* Error including a message from `errno'. */
4763 error_from_errno (name
)
4766 error ("%s: %s", name
, strerror (errno
));
4769 /* Print error message but don't count it. */
4771 warning
VPARAMS ((const char *msgid
, ...))
4774 VA_FIXEDARG (ap
, const char *, msgid
);
4776 v_message (MT_WARNING
, 0, msgid
, ap
);
4781 fatal
VPARAMS ((const char *msgid
, ...))
4784 VA_FIXEDARG (ap
, const char *, msgid
);
4786 v_message (MT_FATAL
, 0, msgid
, ap
);
4788 exit (FATAL_EXIT_CODE
);
4791 /* More 'friendly' abort that prints the location at which we died. */
4793 fancy_abort (line
, func
)
4797 fatal ("internal error in %s, at tradcpp.c:%d\n\
4798 Please submit a full bug report.\n\
4799 See %s for instructions.", func
, line
, GCCBUGURL
);
4803 perror_with_name (name
)
4806 fprintf (stderr
, "%s: %s: %s\n", progname
, name
, strerror (errno
));
4811 pfatal_with_name (name
)
4814 perror_with_name (name
);
4815 exit (FATAL_EXIT_CODE
);
4818 /* Return the line at which an error occurred.
4819 The error is not necessarily associated with the current spot
4820 in the input stack, so LINE says where. LINE will have been
4821 copied from ip->lineno for the current input level.
4822 If the current level is for a file, we return LINE.
4823 But if the current level is not for a file, LINE is meaningless.
4824 In that case, we return the lineno of the innermost file. */
4826 line_for_error (line
)
4832 for (i
= indepth
; i
>= 0; ) {
4833 if (instack
[i
].fname
!= 0)
4838 line1
= instack
[i
].lineno
;
4844 * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
4846 * As things stand, nothing is ever placed in the output buffer to be
4847 * removed again except when it's KNOWN to be part of an identifier,
4848 * so flushing and moving down everything left, instead of expanding,
4853 grow_outbuf (obuf
, needed
)
4860 if (obuf
->length
- (obuf
->bufp
- obuf
->buf
) > needed
)
4863 /* Make it at least twice as big as it is now. */
4865 /* Make it have at least 150% of the free space we will need. */
4866 minsize
= (3 * needed
) / 2 + (obuf
->bufp
- obuf
->buf
);
4867 if (minsize
> obuf
->length
)
4868 obuf
->length
= minsize
;
4870 p
= (U_CHAR
*) xrealloc (obuf
->buf
, obuf
->length
);
4871 obuf
->bufp
= p
+ (obuf
->bufp
- obuf
->buf
);
4875 /* Symbol table for macro names and special symbols */
4878 * install a name in the main hash table, even if it is already there.
4879 * name stops with first non alphanumeric, except leading '#'.
4880 * caller must check against redefinition if that is desired.
4881 * delete_macro () removes things installed by install () in fifo order.
4882 * this is important because of the `defined' special symbol used
4883 * in #if, and also if pushdef/popdef directives are ever implemented.
4885 * If LEN is >= 0, it is the length of the name.
4886 * Otherwise, compute the length by scanning the entire name.
4888 * If HASH is >= 0, it is the precomputed hash code.
4889 * Otherwise, compute the hash code.
4891 * caller must set the value, if any is desired.
4894 install (name
, len
, type
, hash
)
4897 enum node_type type
;
4899 /* watch out here if sizeof (U_CHAR *) != sizeof (int) */
4908 while (is_idchar (*p
))
4914 hash
= hashf (name
, len
, HASHSIZE
);
4916 hp
= (HASHNODE
*) xmalloc (sizeof (HASHNODE
) + len
+ 1);
4918 hp
->bucket_hdr
= &hashtab
[bucket
];
4919 hp
->next
= hashtab
[bucket
];
4920 hashtab
[bucket
] = hp
;
4922 if (hp
->next
!= NULL
)
4923 hp
->next
->prev
= hp
;
4926 hp
->name
= q
= ((U_CHAR
*) hp
) + sizeof (HASHNODE
);
4927 memcpy (q
, name
, len
);
4933 * find the most recent hash node for name name (ending with first
4934 * non-identifier char) installed by install
4936 * If LEN is >= 0, it is the length of the name.
4937 * Otherwise, compute the length by scanning the entire name.
4939 * If HASH is >= 0, it is the precomputed hash code.
4940 * Otherwise, compute the hash code.
4943 lookup (name
, len
, hash
)
4952 for (bp
= name
; is_idchar (*bp
); bp
++) ;
4957 hash
= hashf (name
, len
, HASHSIZE
);
4959 bucket
= hashtab
[hash
];
4961 if (bucket
->length
== len
4962 && strncmp ((const char *)bucket
->name
, (const char *)name
, len
) == 0)
4964 bucket
= bucket
->next
;
4970 * Delete a hash node. Some weirdness to free junk from macros.
4971 * More such weirdness will have to be added if you define more hash
4972 * types that need it.
4975 /* Note that the DEFINITION of a macro is removed from the hash table
4976 but its storage is not freed. This would be a storage leak
4977 except that it is not reasonable to keep undefining and redefining
4978 large numbers of macros many times.
4979 In any case, this is necessary, because a macro can be #undef'd
4980 in the middle of reading the arguments to a call to it.
4981 If #undef freed the DEFINITION, that would crash. */
4987 if (hp
->prev
!= NULL
)
4988 hp
->prev
->next
= hp
->next
;
4989 if (hp
->next
!= NULL
)
4990 hp
->next
->prev
= hp
->prev
;
4992 /* make sure that the bucket chain header that
4993 the deleted guy was on points to the right thing afterwards. */
4994 if (hp
== *hp
->bucket_hdr
)
4995 *hp
->bucket_hdr
= hp
->next
;
5001 * return hash function on name. must be compatible with the one
5002 * computed a step at a time, elsewhere
5005 hashf (name
, len
, hashsize
)
5013 r
= HASHSTEP (r
, *name
++);
5015 return MAKE_POS (r
) % hashsize
;
5018 /* Dump all macro definitions as #defines to stdout. */
5025 for (bucket
= 0; bucket
< HASHSIZE
; bucket
++) {
5028 for (hp
= hashtab
[bucket
]; hp
; hp
= hp
->next
) {
5029 if (hp
->type
== T_MACRO
) {
5030 DEFINITION
*defn
= hp
->value
.defn
;
5036 /* Print the definition of the macro HP. */
5038 printf ("#define %s", hp
->name
);
5039 if (defn
->nargs
>= 0) {
5043 for (i
= 0; i
< defn
->nargs
; i
++) {
5044 dump_arg_n (defn
, i
);
5045 if (i
+ 1 < defn
->nargs
)
5055 for (ap
= defn
->pattern
; ap
!= NULL
; ap
= ap
->next
) {
5056 dump_defn_1 (defn
->expansion
, offset
, ap
->nchars
);
5057 if (ap
->nchars
!= 0)
5059 offset
+= ap
->nchars
;
5062 if (ap
->raw_before
&& !concat
)
5065 dump_arg_n (defn
, ap
->argno
);
5066 if (ap
->raw_after
) {
5071 dump_defn_1 (defn
->expansion
, offset
, defn
->length
- offset
);
5078 /* Output to stdout a substring of a macro definition.
5079 BASE is the beginning of the definition.
5080 Output characters START thru LENGTH.
5081 Discard newlines outside of strings, thus
5082 converting funny-space markers to ordinary spaces. */
5084 dump_defn_1 (base
, start
, length
)
5089 const U_CHAR
*p
= base
+ start
;
5090 const U_CHAR
*limit
= base
+ start
+ length
;
5095 else if (*p
== '\"' || *p
=='\'') {
5096 const U_CHAR
*p1
= skip_quoted_string (p
, limit
, 0, 0, 0, 0);
5097 fwrite (p
, p1
- p
, 1, stdout
);
5104 /* Print the name of argument number ARGNUM of macro definition DEFN.
5105 Recall that DEFN->argnames contains all the arg names
5106 concatenated in reverse order with comma-space in between. */
5108 dump_arg_n (defn
, argnum
)
5112 const U_CHAR
*p
= defn
->argnames
;
5113 while (argnum
+ 1 < defn
->nargs
) {
5114 p
= (const U_CHAR
*) strchr ((const char *)p
, ' ') + 1;
5118 while (*p
&& *p
!= ',') {
5124 /* Initialize the built-in macros. */
5125 #define DSC(x) U x, sizeof x - 1
5126 #define install_spec(name, type) \
5127 install(DSC(name), type, -1);
5128 #define install_value(name, val) do { \
5129 hp = install(DSC(name), T_CONST, -1); hp->value.cpval = val; \
5132 initialize_builtins ()
5136 install_spec ("__BASE_FILE__", T_BASE_FILE
);
5137 install_spec ("__DATE__", T_DATE
);
5138 install_spec ("__FILE__", T_FILE
);
5139 install_spec ("__TIME__", T_TIME
);
5140 install_spec ("__VERSION__", T_VERSION
);
5141 install_spec ("__INCLUDE_LEVEL__", T_INCLUDE_LEVEL
);
5142 install_spec ("__LINE__", T_SPECLINE
);
5144 if (flag_signed_char
== 0)
5145 install_value ("__CHAR_UNSIGNED__", "1");
5149 #undef install_value
5151 /* Common handler of command line directives -U, -D and -A. */
5153 run_directive (str
, len
, type
)
5156 enum node_type type
;
5158 const struct directive
*kt
;
5159 FILE_BUF
*ip
= &instack
[++indepth
];
5160 ip
->fname
= "*command line*";
5162 ip
->buf
= ip
->bufp
= (U_CHAR
*) str
;
5167 ip
->if_stack
= if_stack
;
5169 for (kt
= directive_table
; kt
->type
!= type
; kt
++)
5172 (*kt
->func
) ((U_CHAR
*) str
, (U_CHAR
*) str
+ len
, NULL
);
5176 /* Handle the -D option. If STR is just an identifier, define it with
5177 * value 1. If STR has anything after the identifier, then it should
5178 * be identifier-space-definition. */
5180 make_definition (str
)
5186 /* Copy the entire option so we can modify it.
5187 Change the first "=" in the string to a space. If there is none,
5188 tack " 1" on the end. */
5190 /* Length including the null. */
5191 count
= strlen (str
);
5192 buf
= (char *) alloca (count
+ 2);
5193 memcpy (buf
, str
, count
);
5195 p
= strchr (str
, '=');
5204 run_directive (buf
, count
, T_DEFINE
);
5207 /* Handle the -U option. */
5212 run_directive (str
, strlen (str
), T_UNDEF
);
5215 /* Handles the #assert (-A) and #unassert (-A-) command line options. */
5217 make_assertion (str
)
5220 enum node_type type
= T_ASSERT
;
5230 count
= strlen (str
);
5231 p
= strchr (str
, '=');
5234 /* Copy the entire option so we can modify it. Change the first
5235 "=" in the string to a '(', and tack a ')' on the end. */
5236 char *buf
= (char *) alloca (count
+ 1);
5238 memcpy (buf
, str
, count
);
5244 run_directive (str
, count
, type
);
5247 /* Get the file-mode and data size of the file open on FD
5248 and store them in *MODE_POINTER and *SIZE_POINTER. */
5251 file_size_and_mode (fd
, mode_pointer
, size_pointer
)
5258 if (fstat (fd
, &sbuf
) < 0) return -1;
5259 if (mode_pointer
) *mode_pointer
= sbuf
.st_mode
;
5260 if (size_pointer
) *size_pointer
= sbuf
.st_size
;