OSDN Git Service

include:
[pf3gnuchains/gcc-fork.git] / gcc / tradcpp.c
1 /* C Compatible Compiler Preprocessor (CCCP)
2 Copyright (C) 1986, 1987, 1989, 2000 Free Software Foundation, Inc.
3                     Written by Paul Rubin, June 1986
4                     Adapted to ANSI C, Richard Stallman, Jan 1987
5                     Dusted off, polished, and adapted for use as traditional
6                     preprocessor only, Zack Weinberg, Jul 2000
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "version.h"
25 #include "cppdefault.h"
26 #include "tradcpp.h"
27
28 typedef unsigned char U_CHAR;
29
30 /* Name under which this program was invoked.  */
31
32 static const char *progname;
33
34 /* Current maximum length of directory names in the search path
35    for include files.  (Altered as we get more of them.)  */
36
37 size_t max_include_len;
38
39 /* Nonzero means copy comments into the output file.  */
40
41 int put_out_comments = 0;
42
43 /* Nonzero means print the names of included files rather than
44    the preprocessed output.  1 means just the #include "...",
45    2 means #include <...> as well.  */
46
47 int print_deps = 0;
48
49 /* Nonzero means don't output line number information.  */
50
51 int no_line_commands;
52
53 /* Nonzero means inhibit output of the preprocessed text
54    and instead output the definitions of all user-defined macros
55    in a form suitable for use as input to cccp.  */
56
57 int dump_macros;
58
59 /* Nonzero means don't print warning messages.  -w.  */
60
61 int inhibit_warnings = 0;
62
63 /* Nonzero means warn if slash-star appears in a comment.  */
64
65 int warn_comments;
66
67 /* Nonzero causes output not to be done,
68    but directives such as #define that have side effects
69    are still obeyed.  */
70
71 int no_output;
72
73 /* Value of __USER_LABEL_PREFIX__.  Target-dependent, also controlled
74    by -f(no-)leading-underscore.  */
75 static const char *user_label_prefix;
76
77 /* I/O buffer structure.
78    The `fname' field is nonzero for source files and #include files
79    and for the dummy text used for -D and -U.
80    It is zero for rescanning results of macro expansion
81    and for expanding macro arguments.  */
82 #define INPUT_STACK_MAX 200
83 struct file_buf {
84   const char *fname;
85   int lineno;
86   int length;
87   U_CHAR *buf;
88   U_CHAR *bufp;
89   /* Macro that this level is the expansion of.
90      Included so that we can reenable the macro
91      at the end of this level.  */
92   struct hashnode *macro;
93   /* Value of if_stack at start of this file.
94      Used to prohibit unmatched #endif (etc) in an include file.  */
95   struct if_stack *if_stack;
96   /* Object to be freed at end of input at this level.  */
97   U_CHAR *free_ptr;
98 } instack[INPUT_STACK_MAX];
99
100 typedef struct file_buf FILE_BUF;
101
102 /* Current nesting level of input sources.
103    `instack[indepth]' is the level currently being read.  */
104 int indepth = -1;
105 #define CHECK_DEPTH(code) \
106   if (indepth >= (INPUT_STACK_MAX - 1))                                 \
107     {                                                                   \
108       error_with_line (line_for_error (instack[indepth].lineno),        \
109                        "macro or #include recursion too deep");         \
110       code;                                                             \
111     }
112
113 /* Current depth in #include directives that use <...>.  */
114 int system_include_depth = 0;
115
116 /* The output buffer.  Its LENGTH field is the amount of room allocated
117    for the buffer, not the number of chars actually present.  To get
118    that, subtract outbuf.buf from outbuf.bufp. */
119
120 #define OUTBUF_SIZE 10  /* initial size of output buffer */
121 FILE_BUF outbuf;
122
123 /* Grow output buffer OBUF points at
124    so it can hold at least NEEDED more chars.  */
125
126 #define check_expand(OBUF, NEEDED) do { \
127   if ((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \
128     grow_outbuf ((OBUF), (NEEDED)); \
129  } while (0)
130
131 struct file_name_list
132   {
133     struct file_name_list *next;
134     const char *fname;
135   };
136
137 struct file_name_list *include = 0;     /* First dir to search */
138         /* First dir to search for <file> */
139 struct file_name_list *first_bracket_include = 0;
140 struct file_name_list *last_include = 0;        /* Last in chain */
141
142 /* List of included files that contained #once.  */
143 struct file_name_list *dont_repeat_files = 0;
144
145 /* List of other included files.  */
146 struct file_name_list *all_include_files = 0;
147 \f
148 /* Structure allocated for every #define.  For a simple replacement
149    such as
150         #define foo bar ,
151    nargs = -1, the `pattern' list is null, and the expansion is just
152    the replacement text.  Nargs = 0 means a functionlike macro with no args,
153    e.g.,
154        #define getchar() getc (stdin) .
155    When there are args, the expansion is the replacement text with the
156    args squashed out, and the reflist is a list describing how to
157    build the output from the input: e.g., "3 chars, then the 1st arg,
158    then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
159    The chars here come from the expansion.  Whatever is left of the
160    expansion after the last arg-occurrence is copied after that arg.
161    Note that the reflist can be arbitrarily long---
162    its length depends on the number of times the arguments appear in
163    the replacement text, not how many args there are.  Example:
164    #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
165    pattern list
166      { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
167    where (x, y) means (nchars, argno). */
168
169 typedef struct definition DEFINITION;
170 struct definition {
171   int nargs;
172   int length;                   /* length of expansion string */
173   U_CHAR *expansion;
174   struct reflist {
175     struct reflist *next;
176     char stringify;             /* nonzero if this arg was preceded by a
177                                    # operator. */
178     char raw_before;            /* Nonzero if a ## operator before arg. */
179     char raw_after;             /* Nonzero if a ## operator after arg. */
180     int nchars;                 /* Number of literal chars to copy before
181                                    this arg occurrence.  */
182     int argno;                  /* Number of arg to substitute (origin-0) */
183   } *pattern;
184   /* Names of macro args, concatenated in reverse order
185      with comma-space between them.
186      The only use of this is that we warn on redefinition
187      if this differs between the old and new definitions.  */
188   const U_CHAR *argnames;
189 };
190
191 /* Chained list of answers to an assertion.  */
192 struct answer
193 {
194   struct answer *next;
195   const unsigned char *answer;
196   size_t len;
197 };
198
199 /* different kinds of things that can appear in the value field
200    of a hash node.  Actually, this may be useless now. */
201 union hashval {
202   const char *cpval;
203   DEFINITION *defn;
204   struct answer *answers;
205 };
206
207 /* The structure of a node in the hash table.  The hash table
208    has entries for all tokens defined by #define commands (type T_MACRO),
209    plus some special tokens like __LINE__ (these each have their own
210    type, and the appropriate code is run when that type of node is seen.
211    It does not contain control words like "#define", which are recognized
212    by a separate piece of code. */
213
214 /* different flavors of hash nodes --- also used in keyword table */
215 enum node_type {
216  T_DEFINE = 1,  /* `#define' */
217  T_INCLUDE,     /* `#include' */
218  T_IFDEF,       /* `#ifdef' */
219  T_IFNDEF,      /* `#ifndef' */
220  T_IF,          /* `#if' */
221  T_ELSE,        /* `#else' */
222  T_ELIF,        /* `#elif' */
223  T_UNDEF,       /* `#undef' */
224  T_LINE,        /* `#line' */
225  T_ENDIF,       /* `#endif' */
226  T_ASSERT,      /* `#assert' */
227  T_UNASSERT,    /* `#unassert' */
228  T_SPECLINE,    /* special symbol `__LINE__' */
229  T_DATE,        /* `__DATE__' */
230  T_FILE,        /* `__FILE__' */
231  T_BASE_FILE,   /* `__BASE_FILE__' */
232  T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
233  T_VERSION,     /* `__VERSION__' */
234  T_TIME,        /* `__TIME__' */
235  T_CONST,       /* Constant value, used by `__STDC__' */
236  T_MACRO,       /* macro defined by `#define' */
237  T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
238  T_UNUSED       /* Used for something not defined.  */
239 };
240
241 struct hashnode {
242   struct hashnode *next;        /* double links for easy deletion */
243   struct hashnode *prev;
244   struct hashnode **bucket_hdr; /* also, a back pointer to this node's hash
245                                    chain is kept, in case the node is the head
246                                    of the chain and gets deleted. */
247   enum node_type type;          /* type of special token */
248   int length;                   /* length of token, for quick comparison */
249   U_CHAR *name;                 /* the actual name */
250   union hashval value;          /* pointer to expansion, or whatever */
251 };
252
253 typedef struct hashnode HASHNODE;
254
255 static HASHNODE *parse_assertion PARAMS ((const unsigned char *,
256                                           const unsigned char *,
257                                           struct answer **, int));
258 static struct answer **find_answer PARAMS ((HASHNODE *,
259                                             const struct answer *));
260 static int parse_answer PARAMS ((const unsigned char *, const unsigned char *,
261                                  struct answer **, int));
262 static unsigned char *canonicalize_text PARAMS ((const unsigned char *,
263                                                  const unsigned char *,
264                                                  const unsigned char **));
265
266 /* Some definitions for the hash table.  The hash function MUST be
267    computed as shown in hashf () below.  That is because the rescan
268    loop computes the hash value `on the fly' for most tokens,
269    in order to avoid the overhead of a lot of procedure calls to
270    the hashf () function.  Hashf () only exists for the sake of
271    politeness, for use when speed isn't so important. */
272
273 #define HASHSIZE 1403
274 HASHNODE *hashtab[HASHSIZE];
275 #define HASHSTEP(old, c) ((old << 2) + c)
276 #define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
277
278 /* `struct directive' defines one #-directive, including how to handle it.  */
279
280 struct directive {
281   int length;                   /* Length of name */
282   void (*func) PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
283                                 /* Function to handle directive */
284   const char *name;             /* Name of directive */
285   enum node_type type;          /* Code which describes which directive. */
286 };
287
288 /* Last arg to output_line_command.  */
289 enum file_change_code {same_file, enter_file, leave_file};
290
291 /* This structure represents one parsed argument in a macro call.
292    `raw' points to the argument text as written (`raw_length' is its length).
293    `expanded' points to the argument's macro-expansion
294    (its length is `expand_length').
295    `stringified_length' is the length the argument would have
296    if stringified.
297    `free1' and `free2', if nonzero, point to blocks to be freed
298    when the macro argument data is no longer needed.  */
299
300 struct argdata {
301   U_CHAR *raw, *expanded;
302   int raw_length, expand_length;
303   int stringified_length;
304   U_CHAR *free1, *free2;
305   char newlines;
306   char comments;
307 };
308
309 /* The arglist structure is built by do_define to tell
310    collect_definition where the argument names begin.  That
311    is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
312    would contain pointers to the strings x, y, and z.
313    Collect_definition would then build a DEFINITION node,
314    with reflist nodes pointing to the places x, y, and z had
315    appeared.  So the arglist is just convenience data passed
316    between these two routines.  It is not kept around after
317    the current #define has been processed and entered into the
318    hash table. */
319
320 struct arglist {
321   struct arglist *next;
322   U_CHAR *name;
323   int length;
324   int argno;
325 };
326
327 /* Function prototypes.  */
328
329 static void do_define   PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
330 static void do_line     PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
331 static void do_include  PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
332 static void do_undef    PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
333 static void do_if       PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
334 static void do_ifdef    PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
335 static void do_ifndef   PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
336 static void do_else     PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
337 static void do_elif     PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
338 static void do_endif    PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
339 static void do_assert   PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
340 static void do_unassert PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
341 static void do_xifdef   PARAMS ((U_CHAR *, U_CHAR *, enum node_type));
342
343 static struct hashnode *install PARAMS ((const U_CHAR *, int, enum node_type, int));
344 static int hashf                 PARAMS ((const U_CHAR *, int, int));
345 static int compare_defs  PARAMS ((DEFINITION *, DEFINITION *));
346 static int comp_def_part         PARAMS ((int, const U_CHAR *, int,
347                                           const U_CHAR *, int, int));
348 static void delete_macro         PARAMS ((HASHNODE *));
349
350 /* First arg to v_message.  */
351 enum msgtype { WARNING = 0, ERROR, FATAL };
352 static void v_message            PARAMS ((enum msgtype mtype, int line,
353                                           const char *msgid, va_list ap))
354      ATTRIBUTE_PRINTF (3, 0);
355
356 static int line_for_error        PARAMS ((int));
357
358 /* We know perfectly well which file this is, so we don't need to
359    use __FILE__.  */
360 #undef abort
361 #if (GCC_VERSION >= 2007)
362 #define abort() fancy_abort(__LINE__, __FUNCTION__)
363 #else
364 #define abort() fancy_abort(__LINE__, 0);
365 #endif
366
367 static void macroexpand         PARAMS ((HASHNODE *, FILE_BUF *));
368 static void special_symbol      PARAMS ((HASHNODE *, FILE_BUF *));
369 static void dump_all_macros     PARAMS ((void));
370 static void dump_defn_1         PARAMS ((const U_CHAR *, int, int));
371 static void dump_arg_n          PARAMS ((DEFINITION *, int));
372 static void conditional_skip    PARAMS ((FILE_BUF *, int, enum node_type));
373 static void skip_if_group       PARAMS ((FILE_BUF *, int));
374 static void output_line_command PARAMS ((FILE_BUF *, FILE_BUF *,
375                                          int, enum file_change_code));
376
377 static int eval_if_expression   PARAMS ((const U_CHAR *, int));
378
379 static void initialize_builtins PARAMS ((void));
380 static void run_directive       PARAMS ((const char *, size_t,
381                                          enum node_type));
382 static void make_definition     PARAMS ((const char *));
383 static void make_undef          PARAMS ((const char *));
384 static void make_assertion      PARAMS ((const char *));
385
386 static void grow_outbuf         PARAMS ((FILE_BUF *, int));
387 static int handle_directive     PARAMS ((FILE_BUF *, FILE_BUF *));
388 static void finclude            PARAMS ((int, const char *, FILE_BUF *));
389 static void deps_output         PARAMS ((const char *, int));
390 static void rescan              PARAMS ((FILE_BUF *, int));
391 static void newline_fix         PARAMS ((U_CHAR *));
392 static void name_newline_fix    PARAMS ((U_CHAR *));
393 static U_CHAR *macarg1          PARAMS ((U_CHAR *, const U_CHAR *, int *,
394                                          int *, int *));
395 static const char *macarg       PARAMS ((struct argdata *));
396 static int discard_comments     PARAMS ((U_CHAR *, int, int));
397 static int file_size_and_mode   PARAMS ((int, int *, long *));
398
399 static U_CHAR *skip_to_end_of_comment PARAMS ((FILE_BUF *, int *));
400 static U_CHAR *skip_quoted_string     PARAMS ((const U_CHAR *, const U_CHAR *,
401                                                int, int *, int *, int *));
402
403 int main                PARAMS ((int, char **));
404
405 /* Convenience.  Write U"string" to get an unsigned string constant.  */
406 #define U (const unsigned char *)
407
408 /* Here is the actual list of #-directives, most-often-used first.  */
409
410 struct directive directive_table[] = {
411   {  6, do_define,  "define",  T_DEFINE  },
412   {  7, do_include, "include", T_INCLUDE },
413   {  5, do_endif,   "endif",   T_ENDIF   },
414   {  5, do_ifdef,   "ifdef",   T_IFDEF   },
415   {  2, do_if,      "if",      T_IF,     },
416   {  4, do_else,    "else",    T_ELSE    },
417   {  6, do_ifndef,  "ifndef",  T_IFNDEF  },
418   {  5, do_undef,   "undef",   T_UNDEF   },
419   {  4, do_line,    "line",    T_LINE    },
420   {  4, do_elif,    "elif",    T_ELIF    },
421   {  6, do_assert,  "assert",  T_ASSERT  },
422   {  8, do_unassert,"unassert",T_UNASSERT},
423   {  -1, 0, "", T_UNUSED},
424 };
425
426 #define SKIP_WHITE_SPACE(p) do { while (is_nvspace(*p)) p++; } while (0)
427 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space(*p)) p++; } while (0)
428   
429 int errors = 0;                 /* Error counter for exit code */
430
431 static FILE_BUF expand_to_temp_buffer PARAMS ((const U_CHAR *, const U_CHAR *, int));
432 static DEFINITION *collect_expansion  PARAMS ((U_CHAR *, U_CHAR *, int,
433                                                struct arglist *));
434
435 /* Stack of conditionals currently in progress
436    (including both successful and failing conditionals).  */
437
438 struct if_stack {
439   struct if_stack *next;        /* for chaining to the next stack frame */
440   const char *fname;            /* copied from input when frame is made */
441   int lineno;                   /* similarly */
442   int if_succeeded;             /* true if a leg of this if-group
443                                     has been passed through rescan */
444   enum node_type type;          /* type of last directive seen in this group */
445 };
446 typedef struct if_stack IF_STACK_FRAME;
447 IF_STACK_FRAME *if_stack = NULL;
448
449 /* Buffer of -M output.  */
450
451 char *deps_buffer;
452
453 /* Number of bytes allocated in above.  */
454 int deps_allocated_size;
455
456 /* Number of bytes used.  */
457 int deps_size;
458
459 /* Number of bytes since the last newline.  */
460 int deps_column;
461
462 /* Nonzero means -I- has been seen,
463    so don't look for #include "foo" the source-file directory.  */
464 int ignore_srcdir;
465
466 /* Pending directives.  */
467 enum pending_dir_t {PD_NONE = 0, PD_DEFINE, PD_UNDEF, PD_ASSERTION, PD_FILE};
468
469 typedef struct pending_dir pending_dir;
470 struct pending_dir
471 {
472   const char *arg;
473   enum pending_dir_t type;
474 };
475
476 int
477 main (argc, argv)
478      int argc;
479      char **argv;
480 {
481   int st_mode;
482   long st_size;
483   const char *in_fname, *out_fname;
484   int f, i;
485   FILE_BUF *fp;
486   pending_dir *pend = (pending_dir *) xcalloc (argc, sizeof (pending_dir));
487   int no_standard_includes = 0;
488
489   /* Non-0 means don't output the preprocessed program.  */
490   int inhibit_output = 0;
491
492   /* Stream on which to print the dependency information.  */
493   FILE *deps_stream = 0;
494   /* Target-name to write with the dependency information.  */
495   char *deps_target = 0;
496
497 #ifdef RLIMIT_STACK
498   /* Get rid of any avoidable limit on stack size.  */
499   {
500     struct rlimit rlim;
501
502     /* Set the stack limit huge so that alloca (particularly stringtab
503      * in dbxread.c) does not fail. */
504     getrlimit (RLIMIT_STACK, &rlim);
505     rlim.rlim_cur = rlim.rlim_max;
506     setrlimit (RLIMIT_STACK, &rlim);
507   }
508 #endif /* RLIMIT_STACK defined */
509
510   progname = argv[0];
511
512   in_fname = NULL;
513   out_fname = NULL;
514
515   no_line_commands = 0;
516   dump_macros = 0;
517   no_output = 0;
518
519   max_include_len = cpp_GCC_INCLUDE_DIR_len + 7;  /* ??? */
520
521   /* Process switches and find input file name.  */
522
523   for (i = 1; i < argc; i++) {
524     if (argv[i][0] != '-') {
525       if (out_fname != NULL)
526         fatal ("Usage: %s [switches] input output", argv[0]);
527       else if (in_fname != NULL)
528         out_fname = argv[i];
529       else
530         in_fname = argv[i];
531     } else {
532       int c = argv[i][1];
533
534       switch (c) {
535       case 'E':
536       case '$':
537       case 'g':
538         break;  /* Ignore for compatibility with ISO/extended cpp.  */
539
540       case 'l':
541         if (!strcmp (argv[i], "-lang-c++")
542             || !strcmp (argv[i], "-lang-objc++"))
543           fatal ("-traditional is not supported in C++");
544         else if (!strcmp (argv[i], "-lang-c89"))
545           fatal ("-traditional and -ansi are mutually exclusive");
546         else if (!strcmp (argv[i], "-lang-objc"))
547           pend[i].type = PD_DEFINE, pend[i].arg = "__OBJC__";
548         else if (!strcmp (argv[i], "-lang-asm"))
549           pend[i].type = PD_DEFINE, pend[i].arg = "__ASSEMBLER__";
550         else if (!strcmp (argv[i], "-lang-fortran"))
551           pend[i].type = PD_DEFINE, pend[i].arg = "_LANGUAGE_FORTRAN";
552         /* All other possibilities ignored.  */
553         break;
554
555       case 'i':
556         if (!strcmp (argv[i], "-include"))
557           {
558             if (i + 1 == argc)
559               fatal ("Filename missing after -i option");
560             else
561               pend[i].type = PD_FILE, pend[i].arg = argv[i + 1], i++;
562           }
563         else if (!strcmp (argv[i], "-iprefix"))
564           i++; /* Ignore for compatibility */
565         else if (!strcmp (argv[i], "-isystem")
566                  || !strcmp (argv[i], "-iwithprefix")
567                  || !strcmp (argv[i], "-iwithprefixbefore")
568                  || !strcmp (argv[i], "-idirafter"))
569           goto add_include;  /* best we can do */
570           
571         break;
572
573       case 'o':
574         if (out_fname != NULL)
575           fatal ("Output filename specified twice");
576         if (i + 1 == argc)
577           fatal ("Filename missing after -o option");
578         out_fname = argv[++i];
579         if (!strcmp (out_fname, "-"))
580           out_fname = "";
581         break;
582
583       case 'w':
584         inhibit_warnings = 1;
585         break;
586
587       case 'W':
588         if (!strcmp (argv[i], "-Wcomments"))
589           warn_comments = 1;
590         else if (!strcmp (argv[i], "-Wcomment"))
591           warn_comments = 1;
592         else if (!strcmp (argv[i], "-Wall")) {
593           warn_comments = 1;
594         }
595         break;
596
597       case 'f':
598         if (!strcmp (argv[i], "-fleading-underscore"))
599           user_label_prefix = "_";
600         else if (!strcmp (argv[i], "-fno-leading-underscore"))
601           user_label_prefix = "";
602         break;
603
604       case 'M':
605         if (!strcmp (argv[i], "-M"))
606           print_deps = 2;
607         else if (!strcmp (argv[i], "-MM"))
608           print_deps = 1;
609         inhibit_output = 1;
610         break;
611
612       case 'd':
613         dump_macros = 1;
614         no_output = 1;
615         break;
616
617       case 'v':
618         fprintf (stderr, "GNU traditional CPP version %s\n", version_string);
619         break;
620
621       case 'D':
622       case 'U':
623       case 'A':
624         {
625           char *p;
626
627           if (argv[i][2] != 0)
628             p = argv[i] + 2;
629           else if (i + 1 == argc)
630             fatal ("Macro name missing after -%c option", c);
631           else
632             p = argv[++i];
633
634           if (c == 'D')
635             pend[i].type = PD_DEFINE;
636           else if (c == 'U')
637             pend[i].type = PD_UNDEF;
638           else
639             pend[i].type = PD_ASSERTION;
640           pend[i].arg = p;
641         }
642         break;
643
644       case 'C':
645         put_out_comments = 1;
646         break;
647
648       case 'p':
649         if (!strcmp (argv[i], "-pedantic"))
650           fatal ("-pedantic and -traditional are mutually exclusive");
651         break;
652
653       case 't':
654         if (!strcmp (argv[i], "-trigraphs"))
655           fatal ("-trigraphs and -traditional are mutually exclusive");
656         break;
657
658       case 'P':
659         no_line_commands = 1;
660         break;
661
662       case 'I':                 /* Add directory to path for includes.  */
663       add_include:
664         {
665           struct file_name_list *dirtmp;
666
667           if (! ignore_srcdir && !strcmp (argv[i] + 2, "-"))
668             ignore_srcdir = 1;
669           else {
670             dirtmp = (struct file_name_list *)
671               xmalloc (sizeof (struct file_name_list));
672             dirtmp->next = 0;           /* New one goes on the end */
673             if (include == 0)
674               include = dirtmp;
675             else
676               last_include->next = dirtmp;
677             last_include = dirtmp;      /* Tail follows the last one */
678             if (argv[i][1] == 'I' && argv[i][2] != 0)
679               dirtmp->fname = argv[i] + 2;
680             else if (i + 1 == argc)
681               fatal ("Directory name missing after -I option");
682             else
683               dirtmp->fname = argv[++i];
684             if (strlen (dirtmp->fname) > max_include_len)
685               max_include_len = strlen (dirtmp->fname);
686             if (ignore_srcdir && first_bracket_include == 0)
687               first_bracket_include = dirtmp;
688             }
689         }
690         break;
691
692       case 'n':
693         /* -nostdinc causes no default include directories.
694            You must specify all include-file directories with -I.  */
695         no_standard_includes = 1;
696         break;
697
698       case '\0': /* JF handle '-' as file name meaning stdin or stdout */
699         if (in_fname == NULL) {
700           in_fname = "";
701           break;
702         } else if (out_fname == NULL) {
703           out_fname = "";
704           break;
705         }       /* else fall through into error */
706
707       default:
708         fatal ("Invalid option `%s'", argv[i]);
709       }
710     }
711   }
712
713   if (user_label_prefix == 0)
714     user_label_prefix = USER_LABEL_PREFIX;
715
716   /* Install __LINE__, etc.  Must follow option processing.  */
717   initialize_builtins ();
718
719   /* Do defines specified with -D and undefines specified with -U.  */
720   for (i = 1; i < argc; i++)
721     if (pend[i].type == PD_DEFINE)
722       make_definition (pend[i].arg);
723     else if (pend[i].type == PD_UNDEF)
724       make_undef (pend[i].arg);
725     else if (pend[i].type == PD_ASSERTION)
726       make_assertion (pend[i].arg);
727
728   /* Unless -fnostdinc,
729      tack on the standard include file dirs to the specified list */
730   if (!no_standard_includes) {
731     const struct default_include *di;
732     struct file_name_list *old_last_include = last_include;
733     struct file_name_list *dirtmp;
734     for (di = cpp_include_defaults; di->fname; di++) {
735       if (di->cplusplus)
736         continue;
737       dirtmp = (struct file_name_list *)
738         xmalloc (sizeof (struct file_name_list));
739       dirtmp->next = 0;         /* New one goes on the end */
740       if (include == 0)
741         include = dirtmp;
742       else
743         last_include->next = dirtmp;
744       last_include = dirtmp;    /* Tail follows the last one */
745       dirtmp->fname = di->fname;
746       if (strlen (dirtmp->fname) > max_include_len)
747         max_include_len = strlen (dirtmp->fname);
748     }
749
750     if (ignore_srcdir && first_bracket_include == 0)
751       first_bracket_include = old_last_include->next;
752   }
753
754   /* Initialize output buffer */
755
756   outbuf.buf = (U_CHAR *) xmalloc (OUTBUF_SIZE);
757   outbuf.bufp = outbuf.buf;
758   outbuf.length = OUTBUF_SIZE;
759
760   /* Scan the -i files before the main input.
761      Much like #including them, but with no_output set
762      so that only their macro definitions matter.  */
763
764   no_output++;
765   for (i = 1; i < argc; i++)
766     if (pend[i].type == PD_FILE)
767       {
768         int fd = open (pend[i].arg, O_RDONLY, 0666);
769         if (fd < 0)
770           {
771             perror_with_name (pend[i].arg);
772             return FATAL_EXIT_CODE;
773           }
774         finclude (fd, pend[i].arg, &outbuf);
775       }
776   no_output--;
777
778   /* Pending directives no longer needed.  */
779   free ((PTR) pend);
780
781   /* Create an input stack level for the main input file
782      and copy the entire contents of the file into it.  */
783
784   fp = &instack[++indepth];
785
786   /* JF check for stdin */
787   if (in_fname == NULL || *in_fname == 0) {
788     in_fname = "";
789     f = 0;
790   } else if ((f = open (in_fname, O_RDONLY, 0666)) < 0)
791     goto sys_error;
792
793   /* Either of two environment variables can specify output of deps.
794      Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
795      where OUTPUT_FILE is the file to write deps info to
796      and DEPS_TARGET is the target to mention in the deps.  */
797
798   if (print_deps == 0
799       && (getenv ("SUNPRO_DEPENDENCIES") != 0
800           || getenv ("DEPENDENCIES_OUTPUT") != 0))
801     {
802       char *spec = getenv ("DEPENDENCIES_OUTPUT");
803       char *s;
804       char *output_file;
805
806       if (spec == 0)
807         {
808           spec = getenv ("SUNPRO_DEPENDENCIES");
809           print_deps = 2;
810         }
811       else
812         print_deps = 1;
813
814       /* Find the space before the DEPS_TARGET, if there is one.  */
815       s = strchr (spec, ' ');
816       if (s)
817         {
818           deps_target = s + 1;
819           output_file = (char *) xmalloc (s - spec + 1);
820           memcpy (output_file, spec, s - spec);
821           output_file[s - spec] = 0;
822         }
823       else
824         {
825           deps_target = 0;
826           output_file = spec;
827         }
828       
829       deps_stream = fopen (output_file, "a");
830       if (deps_stream == 0)
831         pfatal_with_name (output_file);
832     }
833   /* If the -M option was used, output the deps to standard output.  */
834   else if (print_deps)
835     deps_stream = stdout;
836
837   /* For -M, print the expected object file name
838      as the target of this Make-rule.  */
839   if (print_deps) {
840     deps_allocated_size = 200;
841     deps_buffer = (char *) xmalloc (deps_allocated_size);
842     deps_buffer[0] = 0;
843     deps_size = 0;
844     deps_column = 0;
845
846     if (deps_target) {
847       deps_output (deps_target, 0);
848       deps_output (":", 0);
849     } else if (*in_fname == 0)
850       deps_output ("-: ", 0);
851     else {
852       int len;
853       const char *p = in_fname;
854       const char *p1 = p;
855       /* Discard all directory prefixes from P.  */
856       while (*p1) {
857         if (*p1 == '/')
858           p = p1 + 1;
859         p1++;
860       }
861       /* Output P, but remove known suffixes.  */
862       len = strlen (p);
863       if (p[len - 2] == '.'
864           && (p[len - 1] == 'c' || p[len - 1] == 'C' || p[len - 1] == 'S'))
865         deps_output (p, len - 2);
866       else if (p[len - 3] == '.'
867                && p[len - 2] == 'c'
868                && p[len - 1] == 'c')
869         deps_output (p, len - 3);
870       else
871         deps_output (p, 0);
872       /* Supply our own suffix.  */
873       deps_output (".o : ", 0);
874       deps_output (in_fname, 0);
875       deps_output (" ", 0);
876     }
877   }
878
879   if (file_size_and_mode (f, &st_mode, &st_size))
880     goto sys_error;
881   fp->fname = in_fname;
882   fp->lineno = 1;
883   /* JF all this is mine about reading pipes and ttys */
884   if (!S_ISREG (st_mode)) {
885     /* Read input from a file that is not a normal disk file.
886        We cannot preallocate a buffer with the correct size,
887        so we must read in the file a piece at the time and make it bigger.  */
888     int size;
889     int bsize;
890     int cnt;
891     U_CHAR *bufp;
892
893     bsize = 2000;
894     size = 0;
895     fp->buf = (U_CHAR *) xmalloc (bsize + 2);
896     bufp = fp->buf;
897     for (;;) {
898       cnt = read (f, bufp, bsize - size);
899       if (cnt < 0) goto sys_error;      /* error! */
900       if (cnt == 0) break;              /* End of file */
901       size += cnt;
902       bufp += cnt;
903       if (bsize == size) {              /* Buffer is full! */
904         bsize *= 2;
905         fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
906         bufp = fp->buf + size;  /* May have moved */
907       }
908     }
909     fp->length = size;
910   } else {
911     /* Read a file whose size we can determine in advance.
912        For the sake of VMS, st_size is just an upper bound.  */
913     long i;
914     fp->length = 0;
915     fp->buf = (U_CHAR *) xmalloc (st_size + 2);
916
917     while (st_size > 0) {
918       i = read (f, fp->buf + fp->length, st_size);
919       if (i <= 0) {
920         if (i == 0) break;
921         goto sys_error;
922       }
923       fp->length += i;
924       st_size -= i;
925     }
926   }
927   fp->bufp = fp->buf;
928   fp->if_stack = if_stack;
929
930   /* Make sure data ends with a newline.  And put a null after it.  */
931
932   if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
933     fp->buf[fp->length++] = '\n';
934   fp->buf[fp->length] = '\0';
935   
936   /* Now that we know the input file is valid, open the output.  */
937
938   if (!out_fname || !strcmp (out_fname, ""))
939     out_fname = "stdout";
940   else if (! freopen (out_fname, "w", stdout))
941     pfatal_with_name (out_fname);
942
943   output_line_command (fp, &outbuf, 0, same_file);
944
945   /* Scan the input, processing macros and directives.  */
946
947   rescan (&outbuf, 0);
948
949   /* Now we have processed the entire input
950      Write whichever kind of output has been requested.  */
951
952
953   if (dump_macros)
954     dump_all_macros ();
955   else if (! inhibit_output && deps_stream != stdout) {
956     if (write (fileno (stdout), outbuf.buf, outbuf.bufp - outbuf.buf) < 0)
957       fatal ("I/O error on output");
958   }
959
960   if (print_deps) {
961     fputs (deps_buffer, deps_stream);
962     putc ('\n', deps_stream);
963     if (deps_stream != stdout) {
964       fclose (deps_stream);
965       if (ferror (deps_stream))
966         fatal ("I/O error on output");
967     }
968   }
969
970   if (ferror (stdout))
971     fatal ("I/O error on output");
972
973   if (errors)
974     exit (FATAL_EXIT_CODE);
975   exit (SUCCESS_EXIT_CODE);
976
977  sys_error:
978   pfatal_with_name (in_fname);
979 }
980
981 /* Move all backslash-newline pairs out of embarrassing places.
982    Exchange all such pairs following BP
983    with any potentially-embarrasing characters that follow them.
984    Potentially-embarrassing characters are / and *
985    (because a backslash-newline inside a comment delimiter
986    would cause it not to be recognized).  */
987 static void
988 newline_fix (bp)
989      U_CHAR *bp;
990 {
991   register U_CHAR *p = bp;
992   register int count = 0;
993
994   /* First count the backslash-newline pairs here.  */
995
996   while (*p++ == '\\' && *p++ == '\n')
997     count++;
998
999   p = bp + count * 2;
1000
1001   /* Exit if what follows the backslash-newlines is not embarrassing.  */
1002
1003   if (count == 0 || (*p != '/' && *p != '*'))
1004     return;
1005
1006   /* Copy all potentially embarrassing characters
1007      that follow the backslash-newline pairs
1008      down to where the pairs originally started.  */
1009
1010   while (*p == '*' || *p == '/')
1011     *bp++ = *p++;
1012
1013   /* Now write the same number of pairs after the embarrassing chars.  */
1014   while (count-- > 0) {
1015     *bp++ = '\\';
1016     *bp++ = '\n';
1017   }
1018 }
1019
1020 /* Like newline_fix but for use within a directive-name.
1021    Move any backslash-newlines up past any following symbol constituents.  */
1022 static void
1023 name_newline_fix (bp)
1024      U_CHAR *bp;
1025 {
1026   register U_CHAR *p = bp;
1027   register int count = 0;
1028
1029   /* First count the backslash-newline pairs here.  */
1030
1031   while (*p++ == '\\' && *p++ == '\n')
1032     count++;
1033
1034   p = bp + count * 2;
1035
1036   /* What follows the backslash-newlines is not embarrassing.  */
1037
1038   if (count == 0 || !is_idchar (*p))
1039     return;
1040
1041   /* Copy all potentially embarrassing characters
1042      that follow the backslash-newline pairs
1043      down to where the pairs originally started.  */
1044
1045   while (is_idchar (*p))
1046     *bp++ = *p++;
1047
1048   /* Now write the same number of pairs after the embarrassing chars.  */
1049   while (count-- > 0) {
1050     *bp++ = '\\';
1051     *bp++ = '\n';
1052   }
1053 }
1054 \f
1055 /*
1056  * The main loop of the program.
1057  *
1058  * Read characters from the input stack, transferring them to the
1059  * output buffer OP.
1060  *
1061  * Macros are expanded and push levels on the input stack.
1062  * At the end of such a level it is popped off and we keep reading.
1063  * At the end of any other kind of level, we return.
1064  * #-directives are handled, except within macros.
1065  *
1066  * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input
1067  * and insert them when appropriate.  This is set while scanning macro
1068  * arguments before substitution.  It is zero when scanning for final output.
1069  *   There are three types of Newline markers:
1070  *   * Newline -  follows a macro name that was not expanded
1071  *     because it appeared inside an expansion of the same macro.
1072  *     This marker prevents future expansion of that identifier.
1073  *     When the input is rescanned into the final output, these are deleted.
1074  *     These are also deleted by ## concatenation.
1075  *   * Newline Space (or Newline and any other whitespace character)
1076  *     stands for a place that tokens must be separated or whitespace
1077  *     is otherwise desirable, but where the ANSI standard specifies there
1078  *     is no whitespace.  This marker turns into a Space (or whichever other
1079  *     whitespace char appears in the marker) in the final output,
1080  *     but it turns into nothing in an argument that is stringified with #.
1081  *     Such stringified arguments are the only place where the ANSI standard
1082  *     specifies with precision that whitespace may not appear.
1083  *
1084  * During this function, IP->bufp is kept cached in IBP for speed of access.
1085  * Likewise, OP->bufp is kept in OBP.  Before calling a subroutine
1086  * IBP, IP and OBP must be copied back to memory.  IP and IBP are
1087  * copied back with the RECACHE macro.  OBP must be copied back from OP->bufp
1088  * explicitly, and before RECACHE, since RECACHE uses OBP.
1089  */
1090
1091 static void
1092 rescan (op, output_marks)
1093      FILE_BUF *op;
1094      int output_marks;
1095 {
1096   /* Character being scanned in main loop.  */
1097   register U_CHAR c;
1098
1099   /* Length of pending accumulated identifier.  */
1100   register int ident_length = 0;
1101
1102   /* Hash code of pending accumulated identifier.  */
1103   register int hash = 0;
1104
1105   /* Current input level (&instack[indepth]).  */
1106   FILE_BUF *ip;
1107
1108   /* Pointer for scanning input.  */
1109   register U_CHAR *ibp;
1110
1111   /* Pointer to end of input.  End of scan is controlled by LIMIT.  */
1112   register U_CHAR *limit;
1113
1114   /* Pointer for storing output.  */
1115   register U_CHAR *obp;
1116
1117   /* REDO_CHAR is nonzero if we are processing an identifier
1118      after backing up over the terminating character.
1119      Sometimes we process an identifier without backing up over
1120      the terminating character, if the terminating character
1121      is not special.  Backing up is done so that the terminating character
1122      will be dispatched on again once the identifier is dealt with.  */
1123   int redo_char = 0;
1124
1125   /* 1 if within an identifier inside of which a concatenation
1126      marker (Newline -) has been seen.  */
1127   int concatenated = 0;
1128
1129   /* While scanning a comment or a string constant,
1130      this records the line it started on, for error messages.  */
1131   int start_line;
1132
1133   /* Record position of last `real' newline.  */
1134   U_CHAR *beg_of_line;
1135
1136 /* Pop the innermost input stack level, assuming it is a macro expansion.  */
1137
1138 #define POPMACRO \
1139 do { ip->macro->type = T_MACRO;         \
1140      if (ip->free_ptr) free (ip->free_ptr);     \
1141      --indepth; } while (0)
1142
1143 /* Reload `rescan's local variables that describe the current
1144    level of the input stack.  */
1145
1146 #define RECACHE  \
1147 do { ip = &instack[indepth];            \
1148      ibp = ip->bufp;                    \
1149      limit = ip->buf + ip->length;      \
1150      op->bufp = obp;                    \
1151      check_expand (op, limit - ibp);    \
1152      beg_of_line = 0;                   \
1153      obp = op->bufp; } while (0)
1154
1155   if (no_output && instack[indepth].fname != 0)
1156     skip_if_group (&instack[indepth], 1);
1157
1158   obp = op->bufp;
1159   RECACHE;
1160   beg_of_line = ibp;
1161
1162   /* Our caller must always put a null after the end of
1163      the input at each input stack level.  */
1164   if (*limit != 0)
1165     abort ();
1166
1167   while (1) {
1168     c = *ibp++;
1169     *obp++ = c;
1170
1171     switch (c) {
1172     case '\\':
1173       if (ibp >= limit)
1174         break;
1175       if (*ibp == '\n') {
1176         /* Always merge lines ending with backslash-newline,
1177            even in middle of identifier.  */
1178         ++ibp;
1179         ++ip->lineno;
1180         --obp;          /* remove backslash from obuf */
1181         break;
1182       }
1183       /* Otherwise, backslash suppresses specialness of following char,
1184          so copy it here to prevent the switch from seeing it.
1185          But first get any pending identifier processed.  */
1186       if (ident_length > 0)
1187         goto specialchar;
1188       *obp++ = *ibp++;
1189       break;
1190
1191     case '#':
1192       /* If this is expanding a macro definition, don't recognize
1193          preprocessor directives.  */
1194       if (ip->macro != 0)
1195         goto randomchar;
1196       if (ident_length)
1197         goto specialchar;
1198
1199       /* # keyword: a # must be the first char on the line */
1200       if (beg_of_line == 0)
1201         goto randomchar;
1202       if (beg_of_line + 1 != ibp)
1203         goto randomchar;
1204
1205       /* This # can start a directive.  */
1206
1207       --obp;            /* Don't copy the '#' */
1208
1209       ip->bufp = ibp;
1210       op->bufp = obp;
1211       if (! handle_directive (ip, op)) {
1212 #ifdef USE_C_ALLOCA
1213         alloca (0);
1214 #endif
1215         /* Not a known directive: treat it as ordinary text.
1216            IP, OP, IBP, etc. have not been changed.  */
1217         if (no_output && instack[indepth].fname) {
1218           /* If not generating expanded output,
1219              what we do with ordinary text is skip it.
1220              Discard everything until next # directive.  */
1221           skip_if_group (&instack[indepth], 1);
1222           RECACHE;
1223           beg_of_line = ibp;
1224           break;
1225         }
1226         ++obp;          /* Copy the '#' after all */
1227         goto randomchar;
1228       }
1229 #ifdef USE_C_ALLOCA
1230       alloca (0);
1231 #endif
1232       /* A # directive has been successfully processed.  */
1233       /* If not generating expanded output, ignore everything until
1234          next # directive.  */
1235       if (no_output && instack[indepth].fname)
1236         skip_if_group (&instack[indepth], 1);
1237       obp = op->bufp;
1238       RECACHE;
1239       beg_of_line = ibp;
1240       break;
1241
1242     case '\"':                  /* skip quoted string */
1243     case '\'':
1244       /* A single quoted string is treated like a double -- some
1245          programs (e.g., troff) are perverse this way */
1246
1247       if (ident_length)
1248         goto specialchar;
1249
1250       start_line = ip->lineno;
1251
1252       /* Skip ahead to a matching quote.  */
1253
1254       while (1) {
1255         if (ibp >= limit) {
1256           if (ip->macro != 0) {
1257             /* try harder: this string crosses a macro expansion boundary */
1258             POPMACRO;
1259             RECACHE;
1260             continue;
1261           }
1262           break;
1263         }
1264         *obp++ = *ibp;
1265         switch (*ibp++) {
1266         case '\n':
1267           ++ip->lineno;
1268           ++op->lineno;
1269           /* Traditionally, end of line ends a string constant with no error.
1270              So exit the loop and record the new line.  */
1271           beg_of_line = ibp;
1272           goto while2end;
1273
1274         case '\\':
1275           if (ibp >= limit)
1276             break;
1277           if (*ibp == '\n') {
1278             /* Backslash newline is replaced by nothing at all,
1279                but keep the line counts correct.  */
1280             --obp;
1281             ++ibp;
1282             ++ip->lineno;
1283           } else {
1284             /* ANSI stupidly requires that in \\ the second \
1285                is *not* prevented from combining with a newline.  */
1286             while (*ibp == '\\' && ibp[1] == '\n') {
1287               ibp += 2;
1288               ++ip->lineno;
1289             }
1290             *obp++ = *ibp++;
1291           }
1292           break;
1293
1294         case '\"':
1295         case '\'':
1296           if (ibp[-1] == c)
1297             goto while2end;
1298           break;
1299         }
1300       }
1301     while2end:
1302       break;
1303
1304     case '/':
1305       if (*ibp == '\\' && ibp[1] == '\n')
1306         newline_fix (ibp);
1307       /* Don't look for comments inside a macro definition.  */
1308       if (ip->macro != 0)
1309         goto randomchar;
1310       /* A comment constitutes white space, so it can terminate an identifier.
1311          Process the identifier, if any.  */
1312       if (ident_length)
1313         goto specialchar;
1314
1315       if (*ibp != '*')
1316         goto randomchar;
1317
1318       /* We have a comment.  Skip it, optionally copying it to output.  */
1319
1320       start_line = ip->lineno;
1321
1322       ++ibp;                    /* Skip the star. */
1323
1324       /* In K+R C, a comment is equivalent to nothing.  Note that we
1325           already output the slash; we might not want it.  */
1326       if (! put_out_comments)
1327         obp--;
1328       else
1329         *obp++ = '*';
1330
1331       {
1332         U_CHAR *before_bp = ibp;
1333
1334         while (ibp < limit) {
1335           switch (*ibp++) {
1336           case '/':
1337             if (warn_comments && ibp < limit && *ibp == '*')
1338               warning("`/*' within comment");
1339             break;
1340           case '*':
1341             if (*ibp == '\\' && ibp[1] == '\n')
1342               newline_fix (ibp);
1343             if (ibp >= limit || *ibp == '/')
1344               goto comment_end;
1345             break;
1346           case '\n':
1347             ++ip->lineno;
1348             /* Copy the newline into the output buffer, in order to
1349                avoid the pain of a #line every time a multiline comment
1350                is seen.  */
1351             if (!put_out_comments)
1352               *obp++ = '\n';
1353             ++op->lineno;
1354           }
1355         }
1356       comment_end:
1357
1358         if (ibp >= limit)
1359           error_with_line (line_for_error (start_line),
1360                            "unterminated comment");
1361         else {
1362           ibp++;
1363           if (put_out_comments) {
1364             memcpy (obp, before_bp, ibp - before_bp);
1365             obp += ibp - before_bp;
1366           }
1367         }
1368       }
1369       break;
1370
1371     case '0': case '1': case '2': case '3': case '4':
1372     case '5': case '6': case '7': case '8': case '9':
1373       /* If digit is not part of identifier, it starts a number,
1374          which means that following letters are not an identifier.
1375          "0x5" does not refer to an identifier "x5".
1376          So copy all alphanumerics that follow without accumulating
1377          as an identifier.  Periods also, for sake of "3.e7".  */
1378
1379       if (ident_length == 0) {
1380         while (ibp < limit) {
1381           while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
1382             ++ip->lineno;
1383             ibp += 2;
1384           }
1385           c = *ibp++;
1386           if (!ISALNUM (c) && c != '.' && c != '_') {
1387             --ibp;
1388             break;
1389           }
1390           *obp++ = c;
1391           /* A sign can be part of a preprocessing number
1392              if it follows an e.  */
1393           if (c == 'e' || c == 'E') {
1394             while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
1395               ++ip->lineno;
1396               ibp += 2;
1397             }
1398             if (ibp < limit && (*ibp == '+' || *ibp == '-')) {
1399               *obp++ = *ibp++;
1400               /* Traditional C does not let the token go past the sign.  */
1401               break;
1402             }
1403           }
1404         }
1405         break;
1406       }
1407       /* fall through */
1408
1409     case '_':
1410     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
1411     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
1412     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
1413     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
1414     case 'y': case 'z':
1415     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
1416     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
1417     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
1418     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
1419     case 'Y': case 'Z':
1420       ident_length++;
1421       /* Compute step of hash function, to avoid a proc call on every token */
1422       hash = HASHSTEP (hash, c);
1423       break;
1424
1425     case '\n':
1426       /* If reprocessing a macro expansion, newline is a special marker.  */
1427       if (ip->macro != 0) {
1428         /* Newline White is a "funny space" to separate tokens that are
1429            supposed to be separate but without space between.
1430            Here White means any horizontal whitespace character.
1431            Newline - marks a recursive macro use that is not
1432            supposed to be expandable.  */
1433
1434         if (*ibp == '-') {
1435           /* Newline - inhibits expansion of preceding token.
1436              If expanding a macro arg, we keep the newline -.
1437              In final output, it is deleted.  */
1438           if (! concatenated) {
1439             ident_length = 0;
1440             hash = 0;
1441           }
1442           ibp++;
1443           if (!output_marks) {
1444             obp--;
1445           } else {
1446             /* If expanding a macro arg, keep the newline -.  */
1447             *obp++ = '-';
1448           }
1449         } else if (is_space (*ibp)) {
1450           /* Newline Space does not prevent expansion of preceding token
1451              so expand the preceding token and then come back.  */
1452           if (ident_length > 0)
1453             goto specialchar;
1454
1455           /* If generating final output, newline space makes a space.  */
1456           if (!output_marks) {
1457             obp[-1] = *ibp++;
1458             /* And Newline Newline makes a newline, so count it.  */
1459             if (obp[-1] == '\n')
1460               op->lineno++;
1461           } else {
1462             /* If expanding a macro arg, keep the newline space.
1463                If the arg gets stringified, newline space makes nothing.  */
1464             *obp++ = *ibp++;
1465           }
1466         } else abort ();        /* Newline followed by something random?  */
1467         break;
1468       }
1469
1470       /* If there is a pending identifier, handle it and come back here.  */
1471       if (ident_length > 0)
1472         goto specialchar;
1473
1474       beg_of_line = ibp;
1475
1476       /* Update the line counts and output a #line if necessary.  */
1477       ++ip->lineno;
1478       ++op->lineno;
1479       if (ip->lineno != op->lineno) {
1480         op->bufp = obp;
1481         output_line_command (ip, op, 1, same_file);
1482         check_expand (op, ip->length - (ip->bufp - ip->buf));
1483         obp = op->bufp;
1484       }
1485       break;
1486
1487       /* Come here either after (1) a null character that is part of the input
1488          or (2) at the end of the input, because there is a null there.  */
1489     case 0:
1490       if (ibp <= limit)
1491         /* Our input really contains a null character.  */
1492         goto randomchar;
1493
1494       /* At end of a macro-expansion level, pop it and read next level.  */
1495       if (ip->macro != 0) {
1496         obp--;
1497         ibp--;
1498         /* If we have an identifier that ends here, process it now, so
1499            we get the right error for recursion.  */
1500         if (ident_length && ! is_idchar (*instack[indepth - 1].bufp)) {
1501           redo_char = 1;
1502           goto randomchar;
1503         }
1504         POPMACRO;
1505         RECACHE;
1506         break;
1507       }
1508
1509       /* If we don't have a pending identifier,
1510          return at end of input.  */
1511       if (ident_length == 0) {
1512         obp--;
1513         ibp--;
1514         op->bufp = obp;
1515         ip->bufp = ibp;
1516         goto ending;
1517       }
1518
1519       /* If we do have a pending identifier, just consider this null
1520          a special character and arrange to dispatch on it again.
1521          The second time, IDENT_LENGTH will be zero so we will return.  */
1522
1523       /* Fall through */
1524
1525 specialchar:
1526
1527       /* Handle the case of a character such as /, ', " or null
1528          seen following an identifier.  Back over it so that
1529          after the identifier is processed the special char
1530          will be dispatched on again.  */
1531
1532       ibp--;
1533       obp--;
1534       redo_char = 1;
1535
1536     default:
1537
1538 randomchar:
1539
1540       if (ident_length > 0) {
1541         register HASHNODE *hp;
1542
1543         /* We have just seen an identifier end.  If it's a macro, expand it.
1544
1545            IDENT_LENGTH is the length of the identifier
1546            and HASH is its hash code.
1547
1548            The identifier has already been copied to the output,
1549            so if it is a macro we must remove it.
1550
1551            If REDO_CHAR is 0, the char that terminated the identifier
1552            has been skipped in the output and the input.
1553            OBP-IDENT_LENGTH-1 points to the identifier.
1554            If the identifier is a macro, we must back over the terminator.
1555
1556            If REDO_CHAR is 1, the terminating char has already been
1557            backed over.  OBP-IDENT_LENGTH points to the identifier.  */
1558
1559         for (hp = hashtab[MAKE_POS (hash) % HASHSIZE]; hp != NULL;
1560              hp = hp->next) {
1561
1562           if (hp->length == ident_length) {
1563             U_CHAR *obufp_before_macroname;
1564             int op_lineno_before_macroname;
1565             register int i = ident_length;
1566             register U_CHAR *p = hp->name;
1567             register U_CHAR *q = obp - i;
1568
1569             if (! redo_char)
1570               q--;
1571
1572             do {                /* All this to avoid a strncmp () */
1573               if (*p++ != *q++)
1574                 goto hashcollision;
1575             } while (--i);
1576
1577             /* We found a use of a macro name.
1578                see if the context shows it is a macro call.  */
1579
1580             /* Back up over terminating character if not already done.  */
1581             if (! redo_char) {
1582               ibp--;
1583               obp--;
1584             }
1585
1586             obufp_before_macroname = obp - ident_length;
1587             op_lineno_before_macroname = op->lineno;
1588
1589             /* If macro wants an arglist, verify that a '(' follows.
1590                first skip all whitespace, copying it to the output
1591                after the macro name.  Then, if there is no '(',
1592                decide this is not a macro call and leave things that way.  */
1593             if (hp->type == T_MACRO && hp->value.defn->nargs >= 0)
1594               {
1595                 while (1) {
1596                   /* Scan forward over whitespace, copying it to the output.  */
1597                   if (ibp == limit && ip->macro != 0) {
1598                     POPMACRO;
1599                     RECACHE;
1600                   }
1601                   /* A comment: copy it unchanged or discard it.  */
1602                   else if (*ibp == '/' && ibp+1 != limit && ibp[1] == '*') {
1603                     if (put_out_comments) {
1604                       *obp++ = '/';
1605                       *obp++ = '*';
1606                     }
1607                     ibp += 2;
1608                     while (ibp + 1 != limit
1609                            && !(ibp[0] == '*' && ibp[1] == '/')) {
1610                       /* We need not worry about newline-marks,
1611                          since they are never found in comments.  */
1612                       if (*ibp == '\n') {
1613                         /* Newline in a file.  Count it.  */
1614                         ++ip->lineno;
1615                         ++op->lineno;
1616                       }
1617                       if (put_out_comments)
1618                         *obp++ = *ibp++;
1619                       else
1620                         ibp++;
1621                     }
1622                     ibp += 2;
1623                     if (put_out_comments) {
1624                       *obp++ = '*';
1625                       *obp++ = '/';
1626                     }
1627                   }
1628                   else if (is_space (*ibp)) {
1629                     *obp++ = *ibp++;
1630                     if (ibp[-1] == '\n') {
1631                       if (ip->macro == 0) {
1632                         /* Newline in a file.  Count it.  */
1633                         ++ip->lineno;
1634                         ++op->lineno;
1635                       } else if (!output_marks) {
1636                         /* A newline mark, and we don't want marks
1637                            in the output.  If it is newline-hyphen,
1638                            discard it entirely.  Otherwise, it is
1639                            newline-whitechar, so keep the whitechar.  */
1640                         obp--;
1641                         if (*ibp == '-')
1642                           ibp++;
1643                         else {
1644                           if (*ibp == '\n')
1645                             ++op->lineno;
1646                           *obp++ = *ibp++;
1647                         }
1648                       } else {
1649                         /* A newline mark; copy both chars to the output.  */
1650                         *obp++ = *ibp++;
1651                       }
1652                     }
1653                   }
1654                   else break;
1655                 }
1656                 if (*ibp != '(')
1657                   break;
1658               }
1659
1660             /* This is now known to be a macro call.
1661                Discard the macro name from the output,
1662                along with any following whitespace just copied.  */
1663             obp = obufp_before_macroname;
1664             op->lineno = op_lineno_before_macroname;
1665
1666             /* Expand the macro, reading arguments as needed,
1667                and push the expansion on the input stack.  */
1668             ip->bufp = ibp;
1669             op->bufp = obp;
1670             macroexpand (hp, op);
1671
1672             /* Reexamine input stack, since macroexpand has pushed
1673                a new level on it.  */
1674             obp = op->bufp;
1675             RECACHE;
1676             break;
1677           }
1678 hashcollision:
1679                ;
1680         }                       /* End hash-table-search loop */
1681         ident_length = hash = 0; /* Stop collecting identifier */
1682         redo_char = 0;
1683         concatenated = 0;
1684       }                         /* End if (ident_length > 0) */
1685     }                           /* End switch */
1686   }                             /* End per-char loop */
1687
1688   /* Come here to return -- but first give an error message
1689      if there was an unterminated successful conditional.  */
1690  ending:
1691   if (if_stack != ip->if_stack) {
1692     const char *str;
1693     switch (if_stack->type) {
1694     case T_IF:
1695       str = "if";
1696       break;
1697     case T_IFDEF:
1698       str = "ifdef";
1699       break;
1700     case T_IFNDEF:
1701       str = "ifndef";
1702       break;
1703     case T_ELSE:
1704       str = "else";
1705       break;
1706     case T_ELIF:
1707       str = "elif";
1708       break;
1709     default:
1710       abort ();
1711     }
1712     error_with_line (line_for_error (if_stack->lineno),
1713                      "unterminated #%s conditional", str);
1714   }
1715   if_stack = ip->if_stack;
1716 }
1717 \f
1718 /*
1719  * Rescan a string into a temporary buffer and return the result
1720  * as a FILE_BUF.  Note this function returns a struct, not a pointer.
1721  *
1722  * OUTPUT_MARKS nonzero means keep Newline markers found in the input
1723  * and insert such markers when appropriate.  See `rescan' for details.
1724  * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
1725  * before substitution; it is 0 for other uses.
1726  */
1727 static FILE_BUF
1728 expand_to_temp_buffer (buf, limit, output_marks)
1729      const U_CHAR *buf, *limit;
1730      int output_marks;
1731 {
1732   register FILE_BUF *ip;
1733   FILE_BUF obuf;
1734   int length = limit - buf;
1735   U_CHAR *buf1;
1736   int odepth = indepth;
1737
1738   if (length < 0)
1739     abort ();
1740
1741   /* Set up the input on the input stack.  */
1742
1743   buf1 = (U_CHAR *) alloca (length + 1);
1744   {
1745     register const U_CHAR *p1 = buf;
1746     register U_CHAR *p2 = buf1;
1747
1748     while (p1 != limit)
1749       *p2++ = *p1++;
1750   }
1751   buf1[length] = 0;
1752
1753   /* Set up to receive the output.  */
1754
1755   obuf.length = length * 2 + 100; /* Usually enough.  Why be stingy?  */
1756   obuf.bufp = obuf.buf = (U_CHAR *) xmalloc (obuf.length);
1757   obuf.fname = 0;
1758   obuf.macro = 0;
1759   obuf.free_ptr = 0;
1760
1761   CHECK_DEPTH ({return obuf;});
1762
1763   ++indepth;
1764
1765   ip = &instack[indepth];
1766   ip->fname = 0;
1767   ip->macro = 0;
1768   ip->free_ptr = 0;
1769   ip->length = length;
1770   ip->buf = ip->bufp = buf1;
1771   ip->if_stack = if_stack;
1772
1773   ip->lineno = obuf.lineno = 1;
1774
1775   /* Scan the input, create the output.  */
1776
1777   rescan (&obuf, output_marks);
1778
1779   /* Pop input stack to original state.  */
1780   --indepth;
1781
1782   if (indepth != odepth)
1783     abort ();
1784
1785   /* Record the output.  */
1786   obuf.length = obuf.bufp - obuf.buf;
1787
1788   return obuf;
1789 }
1790 \f
1791 /*
1792  * Process a # directive.  Expects IP->bufp to point to the '#', as in
1793  * `#define foo bar'.  Passes to the command handler
1794  * (do_define, do_include, etc.): the addresses of the 1st and
1795  * last chars of the command (starting immediately after the #
1796  * keyword), plus op and the keyword table pointer.  If the command
1797  * contains comments it is copied into a temporary buffer sans comments
1798  * and the temporary buffer is passed to the command handler instead.
1799  * Likewise for backslash-newlines.
1800  *
1801  * Returns nonzero if this was a known # directive.
1802  * Otherwise, returns zero, without advancing the input pointer.
1803  */
1804
1805 static int
1806 handle_directive (ip, op)
1807      FILE_BUF *ip, *op;
1808 {
1809   register U_CHAR *bp, *cp;
1810   register struct directive *kt;
1811   register int ident_length;
1812   U_CHAR *resume_p;
1813
1814   /* Nonzero means we must copy the entire command
1815      to get rid of comments or backslash-newlines.  */
1816   int copy_command = 0;
1817
1818   U_CHAR *ident, *after_ident;
1819
1820   bp = ip->bufp;
1821   /* Skip whitespace and \-newline.  */
1822   while (1) {
1823     if (is_nvspace (*bp))
1824       bp++;
1825     else if (*bp == '/' && (newline_fix (bp + 1), bp[1]) == '*') {
1826       ip->bufp = bp;
1827       skip_to_end_of_comment (ip, &ip->lineno);
1828       bp = ip->bufp;
1829     } else if (*bp == '\\' && bp[1] == '\n') {
1830       bp += 2; ip->lineno++;
1831     } else break;
1832   }
1833
1834   /* Now find end of directive name.
1835      If we encounter a backslash-newline, exchange it with any following
1836      symbol-constituents so that we end up with a contiguous name.  */
1837
1838   cp = bp;
1839   while (1) {
1840     if (is_idchar (*cp))
1841       cp++;
1842     else {
1843       if (*cp == '\\' && cp[1] == '\n')
1844         name_newline_fix (cp);
1845       if (is_idchar (*cp))
1846         cp++;
1847       else break;
1848     }
1849   }
1850   ident_length = cp - bp;
1851   ident = bp;
1852   after_ident = cp;
1853
1854   /* A line of just `#' becomes blank.  */
1855
1856   if (ident_length == 0 && *after_ident == '\n') {
1857     ip->bufp = after_ident;
1858     return 1;
1859   }
1860
1861   /*
1862    * Decode the keyword and call the appropriate expansion
1863    * routine, after moving the input pointer up to the next line.
1864    */
1865   for (kt = directive_table; kt->length > 0; kt++) {
1866     if (kt->length == ident_length
1867         && !strncmp (kt->name, (const char *)ident, ident_length)) {
1868       register U_CHAR *buf;
1869       register U_CHAR *limit = ip->buf + ip->length;
1870       int unterminated = 0;
1871
1872       /* Nonzero means do not delete comments within the directive.
1873          #define needs this to detect traditional token paste.  */
1874       int keep_comments = kt->type == T_DEFINE;
1875
1876       /* Find the end of this command (first newline not backslashed
1877          and not in a string or comment).
1878          Set COPY_COMMAND if the command must be copied
1879          (it contains a backslash-newline or a comment).  */
1880
1881       buf = bp = after_ident;
1882       while (bp < limit) {
1883         register U_CHAR c = *bp++;
1884         switch (c) {
1885         case '\\':
1886           if (bp < limit) {
1887             if (*bp == '\n') {
1888               ip->lineno++;
1889               copy_command = 1;
1890             }
1891             bp++;
1892           }
1893           break;
1894
1895         case '\'':
1896         case '\"':
1897           bp = skip_quoted_string (bp - 1, limit, ip->lineno, &ip->lineno, &copy_command, &unterminated);
1898           if (unterminated) {
1899             /* Traditional preprocessing permits unterminated strings.  */
1900             ip->bufp = bp;
1901             goto endloop1;
1902           }
1903           break;
1904
1905           /* <...> is special for #include.  */
1906         case '<':
1907           if (kt->type != T_INCLUDE)
1908             break;
1909           while (*bp && *bp != '>') bp++;
1910           break;
1911
1912         case '/':
1913           if (*bp == '\\' && bp[1] == '\n')
1914             newline_fix (bp);
1915           if (*bp == '*') {
1916             U_CHAR *obp = bp - 1;
1917             ip->bufp = bp + 1;
1918             skip_to_end_of_comment (ip, &ip->lineno);
1919             bp = ip->bufp;
1920             /* No need to copy the command because of a comment at the end;
1921                just don't include the comment in the directive.  */
1922             if (bp == limit || *bp == '\n') {
1923               bp = obp;
1924               goto endloop1;
1925             }
1926             /* Don't remove the comments if this is #define.  */
1927             if (! keep_comments)
1928               copy_command++;
1929           }
1930           break;
1931
1932         case '\n':
1933           --bp;         /* Point to the newline */
1934           ip->bufp = bp;
1935           goto endloop1;
1936         }
1937       }
1938       ip->bufp = bp;
1939
1940     endloop1:
1941       resume_p = ip->bufp;
1942       /* BP is the end of the directive.
1943          RESUME_P is the next interesting data after the directive.
1944          A comment may come between.  */
1945
1946       if (copy_command) {
1947         register U_CHAR *xp = buf;
1948         /* Need to copy entire command into temp buffer before dispatching */
1949
1950         cp = (U_CHAR *) alloca (bp - buf + 5); /* room for cmd plus
1951                                                   some slop */
1952         buf = cp;
1953
1954         /* Copy to the new buffer, deleting comments
1955            and backslash-newlines (and whitespace surrounding the latter).  */
1956
1957         while (xp < bp) {
1958           register U_CHAR c = *xp++;
1959           *cp++ = c;
1960
1961           switch (c) {
1962           case '\n':
1963             break;
1964
1965             /* <...> is special for #include.  */
1966           case '<':
1967             if (kt->type != T_INCLUDE)
1968               break;
1969             while (xp < bp && c != '>') {
1970               c = *xp++;
1971               if (c == '\\' && xp < bp && *xp == '\n')
1972                 xp++, ip->lineno++;
1973               else
1974                 *cp++ = c;
1975             }
1976             break;
1977
1978           case '\\':
1979             if (*xp == '\n') {
1980               xp++;
1981               cp--;
1982               if (cp != buf && is_space (cp[-1])) {
1983                 while (cp != buf && is_space(cp[-1])) cp--;
1984                 cp++;
1985                 SKIP_WHITE_SPACE (xp);
1986               } else if (is_space (*xp)) {
1987                 *cp++ = *xp++;
1988                 SKIP_WHITE_SPACE (xp);
1989               }
1990             } else {
1991               *cp++ = *xp++;
1992             }
1993             break;
1994
1995           case '\'':
1996           case '\"':
1997             {
1998               register const U_CHAR *bp1
1999                 = skip_quoted_string (xp - 1, limit, ip->lineno, 0, 0, 0);
2000               while (xp != bp1)
2001                 *cp++ = *xp++;
2002             }
2003             break;
2004
2005           case '/':
2006             if (*xp == '*') {
2007               ip->bufp = xp + 1;
2008               skip_to_end_of_comment (ip, 0);
2009               if (keep_comments)
2010                 while (xp != ip->bufp)
2011                   *cp++ = *xp++;
2012               /* Delete the slash.  */
2013               else
2014                 cp--;
2015               xp = ip->bufp;
2016             }
2017           }
2018         }
2019
2020         /* Null-terminate the copy.  */
2021
2022         *cp = 0;
2023       }
2024       else
2025         cp = bp;
2026
2027       ip->bufp = resume_p;
2028
2029       /* Call the appropriate command handler.  buf now points to
2030          either the appropriate place in the input buffer, or to
2031          the temp buffer if it was necessary to make one.  cp
2032          points to the first char after the contents of the (possibly
2033          copied) command, in either case. */
2034       (*kt->func) (buf, cp, op);
2035       check_expand (op, ip->length - (ip->bufp - ip->buf));
2036
2037       return 1;
2038     }
2039   }
2040
2041   return 0;
2042 }
2043 \f
2044 static const char *const
2045 monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
2046                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
2047
2048 /*
2049  * expand things like __FILE__.  Place the expansion into the output
2050  * buffer *without* rescanning.
2051  */
2052 static void
2053 special_symbol (hp, op)
2054      HASHNODE *hp;
2055      FILE_BUF *op;
2056 {
2057   const char *buf;
2058   time_t t;
2059   int i, len;
2060   int true_indepth;
2061   FILE_BUF *ip = NULL;
2062   static struct tm *timebuf = NULL;
2063
2064   int paren = 0;                /* For special `defined' keyword */
2065
2066   for (i = indepth; i >= 0; i--)
2067     if (instack[i].fname != NULL) {
2068       ip = &instack[i];
2069       break;
2070     }
2071   if (ip == NULL)
2072     fatal ("not in any file?!");
2073
2074   switch (hp->type) {
2075   case T_FILE:
2076   case T_BASE_FILE:
2077     {
2078       const char *string;
2079       if (hp->type == T_FILE)
2080         string = ip->fname;
2081       else
2082         string = instack[0].fname;
2083
2084       if (string)
2085         {
2086           char *tmp = (char *) alloca (3 + strlen (string));
2087           sprintf (tmp, "\"%s\"", string);
2088           buf = tmp;
2089         }
2090       else
2091         buf = "";
2092
2093       break;
2094     }
2095
2096   case T_INCLUDE_LEVEL:
2097     {
2098       char *tmp = (char *) alloca (8);  /* Eigth bytes ought to be more than enough */
2099       true_indepth = 0;
2100       for (i = indepth; i >= 0; i--)
2101         if (instack[i].fname != NULL)
2102           true_indepth++;
2103
2104     sprintf (tmp, "%d", true_indepth - 1);
2105     buf = tmp;
2106     break;
2107     }
2108
2109   case T_VERSION:
2110     {
2111       char *tmp = (char *) alloca (3 + strlen (version_string));
2112       sprintf (tmp, "\"%s\"", version_string);
2113       buf = tmp;
2114       break;
2115     }
2116
2117   case T_CONST:
2118     buf = hp->value.cpval;
2119     break;
2120
2121   case T_SPECLINE:
2122     {
2123       char *tmp = (char *) alloca (10);
2124       sprintf (tmp, "%d", ip->lineno);
2125       buf = tmp;
2126       break;
2127     }
2128
2129   case T_DATE:
2130   case T_TIME:
2131     {
2132       char *tmp = (char *) alloca (20);
2133
2134       if (timebuf == NULL) {
2135         t = time (0);
2136         timebuf = localtime (&t);
2137       }
2138       if (hp->type == T_DATE)
2139         sprintf (tmp, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
2140                  timebuf->tm_mday, timebuf->tm_year + 1900);
2141       else
2142         sprintf (tmp, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
2143                  timebuf->tm_sec);
2144       buf = tmp;
2145       break;
2146     }
2147
2148   case T_SPEC_DEFINED:
2149     buf = " 0 ";                        /* Assume symbol is not defined */
2150     ip = &instack[indepth];
2151     SKIP_WHITE_SPACE (ip->bufp);
2152     if (*ip->bufp == '(') {
2153       paren++;
2154       ip->bufp++;                       /* Skip over the paren */
2155       SKIP_WHITE_SPACE (ip->bufp);
2156     }
2157
2158     if (!is_idstart (*ip->bufp))
2159       goto oops;
2160     if (lookup (ip->bufp, -1, -1))
2161       buf = " 1 ";
2162     while (is_idchar (*ip->bufp))
2163       ++ip->bufp;
2164     SKIP_WHITE_SPACE (ip->bufp);
2165     if (paren) {
2166       if (*ip->bufp != ')')
2167         goto oops;
2168       ++ip->bufp;
2169     }
2170     break;
2171
2172 oops:
2173
2174     error ("`defined' must be followed by ident or (ident)");
2175     break;
2176
2177   default:
2178     error ("cccp error: invalid special hash type"); /* time for gdb */
2179     abort ();
2180   }
2181   len = strlen (buf);
2182   check_expand (op, len);
2183   memcpy (op->bufp, buf, len);
2184   op->bufp += len;
2185 }
2186
2187 \f
2188 /* Routines to handle #directives */
2189
2190 /*
2191  * Process include file by reading it in and calling rescan.
2192  * Expects to see "fname" or <fname> on the input.
2193  */
2194 static void
2195 do_include (buf, limit, op)
2196      U_CHAR *buf, *limit;
2197      FILE_BUF *op;
2198 {
2199   char *fname;          /* Dynamically allocated fname buffer */
2200   U_CHAR *fbeg, *fend;          /* Beginning and end of fname */
2201
2202   struct file_name_list *stackp = include; /* Chain of dirs to search */
2203   struct file_name_list dsp[1]; /* First in chain, if #include "..." */
2204   int flen;
2205
2206   int f;                        /* file number */
2207
2208   int retried = 0;              /* Have already tried macro
2209                                    expanding the include line*/
2210   FILE_BUF trybuf;              /* It got expanded into here */
2211   int system_header_p = 0;      /* 0 for "...", 1 for <...> */
2212
2213   f= -1;                        /* JF we iz paranoid! */
2214
2215 get_filename:
2216
2217   fbeg = buf;
2218   SKIP_WHITE_SPACE (fbeg);
2219   /* Discard trailing whitespace so we can easily see
2220      if we have parsed all the significant chars we were given.  */
2221   while (limit != fbeg && is_nvspace (limit[-1])) limit--;
2222
2223   switch (*fbeg++) {
2224   case '\"':
2225     fend = fbeg;
2226     while (fend != limit && *fend != '\"')
2227       fend++;
2228     if (*fend == '\"' && fend + 1 == limit) {
2229       FILE_BUF *fp;
2230
2231       /* We have "filename".  Figure out directory this source
2232          file is coming from and put it on the front of the list. */
2233
2234       /* If -I- was specified, don't search current dir, only spec'd ones. */
2235       if (ignore_srcdir) break;
2236
2237       for (fp = &instack[indepth]; fp >= instack; fp--)
2238         {
2239           size_t n;
2240           const char *ep, *nam;
2241
2242           if ((nam = fp->fname) != NULL) {
2243             /* Found a named file.  Figure out dir of the file,
2244                and put it in front of the search list.  */
2245             dsp[0].next = stackp;
2246             stackp = dsp;
2247             ep = strrchr (nam, '/');
2248             if (ep != NULL) {
2249               char *f; 
2250               n = ep - nam;
2251               f = (char *) alloca (n + 1);
2252               strncpy (f, nam, n);
2253               f[n] = '\0';
2254               dsp[0].fname = f;
2255               if (n > max_include_len) max_include_len = n;
2256             } else {
2257               dsp[0].fname = 0; /* Current directory */
2258             }
2259             break;
2260           }
2261         }
2262       break;
2263     }
2264     goto fail;
2265
2266   case '<':
2267     fend = fbeg;
2268     while (fend != limit && *fend != '>') fend++;
2269     if (*fend == '>' && fend + 1 == limit) {
2270       system_header_p = 1;
2271       /* If -I-, start with the first -I dir after the -I-.  */
2272       if (first_bracket_include)
2273         stackp = first_bracket_include;
2274       break;
2275     }
2276     goto fail;
2277
2278   default:
2279   fail:
2280     if (retried) {
2281       error ("#include expects \"fname\" or <fname>");
2282       return;
2283     } else {
2284       trybuf = expand_to_temp_buffer (buf, limit, 0);
2285       buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
2286       memcpy (buf, trybuf.buf, trybuf.bufp - trybuf.buf);
2287       limit = buf + (trybuf.bufp - trybuf.buf);
2288       free (trybuf.buf);
2289       retried++;
2290       goto get_filename;
2291     }
2292   }
2293
2294   flen = fend - fbeg;
2295   fname = (char *) alloca (max_include_len + flen + 2);
2296   /* + 2 above for slash and terminating null.  */
2297
2298   /* If specified file name is absolute, just open it.  */
2299
2300   if (*fbeg == '/') {
2301     strncpy (fname, (const char *)fbeg, flen);
2302     fname[flen] = 0;
2303     f = open (fname, O_RDONLY, 0666);
2304   } else {
2305     /* Search directory path, trying to open the file.
2306        Copy each filename tried into FNAME.  */
2307
2308     for (; stackp; stackp = stackp->next) {
2309       if (stackp->fname) {
2310         strcpy (fname, stackp->fname);
2311         strcat (fname, "/");
2312         fname[strlen (fname) + flen] = 0;
2313       } else {
2314         fname[0] = 0;
2315       }
2316       strncat (fname, (const char *)fbeg, flen);
2317       if ((f = open (fname, O_RDONLY, 0666)) >= 0)
2318         break;
2319     }
2320   }
2321
2322   if (f < 0) {
2323     strncpy (fname, (const char *)fbeg, flen);
2324     fname[flen] = 0;
2325     error_from_errno (fname);
2326
2327     /* For -M, add this file to the dependencies.  */
2328     if (print_deps > (system_header_p || (system_include_depth > 0))) {
2329       if (system_header_p)
2330         warning ("nonexistent file <%.*s> omitted from dependency output",
2331                  fend - fbeg, fbeg);
2332       else
2333         {
2334           deps_output ((const char *)fbeg, fend - fbeg);
2335           deps_output (" ", 0);
2336         }
2337     }
2338   } else {
2339
2340     /* Check to see if this include file is a once-only include file.
2341        If so, give up.  */
2342
2343     struct file_name_list* ptr;
2344
2345     for (ptr = dont_repeat_files; ptr; ptr = ptr->next) {
2346       if (!strcmp (ptr->fname, fname)) {
2347         close (f);
2348         return;                         /* This file was once'd. */
2349       }
2350     }
2351
2352     for (ptr = all_include_files; ptr; ptr = ptr->next) {
2353       if (!strcmp (ptr->fname, fname))
2354         break;                          /* This file was included before. */
2355     }
2356
2357     if (ptr == 0) {
2358       /* This is the first time for this file.  */
2359       /* Add it to list of files included.  */
2360
2361       ptr = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
2362       ptr->next = all_include_files;
2363       all_include_files = ptr;
2364       ptr->fname = xstrdup (fname);
2365
2366       /* For -M, add this file to the dependencies.  */
2367       if (print_deps > (system_header_p || (system_include_depth > 0))) {
2368         deps_output (fname, strlen (fname));
2369         deps_output (" ", 0);
2370       }
2371     }   
2372
2373     if (system_header_p)
2374       system_include_depth++;
2375
2376     /* Actually process the file.  */
2377     finclude (f, fname, op);
2378
2379     if (system_header_p)
2380       system_include_depth--;
2381
2382     close (f);
2383   }
2384 }
2385
2386 /* Process the contents of include file FNAME, already open on descriptor F,
2387    with output to OP.  */
2388
2389 static void
2390 finclude (f, fname, op)
2391      int f;
2392      const char *fname;
2393      FILE_BUF *op;
2394 {
2395   int st_mode;
2396   long st_size;
2397   long i;
2398   FILE_BUF *fp;                 /* For input stack frame */
2399
2400   CHECK_DEPTH (return;);
2401
2402   if (file_size_and_mode (f, &st_mode, &st_size))
2403     goto nope;
2404
2405   fp = &instack[indepth + 1];
2406   memset (fp, 0, sizeof (FILE_BUF));
2407   fp->fname = fname;
2408   fp->length = 0;
2409   fp->lineno = 1;
2410   fp->if_stack = if_stack;
2411
2412   if (S_ISREG (st_mode)) {
2413     fp->buf = (U_CHAR *) xmalloc (st_size + 2);
2414     fp->bufp = fp->buf;
2415
2416     /* Read the file contents, knowing that st_size is an upper bound
2417        on the number of bytes we can read.  */
2418     while (st_size > 0) {
2419       i = read (f, fp->buf + fp->length, st_size);
2420       if (i <= 0) {
2421         if (i == 0) break;
2422         goto nope;
2423       }
2424       fp->length += i;
2425       st_size -= i;
2426     }
2427   }
2428   else {
2429     /* Cannot count its file size before reading.  */
2430
2431     U_CHAR *bufp;
2432     U_CHAR *basep;
2433     int bsize = 2000;
2434
2435     st_size = 0;
2436     basep = (U_CHAR *) xmalloc (bsize + 2);
2437     bufp = basep;
2438
2439     for (;;) {
2440       i = read (f, bufp, bsize - st_size);
2441       if (i < 0)
2442         goto nope;      /* error! */
2443       if (i == 0)
2444         break;  /* End of file */
2445       st_size += i;
2446       bufp += i;
2447       if (bsize == st_size) {   /* Buffer is full! */
2448           bsize *= 2;
2449           basep = (U_CHAR *) xrealloc (basep, bsize + 2);
2450           bufp = basep + st_size;       /* May have moved */
2451         }
2452     }
2453     fp->buf = basep;
2454     fp->bufp = fp->buf;
2455     fp->length = st_size;
2456   }
2457   close (f);
2458
2459   /* Make sure data ends with a newline.  And put a null after it.  */
2460
2461   if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
2462     fp->buf[fp->length++] = '\n';
2463   fp->buf[fp->length] = '\0';
2464
2465   indepth++;
2466   output_line_command (fp, op, 0, enter_file);
2467   rescan (op, 0);
2468   indepth--;
2469   output_line_command (&instack[indepth], op, 0, leave_file);
2470   free (fp->buf);
2471   return;
2472
2473 nope:
2474   perror_with_name (fname);
2475   close (f);
2476 }
2477 \f
2478
2479 /* Process a #define command.
2480 BUF points to the contents of the #define command, as a continguous string.
2481 LIMIT points to the first character past the end of the definition.
2482 KEYWORD is the keyword-table entry for #define.  */
2483
2484 static void
2485 do_define (buf, limit, op)
2486      U_CHAR *buf, *limit;
2487      FILE_BUF *op ATTRIBUTE_UNUSED;
2488 {
2489   U_CHAR *bp;                   /* temp ptr into input buffer */
2490   U_CHAR *symname;              /* remember where symbol name starts */
2491   int sym_length;               /* and how long it is */
2492
2493   DEFINITION *defn;
2494   int arglengths = 0;           /* Accumulate lengths of arg names
2495                                    plus number of args.  */
2496   int hashcode;
2497
2498   bp = buf;
2499
2500   while (is_nvspace (*bp))
2501     bp++;
2502
2503   symname = bp;                 /* remember where it starts */
2504   while (is_idchar (*bp) && bp < limit) {
2505     bp++;
2506   }
2507   sym_length = bp - symname;
2508   if (sym_length == 0)
2509     error ("invalid macro name");
2510   else if (!is_idstart (*symname)) {
2511     U_CHAR *msg;                        /* what pain... */
2512     msg = (U_CHAR *) alloca (sym_length + 1);
2513     memcpy (msg, symname, sym_length);
2514     msg[sym_length] = 0;
2515     error ("invalid macro name `%s'", msg);
2516   } else {
2517     if (! strncmp ((const char *)symname, "defined", 7) && sym_length == 7)
2518       error ("defining `defined' as a macro");
2519   }
2520
2521   /* lossage will occur if identifiers or control keywords are broken
2522      across lines using backslash.  This is not the right place to take
2523      care of that. */
2524
2525   if (*bp == '(') {
2526     struct arglist *arg_ptrs = NULL;
2527     int argno = 0;
2528
2529     bp++;                       /* skip '(' */
2530     SKIP_WHITE_SPACE (bp);
2531
2532     /* Loop over macro argument names.  */
2533     while (*bp != ')') {
2534       struct arglist *temp;
2535
2536       temp = (struct arglist *) alloca (sizeof (struct arglist));
2537       temp->name = bp;
2538       temp->next = arg_ptrs;
2539       temp->argno = argno++;
2540       arg_ptrs = temp;
2541
2542       if (!is_idstart (*bp))
2543         warning ("parameter name starts with a digit in #define");
2544
2545       /* Find the end of the arg name.  */
2546       while (is_idchar (*bp)) {
2547         bp++;
2548       }
2549       temp->length = bp - temp->name;
2550       arglengths += temp->length + 2;
2551       SKIP_WHITE_SPACE (bp);
2552       if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
2553         error ("badly punctuated parameter list in #define");
2554         return;
2555       }
2556       if (*bp == ',') {
2557         bp++;
2558         SKIP_WHITE_SPACE (bp);
2559       }
2560       if (bp >= limit) {
2561         error ("unterminated parameter list in #define");
2562         return;
2563       }
2564     }
2565
2566     ++bp;                       /* skip paren */
2567     while (is_nvspace (*bp))    /* and leading whitespace */
2568       ++bp;
2569     /* now everything from bp before limit is the definition. */
2570     defn = collect_expansion (bp, limit, argno, arg_ptrs);
2571
2572     /* Now set defn->argnames to the result of concatenating
2573        the argument names in reverse order
2574        with comma-space between them.  */
2575     {
2576       struct arglist *temp;
2577       int i = 0;
2578       U_CHAR *tmp = (U_CHAR *) xmalloc (arglengths + 1);
2579
2580       for (temp = arg_ptrs; temp; temp = temp->next) {
2581         memcpy (&tmp[i], temp->name, temp->length);
2582         i += temp->length;
2583         if (temp->next != 0) {
2584           tmp[i++] = ',';
2585           tmp[i++] = ' ';
2586         }
2587       }
2588       tmp[i] = 0;
2589       defn->argnames = tmp;
2590       
2591     }
2592   } else {
2593     /* simple expansion or empty definition; skip leading whitespace */
2594     while (is_nvspace (*bp))
2595       ++bp;
2596     /* now everything from bp before limit is the definition. */
2597     defn = collect_expansion (bp, limit, -1, 0);
2598     defn->argnames = (const U_CHAR *) "";
2599   }
2600
2601   hashcode = hashf (symname, sym_length, HASHSIZE);
2602
2603   {
2604     HASHNODE *hp;
2605     if ((hp = lookup (symname, sym_length, hashcode)) == NULL)
2606       hp = install (symname, sym_length, T_MACRO, hashcode);
2607     else {
2608       if (hp->type != T_MACRO || compare_defs (defn, hp->value.defn))
2609         warning ("\"%.*s\" redefined", sym_length, symname);
2610
2611       /* Replace the old definition.  */
2612       hp->type = T_MACRO;
2613     }
2614
2615     hp->value.defn = defn;
2616   }
2617 }
2618
2619 /*
2620  * return zero if two DEFINITIONs are isomorphic
2621  */
2622 static int
2623 compare_defs (d1, d2)
2624      DEFINITION *d1, *d2;
2625 {
2626   register struct reflist *a1, *a2;
2627   register U_CHAR *p1 = d1->expansion;
2628   register U_CHAR *p2 = d2->expansion;
2629   int first = 1;
2630
2631   if (d1->nargs != d2->nargs)
2632     return 1;
2633   if (strcmp ((const char *)d1->argnames, (const char *)d2->argnames))
2634     return 1;
2635   for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
2636        a1 = a1->next, a2 = a2->next) {
2637     if (!((a1->nchars == a2->nchars
2638            && ! strncmp ((const char *)p1, (const char *)p2, a1->nchars))
2639           || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
2640         || a1->argno != a2->argno
2641         || a1->stringify != a2->stringify
2642         || a1->raw_before != a2->raw_before
2643         || a1->raw_after != a2->raw_after)
2644       return 1;
2645     first = 0;
2646     p1 += a1->nchars;
2647     p2 += a2->nchars;
2648   }
2649   if (a1 != a2)
2650     return 1;
2651   if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
2652                      p2, d2->length - (p2 - d2->expansion), 1))
2653     return 1;
2654   return 0;
2655 }
2656
2657 /* Return 1 if two parts of two macro definitions are effectively different.
2658    One of the parts starts at BEG1 and has LEN1 chars;
2659    the other has LEN2 chars at BEG2.
2660    Any sequence of whitespace matches any other sequence of whitespace.
2661    FIRST means these parts are the first of a macro definition;
2662     so ignore leading whitespace entirely.
2663    LAST means these parts are the last of a macro definition;
2664     so ignore trailing whitespace entirely.  */
2665 static int
2666 comp_def_part (first, beg1, len1, beg2, len2, last)
2667      int first;
2668      const U_CHAR *beg1, *beg2;
2669      int len1, len2;
2670      int last;
2671 {
2672   register const U_CHAR *end1 = beg1 + len1;
2673   register const U_CHAR *end2 = beg2 + len2;
2674   if (first) {
2675     while (beg1 != end1 && is_space (*beg1)) beg1++;
2676     while (beg2 != end2 && is_space (*beg2)) beg2++;
2677   }
2678   if (last) {
2679     while (beg1 != end1 && is_space (end1[-1])) end1--;
2680     while (beg2 != end2 && is_space (end2[-1])) end2--;
2681   }
2682   while (beg1 != end1 && beg2 != end2) {
2683     if (is_space (*beg1) && is_space (*beg2)) {
2684       while (beg1 != end1 && is_space (*beg1)) beg1++;
2685       while (beg2 != end2 && is_space (*beg2)) beg2++;
2686     } else if (*beg1 == *beg2) {
2687       beg1++; beg2++;
2688     } else break;
2689   }
2690   return (beg1 != end1) || (beg2 != end2);
2691 }
2692
2693 /* Read a replacement list for a macro with parameters.
2694    Build the DEFINITION structure.
2695    Reads characters of text starting at BUF until LIMIT.
2696    ARGLIST specifies the formal parameters to look for
2697    in the text of the definition; NARGS is the number of args
2698    in that list, or -1 for a macro name that wants no argument list.
2699    MACRONAME is the macro name itself (so we can avoid recursive expansion)
2700    and NAMELEN is its length in characters.
2701    
2702 Note that comments and backslash-newlines have already been deleted
2703 from the argument.  */
2704
2705 /* Leading and trailing Space, Tab, etc. are converted to markers
2706    Newline Space, Newline Tab, etc.
2707    Newline Space makes a space in the final output
2708    but is discarded if stringified.  (Newline Tab is similar but
2709    makes a Tab instead.)
2710
2711    If there is no trailing whitespace, a Newline Space is added at the end
2712    to prevent concatenation that would be contrary to the standard.  */
2713
2714 static DEFINITION *
2715 collect_expansion (buf, end, nargs, arglist)
2716      U_CHAR *buf, *end;
2717      int nargs;
2718      struct arglist *arglist;
2719 {
2720   DEFINITION *defn;
2721   register U_CHAR *p, *limit, *lastp, *exp_p;
2722   struct reflist *endpat = NULL;
2723   /* Pointer to first nonspace after last ## seen.  */
2724   U_CHAR *concat = 0;
2725   /* Pointer to first nonspace after last single-# seen.  */
2726   U_CHAR *stringify = 0;
2727   int maxsize;
2728   int expected_delimiter = '\0';
2729
2730   /* Scan thru the replacement list, ignoring comments and quoted
2731      strings, picking up on the macro calls.  It does a linear search
2732      thru the arg list on every potential symbol.  Profiling might say
2733      that something smarter should happen. */
2734
2735   if (end < buf)
2736     abort ();
2737
2738   /* Find the beginning of the trailing whitespace.  */
2739   /* Find end of leading whitespace.  */
2740   limit = end;
2741   p = buf;
2742   while (p < limit && is_space (limit[-1])) limit--;
2743   while (p < limit && is_space (*p)) p++;
2744
2745   /* Allocate space for the text in the macro definition.
2746      Leading and trailing whitespace chars need 2 bytes each.
2747      Each other input char may or may not need 1 byte,
2748      so this is an upper bound.
2749      The extra 2 are for invented trailing newline-marker and final null.  */
2750   maxsize = (sizeof (DEFINITION)
2751              + 2 * (end - limit) + 2 * (p - buf)
2752              + (limit - p) + 3);
2753   defn = (DEFINITION *) xcalloc (1, maxsize);
2754
2755   defn->nargs = nargs;
2756   exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
2757   lastp = exp_p;
2758
2759   p = buf;
2760
2761   /* Convert leading whitespace to Newline-markers.  */
2762   while (p < limit && is_space (*p)) {
2763     *exp_p++ = '\n';
2764     *exp_p++ = *p++;
2765   }
2766
2767   /* Process the main body of the definition.  */
2768   while (p < limit) {
2769     int skipped_arg = 0;
2770     register U_CHAR c = *p++;
2771
2772     *exp_p++ = c;
2773
2774     /* In -traditional mode, recognize arguments inside strings and
2775        and character constants, and ignore special properties of #.
2776        Arguments inside strings are considered "stringified", but no
2777        extra quote marks are supplied.  */
2778     switch (c) {
2779     case '\'':
2780     case '\"':
2781       if (expected_delimiter != '\0') {
2782         if (c == expected_delimiter)
2783           expected_delimiter = '\0';
2784       } else
2785         expected_delimiter = c;
2786       break;
2787
2788     case '\\':
2789       /* Backslash quotes delimiters and itself, but not macro args.  */
2790       if (expected_delimiter != 0 && p < limit
2791           && (*p == expected_delimiter || *p == '\\')) {
2792         *exp_p++ = *p++;
2793         continue;
2794       }
2795       break;
2796
2797     case '/':
2798       if (expected_delimiter != '\0') /* No comments inside strings.  */
2799         break;
2800       if (*p == '*') {
2801         /* If we find a comment that wasn't removed by handle_directive,
2802            this must be -traditional.  So replace the comment with
2803            nothing at all.  */
2804         exp_p--;
2805         p += 1;
2806         while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
2807           p++;
2808       }
2809       break;
2810     }
2811
2812     if (is_idchar (c) && nargs > 0) {
2813       U_CHAR *id_beg = p - 1;
2814       int id_len;
2815
2816       --exp_p;
2817       while (p != limit && is_idchar (*p)) p++;
2818       id_len = p - id_beg;
2819
2820       if (is_idstart (c)) {
2821         register struct arglist *arg;
2822
2823         for (arg = arglist; arg != NULL; arg = arg->next) {
2824           struct reflist *tpat;
2825
2826           if (arg->name[0] == c
2827               && arg->length == id_len
2828               && strncmp ((const char *)arg->name,
2829                           (const char *)id_beg, id_len) == 0) {
2830             /* make a pat node for this arg and append it to the end of
2831                the pat list */
2832             tpat = (struct reflist *) xmalloc (sizeof (struct reflist));
2833             tpat->next = NULL;
2834             tpat->raw_before = concat == id_beg;
2835             tpat->raw_after = 0;
2836             tpat->stringify = expected_delimiter != '\0';
2837
2838             if (endpat == NULL)
2839               defn->pattern = tpat;
2840             else
2841               endpat->next = tpat;
2842             endpat = tpat;
2843
2844             tpat->argno = arg->argno;
2845             tpat->nchars = exp_p - lastp;
2846             {
2847               register U_CHAR *p1 = p;
2848               SKIP_WHITE_SPACE (p1);
2849               if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
2850                 tpat->raw_after = 1;
2851             }
2852             lastp = exp_p;      /* place to start copying from next time */
2853             skipped_arg = 1;
2854             break;
2855           }
2856         }
2857       }
2858
2859       /* If this was not a macro arg, copy it into the expansion.  */
2860       if (! skipped_arg) {
2861         register U_CHAR *lim1 = p;
2862         p = id_beg;
2863         while (p != lim1)
2864           *exp_p++ = *p++;
2865         if (stringify == id_beg)
2866           error ("# operator should be followed by a macro argument name");
2867       }
2868     }
2869   }
2870
2871   if (limit < end) {
2872     /* Convert trailing whitespace to Newline-markers.  */
2873     while (limit < end && is_space (*limit)) {
2874       *exp_p++ = '\n';
2875       *exp_p++ = *limit++;
2876     }
2877   }
2878   *exp_p = '\0';
2879
2880   defn->length = exp_p - defn->expansion;
2881
2882   /* Crash now if we overrun the allocated size.  */
2883   if (defn->length + 1 > maxsize)
2884     abort ();
2885
2886   return defn;
2887 }
2888 \f
2889 /*
2890  * interpret #line command.  Remembers previously seen fnames
2891  * in its very own hash table.
2892  */
2893 #define FNAME_HASHSIZE 37
2894 static void
2895 do_line (buf, limit, op)
2896      U_CHAR *buf, *limit;
2897      FILE_BUF *op;
2898 {
2899   register U_CHAR *bp;
2900   FILE_BUF *ip = &instack[indepth];
2901   FILE_BUF tem;
2902   int new_lineno;
2903   enum file_change_code file_change = same_file;
2904
2905   /* Expand any macros.  */
2906   tem = expand_to_temp_buffer (buf, limit, 0);
2907
2908   /* Point to macroexpanded line, which is null-terminated now.  */
2909   bp = tem.buf;
2910   SKIP_WHITE_SPACE (bp);
2911
2912   if (!ISDIGIT (*bp)) {
2913     error ("invalid format #line command");
2914     return;
2915   }
2916
2917   /* The Newline at the end of this line remains to be processed.
2918      To put the next line at the specified line number,
2919      we must store a line number now that is one less.  */
2920   new_lineno = atoi ((const char *)bp) - 1;
2921
2922   /* skip over the line number.  */
2923   while (ISDIGIT (*bp))
2924     bp++;
2925
2926 #if 0 /* #line 10"foo.c" is supposed to be allowed.  */
2927   if (*bp && !is_space (*bp)) {
2928     error ("invalid format #line command");
2929     return;
2930   }
2931 #endif
2932
2933   SKIP_WHITE_SPACE (bp);
2934
2935   if (*bp == '\"') {
2936     static HASHNODE *fname_table[FNAME_HASHSIZE];
2937     HASHNODE *hp, **hash_bucket;
2938     U_CHAR *fname;
2939     int fname_length;
2940
2941     fname = ++bp;
2942
2943     while (*bp && *bp != '\"')
2944       bp++;
2945     if (*bp != '\"') {
2946       error ("invalid format #line command");
2947       return;
2948     }
2949
2950     fname_length = bp - fname;
2951
2952     bp++;
2953     SKIP_WHITE_SPACE (bp);
2954     if (*bp) {
2955       if (*bp == '1')
2956         file_change = enter_file;
2957       else if (*bp == '2')
2958         file_change = leave_file;
2959       else {
2960         error ("invalid format #line command");
2961         return;
2962       }
2963
2964       bp++;
2965       SKIP_WHITE_SPACE (bp);
2966       if (*bp) {
2967         error ("invalid format #line command");
2968         return;
2969       }
2970     }
2971
2972     hash_bucket =
2973       &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)];
2974     for (hp = *hash_bucket; hp != NULL; hp = hp->next)
2975       if (hp->length == fname_length &&
2976           strncmp (hp->value.cpval, (const char *)fname, fname_length) == 0) {
2977         ip->fname = hp->value.cpval;
2978         break;
2979       }
2980     if (hp == 0) {
2981       char *q;
2982       /* Didn't find it; cons up a new one.  */
2983       hp = (HASHNODE *) xcalloc (1, sizeof (HASHNODE) + fname_length + 1);
2984       hp->next = *hash_bucket;
2985       *hash_bucket = hp;
2986
2987       hp->length = fname_length;
2988       ip->fname = hp->value.cpval = q = ((char *) hp) + sizeof (HASHNODE);
2989       memcpy (q, fname, fname_length);
2990     }
2991   } else if (*bp) {
2992     error ("invalid format #line command");
2993     return;
2994   }
2995
2996   ip->lineno = new_lineno;
2997   output_line_command (ip, op, 0, file_change);
2998   check_expand (op, ip->length - (ip->bufp - ip->buf));
2999 }
3000
3001 /*
3002  * remove all definitions of symbol from symbol table.
3003  * according to un*x /lib/cpp, it is not an error to undef
3004  * something that has no definitions, so it isn't one here either.
3005  */
3006 static void
3007 do_undef (buf, limit, op)
3008      U_CHAR *buf;
3009      U_CHAR *limit ATTRIBUTE_UNUSED;
3010      FILE_BUF *op ATTRIBUTE_UNUSED;
3011 {
3012   HASHNODE *hp;
3013
3014   SKIP_WHITE_SPACE (buf);
3015
3016   if (! strncmp ((const char *)buf, "defined", 7) && ! is_idchar (buf[7]))
3017     warning ("undefining `defined'");
3018
3019   while ((hp = lookup (buf, -1, -1)) != NULL) {
3020     if (hp->type != T_MACRO)
3021       warning ("undefining `%s'", hp->name);
3022     delete_macro (hp);
3023   }
3024 }
3025
3026 /* Read the tokens of the answer into the macro pool.  Only commit the
3027    memory if we intend it as permanent storage, i.e. the #assert case.
3028    Returns 0 on success.  */
3029
3030 static int
3031 parse_answer (buf, limit, answerp, type)
3032      const unsigned char *buf, *limit;
3033      struct answer **answerp;
3034      int type;
3035 {
3036   const unsigned char *start;
3037
3038   /* Skip leading whitespace.  */
3039   if (buf < limit && *buf == ' ')
3040     buf++;
3041
3042   /* Parentheses are optional here.  */
3043   if (buf == limit && type == T_UNASSERT)
3044     return 0;
3045
3046   if (buf == limit || *buf++ != '(')
3047     {
3048       if (type == T_IF)
3049         return 0;
3050
3051       error ("missing '(' after predicate");
3052       return 1;
3053     }
3054
3055   /* Drop whitespace at start.  */
3056   while (buf < limit && *buf == ' ')
3057     buf++;
3058
3059   start = buf;
3060   while (buf < limit && *buf != ')')
3061     buf++;
3062
3063   if (buf == limit)
3064     {
3065       error ("missing ')' to complete answer");
3066       return 1;
3067     }
3068
3069   if (buf == start)
3070     {
3071       error ("predicate's answer is empty");
3072       return 1;
3073     }
3074
3075   if ((type == T_ASSERT || type == T_UNASSERT) && buf + 1 != limit)
3076     {
3077       error ("extra text at end of directive");
3078       return 1;
3079     }
3080
3081   /* Lose trailing whitespace.  */
3082   if (buf[-1] == ' ')
3083     buf--;
3084
3085   *answerp = (struct answer *) xmalloc (sizeof (struct answer));
3086   (*answerp)->answer = start;
3087   (*answerp)->len = buf - start;
3088
3089   return 0;
3090 }
3091
3092 /* Parses an assertion, returning a pointer to the hash node of the
3093    predicate, or 0 on error.  If an answer was supplied, it is placed
3094    in ANSWERP, otherwise it is set to 0.  */
3095 static HASHNODE *
3096 parse_assertion (buf, limit, answerp, type)
3097      const unsigned char *buf, *limit;
3098      struct answer **answerp;
3099      int type;
3100 {
3101   HASHNODE *result = 0;
3102   const unsigned char *climit;
3103   unsigned char *bp, *symname = canonicalize_text (buf, limit, &climit);
3104   unsigned int len;
3105
3106   bp = symname;
3107   if (bp < climit && is_idstart (*bp))
3108     {
3109       do
3110         bp++;
3111       while (bp < climit && is_idchar (*bp));
3112     }
3113   len = bp - symname;
3114
3115   *answerp = 0;
3116   if (len == 0)
3117     {
3118       if (symname == climit)
3119         error ("assertion without predicate");
3120       else
3121         error ("predicate must be an identifier");
3122     }
3123   /* Unfortunately, because of the way we handle #if, we don't avoid
3124      macro expansion in answers.  This is not easy to fix.  */
3125   else if (parse_answer (bp, climit, answerp, type) == 0)
3126     {
3127       unsigned char *sym = alloca (len + 1);
3128       int hashcode;
3129       
3130       /* Prefix '#' to get it out of macro namespace.  */
3131       sym[0] = '#';
3132       memcpy (sym + 1, symname, len);
3133
3134       hashcode = hashf (sym, len + 1, HASHSIZE);
3135       result = lookup (sym, len + 1, hashcode);
3136       if (result == 0)
3137         result = install (sym, len + 1, T_UNUSED, hashcode);
3138     }
3139
3140   return result;
3141 }
3142
3143 /* Test an assertion within a preprocessor conditional.  Returns zero
3144    on error or failure, one on success.  */
3145 int
3146 test_assertion (pbuf)
3147      unsigned char **pbuf;      /* NUL-terminated.  */
3148 {
3149   unsigned char *buf = *pbuf;
3150   unsigned char *limit = buf + strlen ((char *) buf);
3151   struct answer *answer;
3152   HASHNODE *node;
3153   int result = 0;
3154
3155   node = parse_assertion (buf, limit, &answer, T_IF);
3156   if (node)
3157     {
3158       result = (node->type == T_ASSERT &&
3159                 (answer == 0 || *find_answer (node, answer) != 0));
3160
3161       /* Yuk.  We update pbuf to point after the assertion test.
3162          First, move past the identifier.  */
3163       if (is_space (*buf))
3164         buf++;
3165       while (is_idchar (*buf))
3166         buf++;
3167       /* If we have an answer, we need to move past the parentheses.  */
3168       if (answer)
3169         while (*buf++ != ')')
3170           ;
3171       *pbuf = buf;
3172     }
3173
3174   return result;
3175 }
3176
3177 /* Handle a #assert directive.  */
3178 static void
3179 do_assert (buf, limit, op)
3180      U_CHAR *buf;
3181      U_CHAR *limit;
3182      FILE_BUF *op ATTRIBUTE_UNUSED;
3183 {
3184   struct answer *new_answer;
3185   HASHNODE *node;
3186   
3187   node = parse_assertion (buf, limit, &new_answer, T_ASSERT);
3188   if (node)
3189     {
3190       /* Place the new answer in the answer list.  First check there
3191          is not a duplicate.  */
3192       new_answer->next = 0;
3193       if (node->type == T_ASSERT)
3194         {
3195           if (*find_answer (node, new_answer))
3196             {
3197               free (new_answer);
3198               warning ("\"%s\" re-asserted", node->name + 1);
3199               return;
3200             }
3201           new_answer->next = node->value.answers;
3202         }
3203       node->type = T_ASSERT;
3204       node->value.answers = new_answer;
3205     }
3206 }
3207
3208 /* Function body to be provided later.  */
3209 static void
3210 do_unassert (buf, limit, op)
3211      U_CHAR *buf;
3212      U_CHAR *limit;
3213      FILE_BUF *op ATTRIBUTE_UNUSED;
3214 {
3215   HASHNODE *node;
3216   struct answer *answer;
3217   
3218   node = parse_assertion (buf, limit, &answer, T_UNASSERT);
3219   /* It isn't an error to #unassert something that isn't asserted.  */
3220   if (node)
3221     {
3222       if (node->type == T_ASSERT)
3223         {
3224           if (answer)
3225             {
3226               struct answer **p = find_answer (node, answer), *temp;
3227
3228               /* Remove the answer from the list.  */
3229               temp = *p;
3230               if (temp)
3231                 *p = temp->next;
3232
3233               /* Did we free the last answer?  */
3234               if (node->value.answers == 0)
3235                 delete_macro (node);
3236             }
3237           else
3238             delete_macro (node);
3239         }
3240
3241       free (answer);
3242     }
3243 }
3244
3245 /* Returns a pointer to the pointer to the answer in the answer chain,
3246    or a pointer to NULL if the answer is not in the chain.  */
3247 static struct answer **
3248 find_answer (node, candidate)
3249      HASHNODE *node;
3250      const struct answer *candidate;
3251 {
3252   struct answer **result;
3253
3254   for (result = &node->value.answers; *result; result = &(*result)->next)
3255     {
3256       struct answer *answer = *result;
3257
3258       if (answer->len == candidate->len
3259           && !memcmp (answer->answer, candidate->answer, answer->len))
3260         break;
3261     }
3262
3263   return result;
3264 }
3265
3266 /* Return a malloced buffer with leading and trailing whitespace
3267    removed, and all instances of internal whitespace reduced to a
3268    single space.  */
3269 static unsigned char *
3270 canonicalize_text (buf, limit, climit)
3271      const unsigned char *buf, *limit, **climit;
3272 {
3273   unsigned int len = limit - buf;
3274   unsigned char *result = (unsigned char *) xmalloc (len), *dest;
3275
3276   for (dest = result; buf < limit;)
3277     {
3278       if (! is_space (*buf))
3279         *dest++ = *buf++;
3280       else
3281         {
3282           while (++buf < limit && is_space (*buf))
3283             ;
3284           if (dest != result && buf != limit)
3285             *dest++ = ' ';
3286         }
3287     }
3288
3289   *climit = dest;
3290   return result;
3291 }
3292
3293 /*
3294  * handle #if command by
3295  *   1) inserting special `defined' keyword into the hash table
3296  *      that gets turned into 0 or 1 by special_symbol (thus,
3297  *      if the luser has a symbol called `defined' already, it won't
3298  *      work inside the #if command)
3299  *   2) rescan the input into a temporary output buffer
3300  *   3) pass the output buffer to the yacc parser and collect a value
3301  *   4) clean up the mess left from steps 1 and 2.
3302  *   5) call conditional_skip to skip til the next #endif (etc.),
3303  *      or not, depending on the value from step 3.
3304  */
3305 static void
3306 do_if (buf, limit, op)
3307      U_CHAR *buf, *limit;
3308      FILE_BUF *op ATTRIBUTE_UNUSED;
3309 {
3310   int value;
3311   FILE_BUF *ip = &instack[indepth];
3312
3313   value = eval_if_expression (buf, limit - buf);
3314   conditional_skip (ip, value == 0, T_IF);
3315 }
3316
3317 /*
3318  * handle a #elif directive by not changing  if_stack  either.
3319  * see the comment above do_else.
3320  */
3321 static void
3322 do_elif (buf, limit, op)
3323      U_CHAR *buf, *limit;
3324      FILE_BUF *op;
3325 {
3326   int value;
3327   FILE_BUF *ip = &instack[indepth];
3328
3329   if (if_stack == instack[indepth].if_stack) {
3330     error ("#elif not within a conditional");
3331     return;
3332   } else {
3333     if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
3334       error ("#elif after #else");
3335       fprintf (stderr, " (matches line %d", if_stack->lineno);
3336       if (if_stack->fname != NULL && ip->fname != NULL &&
3337           strcmp (if_stack->fname, ip->fname) != 0)
3338         fprintf (stderr, ", file %s", if_stack->fname);
3339       fprintf (stderr, ")\n");
3340     }
3341     if_stack->type = T_ELIF;
3342   }
3343
3344   if (if_stack->if_succeeded)
3345     skip_if_group (ip, 0);
3346   else {
3347     value = eval_if_expression (buf, limit - buf);
3348     if (value == 0)
3349       skip_if_group (ip, 0);
3350     else {
3351       ++if_stack->if_succeeded; /* continue processing input */
3352       output_line_command (ip, op, 1, same_file);
3353     }
3354   }
3355 }
3356
3357 /*
3358  * evaluate a #if expression in BUF, of length LENGTH,
3359  * then parse the result as a C expression and return the value as an int.
3360  */
3361 static int
3362 eval_if_expression (buf, length)
3363      const U_CHAR *buf;
3364      int length;
3365 {
3366   FILE_BUF temp_obuf;
3367   HASHNODE *save_defined;
3368   int value;
3369
3370   save_defined = install (U"defined", -1, T_SPEC_DEFINED, -1);
3371   temp_obuf = expand_to_temp_buffer (buf, buf + length, 0);
3372   delete_macro (save_defined);  /* clean up special symbol */
3373
3374   value = parse_c_expression ((const char *)temp_obuf.buf);
3375
3376   free (temp_obuf.buf);
3377
3378   return value;
3379 }
3380
3381 /*
3382  * routine to handle ifdef/ifndef.  Try to look up the symbol,
3383  * then do or don't skip to the #endif/#else/#elif depending
3384  * on what directive is actually being processed.
3385  */
3386 static void
3387 do_xifdef (buf, limit, type)
3388      U_CHAR *buf, *limit;
3389      enum node_type type;     
3390 {
3391   int skip;
3392   FILE_BUF *ip = &instack[indepth];
3393   U_CHAR *end; 
3394
3395   /* Discard leading and trailing whitespace.  */
3396   SKIP_WHITE_SPACE (buf);
3397   while (limit != buf && is_nvspace (limit[-1])) limit--;
3398
3399   /* Find the end of the identifier at the beginning.  */
3400   for (end = buf; is_idchar (*end); end++);
3401
3402   if (end == buf)
3403     skip = (type == T_IFDEF);
3404   else
3405     skip = (lookup (buf, end-buf, -1) == NULL) ^ (type == T_IFNDEF);
3406
3407   conditional_skip (ip, skip, T_IF);
3408 }
3409
3410 static void
3411 do_ifdef (buf, limit, op)
3412      U_CHAR *buf, *limit;
3413      FILE_BUF *op ATTRIBUTE_UNUSED;
3414 {
3415   do_xifdef (buf, limit, T_IFDEF);
3416 }
3417
3418 static void
3419 do_ifndef (buf, limit, op)
3420      U_CHAR *buf, *limit;
3421      FILE_BUF *op ATTRIBUTE_UNUSED;
3422 {
3423   do_xifdef (buf, limit, T_IFNDEF);
3424 }
3425
3426 /*
3427  * push TYPE on stack; then, if SKIP is nonzero, skip ahead.
3428  */
3429 static void
3430 conditional_skip (ip, skip, type)
3431      FILE_BUF *ip;
3432      int skip;
3433      enum node_type type;
3434 {
3435   IF_STACK_FRAME *temp;
3436
3437   temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
3438   temp->fname = ip->fname;
3439   temp->lineno = ip->lineno;
3440   temp->next = if_stack;
3441   if_stack = temp;
3442
3443   if_stack->type = type;
3444
3445   if (skip != 0) {
3446     skip_if_group (ip, 0);
3447     return;
3448   } else {
3449     ++if_stack->if_succeeded;
3450     output_line_command (ip, &outbuf, 1, same_file);
3451   }
3452 }
3453
3454 /*
3455  * skip to #endif, #else, or #elif.  adjust line numbers, etc.
3456  * leaves input ptr at the sharp sign found.
3457  * If ANY is nonzero, return at next directive of any sort.
3458  */
3459 static void
3460 skip_if_group (ip, any)
3461      FILE_BUF *ip;
3462      int any;
3463 {
3464   register U_CHAR *bp = ip->bufp, *cp;
3465   register U_CHAR *endb = ip->buf + ip->length;
3466   struct directive *kt;
3467   IF_STACK_FRAME *save_if_stack = if_stack; /* don't pop past here */
3468   U_CHAR *beg_of_line = bp;
3469
3470   while (bp < endb) {
3471     switch (*bp++) {
3472     case '/':                   /* possible comment */
3473       if (*bp == '\\' && bp[1] == '\n')
3474         newline_fix (bp);
3475       if (*bp == '*') {
3476         ip->bufp = ++bp;
3477         bp = skip_to_end_of_comment (ip, &ip->lineno);
3478       }
3479       break;
3480     case '\"':
3481     case '\'':
3482       bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno, 0, 0);
3483       break;
3484     case '\\':
3485       /* Char after backslash loses its special meaning.  */
3486       if (bp < endb) {
3487         if (*bp == '\n')
3488           ++ip->lineno;         /* But do update the line-count.  */
3489         bp++;
3490       }
3491       break;
3492     case '\n':
3493       ++ip->lineno;
3494       beg_of_line = bp;
3495       break;
3496     case '#':
3497       ip->bufp = bp - 1;
3498
3499       /* # keyword: a # must be first nonblank char on the line */
3500       if (beg_of_line == 0)
3501         break;
3502       /* Scan from start of line, skipping whitespace, comments
3503          and backslash-newlines, and see if we reach this #.
3504          If not, this # is not special.  */
3505       bp = beg_of_line;
3506       while (1) {
3507         if (is_nvspace (*bp))
3508           bp++;
3509         else if (*bp == '\\' && bp[1] == '\n')
3510           bp += 2;
3511         else if (*bp == '/' && bp[1] == '*') {
3512           bp += 2;
3513           while (!(*bp == '*' && bp[1] == '/')) {
3514             if (*bp == '\n')
3515               ip->lineno++;
3516             bp++;
3517           }
3518           bp += 2;
3519         }
3520         else break;
3521       }
3522       if (bp != ip->bufp) {
3523         bp = ip->bufp + 1;      /* Reset bp to after the #.  */
3524         break;
3525       }
3526
3527       bp = ip->bufp + 1;        /* Point after '#'.  */
3528
3529       /* Skip whitespace and \-newline.  */
3530       while (1) {
3531         if (is_nvspace (*bp))
3532           bp++;
3533         else if (*bp == '\\' && bp[1] == '\n')
3534           bp += 2;
3535         else if (*bp == '/' && bp[1] == '*') {
3536           bp += 2;
3537           while (!(*bp == '*' && bp[1] == '/'))
3538             bp++;
3539           bp += 2;
3540         }
3541         else break;
3542       }
3543
3544       cp = bp;
3545
3546       /* Now find end of directive name.
3547          If we encounter a backslash-newline, exchange it with any following
3548          symbol-constituents so that we end up with a contiguous name.  */
3549
3550       while (1) {
3551         if (is_idchar (*bp))
3552           bp++;
3553         else {
3554           if (*bp == '\\' && bp[1] == '\n')
3555             name_newline_fix (bp);
3556           if (is_idchar (*bp))
3557             bp++;
3558           else break;
3559         }
3560       }
3561
3562       for (kt = directive_table; kt->length >= 0; kt++) {
3563         IF_STACK_FRAME *temp;
3564         if (strncmp ((const char *)cp, kt->name, kt->length) == 0
3565             && !is_idchar (cp[kt->length])) {
3566
3567           /* If we are asked to return on next directive,
3568              do so now.  */
3569           if (any)
3570             return;
3571
3572           switch (kt->type) {
3573           case T_IF:
3574           case T_IFDEF:
3575           case T_IFNDEF:
3576             temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
3577             temp->next = if_stack;
3578             if_stack = temp;
3579             temp->lineno = ip->lineno;
3580             temp->fname = ip->fname;
3581             temp->type = kt->type;
3582             break;
3583           case T_ELSE:
3584           case T_ENDIF:
3585           case T_ELIF:
3586             if (if_stack == instack[indepth].if_stack) {
3587               error ("#%s not within a conditional", kt->name);
3588               break;
3589             }
3590             else if (if_stack == save_if_stack)
3591               return;           /* found what we came for */
3592
3593             if (kt->type != T_ENDIF) {
3594               if (if_stack->type == T_ELSE)
3595                 error ("#else or #elif after #else");
3596               if_stack->type = kt->type;
3597               break;
3598             }
3599
3600             temp = if_stack;
3601             if_stack = if_stack->next;
3602             free (temp);
3603             break;
3604
3605           default:
3606             /* Anything else is ignored.  */
3607             break;
3608           }
3609           break;
3610         }
3611       }
3612     }
3613   }
3614   ip->bufp = bp;
3615   /* after this returns, rescan will exit because ip->bufp
3616      now points to the end of the buffer.
3617      rescan is responsible for the error message also.  */
3618 }
3619
3620 /*
3621  * handle a #else directive.  Do this by just continuing processing
3622  * without changing  if_stack ;  this is so that the error message
3623  * for missing #endif's etc. will point to the original #if.  It
3624  * is possible that something different would be better.
3625  */
3626 static void
3627 do_else (buf, limit, op)
3628      U_CHAR *buf ATTRIBUTE_UNUSED;
3629      U_CHAR *limit ATTRIBUTE_UNUSED;
3630      FILE_BUF *op;
3631 {
3632   FILE_BUF *ip = &instack[indepth];
3633
3634   if (if_stack == instack[indepth].if_stack) {
3635     error ("#else not within a conditional");
3636     return;
3637   } else {
3638     if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
3639       error ("#else after #else");
3640       fprintf (stderr, " (matches line %d", if_stack->lineno);
3641       if (strcmp (if_stack->fname, ip->fname) != 0)
3642         fprintf (stderr, ", file %s", if_stack->fname);
3643       fprintf (stderr, ")\n");
3644     }
3645     if_stack->type = T_ELSE;
3646   }
3647
3648   if (if_stack->if_succeeded)
3649     skip_if_group (ip, 0);
3650   else {
3651     ++if_stack->if_succeeded;   /* continue processing input */
3652     output_line_command (ip, op, 1, same_file);
3653   }
3654 }
3655
3656 /*
3657  * unstack after #endif command
3658  */
3659 static void
3660 do_endif (buf, limit, op)
3661      U_CHAR *buf ATTRIBUTE_UNUSED;
3662      U_CHAR *limit ATTRIBUTE_UNUSED;
3663      FILE_BUF *op;
3664 {
3665   if (if_stack == instack[indepth].if_stack)
3666     error ("unbalanced #endif");
3667   else {
3668     IF_STACK_FRAME *temp = if_stack;
3669     if_stack = if_stack->next;
3670     free (temp);
3671     output_line_command (&instack[indepth], op, 1, same_file);
3672   }
3673 }
3674
3675 /*
3676  * Skip a comment, assuming the input ptr immediately follows the
3677  * initial slash-star.  Bump line counter as necessary.
3678  * (The canonical line counter is &ip->lineno).
3679  * Don't use this routine (or the next one) if bumping the line
3680  * counter is not sufficient to deal with newlines in the string.
3681  */
3682 static U_CHAR *
3683 skip_to_end_of_comment (ip, line_counter)
3684      register FILE_BUF *ip;
3685      int *line_counter;         /* place to remember newlines, or NULL */
3686 {
3687   register U_CHAR *limit = ip->buf + ip->length;
3688   register U_CHAR *bp = ip->bufp;
3689   FILE_BUF *op = &outbuf;       /* JF */
3690   int output = put_out_comments && !line_counter;
3691
3692         /* JF this line_counter stuff is a crock to make sure the
3693            comment is only put out once, no matter how many times
3694            the comment is skipped.  It almost works */
3695   if (output) {
3696     *op->bufp++ = '/';
3697     *op->bufp++ = '*';
3698   }
3699   while (bp < limit) {
3700     if (output)
3701       *op->bufp++ = *bp;
3702     switch (*bp++) {
3703     case '/':
3704       if (warn_comments && bp < limit && *bp == '*')
3705         warning("`/*' within comment");
3706       break;
3707     case '\n':
3708       if (line_counter != NULL)
3709         ++*line_counter;
3710       if (output)
3711         ++op->lineno;
3712       break;
3713     case '*':
3714       if (*bp == '\\' && bp[1] == '\n')
3715         newline_fix (bp);
3716       if (*bp == '/') {
3717         if (output)
3718           *op->bufp++ = '/';
3719         ip->bufp = ++bp;
3720         return bp;
3721       }
3722       break;
3723     }
3724   }
3725   ip->bufp = bp;
3726   return bp;
3727 }
3728
3729 /*
3730  * Skip over a quoted string.  BP points to the opening quote.
3731  * Returns a pointer after the closing quote.  Don't go past LIMIT.
3732  * START_LINE is the line number of the starting point (but it need
3733  * not be valid if the starting point is inside a macro expansion).
3734  *
3735  * The input stack state is not changed.
3736  *
3737  * If COUNT_NEWLINES is nonzero, it points to an int to increment
3738  * for each newline passed.
3739  *
3740  * If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
3741  * if we pass a backslash-newline.
3742  *
3743  * If EOFP is nonzero, set *EOFP to 1 if the string is unterminated.
3744  */
3745 static U_CHAR *
3746 skip_quoted_string (bp, limit, start_line, count_newlines, backslash_newlines_p, eofp)
3747      register const U_CHAR *bp;
3748      register const U_CHAR *limit;
3749      int start_line;
3750      int *count_newlines;
3751      int *backslash_newlines_p;
3752      int *eofp;
3753 {
3754   register U_CHAR c, match;
3755
3756   match = *bp++;
3757   while (1) {
3758     if (bp >= limit) {
3759       error_with_line (line_for_error (start_line),
3760                        "unterminated string or character constant");
3761       if (eofp)
3762         *eofp = 1;
3763       break;
3764     }
3765     c = *bp++;
3766     if (c == '\\') {
3767       while (*bp == '\\' && bp[1] == '\n') {
3768         if (backslash_newlines_p)
3769           *backslash_newlines_p = 1;
3770         if (count_newlines)
3771           ++*count_newlines;
3772         bp += 2;
3773       }
3774       if (*bp == '\n' && count_newlines) {
3775         if (backslash_newlines_p)
3776           *backslash_newlines_p = 1;
3777         ++*count_newlines;
3778       }
3779       bp++;
3780     } else if (c == '\n') {
3781       /* Unterminated strings and character constants are 'legal'.  */
3782       bp--;     /* Don't consume the newline. */
3783       if (eofp)
3784         *eofp = 1;
3785       break;
3786     } else if (c == match)
3787       break;
3788   }
3789   return (U_CHAR *) bp;
3790 }
3791 \f
3792 /*
3793  * write out a #line command, for instance, after an #include file.
3794  * If CONDITIONAL is nonzero, we can omit the #line if it would
3795  * appear to be a no-op, and we can output a few newlines instead
3796  * if we want to increase the line number by a small amount.
3797  * FILE_CHANGE says whether we are entering a file, leaving, or neither.
3798  */
3799
3800 static void
3801 output_line_command (ip, op, conditional, file_change)
3802      FILE_BUF *ip, *op;
3803      int conditional;
3804      enum file_change_code file_change;
3805 {
3806   int len;
3807   char line_cmd_buf[500];
3808
3809   if (no_line_commands
3810       || ip->fname == NULL
3811       || no_output) {
3812     op->lineno = ip->lineno;
3813     return;
3814   }
3815
3816   if (conditional) {
3817     if (ip->lineno == op->lineno)
3818       return;
3819
3820     /* If the inherited line number is a little too small,
3821        output some newlines instead of a #line command.  */
3822     if (ip->lineno > op->lineno && ip->lineno < op->lineno + 8) {
3823       check_expand (op, 10);
3824       while (ip->lineno > op->lineno) {
3825         *op->bufp++ = '\n';
3826         op->lineno++;
3827       }
3828       return;
3829     }
3830   }
3831
3832   sprintf (line_cmd_buf, "# %d \"%s\"", ip->lineno, ip->fname);
3833   if (file_change != same_file)
3834     strcat (line_cmd_buf, file_change == enter_file ? " 1" : " 2");
3835   if (system_include_depth > 0)
3836     strcat (line_cmd_buf, " 3");
3837   len = strlen (line_cmd_buf);
3838   line_cmd_buf[len++] = '\n';
3839   check_expand (op, len + 1);
3840   if (op->bufp > op->buf && op->bufp[-1] != '\n')
3841     *op->bufp++ = '\n';
3842   memcpy (op->bufp, line_cmd_buf, len);
3843   op->bufp += len;
3844   op->lineno = ip->lineno;
3845 }
3846 \f
3847
3848 /* Expand a macro call.
3849    HP points to the symbol that is the macro being called.
3850    Put the result of expansion onto the input stack
3851    so that subsequent input by our caller will use it.
3852
3853    If macro wants arguments, caller has already verified that
3854    an argument list follows; arguments come from the input stack.  */
3855
3856 static void
3857 macroexpand (hp, op)
3858      HASHNODE *hp;
3859      FILE_BUF *op;
3860 {
3861   int nargs;
3862   DEFINITION *defn = hp->value.defn;
3863   register U_CHAR *xbuf;
3864   int xbuf_len;
3865   int start_line = instack[indepth].lineno;
3866
3867   CHECK_DEPTH (return;);
3868
3869   /* it might not actually be a macro.  */
3870   if (hp->type != T_MACRO) {
3871     special_symbol (hp, op);
3872     return;
3873   }
3874
3875   nargs = defn->nargs;
3876
3877   if (nargs >= 0) {
3878     register int i;
3879     struct argdata *args;
3880     const char *parse_error = 0;
3881
3882     args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
3883
3884     for (i = 0; i < nargs; i++) {
3885       args[i].raw = args[i].expanded = (U_CHAR *) "";
3886       args[i].raw_length = args[i].expand_length
3887         = args[i].stringified_length = 0;
3888       args[i].free1 = args[i].free2 = 0;
3889     }
3890
3891     /* Parse all the macro args that are supplied.  I counts them.
3892        The first NARGS args are stored in ARGS.
3893        The rest are discarded.  */
3894     i = 0;
3895     do {
3896       /* Discard the open-parenthesis or comma before the next arg.  */
3897       ++instack[indepth].bufp;
3898       parse_error
3899         = macarg ((i < nargs || (nargs == 0 && i == 0)) ? &args[i] : 0);
3900       if (parse_error)
3901         {
3902           error_with_line (line_for_error (start_line), parse_error);
3903           break;
3904         }
3905       i++;
3906     } while (*instack[indepth].bufp != ')');
3907
3908     /* If we got one arg but it was just whitespace, call that 0 args.  */
3909     if (i == 1) {
3910       register const U_CHAR *bp = args[0].raw;
3911       register const U_CHAR *lim = bp + args[0].raw_length;
3912       while (bp != lim && is_space (*bp)) bp++;
3913       if (bp == lim)
3914         i = 0;
3915     }
3916
3917     if (nargs == 0 && i > 0)
3918       error ("arguments given to macro `%s'", hp->name);
3919     else if (i < nargs) {
3920       /* traditional C allows foo() if foo wants one argument.  */
3921       if (nargs == 1 && i == 0)
3922         ;
3923       else if (i == 0)
3924         error ("no args to macro `%s'", hp->name);
3925       else if (i == 1)
3926         error ("only 1 arg to macro `%s'", hp->name);
3927       else
3928         error ("only %d args to macro `%s'", i, hp->name);
3929     } else if (i > nargs)
3930       error ("too many (%d) args to macro `%s'", i, hp->name);
3931
3932     /* Swallow the closeparen.  */
3933     ++instack[indepth].bufp;
3934
3935     /* If macro wants zero args, we parsed the arglist for checking only.
3936        Read directly from the macro definition.  */
3937     if (nargs == 0) {
3938       xbuf = defn->expansion;
3939       xbuf_len = defn->length;
3940     } else {
3941       register U_CHAR *exp = defn->expansion;
3942       register int offset;      /* offset in expansion,
3943                                    copied a piece at a time */
3944       register int totlen;      /* total amount of exp buffer filled so far */
3945
3946       register struct reflist *ap;
3947
3948       /* Macro really takes args.  Compute the expansion of this call.  */
3949
3950       /* Compute length in characters of the macro's expansion.  */
3951       xbuf_len = defn->length;
3952       for (ap = defn->pattern; ap != NULL; ap = ap->next) {
3953         if (ap->stringify)
3954           xbuf_len += args[ap->argno].stringified_length;
3955         else 
3956           xbuf_len += args[ap->argno].raw_length;
3957       }
3958
3959       xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
3960
3961       /* Generate in XBUF the complete expansion
3962          with arguments substituted in.
3963          TOTLEN is the total size generated so far.
3964          OFFSET is the index in the definition
3965          of where we are copying from.  */
3966       offset = totlen = 0;
3967       for (ap = defn->pattern; ap != NULL; ap = ap->next) {
3968         register struct argdata *arg = &args[ap->argno];
3969
3970         for (i = 0; i < ap->nchars; i++)
3971           xbuf[totlen++] = exp[offset++];
3972
3973         if (ap->stringify != 0) {
3974           int arglen = arg->raw_length;
3975           int escaped = 0;
3976           int in_string = 0;
3977           int c;
3978           i = 0;
3979           while (i < arglen
3980                  && (c = arg->raw[i], is_space (c)))
3981             i++;
3982           while (i < arglen
3983                  && (c = arg->raw[arglen - 1], is_space (c)))
3984             arglen--;
3985           for (; i < arglen; i++) {
3986             c = arg->raw[i];
3987
3988             /* Special markers Newline Space
3989                generate nothing for a stringified argument.  */
3990             if (c == '\n' && arg->raw[i+1] != '\n') {
3991               i++;
3992               continue;
3993             }
3994
3995             /* Internal sequences of whitespace are replaced by one space
3996                except within an string or char token.  */
3997             if (! in_string
3998                 && (c == '\n' ? arg->raw[i+1] == '\n' : is_space (c))) {
3999               while (1) {
4000                 /* Note that Newline Space does occur within whitespace
4001                    sequences; consider it part of the sequence.  */
4002                 if (c == '\n' && is_space (arg->raw[i+1]))
4003                   i += 2;
4004                 else if (c != '\n' && is_space (c))
4005                   i++;
4006                 else break;
4007                 c = arg->raw[i];
4008               }
4009               i--;
4010               c = ' ';
4011             }
4012
4013             if (escaped)
4014               escaped = 0;
4015             else {
4016               if (c == '\\')
4017                 escaped = 1;
4018               if (in_string) {
4019                 if (c == in_string)
4020                   in_string = 0;
4021               } else if (c == '\"' || c == '\'')
4022                 in_string = c;
4023             }
4024
4025             /* Escape these chars */
4026             if (c == '\"' || (in_string && c == '\\'))
4027               xbuf[totlen++] = '\\';
4028             if (ISPRINT (c))
4029               xbuf[totlen++] = c;
4030             else {
4031               sprintf ((char *) &xbuf[totlen], "\\%03o", (unsigned int) c);
4032               totlen += 4;
4033             }
4034           }
4035         } else {
4036           const U_CHAR *p1 = arg->raw;
4037           const U_CHAR *l1 = p1 + arg->raw_length;
4038
4039           if (ap->raw_before) {
4040             while (p1 != l1 && is_space (*p1)) p1++;
4041             while (p1 != l1 && is_idchar (*p1))
4042               xbuf[totlen++] = *p1++;
4043             /* Delete any no-reexpansion marker that follows
4044                an identifier at the beginning of the argument
4045                if the argument is concatenated with what precedes it.  */
4046             if (p1[0] == '\n' && p1[1] == '-')
4047               p1 += 2;
4048           }
4049           if (ap->raw_after) {
4050             /* Arg is concatenated after: delete trailing whitespace,
4051                whitespace markers, and no-reexpansion markers.  */
4052             while (p1 != l1) {
4053               if (is_space (l1[-1])) l1--;
4054               else if (l1[-1] == '-') {
4055                 const U_CHAR *p2 = l1 - 1;
4056                 /* If a `-' is preceded by an odd number of newlines then it
4057                    and the last newline are a no-reexpansion marker.  */
4058                 while (p2 != p1 && p2[-1] == '\n') p2--;
4059                 if ((l1 - 1 - p2) & 1) {
4060                   l1 -= 2;
4061                 }
4062                 else break;
4063               }
4064               else break;
4065             }
4066           }
4067           memmove (xbuf + totlen, p1, l1 - p1);
4068           totlen += l1 - p1;
4069         }
4070
4071         if (totlen > xbuf_len)
4072           abort ();
4073       }
4074
4075       /* if there is anything left of the definition
4076          after handling the arg list, copy that in too. */
4077
4078       for (i = offset; i < defn->length; i++)
4079         xbuf[totlen++] = exp[i];
4080
4081       xbuf[totlen] = 0;
4082       xbuf_len = totlen;
4083
4084       for (i = 0; i < nargs; i++) {
4085         if (args[i].free1 != 0)
4086           free (args[i].free1);
4087         if (args[i].free2 != 0)
4088           free (args[i].free2);
4089       }
4090     }
4091   } else {
4092     xbuf = defn->expansion;
4093     xbuf_len = defn->length;
4094   }
4095
4096   /* Now put the expansion on the input stack
4097      so our caller will commence reading from it.  */
4098   {
4099     register FILE_BUF *ip2;
4100
4101     ip2 = &instack[++indepth];
4102
4103     ip2->fname = 0;
4104     ip2->lineno = 0;
4105     ip2->buf = xbuf;
4106     ip2->length = xbuf_len;
4107     ip2->bufp = xbuf;
4108     ip2->free_ptr = (nargs > 0) ? xbuf : 0;
4109     ip2->macro = hp;
4110     ip2->if_stack = if_stack;
4111   }
4112 }
4113 \f
4114 /*
4115  * Parse a macro argument and store the info on it into *ARGPTR.
4116  * Return nonzero to indicate a syntax error.
4117  */
4118
4119 static const char *
4120 macarg (argptr)
4121      register struct argdata *argptr;
4122 {
4123   FILE_BUF *ip = &instack[indepth];
4124   int paren = 0;
4125   int newlines = 0;
4126   int comments = 0;
4127
4128   /* Try to parse as much of the argument as exists at this
4129      input stack level.  */
4130   U_CHAR *bp = macarg1 (ip->bufp, ip->buf + ip->length,
4131                         &paren, &newlines, &comments);
4132
4133   /* If we find the end of the argument at this level,
4134      set up *ARGPTR to point at it in the input stack.  */
4135   if (!(ip->fname != 0 && (newlines != 0 || comments != 0))
4136       && bp != ip->buf + ip->length) {
4137     if (argptr != 0) {
4138       argptr->raw = ip->bufp;
4139       argptr->raw_length = bp - ip->bufp;
4140     }
4141     ip->bufp = bp;
4142   } else {
4143     /* This input stack level ends before the macro argument does.
4144        We must pop levels and keep parsing.
4145        Therefore, we must allocate a temporary buffer and copy
4146        the macro argument into it.  */
4147     int bufsize = bp - ip->bufp;
4148     int extra = newlines;
4149     U_CHAR *buffer = (U_CHAR *) xmalloc (bufsize + extra + 1);
4150     int final_start = 0;
4151
4152     memcpy (buffer, ip->bufp, bufsize);
4153     ip->bufp = bp;
4154     ip->lineno += newlines;
4155
4156     while (bp == ip->buf + ip->length) {
4157       if (instack[indepth].macro == 0) {
4158         free (buffer);
4159         return "unterminated macro call";
4160       }
4161       ip->macro->type = T_MACRO;
4162       if (ip->free_ptr)
4163         free (ip->free_ptr);
4164       ip = &instack[--indepth];
4165       newlines = 0;
4166       comments = 0;
4167       bp = macarg1 (ip->bufp, ip->buf + ip->length, &paren,
4168                     &newlines, &comments);
4169       final_start = bufsize;
4170       bufsize += bp - ip->bufp;
4171       extra += newlines;
4172       buffer = (U_CHAR *) xrealloc (buffer, bufsize + extra + 1);
4173       memcpy (buffer + bufsize - (bp - ip->bufp), ip->bufp, bp - ip->bufp);
4174       ip->bufp = bp;
4175       ip->lineno += newlines;
4176     }
4177
4178     /* Now, if arg is actually wanted, record its raw form,
4179        discarding comments and duplicating newlines in whatever
4180        part of it did not come from a macro expansion.
4181        EXTRA space has been preallocated for duplicating the newlines.
4182        FINAL_START is the index of the start of that part.  */
4183     if (argptr != 0) {
4184       argptr->raw = buffer;
4185       argptr->raw_length = bufsize;
4186       argptr->free1 = buffer;
4187       argptr->newlines = newlines;
4188       argptr->comments = comments;
4189       if ((newlines || comments) && ip->fname != 0)
4190         argptr->raw_length
4191           = final_start +
4192             discard_comments (argptr->raw + final_start,
4193                               argptr->raw_length - final_start,
4194                               newlines);
4195       argptr->raw[argptr->raw_length] = 0;
4196       if (argptr->raw_length > bufsize + extra)
4197         abort ();
4198     }
4199   }
4200
4201   /* If we are not discarding this argument,
4202      macroexpand it and compute its length as stringified.
4203      All this info goes into *ARGPTR.  */
4204
4205   if (argptr != 0) {
4206     FILE_BUF obuf;
4207     register const U_CHAR *buf, *lim;
4208     register int totlen;
4209
4210     obuf = expand_to_temp_buffer (argptr->raw,
4211                                   argptr->raw + argptr->raw_length,
4212                                   1);
4213
4214     argptr->expanded = obuf.buf;
4215     argptr->expand_length = obuf.length;
4216     argptr->free2 = obuf.buf;
4217
4218     buf = argptr->raw;
4219     lim = buf + argptr->raw_length;
4220
4221     totlen = 0;
4222     while (buf != lim) {
4223       register U_CHAR c = *buf++;
4224       totlen++;
4225       /* Internal sequences of whitespace are replaced by one space
4226          in most cases, but not always.  So count all the whitespace
4227          in case we need to keep it all.  */
4228       if (c == '\"' || c == '\\') /* escape these chars */
4229         totlen++;
4230       else if (!ISPRINT (c))
4231         totlen += 3;
4232     }
4233     argptr->stringified_length = totlen;
4234   }
4235   return 0;
4236 }
4237
4238 /* Scan text from START (inclusive) up to LIMIT (exclusive),
4239    counting parens in *DEPTHPTR,
4240    and return if reach LIMIT
4241    or before a `)' that would make *DEPTHPTR negative
4242    or before a comma when *DEPTHPTR is zero.
4243    Single and double quotes are matched and termination
4244    is inhibited within them.  Comments also inhibit it.
4245    Value returned is pointer to stopping place.
4246
4247    Increment *NEWLINES each time a newline is passed.
4248    Set *COMMENTS to 1 if a comment is seen.  */
4249
4250 static U_CHAR *
4251 macarg1 (start, limit, depthptr, newlines, comments)
4252      U_CHAR *start;
4253      register const U_CHAR *limit;
4254      int *depthptr, *newlines, *comments;
4255 {
4256   register U_CHAR *bp = start;
4257
4258   while (bp < limit) {
4259     switch (*bp) {
4260     case '(':
4261       (*depthptr)++;
4262       break;
4263     case ')':
4264       if (--(*depthptr) < 0)
4265         return bp;
4266       break;
4267     case '\\':
4268       /* Traditionally, backslash makes following char not special.  */
4269       if (bp + 1 < limit)
4270         {
4271           bp++;
4272           /* But count source lines anyway.  */
4273           if (*bp == '\n')
4274             ++*newlines;
4275         }
4276       break;
4277     case '\n':
4278       ++*newlines;
4279       break;
4280     case '/':
4281       if (bp[1] == '\\' && bp[2] == '\n')
4282         newline_fix (bp + 1);
4283       if (bp[1] != '*' || bp + 1 >= limit)
4284         break;
4285       *comments = 1;
4286       bp += 2;
4287       while (bp + 1 < limit) {
4288         if (bp[0] == '*'
4289             && bp[1] == '\\' && bp[2] == '\n')
4290           newline_fix (bp + 1);
4291         if (bp[0] == '*' && bp[1] == '/')
4292           break;
4293         if (*bp == '\n') ++*newlines;
4294         bp++;
4295       }
4296       bp += 1;
4297       break;
4298     case '\'':
4299     case '\"':
4300       {
4301         int quotec;
4302         for (quotec = *bp++; bp + 1 < limit && *bp != quotec; bp++) {
4303           if (*bp == '\\') {
4304             bp++;
4305             if (*bp == '\n')
4306               ++*newlines;
4307             while (*bp == '\\' && bp[1] == '\n') {
4308               bp += 2;
4309             }
4310           } else if (*bp == '\n') {
4311             ++*newlines;
4312             if (quotec == '\'')
4313               break;
4314           }
4315         }
4316       }
4317       break;
4318     case ',':
4319       if ((*depthptr) == 0)
4320         return bp;
4321       break;
4322     }
4323     bp++;
4324   }
4325
4326   return bp;
4327 }
4328
4329 /* Discard comments and duplicate newlines
4330    in the string of length LENGTH at START,
4331    except inside of string constants.
4332    The string is copied into itself with its beginning staying fixed.  
4333
4334    NEWLINES is the number of newlines that must be duplicated.
4335    We assume that that much extra space is available past the end
4336    of the string.  */
4337
4338 static int
4339 discard_comments (start, length, newlines)
4340      U_CHAR *start;
4341      int length;
4342      int newlines;
4343 {
4344   register U_CHAR *ibp;
4345   register U_CHAR *obp;
4346   register const U_CHAR *limit;
4347   register int c;
4348
4349   /* If we have newlines to duplicate, copy everything
4350      that many characters up.  Then, in the second part,
4351      we will have room to insert the newlines
4352      while copying down.
4353      NEWLINES may actually be too large, because it counts
4354      newlines in string constants, and we don't duplicate those.
4355      But that does no harm.  */
4356   if (newlines > 0) {
4357     ibp = start + length;
4358     obp = ibp + newlines;
4359     limit = start;
4360     while (limit != ibp)
4361       *--obp = *--ibp;
4362   }
4363
4364   ibp = start + newlines;
4365   limit = start + length + newlines;
4366   obp = start;
4367
4368   while (ibp < limit) {
4369     *obp++ = c = *ibp++;
4370     switch (c) {
4371     case '\n':
4372       /* Duplicate the newline.  */
4373       *obp++ = '\n';
4374       break;
4375
4376     case '\\':
4377       if (*ibp == '\n') {
4378         obp--;
4379         ibp++;
4380       }
4381       break;
4382
4383     case '/':
4384       if (*ibp == '\\' && ibp[1] == '\n')
4385         newline_fix (ibp);
4386       /* Delete any comment.  */
4387       if (ibp[0] != '*' || ibp + 1 >= limit)
4388         break;
4389       obp--;
4390       ibp++;
4391       while (ibp + 1 < limit) {
4392         if (ibp[0] == '*'
4393             && ibp[1] == '\\' && ibp[2] == '\n')
4394           newline_fix (ibp + 1);
4395         if (ibp[0] == '*' && ibp[1] == '/')
4396           break;
4397         ibp++;
4398       }
4399       ibp += 2;
4400       break;
4401
4402     case '\'':
4403     case '\"':
4404       /* Notice and skip strings, so that we don't
4405          think that comments start inside them,
4406          and so we don't duplicate newlines in them.  */
4407       {
4408         int quotec = c;
4409         while (ibp < limit) {
4410           *obp++ = c = *ibp++;
4411           if (c == quotec)
4412             break;
4413           if (c == '\n' && quotec == '\'')
4414             break;
4415           if (c == '\\' && ibp < limit) {
4416             while (*ibp == '\\' && ibp[1] == '\n')
4417               ibp += 2;
4418             *obp++ = *ibp++;
4419           }
4420         }
4421       }
4422       break;
4423     }
4424   }
4425
4426   return obp - start;
4427 }
4428 \f
4429
4430 /* Core error handling routine.  */
4431 static void
4432 v_message (mtype, line, msgid, ap)
4433      enum msgtype mtype;
4434      int line;
4435      const char *msgid;
4436      va_list ap;
4437 {
4438   const char *fname = 0;
4439   int i;
4440
4441   if (mtype == WARNING && inhibit_warnings)
4442     return;
4443
4444   for (i = indepth; i >= 0; i--)
4445     if (instack[i].fname != NULL) {
4446       if (line == 0)
4447         line = instack[i].lineno;
4448       fname = instack[i].fname;
4449       break;
4450     }
4451
4452   if (fname)
4453     fprintf (stderr, "%s:%d: ", fname, line);
4454   else
4455     fprintf (stderr, "%s: ", progname);
4456
4457   if (mtype == WARNING)
4458     fputs ("warning: ", stderr);
4459
4460   vfprintf (stderr, msgid, ap);
4461   putc ('\n', stderr);
4462
4463   if (mtype == ERROR)
4464     errors++;
4465 }
4466
4467 /*
4468  * error - print error message and increment count of errors.
4469  */
4470 void
4471 error VPARAMS ((const char *msgid, ...))
4472 {
4473 #ifndef ANSI_PROTOTYPES
4474   const char *msgid;
4475 #endif
4476   va_list ap;
4477
4478   VA_START(ap, msgid);
4479   
4480 #ifndef ANSI_PROTOTYPES
4481   msgid = va_arg (ap, const char *);
4482 #endif
4483
4484   v_message (ERROR, 0, msgid, ap);
4485 }
4486
4487 void
4488 error_with_line VPARAMS ((int line, const char *msgid, ...))
4489 {
4490 #ifndef ANSI_PROTOTYPES
4491   int line;
4492   const char *msgid;
4493 #endif
4494   va_list ap;
4495
4496   VA_START(ap, msgid);
4497   
4498 #ifndef ANSI_PROTOTYPES
4499   line = va_arg (ap, int);
4500   msgid = va_arg (ap, const char *);
4501 #endif
4502
4503   v_message (ERROR, line, msgid, ap);
4504 }
4505
4506 /* Error including a message from `errno'.  */
4507 void
4508 error_from_errno (name)
4509      const char *name;
4510 {
4511   error ("%s: %s", name, strerror (errno));
4512 }
4513
4514 /* Print error message but don't count it.  */
4515 void
4516 warning VPARAMS ((const char *msgid, ...))
4517 {
4518 #ifndef ANSI_PROTOTYPES
4519   const char *msgid;
4520 #endif
4521   va_list ap;
4522
4523   VA_START(ap, msgid);
4524   
4525 #ifndef ANSI_PROTOTYPES
4526   msgid = va_arg (ap, const char *);
4527 #endif
4528
4529   v_message (WARNING, 0, msgid, ap);
4530 }
4531
4532 void
4533 fatal VPARAMS ((const char *msgid, ...))
4534 {
4535 #ifndef ANSI_PROTOTYPES
4536   const char *msgid;
4537 #endif
4538   va_list ap;
4539
4540   VA_START(ap, msgid);
4541   
4542 #ifndef ANSI_PROTOTYPES
4543   msgid = va_arg (ap, const char *);
4544 #endif
4545
4546   v_message (FATAL, 0, msgid, ap);
4547   exit (FATAL_EXIT_CODE);
4548 }
4549
4550 /* More 'friendly' abort that prints the location at which we died.  */
4551 void
4552 fancy_abort (line, func)
4553      int line;
4554      const char *func;
4555 {
4556   fatal ("Internal error in %s, at tradcpp.c:%d\n\
4557 Please submit a full bug report.\n\
4558 See %s for instructions.", func, line, GCCBUGURL);
4559 }
4560
4561 void
4562 perror_with_name (name)
4563      const char *name;
4564 {
4565   fprintf (stderr, "%s: %s: %s\n", progname, name, strerror (errno));
4566   errors++;
4567 }
4568
4569 void
4570 pfatal_with_name (name)
4571      const char *name;
4572 {
4573   perror_with_name (name);
4574   exit (FATAL_EXIT_CODE);
4575 }
4576
4577 /* Return the line at which an error occurred.
4578    The error is not necessarily associated with the current spot
4579    in the input stack, so LINE says where.  LINE will have been
4580    copied from ip->lineno for the current input level.
4581    If the current level is for a file, we return LINE.
4582    But if the current level is not for a file, LINE is meaningless.
4583    In that case, we return the lineno of the innermost file.  */
4584 static int
4585 line_for_error (line)
4586      int line;
4587 {
4588   int i;
4589   int line1 = line;
4590
4591   for (i = indepth; i >= 0; ) {
4592     if (instack[i].fname != 0)
4593       return line1;
4594     i--;
4595     if (i < 0)
4596       return 0;
4597     line1 = instack[i].lineno;
4598   }
4599   return 0;
4600 }
4601
4602 /*
4603  * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
4604  *
4605  * As things stand, nothing is ever placed in the output buffer to be
4606  * removed again except when it's KNOWN to be part of an identifier,
4607  * so flushing and moving down everything left, instead of expanding,
4608  * should work ok.
4609  */
4610
4611 static void
4612 grow_outbuf (obuf, needed)
4613      register FILE_BUF *obuf;
4614      register int needed;
4615 {
4616   register U_CHAR *p;
4617   int minsize;
4618
4619   if (obuf->length - (obuf->bufp - obuf->buf) > needed)
4620     return;
4621
4622   /* Make it at least twice as big as it is now.  */
4623   obuf->length *= 2;
4624   /* Make it have at least 150% of the free space we will need.  */
4625   minsize = (3 * needed) / 2 + (obuf->bufp - obuf->buf);
4626   if (minsize > obuf->length)
4627     obuf->length = minsize;
4628
4629   p = (U_CHAR *) xrealloc (obuf->buf, obuf->length);
4630   obuf->bufp = p + (obuf->bufp - obuf->buf);
4631   obuf->buf = p;
4632 }
4633 \f
4634 /* Symbol table for macro names and special symbols */
4635
4636 /*
4637  * install a name in the main hash table, even if it is already there.
4638  *   name stops with first non alphanumeric, except leading '#'.
4639  * caller must check against redefinition if that is desired.
4640  * delete_macro () removes things installed by install () in fifo order.
4641  * this is important because of the `defined' special symbol used
4642  * in #if, and also if pushdef/popdef directives are ever implemented.
4643  *
4644  * If LEN is >= 0, it is the length of the name.
4645  * Otherwise, compute the length by scanning the entire name.
4646  *
4647  * If HASH is >= 0, it is the precomputed hash code.
4648  * Otherwise, compute the hash code.
4649  *
4650  * caller must set the value, if any is desired.
4651  */
4652 static HASHNODE *
4653 install (name, len, type, hash)
4654      const U_CHAR *name;
4655      int len;
4656      enum node_type type;
4657      int hash;
4658         /* watch out here if sizeof (U_CHAR *) != sizeof (int) */
4659 {
4660   register HASHNODE *hp;
4661   register int bucket;
4662   register const U_CHAR *p;
4663   U_CHAR *q;
4664
4665   if (len < 0) {
4666     p = name;
4667     while (is_idchar (*p))
4668       p++;
4669     len = p - name;
4670   }
4671
4672   if (hash < 0)
4673     hash = hashf (name, len, HASHSIZE);
4674
4675   hp = (HASHNODE *) xmalloc (sizeof (HASHNODE) + len + 1);
4676   bucket = hash;
4677   hp->bucket_hdr = &hashtab[bucket];
4678   hp->next = hashtab[bucket];
4679   hashtab[bucket] = hp;
4680   hp->prev = NULL;
4681   if (hp->next != NULL)
4682     hp->next->prev = hp;
4683   hp->type = type;
4684   hp->length = len;
4685   hp->name = q = ((U_CHAR *) hp) + sizeof (HASHNODE);
4686   memcpy (q, name, len);
4687   q[len] = 0;
4688   return hp;
4689 }
4690
4691 /*
4692  * find the most recent hash node for name name (ending with first
4693  * non-identifier char) installed by install
4694  *
4695  * If LEN is >= 0, it is the length of the name.
4696  * Otherwise, compute the length by scanning the entire name.
4697  *
4698  * If HASH is >= 0, it is the precomputed hash code.
4699  * Otherwise, compute the hash code.
4700  */
4701 HASHNODE *
4702 lookup (name, len, hash)
4703      const U_CHAR *name;
4704      int len;
4705      int hash;
4706 {
4707   register const U_CHAR *bp;
4708   register HASHNODE *bucket;
4709
4710   if (len < 0) {
4711     for (bp = name; is_idchar (*bp); bp++) ;
4712     len = bp - name;
4713   }
4714
4715   if (hash < 0)
4716     hash = hashf (name, len, HASHSIZE);
4717
4718   bucket = hashtab[hash];
4719   while (bucket) {
4720     if (bucket->length == len
4721         && strncmp ((const char *)bucket->name, (const char *)name, len) == 0)
4722       return bucket;
4723     bucket = bucket->next;
4724   }
4725   return NULL;
4726 }
4727
4728 /*
4729  * Delete a hash node.  Some weirdness to free junk from macros.
4730  * More such weirdness will have to be added if you define more hash
4731  * types that need it.
4732  */
4733
4734 /* Note that the DEFINITION of a macro is removed from the hash table
4735    but its storage is not freed.  This would be a storage leak
4736    except that it is not reasonable to keep undefining and redefining
4737    large numbers of macros many times.
4738    In any case, this is necessary, because a macro can be #undef'd
4739    in the middle of reading the arguments to a call to it.
4740    If #undef freed the DEFINITION, that would crash.  */
4741 static void
4742 delete_macro (hp)
4743      HASHNODE *hp;
4744 {
4745
4746   if (hp->prev != NULL)
4747     hp->prev->next = hp->next;
4748   if (hp->next != NULL)
4749     hp->next->prev = hp->prev;
4750
4751   /* make sure that the bucket chain header that
4752      the deleted guy was on points to the right thing afterwards. */
4753   if (hp == *hp->bucket_hdr)
4754     *hp->bucket_hdr = hp->next;
4755
4756   free (hp);
4757 }
4758
4759 /*
4760  * return hash function on name.  must be compatible with the one
4761  * computed a step at a time, elsewhere
4762  */
4763 static int
4764 hashf (name, len, hashsize)
4765      register const U_CHAR *name;
4766      register int len;
4767      int hashsize;
4768 {
4769   register int r = 0;
4770
4771   while (len--)
4772     r = HASHSTEP (r, *name++);
4773
4774   return MAKE_POS (r) % hashsize;
4775 }
4776 \f
4777 /* Dump all macro definitions as #defines to stdout.  */
4778
4779 static void
4780 dump_all_macros ()
4781 {
4782   int bucket;
4783
4784   for (bucket = 0; bucket < HASHSIZE; bucket++) {
4785     register HASHNODE *hp;
4786
4787     for (hp = hashtab[bucket]; hp; hp= hp->next) {
4788       if (hp->type == T_MACRO) {
4789         register DEFINITION *defn = hp->value.defn;
4790         struct reflist *ap;
4791         int offset;
4792         int concat;
4793
4794
4795         /* Print the definition of the macro HP.  */
4796
4797         printf ("#define %s", hp->name);
4798         if (defn->nargs >= 0) {
4799           int i;
4800
4801           printf ("(");
4802           for (i = 0; i < defn->nargs; i++) {
4803             dump_arg_n (defn, i);
4804             if (i + 1 < defn->nargs)
4805               printf (", ");
4806           }
4807           printf (")");
4808         }
4809
4810         printf (" ");
4811
4812         offset = 0;
4813         concat = 0;
4814         for (ap = defn->pattern; ap != NULL; ap = ap->next) {
4815           dump_defn_1 (defn->expansion, offset, ap->nchars);
4816           if (ap->nchars != 0)
4817             concat = 0;
4818           offset += ap->nchars;
4819           if (ap->stringify)
4820             printf (" #");
4821           if (ap->raw_before && !concat)
4822             printf (" ## ");
4823           concat = 0;
4824           dump_arg_n (defn, ap->argno);
4825           if (ap->raw_after) {
4826             printf (" ## ");
4827             concat = 1;
4828           }
4829         }
4830         dump_defn_1 (defn->expansion, offset, defn->length - offset);
4831         printf ("\n");
4832       }
4833     }
4834   }
4835 }
4836
4837 /* Output to stdout a substring of a macro definition.
4838    BASE is the beginning of the definition.
4839    Output characters START thru LENGTH.
4840    Discard newlines outside of strings, thus
4841    converting funny-space markers to ordinary spaces.  */
4842 static void
4843 dump_defn_1 (base, start, length)
4844      const U_CHAR *base;
4845      int start;
4846      int length;
4847 {
4848   const U_CHAR *p = base + start;
4849   const U_CHAR *limit = base + start + length;
4850
4851   while (p < limit) {
4852     if (*p != '\n')
4853       putchar (*p);
4854     else if (*p == '\"' || *p =='\'') {
4855       const U_CHAR *p1 = skip_quoted_string (p, limit, 0, 0, 0, 0);
4856       fwrite (p, p1 - p, 1, stdout);
4857       p = p1 - 1;
4858     }
4859     p++;
4860   }
4861 }
4862
4863 /* Print the name of argument number ARGNUM of macro definition DEFN.
4864    Recall that DEFN->argnames contains all the arg names
4865    concatenated in reverse order with comma-space in between.  */
4866 static void
4867 dump_arg_n (defn, argnum)
4868      DEFINITION *defn;
4869      int argnum;
4870 {
4871   register const U_CHAR *p = defn->argnames;
4872   while (argnum + 1 < defn->nargs) {
4873     p = (const U_CHAR *) strchr ((const char *)p, ' ') + 1;
4874     argnum++;
4875   }
4876
4877   while (*p && *p != ',') {
4878     putchar (*p);
4879     p++;
4880   }
4881 }
4882
4883 /* Initialize the built-in macros.  */
4884 #define DSC(x) U x, sizeof x - 1
4885 #define install_spec(name, type) \
4886  install(DSC(name), type, -1);
4887 #define install_value(name, val) \
4888  hp = install(DSC(name), T_CONST, -1); hp->value.cpval = val;
4889 static void
4890 initialize_builtins ()
4891 {
4892   HASHNODE *hp;
4893
4894   install_spec ("__BASE_FILE__",     T_BASE_FILE);
4895   install_spec ("__DATE__",          T_DATE);
4896   install_spec ("__FILE__",          T_FILE);
4897   install_spec ("__TIME__",          T_TIME);
4898   install_spec ("__VERSION__",       T_VERSION);
4899   install_spec ("__INCLUDE_LEVEL__", T_INCLUDE_LEVEL);
4900   install_spec ("__LINE__",          T_SPECLINE);
4901
4902 #ifndef NO_BUILTIN_SIZE_TYPE
4903   install_value ("__SIZE_TYPE__",         SIZE_TYPE);
4904 #endif
4905 #ifndef NO_BUILTIN_PTRDIFF_TYPE
4906   install_value ("__PTRDIFF_TYPE__",      PTRDIFF_TYPE);
4907 #endif
4908 #ifndef NO_BUILTIN_WCHAR_TYPE
4909   install_value ("__WCHAR_TYPE__",        WCHAR_TYPE);
4910 #endif
4911 #ifndef NO_BUILTIN_WINT_TYPE
4912   install_value ("__WINT_TYPE__",         WINT_TYPE);
4913 #endif
4914   install_value ("__REGISTER_PREFIX__",   REGISTER_PREFIX);
4915   install_value ("__USER_LABEL_PREFIX__", user_label_prefix);
4916 }
4917 #undef DSC
4918 #undef install_spec
4919 #undef install_value
4920 \f
4921 /* Common handler of command line directives -U, -D and -A.  */
4922 static void
4923 run_directive (str, len, type)
4924      const char *str;
4925      size_t len;
4926      enum node_type type;
4927 {
4928   struct directive *kt;
4929   FILE_BUF *ip = &instack[++indepth];
4930   ip->fname = "*command line*";
4931
4932   ip->buf = ip->bufp = (U_CHAR *) str;
4933   ip->length = len;
4934   ip->lineno = 1;
4935   ip->macro = 0;
4936   ip->free_ptr = 0;
4937   ip->if_stack = if_stack;
4938
4939   for (kt = directive_table; kt->type != type; kt++)
4940     ;
4941
4942   (*kt->func) ((U_CHAR *) str, (U_CHAR *) str + len, NULL);
4943   --indepth;
4944 }
4945
4946 /* Handle the -D option.  If STR is just an identifier, define it with
4947  * value 1.  If STR has anything after the identifier, then it should
4948  * be identifier-space-definition.  */
4949 static void
4950 make_definition (str)
4951      const char *str;
4952 {
4953   char *buf, *p;
4954   size_t count;
4955
4956   /* Copy the entire option so we can modify it. 
4957      Change the first "=" in the string to a space.  If there is none,
4958      tack " 1" on the end.  */
4959
4960   /* Length including the null.  */  
4961   count = strlen (str);
4962   buf = (char *) alloca (count + 2);
4963   memcpy (buf, str, count);
4964
4965   p = strchr (str, '=');
4966   if (p)
4967     buf[p - str] = ' ';
4968   else
4969     {
4970       buf[count++] = ' ';
4971       buf[count++] = '1';
4972     }
4973
4974   run_directive (buf, count, T_DEFINE);
4975 }
4976
4977 /* Handle the -U option.  */
4978 static void
4979 make_undef (str)
4980      const char *str;
4981 {
4982   run_directive (str, strlen (str), T_UNDEF);
4983 }
4984
4985 /* Handles the #assert (-A) and #unassert (-A-) command line options.  */
4986 static void
4987 make_assertion (str)
4988      const char *str;
4989 {
4990   enum node_type type = T_ASSERT;
4991   size_t count;
4992   const char *p;
4993
4994   if (*str == '-')
4995     {
4996       str++;
4997       type = T_UNASSERT;
4998     }
4999   
5000   count = strlen (str);
5001   p = strchr (str, '=');
5002   if (p)
5003     {
5004       /* Copy the entire option so we can modify it.  Change the first
5005          "=" in the string to a '(', and tack a ')' on the end.  */
5006       char *buf = (char *) alloca (count + 1);
5007
5008       memcpy (buf, str, count);
5009       buf[p - str] = '(';
5010       buf[count++] = ')';
5011       str = buf;
5012     }
5013
5014   run_directive (str, count, type);
5015 }
5016 \f
5017 /* Add output to `deps_buffer' for the -M switch.
5018    STRING points to the text to be output.
5019    SIZE is the number of bytes, or 0 meaning output until a null.
5020    If SIZE is nonzero, we break the line first, if it is long enough.  */
5021 static void
5022 deps_output (string, size)
5023      const char *string;
5024      int size;
5025 {
5026 #ifndef MAX_OUTPUT_COLUMNS
5027 #define MAX_OUTPUT_COLUMNS 75
5028 #endif
5029   if (size != 0 && deps_column != 0
5030       && size + deps_column > MAX_OUTPUT_COLUMNS) {
5031     deps_output ("\\\n  ", 0);
5032     deps_column = 0;
5033   }
5034
5035   if (size == 0)
5036     size = strlen (string);
5037
5038   if (deps_size + size + 1 > deps_allocated_size) {
5039     deps_allocated_size = deps_size + size + 50;
5040     deps_allocated_size *= 2;
5041     deps_buffer = (char *) xrealloc (deps_buffer, deps_allocated_size);
5042   }
5043   memcpy (&deps_buffer[deps_size], string, size);
5044   deps_size += size;
5045   deps_column += size;
5046   deps_buffer[deps_size] = 0;
5047 }
5048
5049 /* Get the file-mode and data size of the file open on FD
5050    and store them in *MODE_POINTER and *SIZE_POINTER.  */
5051
5052 static int
5053 file_size_and_mode (fd, mode_pointer, size_pointer)
5054      int fd;
5055      int *mode_pointer;
5056      long *size_pointer;
5057 {
5058   struct stat sbuf;
5059
5060   if (fstat (fd, &sbuf) < 0) return -1;
5061   if (mode_pointer) *mode_pointer = sbuf.st_mode;
5062   if (size_pointer) *size_pointer = sbuf.st_size;
5063   return 0;
5064 }