OSDN Git Service

(reg_last_set_label, reg_last_set_table_tick, label_tick): Use int,
[pf3gnuchains/gcc-fork.git] / gcc / cccp.c
1 /* C Compatible Compiler Preprocessor (CCCP)
2 Copyright (C) 1986, 1987, 1989, 1992 Free Software Foundation, Inc.
3                     Written by Paul Rubin, June 1986
4                     Adapted to ANSI C, Richard Stallman, Jan 1987
5
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19
20  In other words, you are welcome to use, share and improve this program.
21  You are forbidden to forbid anyone else to use, share and improve
22  what you give them.   Help stamp out software-hoarding!  */
23 \f
24 typedef unsigned char U_CHAR;
25
26 #ifdef EMACS
27 #define NO_SHORTNAMES
28 #include "../src/config.h"
29 #ifdef open
30 #undef open
31 #undef read
32 #undef write
33 #endif /* open */
34 #endif /* EMACS */
35
36 /* The macro EMACS is defined when cpp is distributed as part of Emacs,
37    for the sake of machines with limited C compilers.  */
38 #ifndef EMACS
39 #include "config.h"
40 #endif /* not EMACS */
41
42 #ifndef STANDARD_INCLUDE_DIR
43 #define STANDARD_INCLUDE_DIR "/usr/include"
44 #endif
45
46 #ifndef LOCAL_INCLUDE_DIR
47 #define LOCAL_INCLUDE_DIR "/usr/local/include"
48 #endif
49
50 #if 0 /* We can't get ptrdiff_t, so I arranged not to need PTR_INT_TYPE.  */
51 #ifdef __STDC__
52 #define PTR_INT_TYPE ptrdiff_t
53 #else
54 #define PTR_INT_TYPE long
55 #endif
56 #endif /* 0 */
57
58 #include "pcp.h"
59
60 #ifndef STDC_VALUE
61 #define STDC_VALUE 1
62 #endif
63
64 /* By default, colon separates directories in a path.  */
65 #ifndef PATH_SEPARATOR
66 #define PATH_SEPARATOR ':'
67 #endif
68
69 /* In case config.h defines these.  */
70 #undef bcopy
71 #undef bzero
72 #undef bcmp
73
74 #include <sys/types.h>
75 #include <sys/stat.h>
76 #include <ctype.h>
77 #include <stdio.h>
78 #include <signal.h>
79
80 #ifndef VMS
81 #ifndef USG
82 #include <sys/time.h>           /* for __DATE__ and __TIME__ */
83 #include <sys/resource.h>
84 #else
85 #include <time.h>
86 #include <fcntl.h>
87 #endif /* USG */
88 #endif /* not VMS */
89
90 /* This defines "errno" properly for VMS, and gives us EACCES. */
91 #include <errno.h>
92
93 /* VMS-specific definitions */
94 #ifdef VMS
95 #include <time.h>
96 #include <perror.h>             /* This defines sys_errlist/sys_nerr properly */
97 #include <descrip.h>
98 #define O_RDONLY        0       /* Open arg for Read/Only  */
99 #define O_WRONLY        1       /* Open arg for Write/Only */
100 #define read(fd,buf,size)       VMS_read (fd,buf,size)
101 #define write(fd,buf,size)      VMS_write (fd,buf,size)
102 #define open(fname,mode,prot)   VMS_open (fname,mode,prot)
103 #define fopen(fname,mode)       VMS_fopen (fname,mode)
104 #define freopen(fname,mode,ofile) VMS_freopen (fname,mode,ofile)
105 #define strncat(dst,src,cnt) VMS_strncat (dst,src,cnt)
106 static char * VMS_strncat ();
107 static int VMS_read ();
108 static int VMS_write ();
109 static int VMS_open ();
110 static FILE * VMS_fopen ();
111 static FILE * VMS_freopen ();
112 static void hack_vms_include_specification ();
113 typedef struct { unsigned :16, :16, :16; } vms_ino_t;
114 #define ino_t vms_ino_t
115 #define INCLUDE_LEN_FUDGE 10    /* leave room for VMS syntax conversion */
116 #ifdef __GNUC__
117 #define BSTRING                 /* VMS/GCC supplies the bstring routines */
118 #endif /* __GNUC__ */
119 #endif /* VMS */
120   
121 extern char *index ();
122 extern char *rindex ();
123
124 #ifndef O_RDONLY
125 #define O_RDONLY 0
126 #endif
127
128 #undef MIN
129 #undef MAX
130 #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
131 #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
132
133 /* Find the largest host integer type and set its size and type.  */
134
135 #ifndef HOST_BITS_PER_WIDE_INT
136
137 #if HOST_BITS_PER_LONG > HOST_BITS_PER_INT
138 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
139 #define HOST_WIDE_INT long
140 #else
141 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT
142 #define HOST_WIDE_INT int
143 #endif
144
145 #endif
146
147 #ifndef S_ISREG
148 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
149 #endif
150
151 #ifndef S_ISDIR
152 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
153 #endif
154
155 /* Define a generic NULL if one hasn't already been defined.  */
156
157 #ifndef NULL
158 #define NULL 0
159 #endif
160
161 #ifndef GENERIC_PTR
162 #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
163 #define GENERIC_PTR void *
164 #else
165 #define GENERIC_PTR char *
166 #endif
167 #endif
168
169 #ifndef NULL_PTR
170 #define NULL_PTR ((GENERIC_PTR)0)
171 #endif
172
173 #ifndef INCLUDE_LEN_FUDGE
174 #define INCLUDE_LEN_FUDGE 0
175 #endif
176
177 /* Forward declarations.  */
178
179 char *xmalloc ();
180 void error ();
181 void warning ();
182
183 /* External declarations.  */
184
185 extern char *getenv ();
186 extern FILE *fdopen ();
187 extern char *version_string;
188 extern struct tm *localtime ();
189 extern int sys_nerr;
190 extern char *sys_errlist[];
191
192 #ifndef errno
193 extern int errno;
194 #endif
195
196 /* Forward declarations.  */
197
198 struct directive;
199 struct file_buf;
200 struct arglist;
201 struct argdata;
202
203 #if defined(USG) || defined(VMS)
204 #ifndef BSTRING
205 void bcopy ();
206 void bzero ();
207 int bcmp ();
208 #endif
209 #endif
210
211 /* These functions are declared to return int instead of void since they
212    are going to be placed in a table and some old compilers have trouble with
213    pointers to functions returning void.  */
214
215 static int do_define ();
216 static int do_line ();
217 static int do_include ();
218 static int do_undef ();
219 static int do_error ();
220 static int do_pragma ();
221 static int do_ident ();
222 static int do_if ();
223 static int do_xifdef ();
224 static int do_else ();
225 static int do_elif ();
226 static int do_endif ();
227 static int do_sccs ();
228 static int do_once ();
229 static int do_assert ();
230 static int do_unassert ();
231 static int do_warning ();
232
233 static void add_import ();
234 static void append_include_chain ();
235 static void deps_output ();
236 static void make_undef ();
237 static void make_definition ();
238 static void make_assertion ();
239 static void path_include ();
240 static void initialize_builtins ();
241 static void initialize_char_syntax ();
242 static void dump_arg_n ();
243 static void dump_defn_1 ();
244 static void delete_macro ();
245 static void trigraph_pcp ();
246 static void rescan ();
247 static void finclude ();
248 static void validate_else ();
249 static int comp_def_part ();
250 static void error_from_errno ();
251 static void error_with_line ();
252 void pedwarn ();
253 void pedwarn_with_line ();
254 static void pedwarn_with_file_and_line ();
255 static void fatal ();
256 void fancy_abort ();
257 static void pfatal_with_name ();
258 static void perror_with_name ();
259 static void pipe_closed ();
260 static void print_containing_files ();
261 static int lookup_import ();
262 static int redundant_include_p ();
263 static is_system_include ();
264 static int check_preconditions ();
265 static void pcfinclude ();
266 static void pcstring_used ();
267 static void write_output ();
268 static int check_macro_name ();
269 static int compare_defs ();
270 static int compare_token_lists ();
271 static int eval_if_expression ();
272 static int discard_comments ();
273 static int change_newlines ();
274 static int line_for_error ();
275 static int hashf ();
276 static int file_size_and_mode ();
277
278 static struct arglist *read_token_list ();
279 static void free_token_list ();
280
281 static struct hashnode *install ();
282 struct hashnode *lookup ();
283
284 static struct assertion_hashnode *assertion_install ();
285 static struct assertion_hashnode *assertion_lookup ();
286
287 static char *xrealloc ();
288 static char *xcalloc ();
289 static char *savestring ();
290
291 static void delete_assertion ();
292 static void macroexpand ();
293 static void dump_all_macros ();
294 static void conditional_skip ();
295 static void skip_if_group ();
296 static void output_line_command ();
297
298 /* Last arg to output_line_command.  */
299 enum file_change_code {same_file, enter_file, leave_file};
300
301 static int grow_outbuf ();
302 static int handle_directive ();
303 static void memory_full ();
304
305 static U_CHAR *macarg1 ();
306 static char *macarg ();
307
308 static U_CHAR *skip_to_end_of_comment ();
309 static U_CHAR *skip_quoted_string ();
310 static U_CHAR *skip_paren_group ();
311
312 static char *check_precompiled ();
313 /* static struct macrodef create_definition (); [moved below] */
314 static void dump_single_macro ();
315 \f
316 #ifndef FAILURE_EXIT_CODE
317 #define FAILURE_EXIT_CODE 33    /* gnu cc command understands this */
318 #endif
319
320 #ifndef SUCCESS_EXIT_CODE
321 #define SUCCESS_EXIT_CODE 0     /* 0 means success on Unix.  */
322 #endif
323
324 /* Name under which this program was invoked.  */
325
326 static char *progname;
327
328 /* Nonzero means use extra default include directories for C++.  */
329
330 static int cplusplus;
331
332 /* Nonzero means handle cplusplus style comments */
333
334 static int cplusplus_comments;
335
336 /* Nonzero means handle #import, for objective C.  */
337
338 static int objc;
339
340 /* Nonzero means this is an assembly file, and allow
341    unknown directives, which could be comments.  */
342
343 static int lang_asm;
344
345 /* Current maximum length of directory names in the search path
346    for include files.  (Altered as we get more of them.)  */
347
348 static int max_include_len;
349
350 /* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
351
352 static int lint = 0;
353
354 /* Nonzero means copy comments into the output file.  */
355
356 static int put_out_comments = 0;
357
358 /* Nonzero means don't process the ANSI trigraph sequences.  */
359
360 static int no_trigraphs = 0;
361
362 /* Nonzero means print the names of included files rather than
363    the preprocessed output.  1 means just the #include "...",
364    2 means #include <...> as well.  */
365
366 static int print_deps = 0;
367
368 /* Nonzero means print names of header files (-H).  */
369
370 static int print_include_names = 0;
371
372 /* Nonzero means don't output line number information.  */
373
374 static int no_line_commands;
375
376 /* dump_only means inhibit output of the preprocessed text
377              and instead output the definitions of all user-defined
378              macros in a form suitable for use as input to cccp.
379    dump_names means pass #define and the macro name through to output.
380    dump_definitions means pass the whole definition (plus #define) through
381 */
382
383 static enum {dump_none, dump_only, dump_names, dump_definitions}
384      dump_macros = dump_none;
385
386 /* Nonzero means pass all #define and #undef directives which we actually
387    process through to the output stream.  This feature is used primarily
388    to allow cc1 to record the #defines and #undefs for the sake of
389    debuggers which understand about preprocessor macros, but it may
390    also be useful with -E to figure out how symbols are defined, and
391    where they are defined.  */
392 static int debug_output = 0;
393
394 /* Nonzero indicates special processing used by the pcp program.  The
395    special effects of this mode are: 
396      
397      Inhibit all macro expansion, except those inside #if directives.
398
399      Process #define directives normally, and output their contents 
400      to the output file.
401
402      Output preconditions to pcp_outfile indicating all the relevant
403      preconditions for use of this file in a later cpp run.
404 */
405 static FILE *pcp_outfile;
406
407 /* Nonzero means we are inside an IF during a -pcp run.  In this mode
408    macro expansion is done, and preconditions are output for all macro
409    uses requiring them. */
410 static int pcp_inside_if;
411
412 /* Nonzero means never to include precompiled files.
413    This is 1 since there's no way now to make precompiled files,
414    so it's not worth testing for them.  */
415 static int no_precomp = 1;
416
417 /* Nonzero means give all the error messages the ANSI standard requires.  */
418
419 int pedantic;
420
421 /* Nonzero means try to make failure to fit ANSI C an error.  */
422
423 static int pedantic_errors;
424
425 /* Nonzero means don't print warning messages.  -w.  */
426
427 static int inhibit_warnings = 0;
428
429 /* Nonzero means warn if slash-star appears in a comment.  */
430
431 static int warn_comments;
432
433 /* Nonzero means warn if a macro argument is (or would be)
434    stringified with -traditional.  */
435
436 static int warn_stringify;
437
438 /* Nonzero means warn if there are any trigraphs.  */
439
440 static int warn_trigraphs;
441
442 /* Nonzero means warn if #import is used.  */
443
444 static int warn_import = 1;
445
446 /* Nonzero means turn warnings into errors.  */
447
448 static int warnings_are_errors;
449
450 /* Nonzero means try to imitate old fashioned non-ANSI preprocessor.  */
451
452 int traditional;
453
454 /* Nonzero causes output not to be done,
455    but directives such as #define that have side effects
456    are still obeyed.  */
457
458 static int no_output;
459
460 /* Nonzero means that we have finished processing the command line options.
461    This flag is used to decide whether or not to issue certain errors
462    and/or warnings.  */
463
464 static int done_initializing = 0;
465
466 /* Line where a newline was first seen in a string constant.  */
467
468 static int multiline_string_line = 0;
469 \f
470 /* I/O buffer structure.
471    The `fname' field is nonzero for source files and #include files
472    and for the dummy text used for -D and -U.
473    It is zero for rescanning results of macro expansion
474    and for expanding macro arguments.  */
475 #define INPUT_STACK_MAX 200
476 static struct file_buf {
477   char *fname;
478   /* Filename specified with #line command.  */
479   char *nominal_fname;
480   /* Record where in the search path this file was found.
481      For #include_next.  */
482   struct file_name_list *dir;
483   int lineno;
484   int length;
485   U_CHAR *buf;
486   U_CHAR *bufp;
487   /* Macro that this level is the expansion of.
488      Included so that we can reenable the macro
489      at the end of this level.  */
490   struct hashnode *macro;
491   /* Value of if_stack at start of this file.
492      Used to prohibit unmatched #endif (etc) in an include file.  */
493   struct if_stack *if_stack;
494   /* Object to be freed at end of input at this level.  */
495   U_CHAR *free_ptr;
496   /* True if this is a header file included using <FILENAME>.  */
497   char system_header_p;
498 } instack[INPUT_STACK_MAX];
499
500 static int last_error_tick;        /* Incremented each time we print it.  */
501 static int input_file_stack_tick;  /* Incremented when the status changes.  */
502
503 /* Current nesting level of input sources.
504    `instack[indepth]' is the level currently being read.  */
505 static int indepth = -1;
506 #define CHECK_DEPTH(code) \
507   if (indepth >= (INPUT_STACK_MAX - 1))                                 \
508     {                                                                   \
509       error_with_line (line_for_error (instack[indepth].lineno),        \
510                        "macro or `#include' recursion too deep");       \
511       code;                                                             \
512     }
513
514 /* Current depth in #include directives that use <...>.  */
515 static int system_include_depth = 0;
516
517 typedef struct file_buf FILE_BUF;
518
519 /* The output buffer.  Its LENGTH field is the amount of room allocated
520    for the buffer, not the number of chars actually present.  To get
521    that, subtract outbuf.buf from outbuf.bufp. */
522
523 #define OUTBUF_SIZE 10  /* initial size of output buffer */
524 static FILE_BUF outbuf;
525
526 /* Grow output buffer OBUF points at
527    so it can hold at least NEEDED more chars.  */
528
529 #define check_expand(OBUF, NEEDED)  \
530   (((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED))   \
531    ? grow_outbuf ((OBUF), (NEEDED)) : 0)
532
533 struct file_name_list
534   {
535     struct file_name_list *next;
536     char *fname;
537     /* If the following is nonzero, it is a macro name.
538        Don't include the file again if that macro is defined.  */
539     U_CHAR *control_macro;
540   };
541
542 /* #include "file" looks in source file dir, then stack. */
543 /* #include <file> just looks in the stack. */
544 /* -I directories are added to the end, then the defaults are added. */
545 static struct default_include { char *fname; int cplusplus; } include_defaults_array[]
546 #ifdef INCLUDE_DEFAULTS
547   = INCLUDE_DEFAULTS;
548 #else
549   = {
550     /* Pick up GNU C++ specific include files.  */
551     { GPLUSPLUS_INCLUDE_DIR, 1},
552 #ifdef CROSS_COMPILE
553     /* This is the dir for fixincludes.  Put it just before
554        the files that we fix.  */
555     { GCC_INCLUDE_DIR, 0},
556     /* For cross-compilation, this dir name is generated
557        automatically in Makefile.in.  */
558     { CROSS_INCLUDE_DIR, 0 },
559     /* This is another place that the target system's headers might be.  */
560     { TOOL_INCLUDE_DIR, 0},
561 #else /* not CROSS_COMPILE */
562     /* Until we are really clear on what people will use this dir for
563        in a native compiler, it's not clear where in the order it belongs.  */
564     { TOOL_INCLUDE_DIR, 0},
565     /* This should be /use/local/include and should come before
566        the fixincludes-fixed header files.  */
567     { LOCAL_INCLUDE_DIR, 0},
568     /* This is the dir for fixincludes.  Put it just before
569        the files that we fix.  */
570     { GCC_INCLUDE_DIR, 0},
571     /* Some systems have an extra dir of include files.  */
572 #ifdef SYSTEM_INCLUDE_DIR
573     { SYSTEM_INCLUDE_DIR, 0},
574 #endif
575     { STANDARD_INCLUDE_DIR, 0},
576 #endif /* not CROSS_COMPILE */
577     { 0, 0}
578     };
579 #endif /* no INCLUDE_DEFAULTS */
580
581 /* The code looks at the defaults through this pointer, rather than through
582    the constant structure above.  This pointer gets changed if an environment
583    variable specifies other defaults.  */
584 static struct default_include *include_defaults = include_defaults_array;
585
586 static struct file_name_list *include = 0;      /* First dir to search */
587         /* First dir to search for <file> */
588 /* This is the first element to use for #include <...>.
589    If it is 0, use the entire chain for such includes.  */
590 static struct file_name_list *first_bracket_include = 0;
591 /* This is the first element in the chain that corresponds to
592    a directory of system header files.  */
593 static struct file_name_list *first_system_include = 0;
594 static struct file_name_list *last_include = 0; /* Last in chain */
595
596 /* Chain of include directories to put at the end of the other chain.  */
597 static struct file_name_list *after_include = 0;
598 static struct file_name_list *last_after_include = 0;   /* Last in chain */
599
600 /* List of included files that contained #pragma once.  */
601 static struct file_name_list *dont_repeat_files = 0;
602
603 /* List of other included files.
604    If ->control_macro if nonzero, the file had a #ifndef
605    around the entire contents, and ->control_macro gives the macro name.  */
606 static struct file_name_list *all_include_files = 0;
607
608 /* Directory prefix that should replace `/usr' in the standard
609    include file directories.  */
610 static char *include_prefix;
611
612 /* Global list of strings read in from precompiled files.  This list
613    is kept in the order the strings are read in, with new strings being
614    added at the end through stringlist_tailp.  We use this list to output
615    the strings at the end of the run. 
616 */
617 static STRINGDEF *stringlist;
618 static STRINGDEF **stringlist_tailp = &stringlist;
619
620
621 /* Structure returned by create_definition */
622 typedef struct macrodef MACRODEF;
623 struct macrodef
624 {
625   struct definition *defn;
626   U_CHAR *symnam;
627   int symlen;
628 };
629
630 static struct macrodef create_definition ();
631
632 \f
633 /* Structure allocated for every #define.  For a simple replacement
634    such as
635         #define foo bar ,
636    nargs = -1, the `pattern' list is null, and the expansion is just
637    the replacement text.  Nargs = 0 means a functionlike macro with no args,
638    e.g.,
639        #define getchar() getc (stdin) .
640    When there are args, the expansion is the replacement text with the
641    args squashed out, and the reflist is a list describing how to
642    build the output from the input: e.g., "3 chars, then the 1st arg,
643    then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
644    The chars here come from the expansion.  Whatever is left of the
645    expansion after the last arg-occurrence is copied after that arg.
646    Note that the reflist can be arbitrarily long---
647    its length depends on the number of times the arguments appear in
648    the replacement text, not how many args there are.  Example:
649    #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
650    pattern list
651      { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
652    where (x, y) means (nchars, argno). */
653
654 typedef struct definition DEFINITION;
655 struct definition {
656   int nargs;
657   int length;                   /* length of expansion string */
658   int predefined;               /* True if the macro was builtin or */
659                                 /* came from the command line */
660   U_CHAR *expansion;
661   int line;                     /* Line number of definition */
662   char *file;                   /* File of definition */
663   char rest_args;               /* Nonzero if last arg. absorbs the rest */
664   struct reflist {
665     struct reflist *next;
666     char stringify;             /* nonzero if this arg was preceded by a
667                                    # operator. */
668     char raw_before;            /* Nonzero if a ## operator before arg. */
669     char raw_after;             /* Nonzero if a ## operator after arg. */
670     char rest_args;             /* Nonzero if this arg. absorbs the rest */
671     int nchars;                 /* Number of literal chars to copy before
672                                    this arg occurrence.  */
673     int argno;                  /* Number of arg to substitute (origin-0) */
674   } *pattern;
675   union {
676     /* Names of macro args, concatenated in reverse order
677        with comma-space between them.
678        The only use of this is that we warn on redefinition
679        if this differs between the old and new definitions.  */
680     U_CHAR *argnames;
681   } args;
682 };
683
684 /* different kinds of things that can appear in the value field
685    of a hash node.  Actually, this may be useless now. */
686 union hashval {
687   int ival;
688   char *cpval;
689   DEFINITION *defn;
690   KEYDEF *keydef;
691 };
692
693 /*
694  * special extension string that can be added to the last macro argument to 
695  * allow it to absorb the "rest" of the arguments when expanded.  Ex:
696  *              #define wow(a, b...)            process (b, a, b)
697  *              { wow (1, 2, 3); }      ->      { process (2, 3, 1, 2, 3); }
698  *              { wow (one, two); }     ->      { process (two, one, two); }
699  * if this "rest_arg" is used with the concat token '##' and if it is not
700  * supplied then the token attached to with ## will not be outputted.  Ex:
701  *              #define wow (a, b...)           process (b ## , a, ## b)
702  *              { wow (1, 2); }         ->      { process (2, 1, 2); }
703  *              { wow (one); }          ->      { process (one); {
704  */
705 static char rest_extension[] = "...";
706 #define REST_EXTENSION_LENGTH   (sizeof (rest_extension) - 1)
707
708 /* The structure of a node in the hash table.  The hash table
709    has entries for all tokens defined by #define commands (type T_MACRO),
710    plus some special tokens like __LINE__ (these each have their own
711    type, and the appropriate code is run when that type of node is seen.
712    It does not contain control words like "#define", which are recognized
713    by a separate piece of code. */
714
715 /* different flavors of hash nodes --- also used in keyword table */
716 enum node_type {
717  T_DEFINE = 1,  /* the `#define' keyword */
718  T_INCLUDE,     /* the `#include' keyword */
719  T_INCLUDE_NEXT, /* the `#include_next' keyword */
720  T_IMPORT,      /* the `#import' keyword */
721  T_IFDEF,       /* the `#ifdef' keyword */
722  T_IFNDEF,      /* the `#ifndef' keyword */
723  T_IF,          /* the `#if' keyword */
724  T_ELSE,        /* `#else' */
725  T_PRAGMA,      /* `#pragma' */
726  T_ELIF,        /* `#elif' */
727  T_UNDEF,       /* `#undef' */
728  T_LINE,        /* `#line' */
729  T_ERROR,       /* `#error' */
730  T_WARNING,     /* `#warning' */
731  T_ENDIF,       /* `#endif' */
732  T_SCCS,        /* `#sccs', used on system V.  */
733  T_IDENT,       /* `#ident', used on system V.  */
734  T_ASSERT,      /* `#assert', taken from system V.  */
735  T_UNASSERT,    /* `#unassert', taken from system V.  */
736  T_SPECLINE,    /* special symbol `__LINE__' */
737  T_DATE,        /* `__DATE__' */
738  T_FILE,        /* `__FILE__' */
739  T_BASE_FILE,   /* `__BASE_FILE__' */
740  T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
741  T_VERSION,     /* `__VERSION__' */
742  T_SIZE_TYPE,   /* `__SIZE_TYPE__' */
743  T_PTRDIFF_TYPE,   /* `__PTRDIFF_TYPE__' */
744  T_WCHAR_TYPE,   /* `__WCHAR_TYPE__' */
745  T_USER_LABEL_PREFIX_TYPE, /* `__USER_LABEL_PREFIX__' */
746  T_REGISTER_PREFIX_TYPE,   /* `__REGISTER_PREFIX__' */
747  T_TIME,        /* `__TIME__' */
748  T_CONST,       /* Constant value, used by `__STDC__' */
749  T_MACRO,       /* macro defined by `#define' */
750  T_DISABLED,    /* macro temporarily turned off for rescan */
751  T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
752  T_PCSTRING,    /* precompiled string (hashval is KEYDEF *) */
753  T_UNUSED       /* Used for something not defined.  */
754  };
755
756 struct hashnode {
757   struct hashnode *next;        /* double links for easy deletion */
758   struct hashnode *prev;
759   struct hashnode **bucket_hdr; /* also, a back pointer to this node's hash
760                                    chain is kept, in case the node is the head
761                                    of the chain and gets deleted. */
762   enum node_type type;          /* type of special token */
763   int length;                   /* length of token, for quick comparison */
764   U_CHAR *name;                 /* the actual name */
765   union hashval value;          /* pointer to expansion, or whatever */
766 };
767
768 typedef struct hashnode HASHNODE;
769
770 /* Some definitions for the hash table.  The hash function MUST be
771    computed as shown in hashf () below.  That is because the rescan
772    loop computes the hash value `on the fly' for most tokens,
773    in order to avoid the overhead of a lot of procedure calls to
774    the hashf () function.  Hashf () only exists for the sake of
775    politeness, for use when speed isn't so important. */
776
777 #define HASHSIZE 1403
778 static HASHNODE *hashtab[HASHSIZE];
779 #define HASHSTEP(old, c) ((old << 2) + c)
780 #define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
781
782 /* Symbols to predefine.  */
783
784 #ifdef CPP_PREDEFINES
785 static char *predefs = CPP_PREDEFINES;
786 #else
787 static char *predefs = "";
788 #endif
789 \f
790 /* We let tm.h override the types used here, to handle trivial differences
791    such as the choice of unsigned int or long unsigned int for size_t.
792    When machines start needing nontrivial differences in the size type,
793    it would be best to do something here to figure out automatically
794    from other information what type to use.  */
795
796 /* The string value for __size_type__.  */
797
798 #ifndef SIZE_TYPE
799 #define SIZE_TYPE "long unsigned int"
800 #endif
801
802 /* The string value for __ptrdiff_type__.  */
803
804 #ifndef PTRDIFF_TYPE
805 #define PTRDIFF_TYPE "long int"
806 #endif
807
808 /* The string value for __wchar_type__.  */
809
810 #ifndef WCHAR_TYPE
811 #define WCHAR_TYPE "int"
812 #endif
813
814 /* The string value for __USER_LABEL_PREFIX__ */
815
816 #ifndef USER_LABEL_PREFIX
817 #define USER_LABEL_PREFIX ""
818 #endif
819
820 /* The string value for __REGISTER_PREFIX__ */
821
822 #ifndef REGISTER_PREFIX
823 #define REGISTER_PREFIX ""
824 #endif
825 \f
826 /* In the definition of a #assert name, this structure forms
827    a list of the individual values asserted.
828    Each value is itself a list of "tokens".
829    These are strings that are compared by name.  */
830
831 struct tokenlist_list {
832   struct tokenlist_list *next;
833   struct arglist *tokens;
834 };
835
836 struct assertion_hashnode {
837   struct assertion_hashnode *next;      /* double links for easy deletion */
838   struct assertion_hashnode *prev;
839   /* also, a back pointer to this node's hash
840      chain is kept, in case the node is the head
841      of the chain and gets deleted. */
842   struct assertion_hashnode **bucket_hdr;
843   int length;                   /* length of token, for quick comparison */
844   U_CHAR *name;                 /* the actual name */
845   /* List of token-sequences.  */
846   struct tokenlist_list *value;
847 };
848
849 typedef struct assertion_hashnode ASSERTION_HASHNODE;
850
851 /* Some definitions for the hash table.  The hash function MUST be
852    computed as shown in hashf below.  That is because the rescan
853    loop computes the hash value `on the fly' for most tokens,
854    in order to avoid the overhead of a lot of procedure calls to
855    the hashf function.  hashf only exists for the sake of
856    politeness, for use when speed isn't so important. */
857
858 #define ASSERTION_HASHSIZE 37
859 static ASSERTION_HASHNODE *assertion_hashtab[ASSERTION_HASHSIZE];
860
861 /* Nonzero means inhibit macroexpansion of what seem to be
862    assertion tests, in rescan.  For #if.  */
863 static int assertions_flag;
864 \f
865 /* `struct directive' defines one #-directive, including how to handle it.  */
866
867 struct directive {
868   int length;                   /* Length of name */
869   int (*func)();                /* Function to handle directive */
870   char *name;                   /* Name of directive */
871   enum node_type type;          /* Code which describes which directive. */
872   char angle_brackets;          /* Nonzero => <...> is special.  */
873   char traditional_comments;    /* Nonzero: keep comments if -traditional.  */
874   char pass_thru;               /* Copy preprocessed directive to output file.  */
875 };
876
877 /* Here is the actual list of #-directives, most-often-used first.  */
878
879 static struct directive directive_table[] = {
880   {  6, do_define, "define", T_DEFINE, 0, 1},
881   {  2, do_if, "if", T_IF},
882   {  5, do_xifdef, "ifdef", T_IFDEF},
883   {  6, do_xifdef, "ifndef", T_IFNDEF},
884   {  5, do_endif, "endif", T_ENDIF},
885   {  4, do_else, "else", T_ELSE},
886   {  4, do_elif, "elif", T_ELIF},
887   {  4, do_line, "line", T_LINE},
888   {  7, do_include, "include", T_INCLUDE, 1},
889   { 12, do_include, "include_next", T_INCLUDE_NEXT, 1},
890   {  6, do_include, "import", T_IMPORT, 1},
891   {  5, do_undef, "undef", T_UNDEF},
892   {  5, do_error, "error", T_ERROR},
893   {  7, do_warning, "warning", T_WARNING},
894 #ifdef SCCS_DIRECTIVE
895   {  4, do_sccs, "sccs", T_SCCS},
896 #endif
897   {  6, do_pragma, "pragma", T_PRAGMA, 0, 0, 1},
898   {  5, do_ident, "ident", T_IDENT, 0, 0, 1},
899   {  6, do_assert, "assert", T_ASSERT},
900   {  8, do_unassert, "unassert", T_UNASSERT},
901   {  -1, 0, "", T_UNUSED},
902 };
903
904 /* When a directive handler is called,
905    this points to the # that started the directive.  */
906 U_CHAR *directive_start;
907
908 /* table to tell if char can be part of a C identifier. */
909 U_CHAR is_idchar[256];
910 /* table to tell if char can be first char of a c identifier. */
911 U_CHAR is_idstart[256];
912 /* table to tell if c is horizontal space.  */
913 U_CHAR is_hor_space[256];
914 /* table to tell if c is horizontal or vertical space.  */
915 static U_CHAR is_space[256];
916
917 #define SKIP_WHITE_SPACE(p) do { while (is_hor_space[*p]) p++; } while (0)
918 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space[*p]) p++; } while (0)
919   
920 static int errors = 0;                  /* Error counter for exit code */
921
922 /* Name of output file, for error messages.  */
923 static char *out_fname;
924
925 /* Zero means dollar signs are punctuation.
926    -$ stores 0; -traditional may store 1.  Default is 1 for VMS, 0 otherwise.
927    This must be 0 for correct processing of this ANSI C program:
928         #define foo(a) #a
929         #define lose(b) foo (b)
930         #define test$
931         lose (test)     */
932 static int dollars_in_ident;
933 #ifndef DOLLARS_IN_IDENTIFIERS
934 #define DOLLARS_IN_IDENTIFIERS 1
935 #endif
936
937 static FILE_BUF expand_to_temp_buffer ();
938
939 static DEFINITION *collect_expansion ();
940
941 /* Stack of conditionals currently in progress
942    (including both successful and failing conditionals).  */
943
944 struct if_stack {
945   struct if_stack *next;        /* for chaining to the next stack frame */
946   char *fname;          /* copied from input when frame is made */
947   int lineno;                   /* similarly */
948   int if_succeeded;             /* true if a leg of this if-group
949                                     has been passed through rescan */
950   U_CHAR *control_macro;        /* For #ifndef at start of file,
951                                    this is the macro name tested.  */
952   enum node_type type;          /* type of last directive seen in this group */
953 };
954 typedef struct if_stack IF_STACK_FRAME;
955 static IF_STACK_FRAME *if_stack = NULL;
956
957 /* Buffer of -M output.  */
958 static char *deps_buffer;
959
960 /* Number of bytes allocated in above.  */
961 static int deps_allocated_size;
962
963 /* Number of bytes used.  */
964 static int deps_size;
965
966 /* Number of bytes since the last newline.  */
967 static int deps_column;
968
969 /* Nonzero means -I- has been seen,
970    so don't look for #include "foo" the source-file directory.  */
971 static int ignore_srcdir;
972 \f
973 int
974 main (argc, argv)
975      int argc;
976      char **argv;
977 {
978   int st_mode;
979   long st_size;
980   char *in_fname;
981   char *p;
982   int f, i;
983   FILE_BUF *fp;
984   char **pend_files = (char **) xmalloc (argc * sizeof (char *));
985   char **pend_defs = (char **) xmalloc (argc * sizeof (char *));
986   char **pend_undefs = (char **) xmalloc (argc * sizeof (char *));
987   char **pend_assertions = (char **) xmalloc (argc * sizeof (char *));
988   char **pend_includes = (char **) xmalloc (argc * sizeof (char *));
989
990   /* Record the option used with each element of pend_assertions.
991      This is preparation for supporting more than one option for making
992      an assertion.  */
993   char **pend_assertion_options = (char **) xmalloc (argc * sizeof (char *));
994   int inhibit_predefs = 0;
995   int no_standard_includes = 0;
996   int no_standard_cplusplus_includes = 0;
997   int missing_newline = 0;
998
999   /* Non-0 means don't output the preprocessed program.  */
1000   int inhibit_output = 0;
1001
1002   /* File name which deps are being written to.
1003      This is 0 if deps are being written to stdout.  */
1004   char *deps_file = 0;
1005   /* Fopen file mode to open deps_file with.  */
1006   char *deps_mode = "a";
1007   /* Stream on which to print the dependency information.  */
1008   FILE *deps_stream = 0;
1009   /* Target-name to write with the dependency information.  */
1010   char *deps_target = 0;
1011
1012 #ifdef RLIMIT_STACK
1013   /* Get rid of any avoidable limit on stack size.  */
1014   {
1015     struct rlimit rlim;
1016
1017     /* Set the stack limit huge so that alloca (particularly stringtab
1018      * in dbxread.c) does not fail. */
1019     getrlimit (RLIMIT_STACK, &rlim);
1020     rlim.rlim_cur = rlim.rlim_max;
1021     setrlimit (RLIMIT_STACK, &rlim);
1022   }
1023 #endif /* RLIMIT_STACK defined */
1024
1025   signal (SIGPIPE, pipe_closed);
1026
1027   p = argv[0] + strlen (argv[0]);
1028   while (p != argv[0] && p[-1] != '/') --p;
1029   progname = p;
1030
1031 #ifdef VMS
1032   {
1033     /* Remove directories from PROGNAME.  */
1034     char *s;
1035
1036     progname = savestring (argv[0]);
1037
1038     if (!(s = rindex (progname, ']')))
1039       s = rindex (progname, ':');
1040     if (s)
1041       strcpy (progname, s+1);
1042     if (s = rindex (progname, '.'))
1043       *s = '\0';
1044   }
1045 #endif
1046
1047   in_fname = NULL;
1048   out_fname = NULL;
1049
1050   /* Initialize is_idchar to allow $.  */
1051   dollars_in_ident = 1;
1052   initialize_char_syntax ();
1053   dollars_in_ident = DOLLARS_IN_IDENTIFIERS > 0;
1054
1055   no_line_commands = 0;
1056   no_trigraphs = 1;
1057   dump_macros = dump_none;
1058   no_output = 0;
1059   cplusplus = 0;
1060   cplusplus_comments = 0;
1061
1062   bzero (pend_files, argc * sizeof (char *));
1063   bzero (pend_defs, argc * sizeof (char *));
1064   bzero (pend_undefs, argc * sizeof (char *));
1065   bzero (pend_assertions, argc * sizeof (char *));
1066   bzero (pend_includes, argc * sizeof (char *));
1067
1068   /* Process switches and find input file name.  */
1069
1070   for (i = 1; i < argc; i++) {
1071     if (argv[i][0] != '-') {
1072       if (out_fname != NULL)
1073         fatal ("Usage: %s [switches] input output", argv[0]);
1074       else if (in_fname != NULL)
1075         out_fname = argv[i];
1076       else
1077         in_fname = argv[i];
1078     } else {
1079       switch (argv[i][1]) {
1080
1081       case 'i':
1082         if (!strcmp (argv[i], "-include")) {
1083           if (i + 1 == argc)
1084             fatal ("Filename missing after `-include' option");
1085           else
1086             pend_includes[i] = argv[i+1], i++;
1087         }
1088         if (!strcmp (argv[i], "-imacros")) {
1089           if (i + 1 == argc)
1090             fatal ("Filename missing after `-imacros' option");
1091           else
1092             pend_files[i] = argv[i+1], i++;
1093         }
1094         if (!strcmp (argv[i], "-iprefix")) {
1095           if (i + 1 == argc)
1096             fatal ("Filename missing after `-iprefix' option");
1097           else
1098             include_prefix = argv[++i];
1099         }
1100         /* Add directory to end of path for includes,
1101            with the default prefix at the front of its name.  */
1102         if (!strcmp (argv[i], "-iwithprefix")) {
1103           struct file_name_list *dirtmp;
1104
1105           dirtmp = (struct file_name_list *)
1106             xmalloc (sizeof (struct file_name_list));
1107           dirtmp->next = 0;     /* New one goes on the end */
1108           dirtmp->control_macro = 0;
1109           if (i + 1 == argc)
1110             fatal ("Directory name missing after `-iwithprefix' option");
1111
1112           dirtmp->fname = (char *) xmalloc (strlen (argv[i+1])
1113                                             + strlen (include_prefix) + 1);
1114           strcpy (dirtmp->fname, include_prefix);
1115           strcat (dirtmp->fname, argv[++i]);
1116
1117           if (after_include == 0)
1118             after_include = dirtmp;
1119           else
1120             last_after_include->next = dirtmp;
1121           last_after_include = dirtmp; /* Tail follows the last one */
1122         }
1123         /* Add directory to end of path for includes.  */
1124         if (!strcmp (argv[i], "-idirafter")) {
1125           struct file_name_list *dirtmp;
1126
1127           dirtmp = (struct file_name_list *)
1128             xmalloc (sizeof (struct file_name_list));
1129           dirtmp->next = 0;     /* New one goes on the end */
1130           dirtmp->control_macro = 0;
1131           if (i + 1 == argc)
1132             fatal ("Directory name missing after `-idirafter' option");
1133           else
1134             dirtmp->fname = argv[++i];
1135
1136           if (after_include == 0)
1137             after_include = dirtmp;
1138           else
1139             last_after_include->next = dirtmp;
1140           last_after_include = dirtmp; /* Tail follows the last one */
1141         }
1142         break;
1143
1144       case 'o':
1145         if (out_fname != NULL)
1146           fatal ("Output filename specified twice");
1147         if (i + 1 == argc)
1148           fatal ("Filename missing after -o option");
1149         out_fname = argv[++i];
1150         if (!strcmp (out_fname, "-"))
1151           out_fname = "";
1152         break;
1153
1154       case 'p':
1155         if (!strcmp (argv[i], "-pedantic"))
1156           pedantic = 1;
1157         else if (!strcmp (argv[i], "-pedantic-errors")) {
1158           pedantic = 1;
1159           pedantic_errors = 1;
1160         } else if (!strcmp (argv[i], "-pcp")) {
1161           char *pcp_fname = argv[++i];
1162           pcp_outfile = 
1163             ((pcp_fname[0] != '-' || pcp_fname[1] != '\0')
1164              ? fopen (pcp_fname, "w")
1165              : fdopen (dup (fileno (stdout)), "w"));
1166           if (pcp_outfile == 0)
1167             pfatal_with_name (pcp_fname);
1168           no_precomp = 1;
1169         }
1170         break;
1171
1172       case 't':
1173         if (!strcmp (argv[i], "-traditional")) {
1174           traditional = 1;
1175           if (dollars_in_ident > 0)
1176             dollars_in_ident = 1;
1177         } else if (!strcmp (argv[i], "-trigraphs")) {
1178           no_trigraphs = 0;
1179         }
1180         break;
1181
1182       case 'l':
1183         if (! strcmp (argv[i], "-lang-c"))
1184           cplusplus = 0, cplusplus_comments = 0, objc = 0;
1185         if (! strcmp (argv[i], "-lang-c++"))
1186           cplusplus = 1, cplusplus_comments = 1, objc = 0;
1187         if (! strcmp (argv[i], "-lang-objc"))
1188           objc = 1, cplusplus = 0, cplusplus_comments = 1;
1189         if (! strcmp (argv[i], "-lang-objc++"))
1190           objc = 1, cplusplus = 1, cplusplus_comments = 1;
1191         if (! strcmp (argv[i], "-lang-asm"))
1192           lang_asm = 1;
1193         if (! strcmp (argv[i], "-lint"))
1194           lint = 1;
1195         break;
1196
1197       case '+':
1198         cplusplus = 1, cplusplus_comments = 1;
1199         break;
1200
1201       case 'w':
1202         inhibit_warnings = 1;
1203         break;
1204
1205       case 'W':
1206         if (!strcmp (argv[i], "-Wtrigraphs"))
1207           warn_trigraphs = 1;
1208         else if (!strcmp (argv[i], "-Wno-trigraphs"))
1209           warn_trigraphs = 0;
1210         else if (!strcmp (argv[i], "-Wcomment"))
1211           warn_comments = 1;
1212         else if (!strcmp (argv[i], "-Wno-comment"))
1213           warn_comments = 0;
1214         else if (!strcmp (argv[i], "-Wcomments"))
1215           warn_comments = 1;
1216         else if (!strcmp (argv[i], "-Wno-comments"))
1217           warn_comments = 0;
1218         else if (!strcmp (argv[i], "-Wtraditional"))
1219           warn_stringify = 1;
1220         else if (!strcmp (argv[i], "-Wno-traditional"))
1221           warn_stringify = 0;
1222         else if (!strcmp (argv[i], "-Wimport"))
1223           warn_import = 1;
1224         else if (!strcmp (argv[i], "-Wno-import"))
1225           warn_import = 0;
1226         else if (!strcmp (argv[i], "-Werror"))
1227           warnings_are_errors = 1;
1228         else if (!strcmp (argv[i], "-Wno-error"))
1229           warnings_are_errors = 0;
1230         else if (!strcmp (argv[i], "-Wall"))
1231           {
1232             warn_trigraphs = 1;
1233             warn_comments = 1;
1234           }
1235         break;
1236
1237       case 'M':
1238         if (!strcmp (argv[i], "-M"))
1239           print_deps = 2;
1240         else if (!strcmp (argv[i], "-MM"))
1241           print_deps = 1;
1242         else if (!strcmp (argv[i], "-MD"))
1243           print_deps = 2;
1244         else if (!strcmp (argv[i], "-MMD"))
1245           print_deps = 1;
1246         /* For -MD and -MMD options, write deps on file named by next arg.  */
1247         if (!strcmp (argv[i], "-MD")
1248             || !strcmp (argv[i], "-MMD")) {
1249           i++;
1250           deps_file = argv[i];
1251           deps_mode = "w";
1252         } else {
1253           /* For -M and -MM, write deps on standard output
1254              and suppress the usual output.  */
1255           deps_stream = stdout;
1256           inhibit_output = 1;
1257         }         
1258         break;
1259
1260       case 'd':
1261         {
1262           char *p = argv[i] + 2;
1263           char c;
1264           while (c = *p++) {
1265             /* Arg to -d specifies what parts of macros to dump */
1266             switch (c) {
1267             case 'M':
1268               dump_macros = dump_only;
1269               no_output = 1;
1270               break;
1271             case 'N':
1272               dump_macros = dump_names;
1273               break;
1274             case 'D':
1275               dump_macros = dump_definitions;
1276               break;
1277             }
1278           }
1279         }
1280         break;
1281
1282       case 'g':
1283         if (argv[i][2] == '3')
1284           debug_output = 1;
1285         break;
1286
1287       case 'v':
1288         fprintf (stderr, "GNU CPP version %s", version_string);
1289 #ifdef TARGET_VERSION
1290         TARGET_VERSION;
1291 #endif
1292         fprintf (stderr, "\n");
1293         break;
1294
1295       case 'H':
1296         print_include_names = 1;
1297         break;
1298
1299       case 'D':
1300         {
1301           char *p, *p1;
1302
1303           if (argv[i][2] != 0)
1304             p = argv[i] + 2;
1305           else if (i + 1 == argc)
1306             fatal ("Macro name missing after -D option");
1307           else
1308             p = argv[++i];
1309
1310           pend_defs[i] = p;
1311         }
1312         break;
1313
1314       case 'A':
1315         {
1316           char *p, *p1;
1317
1318           if (argv[i][2] != 0)
1319             p = argv[i] + 2;
1320           else if (i + 1 == argc)
1321             fatal ("Assertion missing after -A option");
1322           else
1323             p = argv[++i];
1324
1325           if (!strcmp (p, "-")) {
1326             /* -A- eliminates all predefined macros and assertions.
1327                Let's include also any that were specified earlier
1328                on the command line.  That way we can get rid of any
1329                that were passed automatically in from GCC.  */
1330             int j;
1331             inhibit_predefs = 1;
1332             for (j = 0; j < i; j++)
1333               pend_defs[j] = pend_assertions[j] = 0;
1334           } else {
1335             pend_assertions[i] = p;
1336             pend_assertion_options[i] = "-A";
1337           }
1338         }
1339         break;
1340
1341       case 'U':         /* JF #undef something */
1342         if (argv[i][2] != 0)
1343           pend_undefs[i] = argv[i] + 2;
1344         else if (i + 1 == argc)
1345           fatal ("Macro name missing after -U option");
1346         else
1347           pend_undefs[i] = argv[i+1], i++;
1348         break;
1349
1350       case 'C':
1351         put_out_comments = 1;
1352         break;
1353
1354       case 'E':                 /* -E comes from cc -E; ignore it.  */
1355         break;
1356
1357       case 'P':
1358         no_line_commands = 1;
1359         break;
1360
1361       case '$':                 /* Don't include $ in identifiers.  */
1362         dollars_in_ident = 0;
1363         break;
1364
1365       case 'I':                 /* Add directory to path for includes.  */
1366         {
1367           struct file_name_list *dirtmp;
1368
1369           if (! ignore_srcdir && !strcmp (argv[i] + 2, "-")) {
1370             ignore_srcdir = 1;
1371             /* Don't use any preceding -I directories for #include <...>.  */
1372             first_bracket_include = 0;
1373           }
1374           else {
1375             dirtmp = (struct file_name_list *)
1376               xmalloc (sizeof (struct file_name_list));
1377             dirtmp->next = 0;           /* New one goes on the end */
1378             dirtmp->control_macro = 0;
1379             if (argv[i][2] != 0)
1380               dirtmp->fname = argv[i] + 2;
1381             else if (i + 1 == argc)
1382               fatal ("Directory name missing after -I option");
1383             else
1384               dirtmp->fname = argv[++i];
1385             append_include_chain (dirtmp, dirtmp);
1386           }
1387         }
1388         break;
1389
1390       case 'n':
1391         if (!strcmp (argv[i], "-nostdinc"))
1392           /* -nostdinc causes no default include directories.
1393              You must specify all include-file directories with -I.  */
1394           no_standard_includes = 1;
1395         else if (!strcmp (argv[i], "-nostdinc++"))
1396           /* -nostdinc++ causes no default C++-specific include directories. */
1397           no_standard_cplusplus_includes = 1;
1398         else if (!strcmp (argv[i], "-noprecomp"))
1399           no_precomp = 1;
1400         break;
1401
1402       case 'u':
1403         /* Sun compiler passes undocumented switch "-undef".
1404            Let's assume it means to inhibit the predefined symbols.  */
1405         inhibit_predefs = 1;
1406         break;
1407
1408       case '\0': /* JF handle '-' as file name meaning stdin or stdout */
1409         if (in_fname == NULL) {
1410           in_fname = "";
1411           break;
1412         } else if (out_fname == NULL) {
1413           out_fname = "";
1414           break;
1415         }       /* else fall through into error */
1416
1417       default:
1418         fatal ("Invalid option `%s'", argv[i]);
1419       }
1420     }
1421   }
1422
1423   /* Add dirs from CPATH after dirs from -I.  */
1424   /* There seems to be confusion about what CPATH should do,
1425      so for the moment it is not documented.  */
1426   /* Some people say that CPATH should replace the standard include dirs,
1427      but that seems pointless: it comes before them, so it overrides them
1428      anyway.  */
1429   p = (char *) getenv ("CPATH");
1430   if (p != 0 && ! no_standard_includes)
1431     path_include (p);
1432
1433   /* Now that dollars_in_ident is known, initialize is_idchar.  */
1434   initialize_char_syntax ();
1435
1436   /* Initialize output buffer */
1437
1438   outbuf.buf = (U_CHAR *) xmalloc (OUTBUF_SIZE);
1439   outbuf.bufp = outbuf.buf;
1440   outbuf.length = OUTBUF_SIZE;
1441
1442   /* Do partial setup of input buffer for the sake of generating
1443      early #line directives (when -g is in effect).  */
1444
1445   fp = &instack[++indepth];
1446   if (in_fname == NULL)
1447     in_fname = "";
1448   fp->nominal_fname = fp->fname = in_fname;
1449   fp->lineno = 0;
1450
1451   /* Install __LINE__, etc.  Must follow initialize_char_syntax
1452      and option processing.  */
1453   initialize_builtins (fp, &outbuf);
1454
1455   /* Do standard #defines and assertions
1456      that identify system and machine type.  */
1457
1458   if (!inhibit_predefs) {
1459     char *p = (char *) alloca (strlen (predefs) + 1);
1460     strcpy (p, predefs);
1461     while (*p) {
1462       char *q;
1463       while (*p == ' ' || *p == '\t')
1464         p++;
1465       /* Handle -D options.  */ 
1466       if (p[0] == '-' && p[1] == 'D') {
1467         q = &p[2];
1468         while (*p && *p != ' ' && *p != '\t')
1469           p++;
1470         if (*p != 0)
1471           *p++= 0;
1472         if (debug_output)
1473           output_line_command (fp, &outbuf, 0, same_file);
1474         make_definition (q, &outbuf);
1475         while (*p == ' ' || *p == '\t')
1476           p++;
1477       } else if (p[0] == '-' && p[1] == 'A') {
1478         /* Handle -A options (assertions).  */ 
1479         char *assertion;
1480         char *past_name;
1481         char *value;
1482         char *past_value;
1483         char *termination;
1484         int save_char;
1485
1486         assertion = &p[2];
1487         past_name = assertion;
1488         /* Locate end of name.  */
1489         while (*past_name && *past_name != ' '
1490                && *past_name != '\t' && *past_name != '(')
1491           past_name++;
1492         /* Locate `(' at start of value.  */
1493         value = past_name;
1494         while (*value && (*value == ' ' || *value == '\t'))
1495           value++;
1496         if (*value++ != '(')
1497           abort ();
1498         while (*value && (*value == ' ' || *value == '\t'))
1499           value++;
1500         past_value = value;
1501         /* Locate end of value.  */
1502         while (*past_value && *past_value != ' '
1503                && *past_value != '\t' && *past_value != ')')
1504           past_value++;
1505         termination = past_value;
1506         while (*termination && (*termination == ' ' || *termination == '\t'))
1507           termination++;
1508         if (*termination++ != ')')
1509           abort ();
1510         if (*termination && *termination != ' ' && *termination != '\t')
1511           abort ();
1512         /* Temporarily null-terminate the value.  */
1513         save_char = *termination;
1514         *termination = '\0';
1515         /* Install the assertion.  */
1516         make_assertion ("-A", assertion);
1517         *termination = (char) save_char;
1518         p = termination;
1519         while (*p == ' ' || *p == '\t')
1520           p++;
1521       } else {
1522         abort ();
1523       }
1524     }
1525   }
1526
1527   /* Now handle the command line options.  */
1528
1529   /* Do -U's, -D's and -A's in the order they were seen.  */
1530   for (i = 1; i < argc; i++) {
1531     if (pend_undefs[i]) {
1532       if (debug_output)
1533         output_line_command (fp, &outbuf, 0, same_file);
1534       make_undef (pend_undefs[i], &outbuf);
1535     }
1536     if (pend_defs[i]) {
1537       if (debug_output)
1538         output_line_command (fp, &outbuf, 0, same_file);
1539       make_definition (pend_defs[i], &outbuf);
1540     }
1541     if (pend_assertions[i])
1542       make_assertion (pend_assertion_options[i], pend_assertions[i]);
1543   }
1544
1545   done_initializing = 1;
1546
1547   { /* read the appropriate environment variable and if it exists
1548        replace include_defaults with the listed path. */
1549     char *epath = 0;
1550     switch ((objc << 1) + cplusplus)
1551       {
1552       case 0:
1553         epath = getenv ("C_INCLUDE_PATH");
1554         break;
1555       case 1:
1556         epath = getenv ("CPLUS_INCLUDE_PATH");
1557         break;
1558       case 2:
1559         epath = getenv ("OBJC_INCLUDE_PATH");
1560         break;
1561       case 3:
1562         epath = getenv ("OBJCPLUS_INCLUDE_PATH");
1563         break;
1564       }
1565     /* If the environment var for this language is set,
1566        add to the default list of include directories.  */
1567     if (epath) {
1568       char *nstore = (char *) alloca (strlen (epath) + 2);
1569       int num_dirs;
1570       char *startp, *endp;
1571
1572       for (num_dirs = 1, startp = epath; *startp; startp++)
1573         if (*startp == PATH_SEPARATOR)
1574           num_dirs++;
1575       include_defaults
1576         = (struct default_include *) xmalloc ((num_dirs
1577                                                * sizeof (struct default_include))
1578                                               + sizeof (include_defaults_array));
1579       startp = endp = epath;
1580       num_dirs = 0;
1581       while (1) {
1582         /* Handle cases like c:/usr/lib:d:/gcc/lib */
1583         if ((*endp == PATH_SEPARATOR
1584 #if 0 /* Obsolete, now that we use semicolons as the path separator.  */
1585 #ifdef __MSDOS__
1586              && (endp-startp != 1 || !isalpha (*startp))
1587 #endif
1588 #endif
1589              )
1590             || *endp == 0) {
1591           strncpy (nstore, startp, endp-startp);
1592           if (endp == startp)
1593             strcpy (nstore, ".");
1594           else
1595             nstore[endp-startp] = '\0';
1596
1597           include_defaults[num_dirs].fname = savestring (nstore);
1598           include_defaults[num_dirs].cplusplus = cplusplus;
1599           num_dirs++;
1600           if (*endp == '\0')
1601             break;
1602           endp = startp = endp + 1;
1603         } else
1604           endp++;
1605       }
1606       /* Put the usual defaults back in at the end.  */
1607       bcopy (include_defaults_array, &include_defaults[num_dirs],
1608              sizeof (include_defaults_array));
1609     }
1610   }
1611
1612   first_system_include = 0;
1613   /* Unless -fnostdinc,
1614      tack on the standard include file dirs to the specified list */
1615   if (!no_standard_includes) {
1616     struct default_include *p = include_defaults;
1617     char *specd_prefix = include_prefix;
1618     char *default_prefix = savestring (GCC_INCLUDE_DIR);
1619     int default_len = 0;
1620     /* Remove the `include' from /usr/local/lib/gcc.../include.  */
1621     if (!strcmp (default_prefix + strlen (default_prefix) - 8, "/include")) {
1622       default_len = strlen (default_prefix) - 7;
1623       default_prefix[default_len] = 0;
1624     }
1625     /* Search "translated" versions of GNU directories.
1626        These have /usr/local/lib/gcc... replaced by specd_prefix.  */
1627     if (specd_prefix != 0 && default_len != 0)
1628       for (p = include_defaults; p->fname; p++) {
1629         /* Some standard dirs are only for C++.  */
1630         if (!p->cplusplus || (cplusplus && !no_standard_cplusplus_includes)) {
1631           /* Does this dir start with the prefix?  */
1632           if (!strncmp (p->fname, default_prefix, default_len)) {
1633             /* Yes; change prefix and add to search list.  */
1634             struct file_name_list *new
1635               = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
1636             int this_len = strlen (specd_prefix) + strlen (p->fname) - default_len;
1637             char *str = (char *) xmalloc (this_len + 1);
1638             strcpy (str, specd_prefix);
1639             strcat (str, p->fname + default_len);
1640             new->fname = str;
1641             new->control_macro = 0;
1642             append_include_chain (new, new);
1643             if (first_system_include == 0)
1644               first_system_include = new;
1645           }
1646         }
1647       }
1648     /* Search ordinary names for GNU include directories.  */
1649     for (p = include_defaults; p->fname; p++) {
1650       /* Some standard dirs are only for C++.  */
1651       if (!p->cplusplus || (cplusplus && !no_standard_cplusplus_includes)) {
1652         struct file_name_list *new
1653           = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
1654         new->control_macro = 0;
1655         new->fname = p->fname;
1656         append_include_chain (new, new);
1657         if (first_system_include == 0)
1658           first_system_include = new;
1659       }
1660     }
1661   }
1662
1663   /* Tack the after_include chain at the end of the include chain.  */
1664   append_include_chain (after_include, last_after_include);
1665   if (first_system_include == 0)
1666     first_system_include = after_include;
1667
1668   /* Scan the -imacros files before the main input.
1669      Much like #including them, but with no_output set
1670      so that only their macro definitions matter.  */
1671
1672   no_output++;
1673   for (i = 1; i < argc; i++)
1674     if (pend_files[i]) {
1675       int fd = open (pend_files[i], O_RDONLY, 0666);
1676       if (fd < 0) {
1677         perror_with_name (pend_files[i]);
1678         return FAILURE_EXIT_CODE;
1679       }
1680       finclude (fd, pend_files[i], &outbuf, 0, NULL_PTR);
1681     }
1682   no_output--;
1683
1684   /* Copy the entire contents of the main input file into
1685      the stacked input buffer previously allocated for it.  */
1686
1687   /* JF check for stdin */
1688   if (in_fname == NULL || *in_fname == 0) {
1689     in_fname = "";
1690     f = 0;
1691   } else if ((f = open (in_fname, O_RDONLY, 0666)) < 0)
1692     goto perror;
1693
1694   /* Either of two environment variables can specify output of deps.
1695      Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
1696      where OUTPUT_FILE is the file to write deps info to
1697      and DEPS_TARGET is the target to mention in the deps.  */
1698
1699   if (print_deps == 0
1700       && (getenv ("SUNPRO_DEPENDENCIES") != 0
1701           || getenv ("DEPENDENCIES_OUTPUT") != 0)) {
1702     char *spec = getenv ("DEPENDENCIES_OUTPUT");
1703     char *s;
1704     char *output_file;
1705
1706     if (spec == 0) {
1707       spec = getenv ("SUNPRO_DEPENDENCIES");
1708       print_deps = 2;
1709     }
1710     else
1711       print_deps = 1;
1712
1713     s = spec;
1714     /* Find the space before the DEPS_TARGET, if there is one.  */
1715     /* This should use index.  (mrs) */
1716     while (*s != 0 && *s != ' ') s++;
1717     if (*s != 0) {
1718       deps_target = s + 1;
1719       output_file = (char *) xmalloc (s - spec + 1);
1720       bcopy (spec, output_file, s - spec);
1721       output_file[s - spec] = 0;
1722     }
1723     else {
1724       deps_target = 0;
1725       output_file = spec;
1726     }
1727       
1728     deps_file = output_file;
1729     deps_mode = "a";
1730   }
1731
1732   /* For -M, print the expected object file name
1733      as the target of this Make-rule.  */
1734   if (print_deps) {
1735     deps_allocated_size = 200;
1736     deps_buffer = (char *) xmalloc (deps_allocated_size);
1737     deps_buffer[0] = 0;
1738     deps_size = 0;
1739     deps_column = 0;
1740
1741     if (deps_target) {
1742       deps_output (deps_target, 0);
1743       deps_output (":", 0);
1744     } else if (*in_fname == 0)
1745       deps_output ("-: ", 0);
1746     else {
1747       int len;
1748       char *p = in_fname;
1749       char *p1 = p;
1750       /* Discard all directory prefixes from P.  */
1751       while (*p1) {
1752         if (*p1 == '/')
1753           p = p1 + 1;
1754         p1++;
1755       }
1756       /* Output P, but remove known suffixes.  */
1757       len = strlen (p);
1758       if (p[len - 2] == '.' && p[len - 1] == 'c')
1759         deps_output (p, len - 2);
1760       else if (p[len - 2] == '.' && p[len - 1] == 'C')
1761         deps_output (p, len - 2);
1762       else if (p[len - 3] == '.'
1763                && p[len - 2] == 'c'
1764                && p[len - 1] == 'c')
1765         deps_output (p, len - 3);
1766       else if (p[len - 4] == '.'
1767                && p[len - 3] == 'c'
1768                && p[len - 2] == 'x'
1769                && p[len - 1] == 'x')
1770         deps_output (p, len - 4);
1771       else if (p[len - 2] == '.' && p[len - 1] == 's')
1772         deps_output (p, len - 2);
1773       else if (p[len - 2] == '.' && p[len - 1] == 'S')
1774         deps_output (p, len - 2);
1775       else if (p[len - 2] == '.' && p[len - 1] == 'm')
1776         deps_output (p, len - 2);
1777       else
1778         deps_output (p, 0);
1779       /* Supply our own suffix.  */
1780 #ifndef VMS
1781       deps_output (".o : ", 0);
1782 #else
1783       deps_output (".obj : ", 0);
1784 #endif
1785       deps_output (in_fname, 0);
1786       deps_output (" ", 0);
1787     }
1788   }
1789
1790   file_size_and_mode (f, &st_mode, &st_size);
1791   fp->nominal_fname = fp->fname = in_fname;
1792   fp->lineno = 1;
1793   fp->system_header_p = 0;
1794   /* JF all this is mine about reading pipes and ttys */
1795   if (! S_ISREG (st_mode)) {
1796     /* Read input from a file that is not a normal disk file.
1797        We cannot preallocate a buffer with the correct size,
1798        so we must read in the file a piece at the time and make it bigger.  */
1799     int size;
1800     int bsize;
1801     int cnt;
1802     U_CHAR *bufp;
1803
1804     bsize = 2000;
1805     size = 0;
1806     fp->buf = (U_CHAR *) xmalloc (bsize + 2);
1807     bufp = fp->buf;
1808     for (;;) {
1809       cnt = read (f, bufp, bsize - size);
1810       if (cnt < 0) goto perror; /* error! */
1811       if (cnt == 0) break;      /* End of file */
1812       size += cnt;
1813       bufp += cnt;
1814       if (bsize == size) {      /* Buffer is full! */
1815         bsize *= 2;
1816         fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
1817         bufp = fp->buf + size;  /* May have moved */
1818       }
1819     }
1820     fp->length = size;
1821   } else {
1822     /* Read a file whose size we can determine in advance.
1823        For the sake of VMS, st_size is just an upper bound.  */
1824     long i;
1825     fp->length = 0;
1826     fp->buf = (U_CHAR *) xmalloc (st_size + 2);
1827
1828     while (st_size > 0) {
1829       i = read (f, fp->buf + fp->length, st_size);
1830       if (i <= 0) {
1831         if (i == 0) break;
1832         goto perror;
1833       }
1834       fp->length += i;
1835       st_size -= i;
1836     }
1837   }
1838   fp->bufp = fp->buf;
1839   fp->if_stack = if_stack;
1840
1841   /* Make sure data ends with a newline.  And put a null after it.  */
1842
1843   if ((fp->length > 0 && fp->buf[fp->length - 1] != '\n')
1844       /* Backslash-newline at end is not good enough.  */
1845       || (fp->length > 1 && fp->buf[fp->length - 2] == '\\')) {
1846     fp->buf[fp->length++] = '\n';
1847     missing_newline = 1;
1848   }
1849   fp->buf[fp->length] = '\0';
1850
1851   /* Unless inhibited, convert trigraphs in the input.  */
1852
1853   if (!no_trigraphs)
1854     trigraph_pcp (fp);
1855
1856   /* Now that we know the input file is valid, open the output.  */
1857
1858   if (!out_fname || !strcmp (out_fname, ""))
1859     out_fname = "stdout";
1860   else if (! freopen (out_fname, "w", stdout))
1861     pfatal_with_name (out_fname);
1862
1863   output_line_command (fp, &outbuf, 0, same_file);
1864
1865   /* Scan the -include files before the main input.  */
1866
1867   for (i = 1; i < argc; i++)
1868     if (pend_includes[i]) {
1869       int fd = open (pend_includes[i], O_RDONLY, 0666);
1870       if (fd < 0) {
1871         perror_with_name (pend_includes[i]);
1872         return FAILURE_EXIT_CODE;
1873       }
1874       finclude (fd, pend_includes[i], &outbuf, 0, NULL_PTR);
1875     }
1876
1877   /* Scan the input, processing macros and directives.  */
1878
1879   rescan (&outbuf, 0);
1880
1881   if (missing_newline)
1882     fp->lineno--;
1883
1884   if (pedantic && missing_newline)
1885     pedwarn ("file does not end in newline");
1886
1887   /* Now we have processed the entire input
1888      Write whichever kind of output has been requested.  */
1889
1890   if (dump_macros == dump_only)
1891     dump_all_macros ();
1892   else if (! inhibit_output) {
1893     write_output ();
1894   }
1895
1896   if (print_deps) {
1897     /* Don't actually write the deps file if compilation has failed.  */
1898     if (errors == 0) {
1899       if (deps_file && ! (deps_stream = fopen (deps_file, deps_mode)))
1900         pfatal_with_name (deps_file);
1901       fputs (deps_buffer, deps_stream);
1902       putc ('\n', deps_stream);
1903       if (deps_file) {
1904         if (ferror (deps_stream) || fclose (deps_stream) != 0)
1905           fatal ("I/O error on output");
1906       }
1907     }
1908   }
1909
1910   if (pcp_outfile && pcp_outfile != stdout
1911       && (ferror (pcp_outfile) || fclose (pcp_outfile) != 0))
1912     fatal ("I/O error on `-pcp' output");
1913
1914   if (ferror (stdout) || fclose (stdout) != 0)
1915     fatal ("I/O error on output");
1916
1917   if (errors)
1918     exit (FAILURE_EXIT_CODE);
1919   exit (SUCCESS_EXIT_CODE);
1920
1921  perror:
1922   pfatal_with_name (in_fname);
1923   return 0;
1924 }
1925 \f
1926 /* Given a colon-separated list of file names PATH,
1927    add all the names to the search path for include files.  */
1928
1929 static void
1930 path_include (path)
1931      char *path;
1932 {
1933   char *p;
1934
1935   p = path;
1936
1937   if (*p)
1938     while (1) {
1939       char *q = p;
1940       char *name;
1941       struct file_name_list *dirtmp;
1942
1943       /* Find the end of this name.  */
1944       while (*q != 0 && *q != PATH_SEPARATOR) q++;
1945       if (p == q) {
1946         /* An empty name in the path stands for the current directory.  */
1947         name = (char *) xmalloc (2);
1948         name[0] = '.';
1949         name[1] = 0;
1950       } else {
1951         /* Otherwise use the directory that is named.  */
1952         name = (char *) xmalloc (q - p + 1);
1953         bcopy (p, name, q - p);
1954         name[q - p] = 0;
1955       }
1956
1957       dirtmp = (struct file_name_list *)
1958         xmalloc (sizeof (struct file_name_list));
1959       dirtmp->next = 0;         /* New one goes on the end */
1960       dirtmp->control_macro = 0;
1961       dirtmp->fname = name;
1962       append_include_chain (dirtmp, dirtmp);
1963
1964       /* Advance past this name.  */
1965       p = q;
1966       if (*p == 0)
1967         break;
1968       /* Skip the colon.  */
1969       p++;
1970     }
1971 }
1972 \f
1973 /* Pre-C-Preprocessor to translate ANSI trigraph idiocy in BUF
1974    before main CCCP processing.  Name `pcp' is also in honor of the
1975    drugs the trigraph designers must have been on.
1976
1977    Using an extra pass through the buffer takes a little extra time,
1978    but is infinitely less hairy than trying to handle trigraphs inside
1979    strings, etc. everywhere, and also makes sure that trigraphs are
1980    only translated in the top level of processing. */
1981
1982 static void
1983 trigraph_pcp (buf)
1984      FILE_BUF *buf;
1985 {
1986   register U_CHAR c, *fptr, *bptr, *sptr;
1987   int len;
1988
1989   fptr = bptr = sptr = buf->buf;
1990   while ((sptr = (U_CHAR *) index (sptr, '?')) != NULL) {
1991     if (*++sptr != '?')
1992       continue;
1993     switch (*++sptr) {
1994       case '=':
1995       c = '#';
1996       break;
1997     case '(':
1998       c = '[';
1999       break;
2000     case '/':
2001       c = '\\';
2002       break;
2003     case ')':
2004       c = ']';
2005       break;
2006     case '\'':
2007       c = '^';
2008       break;
2009     case '<':
2010       c = '{';
2011       break;
2012     case '!':
2013       c = '|';
2014       break;
2015     case '>':
2016       c = '}';
2017       break;
2018     case '-':
2019       c  = '~';
2020       break;
2021     case '?':
2022       sptr--;
2023       continue;
2024     default:
2025       continue;
2026     }
2027     len = sptr - fptr - 2;
2028     if (bptr != fptr && len > 0)
2029       bcopy (fptr, bptr, len);  /* BSD doc says bcopy () works right
2030                                    for overlapping strings.  In ANSI
2031                                    C, this will be memmove (). */
2032     bptr += len;
2033     *bptr++ = c;
2034     fptr = ++sptr;
2035   }
2036   len = buf->length - (fptr - buf->buf);
2037   if (bptr != fptr && len > 0)
2038     bcopy (fptr, bptr, len);
2039   buf->length -= fptr - bptr;
2040   buf->buf[buf->length] = '\0';
2041   if (warn_trigraphs && fptr != bptr)
2042     warning ("%d trigraph(s) encountered", (fptr - bptr) / 2);
2043 }
2044 \f
2045 /* Move all backslash-newline pairs out of embarrassing places.
2046    Exchange all such pairs following BP
2047    with any potentially-embarrassing characters that follow them.
2048    Potentially-embarrassing characters are / and *
2049    (because a backslash-newline inside a comment delimiter
2050    would cause it not to be recognized).  */
2051
2052 static void
2053 newline_fix (bp)
2054      U_CHAR *bp;
2055 {
2056   register U_CHAR *p = bp;
2057   register int count = 0;
2058
2059   /* First count the backslash-newline pairs here.  */
2060
2061   while (1) {
2062     if (p[0] == '\\') {
2063       if (p[1] == '\n')
2064         p += 2, count++;
2065       else if (p[1] == '\r' && p[2] == '\n')
2066         p += 3, count++;
2067       else
2068         break;
2069     } else
2070       break;
2071   }
2072
2073   /* What follows the backslash-newlines is not embarrassing.  */
2074
2075   if (count == 0 || (*p != '/' && *p != '*'))
2076     return;
2077
2078   /* Copy all potentially embarrassing characters
2079      that follow the backslash-newline pairs
2080      down to where the pairs originally started.  */
2081
2082   while (*p == '*' || *p == '/')
2083     *bp++ = *p++;
2084
2085   /* Now write the same number of pairs after the embarrassing chars.  */
2086   while (count-- > 0) {
2087     *bp++ = '\\';
2088     *bp++ = '\n';
2089   }
2090 }
2091
2092 /* Like newline_fix but for use within a directive-name.
2093    Move any backslash-newlines up past any following symbol constituents.  */
2094
2095 static void
2096 name_newline_fix (bp)
2097      U_CHAR *bp;
2098 {
2099   register U_CHAR *p = bp;
2100   register int count = 0;
2101
2102   /* First count the backslash-newline pairs here.  */
2103   while (1) {
2104     if (p[0] == '\\') {
2105       if (p[1] == '\n')
2106         p += 2, count++;
2107       else if (p[1] == '\r' && p[2] == '\n')
2108         p += 3, count++;
2109       else
2110         break;
2111     } else
2112       break;
2113   }
2114
2115   /* What follows the backslash-newlines is not embarrassing.  */
2116
2117   if (count == 0 || !is_idchar[*p])
2118     return;
2119
2120   /* Copy all potentially embarrassing characters
2121      that follow the backslash-newline pairs
2122      down to where the pairs originally started.  */
2123
2124   while (is_idchar[*p])
2125     *bp++ = *p++;
2126
2127   /* Now write the same number of pairs after the embarrassing chars.  */
2128   while (count-- > 0) {
2129     *bp++ = '\\';
2130     *bp++ = '\n';
2131   }
2132 }
2133 \f
2134 /* Look for lint commands in comments.
2135
2136    When we come in here, ibp points into a comment.  Limit is as one expects.
2137    scan within the comment -- it should start, after lwsp, with a lint command.
2138    If so that command is returned as a (constant) string.
2139
2140    Upon return, any arg will be pointed to with argstart and will be
2141    arglen long.  Note that we don't parse that arg since it will just
2142    be printed out again.
2143 */
2144
2145 static char *
2146 get_lintcmd (ibp, limit, argstart, arglen, cmdlen)
2147      register U_CHAR *ibp;
2148      register U_CHAR *limit;
2149      U_CHAR **argstart;         /* point to command arg */
2150      int *arglen, *cmdlen;      /* how long they are */
2151 {
2152   long linsize;
2153   register U_CHAR *numptr;      /* temp for arg parsing */
2154
2155   *arglen = 0;
2156
2157   SKIP_WHITE_SPACE (ibp);
2158
2159   if (ibp >= limit) return NULL;
2160
2161   linsize = limit - ibp;
2162   
2163   /* Oh, I wish C had lexical functions... hell, I'll just open-code the set */
2164   if ((linsize >= 10) && !strncmp (ibp, "NOTREACHED", 10)) {
2165     *cmdlen = 10;
2166     return "NOTREACHED";
2167   }
2168   if ((linsize >= 8) && !strncmp (ibp, "ARGSUSED", 8)) {
2169     *cmdlen = 8;
2170     return "ARGSUSED";
2171   }
2172   if ((linsize >= 11) && !strncmp (ibp, "LINTLIBRARY", 11)) {
2173     *cmdlen = 11;
2174     return "LINTLIBRARY";
2175   }
2176   if ((linsize >= 7) && !strncmp (ibp, "VARARGS", 7)) {
2177     *cmdlen = 7;
2178     ibp += 7; linsize -= 7;
2179     if ((linsize == 0) || ! isdigit (*ibp)) return "VARARGS";
2180
2181     /* OK, read a number */
2182     for (numptr = *argstart = ibp; (numptr < limit) && isdigit (*numptr);
2183          numptr++);
2184     *arglen = numptr - *argstart;
2185     return "VARARGS";
2186   }
2187   return NULL;
2188 }
2189 \f
2190 /*
2191  * The main loop of the program.
2192  *
2193  * Read characters from the input stack, transferring them to the
2194  * output buffer OP.
2195  *
2196  * Macros are expanded and push levels on the input stack.
2197  * At the end of such a level it is popped off and we keep reading.
2198  * At the end of any other kind of level, we return.
2199  * #-directives are handled, except within macros.
2200  *
2201  * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input
2202  * and insert them when appropriate.  This is set while scanning macro
2203  * arguments before substitution.  It is zero when scanning for final output.
2204  *   There are three types of Newline markers:
2205  *   * Newline -  follows a macro name that was not expanded
2206  *     because it appeared inside an expansion of the same macro.
2207  *     This marker prevents future expansion of that identifier.
2208  *     When the input is rescanned into the final output, these are deleted.
2209  *     These are also deleted by ## concatenation.
2210  *   * Newline Space (or Newline and any other whitespace character)
2211  *     stands for a place that tokens must be separated or whitespace
2212  *     is otherwise desirable, but where the ANSI standard specifies there
2213  *     is no whitespace.  This marker turns into a Space (or whichever other
2214  *     whitespace char appears in the marker) in the final output,
2215  *     but it turns into nothing in an argument that is stringified with #.
2216  *     Such stringified arguments are the only place where the ANSI standard
2217  *     specifies with precision that whitespace may not appear.
2218  *
2219  * During this function, IP->bufp is kept cached in IBP for speed of access.
2220  * Likewise, OP->bufp is kept in OBP.  Before calling a subroutine
2221  * IBP, IP and OBP must be copied back to memory.  IP and IBP are
2222  * copied back with the RECACHE macro.  OBP must be copied back from OP->bufp
2223  * explicitly, and before RECACHE, since RECACHE uses OBP.
2224  */
2225
2226 static void
2227 rescan (op, output_marks)
2228      FILE_BUF *op;
2229      int output_marks;
2230 {
2231   /* Character being scanned in main loop.  */
2232   register U_CHAR c;
2233
2234   /* Length of pending accumulated identifier.  */
2235   register int ident_length = 0;
2236
2237   /* Hash code of pending accumulated identifier.  */
2238   register int hash = 0;
2239
2240   /* Current input level (&instack[indepth]).  */
2241   FILE_BUF *ip;
2242
2243   /* Pointer for scanning input.  */
2244   register U_CHAR *ibp;
2245
2246   /* Pointer to end of input.  End of scan is controlled by LIMIT.  */
2247   register U_CHAR *limit;
2248
2249   /* Pointer for storing output.  */
2250   register U_CHAR *obp;
2251
2252   /* REDO_CHAR is nonzero if we are processing an identifier
2253      after backing up over the terminating character.
2254      Sometimes we process an identifier without backing up over
2255      the terminating character, if the terminating character
2256      is not special.  Backing up is done so that the terminating character
2257      will be dispatched on again once the identifier is dealt with.  */
2258   int redo_char = 0;
2259
2260   /* 1 if within an identifier inside of which a concatenation
2261      marker (Newline -) has been seen.  */
2262   int concatenated = 0;
2263
2264   /* While scanning a comment or a string constant,
2265      this records the line it started on, for error messages.  */
2266   int start_line;
2267
2268   /* Record position of last `real' newline.  */
2269   U_CHAR *beg_of_line;
2270
2271 /* Pop the innermost input stack level, assuming it is a macro expansion.  */
2272
2273 #define POPMACRO \
2274 do { ip->macro->type = T_MACRO;         \
2275      if (ip->free_ptr) free (ip->free_ptr);     \
2276      --indepth; } while (0)
2277
2278 /* Reload `rescan's local variables that describe the current
2279    level of the input stack.  */
2280
2281 #define RECACHE  \
2282 do { ip = &instack[indepth];            \
2283      ibp = ip->bufp;                    \
2284      limit = ip->buf + ip->length;      \
2285      op->bufp = obp;                    \
2286      check_expand (op, limit - ibp);    \
2287      beg_of_line = 0;                   \
2288      obp = op->bufp; } while (0)
2289
2290   if (no_output && instack[indepth].fname != 0)
2291     skip_if_group (&instack[indepth], 1);
2292
2293   obp = op->bufp;
2294   RECACHE;
2295
2296   beg_of_line = ibp;
2297
2298   /* Our caller must always put a null after the end of
2299      the input at each input stack level.  */
2300   if (*limit != 0)
2301     abort ();
2302
2303   while (1) {
2304     c = *ibp++;
2305     *obp++ = c;
2306
2307     switch (c) {
2308     case '\\':
2309       if (ibp >= limit)
2310         break;
2311       if (*ibp == '\n') {
2312         /* Always merge lines ending with backslash-newline,
2313            even in middle of identifier.  */
2314         ++ibp;
2315         ++ip->lineno;
2316         --obp;          /* remove backslash from obuf */
2317         break;
2318       }
2319       /* Otherwise, backslash suppresses specialness of following char,
2320          so copy it here to prevent the switch from seeing it.
2321          But first get any pending identifier processed.  */
2322       if (ident_length > 0)
2323         goto specialchar;
2324       *obp++ = *ibp++;
2325       break;
2326
2327     case '#':
2328       if (assertions_flag) {
2329         /* Copy #foo (bar lose) without macro expansion.  */
2330         SKIP_WHITE_SPACE (ibp);
2331         while (is_idchar[*ibp])
2332           *obp++ = *ibp++;
2333         SKIP_WHITE_SPACE (ibp);
2334         if (*ibp == '(') {
2335           ip->bufp = ibp;
2336           skip_paren_group (ip);
2337           bcopy (ibp, obp, ip->bufp - ibp);
2338           obp += ip->bufp - ibp;
2339           ibp = ip->bufp;
2340         }
2341       }
2342
2343       /* If this is expanding a macro definition, don't recognize
2344          preprocessor directives.  */
2345       if (ip->macro != 0)
2346         goto randomchar;
2347       /* If this is expand_into_temp_buffer, recognize them
2348          only after an actual newline at this level,
2349          not at the beginning of the input level.  */
2350       if (ip->fname == 0 && beg_of_line == ip->buf)
2351         goto randomchar;
2352       if (ident_length)
2353         goto specialchar;
2354
2355       
2356       /* # keyword: a # must be first nonblank char on the line */
2357       if (beg_of_line == 0)
2358         goto randomchar;
2359       {
2360         U_CHAR *bp;
2361
2362         /* Scan from start of line, skipping whitespace, comments
2363            and backslash-newlines, and see if we reach this #.
2364            If not, this # is not special.  */
2365         bp = beg_of_line;
2366         /* If -traditional, require # to be at beginning of line.  */
2367         if (!traditional)
2368           while (1) {
2369             if (is_hor_space[*bp])
2370               bp++;
2371             else if (*bp == '\\' && bp[1] == '\n')
2372               bp += 2;
2373             else if (*bp == '/' && bp[1] == '*') {
2374               bp += 2;
2375               while (!(*bp == '*' && bp[1] == '/'))
2376                 bp++;
2377               bp += 2;
2378             }
2379             else if (cplusplus_comments && *bp == '/' && bp[1] == '/') {
2380               bp += 2;
2381               while (*bp++ != '\n') ;
2382             }
2383             else break;
2384           }
2385         if (bp + 1 != ibp)
2386           goto randomchar;
2387       }
2388
2389       /* This # can start a directive.  */
2390
2391       --obp;            /* Don't copy the '#' */
2392
2393       ip->bufp = ibp;
2394       op->bufp = obp;
2395       if (! handle_directive (ip, op)) {
2396 #ifdef USE_C_ALLOCA
2397         alloca (0);
2398 #endif
2399         /* Not a known directive: treat it as ordinary text.
2400            IP, OP, IBP, etc. have not been changed.  */
2401         if (no_output && instack[indepth].fname) {
2402           /* If not generating expanded output,
2403              what we do with ordinary text is skip it.
2404              Discard everything until next # directive.  */
2405           skip_if_group (&instack[indepth], 1);
2406           RECACHE;
2407           beg_of_line = ibp;
2408           break;
2409         }
2410         ++obp;          /* Copy the '#' after all */
2411         goto randomchar;
2412       }
2413 #ifdef USE_C_ALLOCA
2414       alloca (0);
2415 #endif
2416       /* A # directive has been successfully processed.  */
2417       /* If not generating expanded output, ignore everything until
2418          next # directive.  */
2419       if (no_output && instack[indepth].fname)
2420         skip_if_group (&instack[indepth], 1);
2421       obp = op->bufp;
2422       RECACHE;
2423       beg_of_line = ibp;
2424       break;
2425
2426     case '\"':                  /* skip quoted string */
2427     case '\'':
2428       /* A single quoted string is treated like a double -- some
2429          programs (e.g., troff) are perverse this way */
2430
2431       if (ident_length)
2432         goto specialchar;
2433
2434       start_line = ip->lineno;
2435
2436       /* Skip ahead to a matching quote.  */
2437
2438       while (1) {
2439         if (ibp >= limit) {
2440           if (ip->macro != 0) {
2441             /* try harder: this string crosses a macro expansion boundary.
2442                This can happen naturally if -traditional.
2443                Otherwise, only -D can make a macro with an unmatched quote.  */
2444             POPMACRO;
2445             RECACHE;
2446             continue;
2447           }
2448           if (!traditional) {
2449             error_with_line (line_for_error (start_line),
2450                              "unterminated string or character constant");
2451             error_with_line (multiline_string_line,
2452                              "possible real start of unterminated constant");
2453             multiline_string_line = 0;
2454           }
2455           break;
2456         }
2457         *obp++ = *ibp;
2458         switch (*ibp++) {
2459         case '\n':
2460           ++ip->lineno;
2461           ++op->lineno;
2462           /* Traditionally, end of line ends a string constant with no error.
2463              So exit the loop and record the new line.  */
2464           if (traditional) {
2465             beg_of_line = ibp;
2466             goto while2end;
2467           }
2468           if (c == '\'') {
2469             error_with_line (line_for_error (start_line),
2470                              "unterminated character constant");
2471             goto while2end;
2472           }
2473           if (pedantic && multiline_string_line == 0) {
2474             pedwarn_with_line (line_for_error (start_line),
2475                                "string constant runs past end of line");
2476           }
2477           if (multiline_string_line == 0)
2478             multiline_string_line = ip->lineno - 1;
2479           break;
2480
2481         case '\\':
2482           if (ibp >= limit)
2483             break;
2484           if (*ibp == '\n') {
2485             /* Backslash newline is replaced by nothing at all,
2486                but keep the line counts correct.  */
2487             --obp;
2488             ++ibp;
2489             ++ip->lineno;
2490           } else {
2491             /* ANSI stupidly requires that in \\ the second \
2492                is *not* prevented from combining with a newline.  */
2493             while (*ibp == '\\' && ibp[1] == '\n') {
2494               ibp += 2;
2495               ++ip->lineno;
2496             }
2497             *obp++ = *ibp++;
2498           }
2499           break;
2500
2501         case '\"':
2502         case '\'':
2503           if (ibp[-1] == c)
2504             goto while2end;
2505           break;
2506         }
2507       }
2508     while2end:
2509       break;
2510
2511     case '/':
2512       if (*ibp == '\\' && ibp[1] == '\n')
2513         newline_fix (ibp);
2514
2515       if (*ibp != '*'
2516           && !(cplusplus_comments && *ibp == '/'))
2517         goto randomchar;
2518       if (ip->macro != 0)
2519         goto randomchar;
2520       if (ident_length)
2521         goto specialchar;
2522
2523       if (*ibp == '/') {
2524         /* C++ style comment... */
2525         start_line = ip->lineno;
2526
2527         --ibp;                  /* Back over the slash */
2528         --obp;
2529
2530         /* Comments are equivalent to spaces. */
2531         if (! put_out_comments)
2532           *obp++ = ' ';
2533         else {
2534           /* must fake up a comment here */
2535           *obp++ = '/';
2536           *obp++ = '/';
2537         }
2538         {
2539           U_CHAR *before_bp = ibp+2;
2540
2541           while (ibp < limit) {
2542             if (*ibp++ == '\n') {
2543               ibp--;
2544               if (put_out_comments) {
2545                 bcopy (before_bp, obp, ibp - before_bp);
2546                 obp += ibp - before_bp;
2547               }
2548               break;
2549             }
2550           }
2551           break;
2552         }
2553       }
2554
2555       /* Ordinary C comment.  Skip it, optionally copying it to output.  */
2556
2557       start_line = ip->lineno;
2558
2559       ++ibp;                    /* Skip the star. */
2560
2561       /* If this cpp is for lint, we peek inside the comments: */
2562       if (lint) {
2563         U_CHAR *argbp;
2564         int cmdlen, arglen;
2565         char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen);
2566
2567         if (lintcmd != NULL) {
2568           /* I believe it is always safe to emit this newline: */
2569           obp[-1] = '\n';
2570           bcopy ("#pragma lint ", obp, 13);
2571           obp += 13;
2572           bcopy (lintcmd, obp, cmdlen);
2573           obp += cmdlen;
2574
2575           if (arglen != 0) {
2576             *(obp++) = ' ';
2577             bcopy (argbp, obp, arglen);
2578             obp += arglen;
2579           }
2580
2581           /* OK, now bring us back to the state we were in before we entered
2582              this branch.  We need #line b/c the newline for the pragma
2583              could fuck things up. */
2584           output_line_command (ip, op, 0, same_file);
2585           *(obp++) = ' ';       /* just in case, if comments are copied thru */
2586           *(obp++) = '/';
2587         }
2588       }
2589
2590       /* Comments are equivalent to spaces.
2591          Note that we already output the slash; we might not want it.
2592          For -traditional, a comment is equivalent to nothing.  */
2593       if (! put_out_comments) {
2594         if (traditional)
2595           obp--;
2596         else
2597           obp[-1] = ' ';
2598       }
2599       else
2600         *obp++ = '*';
2601
2602       {
2603         U_CHAR *before_bp = ibp;
2604
2605         while (ibp < limit) {
2606           switch (*ibp++) {
2607           case '/':
2608             if (warn_comments && ibp < limit && *ibp == '*')
2609               warning ("`/*' within comment");
2610             break;
2611           case '*':
2612             if (*ibp == '\\' && ibp[1] == '\n')
2613               newline_fix (ibp);
2614             if (ibp >= limit || *ibp == '/')
2615               goto comment_end;
2616             break;
2617           case '\n':
2618             ++ip->lineno;
2619             /* Copy the newline into the output buffer, in order to
2620                avoid the pain of a #line every time a multiline comment
2621                is seen.  */
2622             if (!put_out_comments)
2623               *obp++ = '\n';
2624             ++op->lineno;
2625           }
2626         }
2627       comment_end:
2628
2629         if (ibp >= limit)
2630           error_with_line (line_for_error (start_line),
2631                            "unterminated comment");
2632         else {
2633           ibp++;
2634           if (put_out_comments) {
2635             bcopy (before_bp, obp, ibp - before_bp);
2636             obp += ibp - before_bp;
2637           }
2638         }
2639       }
2640       break;
2641
2642     case '$':
2643       if (!dollars_in_ident)
2644         goto randomchar;
2645       goto letter;
2646
2647     case '0': case '1': case '2': case '3': case '4':
2648     case '5': case '6': case '7': case '8': case '9':
2649       /* If digit is not part of identifier, it starts a number,
2650          which means that following letters are not an identifier.
2651          "0x5" does not refer to an identifier "x5".
2652          So copy all alphanumerics that follow without accumulating
2653          as an identifier.  Periods also, for sake of "3.e7".  */
2654
2655       if (ident_length == 0) {
2656         while (ibp < limit) {
2657           while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
2658             ++ip->lineno;
2659             ibp += 2;
2660           }
2661           c = *ibp++;
2662           /* ".." terminates a preprocessing number.  This is useless for C
2663              code but useful for preprocessing other things.  */
2664           if (!isalnum (c) && (c != '.' || *ibp == '.') && c != '_') {
2665             --ibp;
2666             break;
2667           }
2668           *obp++ = c;
2669           /* A sign can be part of a preprocessing number
2670              if it follows an e.  */
2671           if (c == 'e' || c == 'E') {
2672             while (ibp < limit && ibp[0] == '\\' && ibp[1] == '\n') {
2673               ++ip->lineno;
2674               ibp += 2;
2675             }
2676             if (ibp < limit && (*ibp == '+' || *ibp == '-')) {
2677               *obp++ = *ibp++;
2678               /* But traditional C does not let the token go past the sign.  */
2679               if (traditional)
2680                 break;
2681             }
2682           }
2683         }
2684         break;
2685       }
2686       /* fall through */
2687
2688     case '_':
2689     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
2690     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
2691     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
2692     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
2693     case 'y': case 'z':
2694     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
2695     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
2696     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
2697     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
2698     case 'Y': case 'Z':
2699     letter:
2700       ident_length++;
2701       /* Compute step of hash function, to avoid a proc call on every token */
2702       hash = HASHSTEP (hash, c);
2703       break;
2704
2705     case '\n':
2706       if (ip->fname == 0 && *ibp == '-') {
2707         /* Newline - inhibits expansion of preceding token.
2708            If expanding a macro arg, we keep the newline -.
2709            In final output, it is deleted.
2710            We recognize Newline - in macro bodies and macro args.  */
2711         if (! concatenated) {
2712           ident_length = 0;
2713           hash = 0;
2714         }
2715         ibp++;
2716         if (!output_marks) {
2717           obp--;
2718         } else {
2719           /* If expanding a macro arg, keep the newline -.  */
2720           *obp++ = '-';
2721         }
2722         break;
2723       }
2724
2725       /* If reprocessing a macro expansion, newline is a special marker.  */
2726       else if (ip->macro != 0) {
2727         /* Newline White is a "funny space" to separate tokens that are
2728            supposed to be separate but without space between.
2729            Here White means any whitespace character.
2730            Newline - marks a recursive macro use that is not
2731            supposed to be expandable.  */
2732
2733         if (is_space[*ibp]) {
2734           /* Newline Space does not prevent expansion of preceding token
2735              so expand the preceding token and then come back.  */
2736           if (ident_length > 0)
2737             goto specialchar;
2738
2739           /* If generating final output, newline space makes a space.  */
2740           if (!output_marks) {
2741             obp[-1] = *ibp++;
2742             /* And Newline Newline makes a newline, so count it.  */
2743             if (obp[-1] == '\n')
2744               op->lineno++;
2745           } else {
2746             /* If expanding a macro arg, keep the newline space.
2747                If the arg gets stringified, newline space makes nothing.  */
2748             *obp++ = *ibp++;
2749           }
2750         } else abort ();        /* Newline followed by something random?  */
2751         break;
2752       }
2753
2754       /* If there is a pending identifier, handle it and come back here.  */
2755       if (ident_length > 0)
2756         goto specialchar;
2757
2758       beg_of_line = ibp;
2759
2760       /* Update the line counts and output a #line if necessary.  */
2761       ++ip->lineno;
2762       ++op->lineno;
2763       if (ip->lineno != op->lineno) {
2764         op->bufp = obp;
2765         output_line_command (ip, op, 1, same_file);
2766         check_expand (op, ip->length - (ip->bufp - ip->buf));
2767         obp = op->bufp;
2768       }
2769       break;
2770
2771       /* Come here either after (1) a null character that is part of the input
2772          or (2) at the end of the input, because there is a null there.  */
2773     case 0:
2774       if (ibp <= limit)
2775         /* Our input really contains a null character.  */
2776         goto randomchar;
2777
2778       /* At end of a macro-expansion level, pop it and read next level.  */
2779       if (ip->macro != 0) {
2780         obp--;
2781         ibp--;
2782         /* If traditional, and we have an identifier that ends here,
2783            process it now, so we get the right error for recursion.  */
2784         if (traditional && ident_length
2785             && ! is_idchar[*instack[indepth - 1].bufp]) {
2786           redo_char = 1;
2787           goto randomchar;
2788         }
2789         POPMACRO;
2790         RECACHE;
2791         break;
2792       }
2793
2794       /* If we don't have a pending identifier,
2795          return at end of input.  */
2796       if (ident_length == 0) {
2797         obp--;
2798         ibp--;
2799         op->bufp = obp;
2800         ip->bufp = ibp;
2801         goto ending;
2802       }
2803
2804       /* If we do have a pending identifier, just consider this null
2805          a special character and arrange to dispatch on it again.
2806          The second time, IDENT_LENGTH will be zero so we will return.  */
2807
2808       /* Fall through */
2809
2810 specialchar:
2811
2812       /* Handle the case of a character such as /, ', " or null
2813          seen following an identifier.  Back over it so that
2814          after the identifier is processed the special char
2815          will be dispatched on again.  */
2816
2817       ibp--;
2818       obp--;
2819       redo_char = 1;
2820
2821     default:
2822
2823 randomchar:
2824
2825       if (ident_length > 0) {
2826         register HASHNODE *hp;
2827
2828         /* We have just seen an identifier end.  If it's a macro, expand it.
2829
2830            IDENT_LENGTH is the length of the identifier
2831            and HASH is its hash code.
2832
2833            The identifier has already been copied to the output,
2834            so if it is a macro we must remove it.
2835
2836            If REDO_CHAR is 0, the char that terminated the identifier
2837            has been skipped in the output and the input.
2838            OBP-IDENT_LENGTH-1 points to the identifier.
2839            If the identifier is a macro, we must back over the terminator.
2840
2841            If REDO_CHAR is 1, the terminating char has already been
2842            backed over.  OBP-IDENT_LENGTH points to the identifier.  */
2843
2844         if (!pcp_outfile || pcp_inside_if) {
2845 startagain:
2846           for (hp = hashtab[MAKE_POS (hash) % HASHSIZE]; hp != NULL;
2847                hp = hp->next) {
2848             
2849             if (hp->length == ident_length) {
2850               int obufp_before_macroname;
2851               int op_lineno_before_macroname;
2852               register int i = ident_length;
2853               register U_CHAR *p = hp->name;
2854               register U_CHAR *q = obp - i;
2855               int disabled;
2856               
2857               if (! redo_char)
2858                 q--;
2859               
2860               do {              /* All this to avoid a strncmp () */
2861                 if (*p++ != *q++)
2862                   goto hashcollision;
2863               } while (--i);
2864               
2865               /* We found a use of a macro name.
2866                  see if the context shows it is a macro call.  */
2867               
2868               /* Back up over terminating character if not already done.  */
2869               if (! redo_char) {
2870                 ibp--;
2871                 obp--;
2872               }
2873               
2874               /* Save this as a displacement from the beginning of the output
2875                  buffer.  We can not save this as a position in the output
2876                  buffer, because it may get realloc'ed by RECACHE.  */
2877               obufp_before_macroname = (obp - op->buf) - ident_length;
2878               op_lineno_before_macroname = op->lineno;
2879               
2880               if (hp->type == T_PCSTRING) {
2881                 pcstring_used (hp); /* Mark the definition of this key
2882                                        as needed, ensuring that it
2883                                        will be output.  */
2884                 break;          /* Exit loop, since the key cannot have a
2885                                    definition any longer.  */
2886               }
2887
2888               /* Record whether the macro is disabled.  */
2889               disabled = hp->type == T_DISABLED;
2890               
2891               /* This looks like a macro ref, but if the macro was disabled,
2892                  just copy its name and put in a marker if requested.  */
2893               
2894               if (disabled) {
2895 #if 0
2896                 /* This error check caught useful cases such as
2897                    #define foo(x,y) bar (x (y,0), y)
2898                    foo (foo, baz)  */
2899                 if (traditional)
2900                   error ("recursive use of macro `%s'", hp->name);
2901 #endif
2902                 
2903                 if (output_marks) {
2904                   check_expand (op, limit - ibp + 2);
2905                   *obp++ = '\n';
2906                   *obp++ = '-';
2907                 }
2908                 break;
2909               }
2910               
2911               /* If macro wants an arglist, verify that a '(' follows.
2912                  first skip all whitespace, copying it to the output
2913                  after the macro name.  Then, if there is no '(',
2914                  decide this is not a macro call and leave things that way.  */
2915               if ((hp->type == T_MACRO || hp->type == T_DISABLED)
2916                   && hp->value.defn->nargs >= 0)
2917                 {
2918                   U_CHAR *old_ibp = ibp;
2919                   U_CHAR *old_obp = obp;
2920                   int old_iln = ip->lineno;
2921                   int old_oln = op->lineno;
2922                   
2923                   while (1) {
2924                     /* Scan forward over whitespace, copying it to the output.  */
2925                     if (ibp == limit && ip->macro != 0) {
2926                       POPMACRO;
2927                       RECACHE;
2928                       old_ibp = ibp;
2929                       old_obp = obp;
2930                       old_iln = ip->lineno;
2931                       old_oln = op->lineno;
2932                     }
2933                     /* A comment: copy it unchanged or discard it.  */
2934                     else if (*ibp == '/' && ibp+1 != limit && ibp[1] == '*') {
2935                       if (put_out_comments) {
2936                         *obp++ = '/';
2937                         *obp++ = '*';
2938                       } else if (! traditional) {
2939                         *obp++ = ' ';
2940                       }
2941                       ibp += 2;
2942                       while (ibp + 1 != limit
2943                              && !(ibp[0] == '*' && ibp[1] == '/')) {
2944                         /* We need not worry about newline-marks,
2945                            since they are never found in comments.  */
2946                         if (*ibp == '\n') {
2947                           /* Newline in a file.  Count it.  */
2948                           ++ip->lineno;
2949                           ++op->lineno;
2950                         }
2951                         if (put_out_comments)
2952                           *obp++ = *ibp++;
2953                         else
2954                           ibp++;
2955                       }
2956                       ibp += 2;
2957                       if (put_out_comments) {
2958                         *obp++ = '*';
2959                         *obp++ = '/';
2960                       }
2961                     }
2962                     else if (is_space[*ibp]) {
2963                       *obp++ = *ibp++;
2964                       if (ibp[-1] == '\n') {
2965                         if (ip->macro == 0) {
2966                           /* Newline in a file.  Count it.  */
2967                           ++ip->lineno;
2968                           ++op->lineno;
2969                         } else if (!output_marks) {
2970                           /* A newline mark, and we don't want marks
2971                              in the output.  If it is newline-hyphen,
2972                              discard it entirely.  Otherwise, it is
2973                              newline-whitechar, so keep the whitechar.  */
2974                           obp--;
2975                           if (*ibp == '-')
2976                             ibp++;
2977                           else {
2978                             if (*ibp == '\n')
2979                               ++op->lineno;
2980                             *obp++ = *ibp++;
2981                           }
2982                         } else {
2983                           /* A newline mark; copy both chars to the output.  */
2984                           *obp++ = *ibp++;
2985                         }
2986                       }
2987                     }
2988                     else break;
2989                   }
2990                   if (*ibp != '(') {
2991                     /* It isn't a macro call.
2992                        Put back the space that we just skipped.  */
2993                     ibp = old_ibp;
2994                     obp = old_obp;
2995                     ip->lineno = old_iln;
2996                     op->lineno = old_oln;
2997                     /* Exit the for loop.  */
2998                     break;
2999                   }
3000                 }
3001               
3002               /* This is now known to be a macro call.
3003                  Discard the macro name from the output,
3004                  along with any following whitespace just copied.  */
3005               obp = op->buf + obufp_before_macroname;
3006               op->lineno = op_lineno_before_macroname;
3007
3008               /* Prevent accidental token-pasting with a character
3009                  before the macro call.  */
3010               if (!traditional && obp != op->buf
3011                   && (obp[-1] == '-' || obp[1] == '+' || obp[1] == '&'
3012                       || obp[-1] == '|' || obp[1] == '<' || obp[1] == '>')) {
3013                 /* If we are expanding a macro arg, make a newline marker
3014                    to separate the tokens.  If we are making real output,
3015                    a plain space will do.  */
3016                 if (output_marks)
3017                   *obp++ = '\n';
3018                 *obp++ = ' ';
3019               }
3020
3021               /* Expand the macro, reading arguments as needed,
3022                  and push the expansion on the input stack.  */
3023               ip->bufp = ibp;
3024               op->bufp = obp;
3025               macroexpand (hp, op);
3026               
3027               /* Reexamine input stack, since macroexpand has pushed
3028                  a new level on it.  */
3029               obp = op->bufp;
3030               RECACHE;
3031               break;
3032             }
3033 hashcollision:
3034             ;
3035           }                     /* End hash-table-search loop */
3036         }
3037         ident_length = hash = 0; /* Stop collecting identifier */
3038         redo_char = 0;
3039         concatenated = 0;
3040       }                         /* End if (ident_length > 0) */
3041     }                           /* End switch */
3042   }                             /* End per-char loop */
3043
3044   /* Come here to return -- but first give an error message
3045      if there was an unterminated successful conditional.  */
3046  ending:
3047   if (if_stack != ip->if_stack) {
3048     char *str;
3049     switch (if_stack->type) {
3050     case T_IF:
3051       str = "if";
3052       break;
3053     case T_IFDEF:
3054       str = "ifdef";
3055       break;
3056     case T_IFNDEF:
3057       str = "ifndef";
3058       break;
3059     case T_ELSE:
3060       str = "else";
3061       break;
3062     case T_ELIF:
3063       str = "elif";
3064       break;
3065     }
3066     error_with_line (line_for_error (if_stack->lineno),
3067                      "unterminated `#%s' conditional", str);
3068   }
3069   if_stack = ip->if_stack;
3070 }
3071 \f
3072 /*
3073  * Rescan a string into a temporary buffer and return the result
3074  * as a FILE_BUF.  Note this function returns a struct, not a pointer.
3075  *
3076  * OUTPUT_MARKS nonzero means keep Newline markers found in the input
3077  * and insert such markers when appropriate.  See `rescan' for details.
3078  * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
3079  * before substitution; it is 0 for other uses.
3080  */
3081 static FILE_BUF
3082 expand_to_temp_buffer (buf, limit, output_marks, assertions)
3083      U_CHAR *buf, *limit;
3084      int output_marks, assertions;
3085 {
3086   register FILE_BUF *ip;
3087   FILE_BUF obuf;
3088   int length = limit - buf;
3089   U_CHAR *buf1;
3090   int odepth = indepth;
3091   int save_assertions_flag = assertions_flag;
3092
3093   assertions_flag = assertions;
3094
3095   if (length < 0)
3096     abort ();
3097
3098   /* Set up the input on the input stack.  */
3099
3100   buf1 = (U_CHAR *) alloca (length + 1);
3101   {
3102     register U_CHAR *p1 = buf;
3103     register U_CHAR *p2 = buf1;
3104
3105     while (p1 != limit)
3106       *p2++ = *p1++;
3107   }
3108   buf1[length] = 0;
3109
3110   /* Set up to receive the output.  */
3111
3112   obuf.length = length * 2 + 100; /* Usually enough.  Why be stingy?  */
3113   obuf.bufp = obuf.buf = (U_CHAR *) xmalloc (obuf.length);
3114   obuf.fname = 0;
3115   obuf.macro = 0;
3116   obuf.free_ptr = 0;
3117
3118   CHECK_DEPTH ({return obuf;});
3119
3120   ++indepth;
3121
3122   ip = &instack[indepth];
3123   ip->fname = 0;
3124   ip->nominal_fname = 0;
3125   ip->system_header_p = 0;
3126   ip->macro = 0;
3127   ip->free_ptr = 0;
3128   ip->length = length;
3129   ip->buf = ip->bufp = buf1;
3130   ip->if_stack = if_stack;
3131
3132   ip->lineno = obuf.lineno = 1;
3133
3134   /* Scan the input, create the output.  */
3135   rescan (&obuf, output_marks);
3136
3137   /* Pop input stack to original state.  */
3138   --indepth;
3139
3140   if (indepth != odepth)
3141     abort ();
3142
3143   /* Record the output.  */
3144   obuf.length = obuf.bufp - obuf.buf;
3145
3146   assertions_flag = save_assertions_flag;
3147   return obuf;
3148 }
3149 \f
3150 /*
3151  * Process a # directive.  Expects IP->bufp to point after the '#', as in
3152  * `#define foo bar'.  Passes to the command handler
3153  * (do_define, do_include, etc.): the addresses of the 1st and
3154  * last chars of the command (starting immediately after the #
3155  * keyword), plus op and the keyword table pointer.  If the command
3156  * contains comments it is copied into a temporary buffer sans comments
3157  * and the temporary buffer is passed to the command handler instead.
3158  * Likewise for backslash-newlines.
3159  *
3160  * Returns nonzero if this was a known # directive.
3161  * Otherwise, returns zero, without advancing the input pointer.
3162  */
3163
3164 static int
3165 handle_directive (ip, op)
3166      FILE_BUF *ip, *op;
3167 {
3168   register U_CHAR *bp, *cp;
3169   register struct directive *kt;
3170   register int ident_length;
3171   U_CHAR *resume_p;
3172
3173   /* Nonzero means we must copy the entire command
3174      to get rid of comments or backslash-newlines.  */
3175   int copy_command = 0;
3176
3177   U_CHAR *ident, *after_ident;
3178
3179   bp = ip->bufp;
3180
3181   /* Record where the directive started.  do_xifdef needs this.  */
3182   directive_start = bp - 1;
3183
3184   /* Skip whitespace and \-newline.  */
3185   while (1) {
3186     if (is_hor_space[*bp]) {
3187       if ((*bp == '\f' || *bp == '\v') && pedantic)
3188         pedwarn ("%s in preprocessing directive",
3189                  *bp == '\f' ? "formfeed" : "vertical tab");
3190       bp++;
3191     } else if (*bp == '/' && bp[1] == '*') {
3192       ip->bufp = bp;
3193       skip_to_end_of_comment (ip, &ip->lineno, 0);
3194       bp = ip->bufp;
3195     } else if (*bp == '\\' && bp[1] == '\n') {
3196       bp += 2; ip->lineno++;
3197     } else break;
3198   }
3199
3200   /* Now find end of directive name.
3201      If we encounter a backslash-newline, exchange it with any following
3202      symbol-constituents so that we end up with a contiguous name.  */
3203
3204   cp = bp;
3205   while (1) {
3206     if (is_idchar[*cp])
3207       cp++;
3208     else {
3209       if (*cp == '\\' && cp[1] == '\n')
3210         name_newline_fix (cp);
3211       if (is_idchar[*cp])
3212         cp++;
3213       else break;
3214     }
3215   }
3216   ident_length = cp - bp;
3217   ident = bp;
3218   after_ident = cp;
3219
3220   /* A line of just `#' becomes blank.  */
3221
3222   if (ident_length == 0 && *after_ident == '\n') {
3223     ip->bufp = after_ident;
3224     return 1;
3225   }
3226
3227   if (ident_length == 0 || !is_idstart[*ident]) {
3228     U_CHAR *p = ident;
3229     while (is_idchar[*p]) {
3230       if (*p < '0' || *p > '9')
3231         break;
3232       p++;
3233     }
3234     /* Handle # followed by a line number.  */
3235     if (p != ident && !is_idchar[*p]) {
3236       static struct directive line_directive_table[] = {
3237         {  4, do_line, "line", T_LINE},
3238       };
3239       if (pedantic)
3240         pedwarn ("`#' followed by integer");
3241       after_ident = ident;
3242       kt = line_directive_table;
3243       goto old_linenum;
3244     }
3245
3246     /* Avoid error for `###' and similar cases unless -pedantic.  */
3247     if (p == ident) {
3248       while (*p == '#' || is_hor_space[*p]) p++;
3249       if (*p == '\n') {
3250         if (pedantic && !lang_asm)
3251           warning ("invalid preprocessor directive");
3252         return 0;
3253       }
3254     }
3255
3256     if (!lang_asm)
3257       error ("invalid preprocessor directive name");
3258
3259     return 0;
3260   }
3261
3262   /*
3263    * Decode the keyword and call the appropriate expansion
3264    * routine, after moving the input pointer up to the next line.
3265    */
3266   for (kt = directive_table; kt->length > 0; kt++) {
3267     if (kt->length == ident_length && !strncmp (kt->name, ident, ident_length)) {
3268       register U_CHAR *buf;
3269       register U_CHAR *limit;
3270       int unterminated;
3271       int junk;
3272       int *already_output;
3273
3274       /* Nonzero means do not delete comments within the directive.
3275          #define needs this when -traditional.  */
3276       int keep_comments;
3277
3278     old_linenum:
3279
3280       limit = ip->buf + ip->length;
3281       unterminated = 0;
3282       already_output = 0;
3283       keep_comments = traditional && kt->traditional_comments;
3284       /* #import is defined only in Objective C, or when on the NeXT.  */
3285       if (kt->type == T_IMPORT && !(objc || lookup ("__NeXT__", -1, -1)))
3286         break;
3287
3288       /* Find the end of this command (first newline not backslashed
3289          and not in a string or comment).
3290          Set COPY_COMMAND if the command must be copied
3291          (it contains a backslash-newline or a comment).  */
3292
3293       buf = bp = after_ident;
3294       while (bp < limit) {
3295         register U_CHAR c = *bp++;
3296         switch (c) {
3297         case '\\':
3298           if (bp < limit) {
3299             if (*bp == '\n') {
3300               ip->lineno++;
3301               copy_command = 1;
3302             }
3303             bp++;
3304           }
3305           break;
3306
3307         case '\'':
3308         case '\"':
3309           bp = skip_quoted_string (bp - 1, limit, ip->lineno, &ip->lineno, &copy_command, &unterminated);
3310           /* Don't bother calling the directive if we already got an error
3311              message due to unterminated string.  Skip everything and pretend
3312              we called the directive.  */
3313           if (unterminated) {
3314             if (traditional) {
3315               /* Traditional preprocessing permits unterminated strings.  */
3316               ip->bufp = bp;
3317               goto endloop1;
3318             }
3319             ip->bufp = bp;
3320             return 1;
3321           }
3322           break;
3323
3324           /* <...> is special for #include.  */
3325         case '<':
3326           if (!kt->angle_brackets)
3327             break;
3328           while (*bp && *bp != '>') bp++;
3329           break;
3330
3331         case '/':
3332           if (*bp == '\\' && bp[1] == '\n')
3333             newline_fix (bp);
3334           if (*bp == '*'
3335               || (cplusplus_comments && *bp == '/')) {
3336             U_CHAR *obp = bp - 1;
3337             ip->bufp = bp + 1;
3338             skip_to_end_of_comment (ip, &ip->lineno, 0);
3339             bp = ip->bufp;
3340             /* No need to copy the command because of a comment at the end;
3341                just don't include the comment in the directive.  */
3342             if (bp == limit || *bp == '\n') {
3343               bp = obp;
3344               goto endloop1;
3345             }
3346             /* Don't remove the comments if -traditional.  */
3347             if (! keep_comments)
3348               copy_command++;
3349           }
3350           break;
3351
3352         case '\f':
3353         case '\v':
3354           if (pedantic)
3355             pedwarn ("%s in preprocessing directive",
3356                      c == '\f' ? "formfeed" : "vertical tab");
3357           break;
3358
3359         case '\n':
3360           --bp;         /* Point to the newline */
3361           ip->bufp = bp;
3362           goto endloop1;
3363         }
3364       }
3365       ip->bufp = bp;
3366
3367     endloop1:
3368       resume_p = ip->bufp;
3369       /* BP is the end of the directive.
3370          RESUME_P is the next interesting data after the directive.
3371          A comment may come between.  */
3372
3373       /* If a directive should be copied through, and -E was given,
3374          pass it through before removing comments.  */
3375       if (!no_output && kt->pass_thru && put_out_comments) {
3376         int len;
3377
3378         /* Output directive name.  */
3379         check_expand (op, kt->length + 2);
3380         /* Make sure # is at the start of a line */
3381         if (op->bufp > op->buf && op->bufp[-1] != '\n') {
3382           op->lineno++;
3383           *op->bufp++ = '\n';
3384         }
3385         *op->bufp++ = '#';
3386         bcopy (kt->name, op->bufp, kt->length);
3387         op->bufp += kt->length;
3388
3389         /* Output arguments.  */
3390         len = (bp - buf);
3391         check_expand (op, len);
3392         bcopy (buf, op->bufp, len);
3393         op->bufp += len;
3394         /* Take account of any (escaped) newlines just output.  */
3395         while (--len >= 0)
3396           if (buf[len] == '\n')
3397             op->lineno++;
3398
3399         already_output = &junk;
3400       }                         /* Don't we need a newline or #line? */
3401
3402       if (copy_command) {
3403         register U_CHAR *xp = buf;
3404         /* Need to copy entire command into temp buffer before dispatching */
3405
3406         cp = (U_CHAR *) alloca (bp - buf + 5); /* room for cmd plus
3407                                                   some slop */
3408         buf = cp;
3409
3410         /* Copy to the new buffer, deleting comments
3411            and backslash-newlines (and whitespace surrounding the latter).  */
3412
3413         while (xp < bp) {
3414           register U_CHAR c = *xp++;
3415           *cp++ = c;
3416
3417           switch (c) {
3418           case '\n':
3419             abort ();  /* A bare newline should never part of the line.  */
3420             break;
3421
3422             /* <...> is special for #include.  */
3423           case '<':
3424             if (!kt->angle_brackets)
3425               break;
3426             while (xp < bp && c != '>') {
3427               c = *xp++;
3428               if (c == '\\' && xp < bp && *xp == '\n')
3429                 xp++;
3430               else
3431                 *cp++ = c;
3432             }
3433             break;
3434
3435           case '\\':
3436             if (*xp == '\n') {
3437               xp++;
3438               cp--;
3439               if (cp != buf && is_space[cp[-1]]) {
3440                 while (cp != buf && is_space[cp[-1]]) cp--;
3441                 cp++;
3442                 SKIP_WHITE_SPACE (xp);
3443               } else if (is_space[*xp]) {
3444                 *cp++ = *xp++;
3445                 SKIP_WHITE_SPACE (xp);
3446               }
3447             } else {
3448               *cp++ = *xp++;
3449             }
3450             break;
3451
3452           case '\'':
3453           case '\"':
3454             {
3455               register U_CHAR *bp1
3456                 = skip_quoted_string (xp - 1, bp, ip->lineno,
3457                                       NULL_PTR, NULL_PTR, NULL_PTR);
3458               while (xp != bp1)
3459                 if (*xp == '\\') {
3460                   if (*++xp != '\n')
3461                     *cp++ = '\\';
3462                   else
3463                     xp++;
3464                 } else
3465                   *cp++ = *xp++;
3466             }
3467             break;
3468
3469           case '/':
3470             if (*xp == '*'
3471                 || (cplusplus_comments && *xp == '/')) {
3472               ip->bufp = xp + 1;
3473               /* If we already copied the command through,
3474                  already_output != 0 prevents outputting comment now.  */
3475               skip_to_end_of_comment (ip, already_output, 0);
3476               if (keep_comments)
3477                 while (xp != ip->bufp)
3478                   *cp++ = *xp++;
3479               /* Delete or replace the slash.  */
3480               else if (traditional)
3481                 cp--;
3482               else
3483                 cp[-1] = ' ';
3484               xp = ip->bufp;
3485             }
3486           }
3487         }
3488
3489         /* Null-terminate the copy.  */
3490
3491         *cp = 0;
3492       } else
3493         cp = bp;
3494
3495       ip->bufp = resume_p;
3496
3497       /* Some directives should be written out for cc1 to process,
3498          just as if they were not defined.  And sometimes we're copying
3499          definitions through.  */
3500
3501       if (!no_output && already_output == 0
3502           && (kt->pass_thru
3503               || (kt->type == T_DEFINE
3504                   && (dump_macros == dump_names
3505                       || dump_macros == dump_definitions)))) {
3506         int len;
3507
3508         /* Output directive name.  */
3509         check_expand (op, kt->length + 1);
3510         *op->bufp++ = '#';
3511         bcopy (kt->name, op->bufp, kt->length);
3512         op->bufp += kt->length;
3513
3514         if (kt->pass_thru || dump_macros == dump_definitions) {
3515           /* Output arguments.  */
3516           len = (cp - buf);
3517           check_expand (op, len);
3518           bcopy (buf, op->bufp, len);
3519           op->bufp += len;
3520         } else if (kt->type == T_DEFINE && dump_macros == dump_names) {
3521           U_CHAR *xp = buf;
3522           U_CHAR *yp;
3523           SKIP_WHITE_SPACE (xp);
3524           yp = xp;
3525           while (is_idchar[*xp]) xp++;
3526           len = (xp - yp);
3527           check_expand (op, len + 1);
3528           *op->bufp++ = ' ';
3529           bcopy (yp, op->bufp, len);
3530           op->bufp += len;
3531         }
3532       }                         /* Don't we need a newline or #line? */
3533
3534       /* Call the appropriate command handler.  buf now points to
3535          either the appropriate place in the input buffer, or to
3536          the temp buffer if it was necessary to make one.  cp
3537          points to the first char after the contents of the (possibly
3538          copied) command, in either case. */
3539       (*kt->func) (buf, cp, op, kt);
3540       check_expand (op, ip->length - (ip->bufp - ip->buf));
3541
3542       return 1;
3543     }
3544   }
3545
3546   /* It is deliberate that we don't warn about undefined directives.
3547      That is the responsibility of cc1.  */
3548   return 0;
3549 }
3550 \f
3551 static struct tm *
3552 timestamp ()
3553 {
3554   static struct tm *timebuf;
3555   if (!timebuf) {
3556     time_t t = time (0);
3557     timebuf = localtime (&t);
3558   }
3559   return timebuf;
3560 }
3561
3562 static char *monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
3563                              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
3564                             };
3565
3566 /*
3567  * expand things like __FILE__.  Place the expansion into the output
3568  * buffer *without* rescanning.
3569  */
3570
3571 static void
3572 special_symbol (hp, op)
3573      HASHNODE *hp;
3574      FILE_BUF *op;
3575 {
3576   char *buf;
3577   int i, len;
3578   int true_indepth;
3579   FILE_BUF *ip = NULL;
3580   struct tm *timebuf;
3581
3582   int paren = 0;                /* For special `defined' keyword */
3583
3584   if (pcp_outfile && pcp_inside_if
3585       && hp->type != T_SPEC_DEFINED && hp->type != T_CONST)
3586     error ("Predefined macro `%s' used inside `#if' during precompilation",
3587            hp->name);
3588     
3589   for (i = indepth; i >= 0; i--)
3590     if (instack[i].fname != NULL) {
3591       ip = &instack[i];
3592       break;
3593     }
3594   if (ip == NULL) {
3595     error ("cccp error: not in any file?!");
3596     return;                     /* the show must go on */
3597   }
3598
3599   switch (hp->type) {
3600   case T_FILE:
3601   case T_BASE_FILE:
3602     {
3603       char *string;
3604       if (hp->type == T_FILE)
3605         string = ip->nominal_fname;
3606       else
3607         string = instack[0].nominal_fname;
3608
3609       if (string)
3610         {
3611           buf = (char *) alloca (3 + strlen (string));
3612           sprintf (buf, "\"%s\"", string);
3613         }
3614       else
3615         buf = "\"\"";
3616
3617       break;
3618     }
3619
3620   case T_INCLUDE_LEVEL:
3621     true_indepth = 0;
3622     for (i = indepth; i >= 0; i--)
3623       if (instack[i].fname != NULL)
3624         true_indepth++;
3625
3626     buf = (char *) alloca (8);  /* Eight bytes ought to be more than enough */
3627     sprintf (buf, "%d", true_indepth - 1);
3628     break;
3629
3630   case T_VERSION:
3631     buf = (char *) alloca (3 + strlen (version_string));
3632     sprintf (buf, "\"%s\"", version_string);
3633     break;
3634
3635   case T_SIZE_TYPE:
3636     buf = (char *) alloca (3 + strlen (SIZE_TYPE));
3637     sprintf (buf, "%s", SIZE_TYPE);
3638     break;
3639
3640   case T_PTRDIFF_TYPE:
3641     buf = (char *) alloca (3 + strlen (PTRDIFF_TYPE));
3642     sprintf (buf, "%s", PTRDIFF_TYPE);
3643     break;
3644
3645   case T_WCHAR_TYPE:
3646     buf = (char *) alloca (3 + strlen (WCHAR_TYPE));
3647     sprintf (buf, "%s", WCHAR_TYPE);
3648     break;
3649
3650   case T_USER_LABEL_PREFIX_TYPE:
3651     buf = (char *) alloca (3 + strlen (USER_LABEL_PREFIX));
3652     sprintf (buf, "%s", USER_LABEL_PREFIX);
3653     break;
3654
3655   case T_REGISTER_PREFIX_TYPE:
3656     buf = (char *) alloca (3 + strlen (REGISTER_PREFIX));
3657     sprintf (buf, "%s", REGISTER_PREFIX);
3658     break;
3659
3660   case T_CONST:
3661     buf = (char *) alloca (4 * sizeof (int));
3662     sprintf (buf, "%d", hp->value.ival);
3663     if (pcp_inside_if && pcp_outfile)
3664       /* Output a precondition for this macro use */
3665       fprintf (pcp_outfile, "#define %s %d\n", hp->name, hp->value.ival);
3666     break;
3667
3668   case T_SPECLINE:
3669     buf = (char *) alloca (10);
3670     sprintf (buf, "%d", ip->lineno);
3671     break;
3672
3673   case T_DATE:
3674   case T_TIME:
3675     buf = (char *) alloca (20);
3676     timebuf = timestamp ();
3677     if (hp->type == T_DATE)
3678       sprintf (buf, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
3679               timebuf->tm_mday, timebuf->tm_year + 1900);
3680     else
3681       sprintf (buf, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
3682               timebuf->tm_sec);
3683     break;
3684
3685   case T_SPEC_DEFINED:
3686     buf = " 0 ";                /* Assume symbol is not defined */
3687     ip = &instack[indepth];
3688     SKIP_WHITE_SPACE (ip->bufp);
3689     if (*ip->bufp == '(') {
3690       paren++;
3691       ip->bufp++;                       /* Skip over the paren */
3692       SKIP_WHITE_SPACE (ip->bufp);
3693     }
3694
3695     if (!is_idstart[*ip->bufp])
3696       goto oops;
3697     if (hp = lookup (ip->bufp, -1, -1)) {
3698       if (pcp_outfile && pcp_inside_if
3699           && hp->value.defn->predefined)
3700         /* Output a precondition for this macro use. */
3701         fprintf (pcp_outfile, "#define %s\n", hp->name);
3702       buf = " 1 ";
3703     }
3704     else
3705       if (pcp_outfile && pcp_inside_if) {
3706         /* Output a precondition for this macro use */
3707         U_CHAR *cp = ip->bufp;
3708         fprintf (pcp_outfile, "#undef ");
3709         while (is_idchar[*cp]) /* Ick! */
3710           fputc (*cp++, pcp_outfile);
3711         putc ('\n', pcp_outfile);
3712       }
3713     while (is_idchar[*ip->bufp])
3714       ++ip->bufp;
3715     SKIP_WHITE_SPACE (ip->bufp);
3716     if (paren) {
3717       if (*ip->bufp != ')')
3718         goto oops;
3719       ++ip->bufp;
3720     }
3721     break;
3722
3723 oops:
3724
3725     error ("`defined' without an identifier");
3726     break;
3727
3728   default:
3729     error ("cccp error: invalid special hash type"); /* time for gdb */
3730     abort ();
3731   }
3732   len = strlen (buf);
3733   check_expand (op, len);
3734   bcopy (buf, op->bufp, len);
3735   op->bufp += len;
3736
3737   return;
3738 }
3739
3740 \f
3741 /* Routines to handle #directives */
3742
3743 /* Handle #include and #import.
3744    This function expects to see "fname" or <fname> on the input.  */
3745
3746 static int
3747 do_include (buf, limit, op, keyword)
3748      U_CHAR *buf, *limit;
3749      FILE_BUF *op;
3750      struct directive *keyword;
3751 {
3752   int importing = (keyword->type == T_IMPORT);
3753   int skip_dirs = (keyword->type == T_INCLUDE_NEXT);
3754   static int import_warning = 0;
3755   char *fname;          /* Dynamically allocated fname buffer */
3756   char *pcftry;
3757   char *pcfname;
3758   U_CHAR *fbeg, *fend;          /* Beginning and end of fname */
3759
3760   struct file_name_list *search_start = include; /* Chain of dirs to search */
3761   struct file_name_list dsp[1]; /* First in chain, if #include "..." */
3762   struct file_name_list *searchptr = 0;
3763   int flen;
3764
3765   int f;                        /* file number */
3766
3767   int retried = 0;              /* Have already tried macro
3768                                    expanding the include line*/
3769   FILE_BUF trybuf;              /* It got expanded into here */
3770   int angle_brackets = 0;       /* 0 for "...", 1 for <...> */
3771   int pcf = -1;
3772   char *pcfbuf;
3773   int pcfbuflimit;
3774   int pcfnum;
3775   f= -1;                        /* JF we iz paranoid! */
3776
3777   if (importing && warn_import && !inhibit_warnings
3778       && !instack[indepth].system_header_p && !import_warning) {
3779     import_warning = 1;
3780     warning ("using `#import' is not recommended");
3781     fprintf (stderr, "The fact that a certain header file need not be processed more than once\n");
3782     fprintf (stderr, "should be indicated in the header file, not where it is used.\n");
3783     fprintf (stderr, "The best way to do this is with a conditional of this form:\n\n");
3784     fprintf (stderr, "  #ifndef _FOO_H_INCLUDED\n");
3785     fprintf (stderr, "  #define _FOO_H_INCLUDED\n");
3786     fprintf (stderr, "  ... <real contents of file> ...\n");
3787     fprintf (stderr, "  #endif /* Not _FOO_H_INCLUDED */\n\n");
3788     fprintf (stderr, "Then users can use `#include' any number of times.\n");
3789     fprintf (stderr, "GNU C automatically avoids processing the file more than once\n");
3790     fprintf (stderr, "when it is equipped with such a conditional.\n");
3791   }
3792
3793 get_filename:
3794
3795   fbeg = buf;
3796   SKIP_WHITE_SPACE (fbeg);
3797   /* Discard trailing whitespace so we can easily see
3798      if we have parsed all the significant chars we were given.  */
3799   while (limit != fbeg && is_hor_space[limit[-1]]) limit--;
3800
3801   switch (*fbeg++) {
3802   case '\"':
3803     {
3804       FILE_BUF *fp;
3805       /* Copy the operand text, concatenating the strings.  */
3806       {
3807         U_CHAR *fin = fbeg;
3808         fbeg = (U_CHAR *) alloca (limit - fbeg + 1);
3809         fend = fbeg;
3810         while (fin != limit) {
3811           while (fin != limit && *fin != '\"')
3812             *fend++ = *fin++;
3813           fin++;
3814           if (fin == limit)
3815             break;
3816           /* If not at the end, there had better be another string.  */
3817           /* Skip just horiz space, and don't go past limit.  */
3818           while (fin != limit && is_hor_space[*fin]) fin++;
3819           if (fin != limit && *fin == '\"')
3820             fin++;
3821           else
3822             goto fail;
3823         }
3824       }
3825       *fend = 0;
3826
3827       /* We have "filename".  Figure out directory this source
3828          file is coming from and put it on the front of the list. */
3829
3830       /* If -I- was specified, don't search current dir, only spec'd ones. */
3831       if (ignore_srcdir) break;
3832
3833       for (fp = &instack[indepth]; fp >= instack; fp--)
3834         {
3835           int n;
3836           char *ep,*nam;
3837
3838           if ((nam = fp->nominal_fname) != NULL) {
3839             /* Found a named file.  Figure out dir of the file,
3840                and put it in front of the search list.  */
3841             dsp[0].next = search_start;
3842             search_start = dsp;
3843 #ifndef VMS
3844             ep = rindex (nam, '/');
3845 #else                           /* VMS */
3846             ep = rindex (nam, ']');
3847             if (ep == NULL) ep = rindex (nam, '>');
3848             if (ep == NULL) ep = rindex (nam, ':');
3849             if (ep != NULL) ep++;
3850 #endif                          /* VMS */
3851             if (ep != NULL) {
3852               n = ep - nam;
3853               dsp[0].fname = (char *) alloca (n + 1);
3854               strncpy (dsp[0].fname, nam, n);
3855               dsp[0].fname[n] = '\0';
3856               if (n + INCLUDE_LEN_FUDGE > max_include_len)
3857                 max_include_len = n + INCLUDE_LEN_FUDGE;
3858             } else {
3859               dsp[0].fname = 0; /* Current directory */
3860             }
3861             break;
3862           }
3863         }
3864       break;
3865     }
3866
3867   case '<':
3868     fend = fbeg;
3869     while (fend != limit && *fend != '>') fend++;
3870     if (*fend == '>' && fend + 1 == limit) {
3871       angle_brackets = 1;
3872       /* If -I-, start with the first -I dir after the -I-.  */
3873       if (first_bracket_include)
3874         search_start = first_bracket_include;
3875       break;
3876     }
3877     goto fail;
3878
3879   default:
3880   fail:
3881     if (retried) {
3882       error ("`#%s' expects \"FILENAME\" or <FILENAME>", keyword->name);
3883       return 0;
3884     } else {
3885       trybuf = expand_to_temp_buffer (buf, limit, 0, 0);
3886       buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
3887       bcopy (trybuf.buf, buf, trybuf.bufp - trybuf.buf);
3888       limit = buf + (trybuf.bufp - trybuf.buf);
3889       free (trybuf.buf);
3890       retried++;
3891       goto get_filename;
3892     }
3893   }
3894
3895   /* For #include_next, skip in the search path
3896      past the dir in which the containing file was found.  */
3897   if (skip_dirs) {
3898     FILE_BUF *fp;
3899     for (fp = &instack[indepth]; fp >= instack; fp--)
3900       if (fp->fname != NULL) {
3901         /* fp->dir is null if the containing file was specified
3902            with an absolute file name.  In that case, don't skip anything.  */
3903         if (fp->dir)
3904           search_start = fp->dir->next;
3905         break;
3906       }
3907   }
3908
3909   flen = fend - fbeg;
3910
3911   if (flen == 0)
3912     {
3913       error ("empty file name in `#%s'", keyword->name);
3914       return 0;
3915     }
3916
3917   /* Allocate this permanently, because it gets stored in the definitions
3918      of macros.  */
3919   fname = (char *) xmalloc (max_include_len + flen + 2);
3920   /* + 2 above for slash and terminating null.  */
3921
3922   /* If specified file name is absolute, just open it.  */
3923
3924   if (*fbeg == '/') {
3925     strncpy (fname, fbeg, flen);
3926     fname[flen] = 0;
3927     if (redundant_include_p (fname))
3928       return 0;
3929     if (importing)
3930       f = lookup_import (fname);
3931     else
3932       f = open (fname, O_RDONLY, 0666);
3933     if (f == -2)
3934       return 0;         /* Already included this file */
3935   } else {
3936     /* Search directory path, trying to open the file.
3937        Copy each filename tried into FNAME.  */
3938
3939     for (searchptr = search_start; searchptr; searchptr = searchptr->next) {
3940       if (searchptr->fname) {
3941         /* The empty string in a search path is ignored.
3942            This makes it possible to turn off entirely
3943            a standard piece of the list.  */
3944         if (searchptr->fname[0] == 0)
3945           continue;
3946         strcpy (fname, searchptr->fname);
3947         strcat (fname, "/");
3948         fname[strlen (fname) + flen] = 0;
3949       } else {
3950         fname[0] = 0;
3951       }
3952       strncat (fname, fbeg, flen);
3953 #ifdef VMS
3954       /* Change this 1/2 Unix 1/2 VMS file specification into a
3955          full VMS file specification */
3956       if (searchptr->fname && (searchptr->fname[0] != 0)) {
3957         /* Fix up the filename */
3958         hack_vms_include_specification (fname);
3959       } else {
3960         /* This is a normal VMS filespec, so use it unchanged.  */
3961         strncpy (fname, fbeg, flen);
3962         fname[flen] = 0;
3963       }
3964 #endif /* VMS */
3965       if (importing)
3966         f = lookup_import (fname);
3967       else
3968         f = open (fname, O_RDONLY, 0666);
3969       if (f == -2)
3970         return 0;                       /* Already included this file */
3971 #ifdef EACCES
3972       else if (f == -1 && errno == EACCES)
3973         warning ("Header file %s exists, but is not readable", fname);
3974 #endif
3975       if (redundant_include_p (fname)) {
3976         close (f);
3977         return 0;
3978       }
3979       if (f >= 0)
3980         break;
3981     }
3982   }
3983
3984   if (f < 0) {
3985     /* A file that was not found.  */
3986
3987     strncpy (fname, fbeg, flen);
3988     fname[flen] = 0;
3989     /* If -M was specified, and this header file won't be added to the
3990        dependency list, then don't count this as an error, because we can
3991        still produce correct output.  Otherwise, we can't produce correct
3992        output, because there may be dependencies we need inside the missing
3993        file, and we don't know what directory this missing file exists in.  */
3994     if (print_deps
3995         && (print_deps <= (angle_brackets || (system_include_depth > 0))))
3996       warning ("No include path in which to find %s", fname);
3997     else if (search_start)
3998       error_from_errno (fname);
3999     else
4000       error ("No include path in which to find %s", fname);
4001   } else {
4002     struct stat stat_f;
4003
4004     /* Check to see if this include file is a once-only include file.
4005        If so, give up.  */
4006
4007     struct file_name_list* ptr;
4008
4009     for (ptr = dont_repeat_files; ptr; ptr = ptr->next) {
4010       if (!strcmp (ptr->fname, fname)) {
4011         close (f);
4012         return 0;                               /* This file was once'd. */
4013       }
4014     }
4015
4016     for (ptr = all_include_files; ptr; ptr = ptr->next) {
4017       if (!strcmp (ptr->fname, fname))
4018         break;                          /* This file was included before. */
4019     }
4020
4021     if (ptr == 0) {
4022       /* This is the first time for this file.  */
4023       /* Add it to list of files included.  */
4024
4025       ptr = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
4026       ptr->control_macro = 0;
4027       ptr->next = all_include_files;
4028       all_include_files = ptr;
4029       ptr->fname = savestring (fname);
4030
4031       /* For -M, add this file to the dependencies.  */
4032       if (print_deps > (angle_brackets || (system_include_depth > 0))) {
4033         deps_output ("", 0);
4034         deps_output (fname, 0);
4035         deps_output (" ", 0);
4036       }
4037     }   
4038
4039     /* Handle -H option.  */
4040     if (print_include_names)
4041       fprintf (stderr, "%s\n", fname);
4042
4043     if (angle_brackets)
4044       system_include_depth++;
4045
4046     /* Actually process the file.  */
4047     add_import (f, fname);      /* Record file on "seen" list for #import. */
4048
4049     pcftry = (char *) alloca (strlen (fname) + 30);
4050     pcfbuf = 0;
4051     pcfnum = 0;
4052
4053     fstat (f, &stat_f);
4054
4055     if (!no_precomp)
4056       do {
4057         sprintf (pcftry, "%s%d", fname, pcfnum++);
4058         
4059         pcf = open (pcftry, O_RDONLY, 0666);
4060         if (pcf != -1)
4061           {
4062             struct stat s;
4063
4064             fstat (pcf, &s);
4065             if (bcmp (&stat_f.st_ino, &s.st_ino, sizeof (s.st_ino))
4066                 || stat_f.st_dev != s.st_dev)
4067               {
4068                 pcfbuf = check_precompiled (pcf, fname, &pcfbuflimit);
4069                 /* Don't need it any more.  */
4070                 close (pcf);
4071               }
4072             else
4073               {
4074                 /* Don't need it at all.  */
4075                 close (pcf);
4076                 break;
4077               }
4078           }
4079       } while (pcf != -1 && !pcfbuf);
4080     
4081     /* Actually process the file */
4082     if (pcfbuf) {
4083       pcfname = xmalloc (strlen (pcftry) + 1);
4084       strcpy (pcfname, pcftry);
4085       pcfinclude (pcfbuf, pcfbuflimit, fname, op);
4086     }
4087     else
4088       finclude (f, fname, op, is_system_include (fname), searchptr);
4089
4090     if (angle_brackets)
4091       system_include_depth--;
4092   }
4093   return 0;
4094 }
4095
4096 /* Return nonzero if there is no need to include file NAME
4097    because it has already been included and it contains a conditional
4098    to make a repeated include do nothing.  */
4099
4100 static int
4101 redundant_include_p (name)
4102      char *name;
4103 {
4104   struct file_name_list *l = all_include_files;
4105   for (; l; l = l->next)
4106     if (! strcmp (name, l->fname)
4107         && l->control_macro
4108         && lookup (l->control_macro, -1, -1))
4109       return 1;
4110   return 0;
4111 }
4112
4113 /* Return nonzero if the given FILENAME is an absolute pathname which
4114    designates a file within one of the known "system" include file
4115    directories.  We assume here that if the given FILENAME looks like
4116    it is the name of a file which resides either directly in a "system"
4117    include file directory, or within any subdirectory thereof, then the
4118    given file must be a "system" include file.  This function tells us
4119    if we should suppress pedantic errors/warnings for the given FILENAME.  */
4120
4121 static int
4122 is_system_include (filename)
4123     register char *filename;
4124 {
4125   struct file_name_list *searchptr;
4126
4127   for (searchptr = first_system_include; searchptr;
4128        searchptr = searchptr->next)
4129     if (searchptr->fname) {
4130       register char *sys_dir = searchptr->fname;
4131       register unsigned length = strlen (sys_dir);
4132
4133       if (! strncmp (sys_dir, filename, length) && filename[length] == '/')
4134         return 1;
4135     }
4136   return 0;
4137 }
4138 \f
4139 /* Process the contents of include file FNAME, already open on descriptor F,
4140    with output to OP.
4141    SYSTEM_HEADER_P is 1 if this file was specified using <...>.
4142    DIRPTR is the link in the dir path through which this file was found,
4143    or 0 if the file name was absolute.  */
4144
4145 static void
4146 finclude (f, fname, op, system_header_p, dirptr)
4147      int f;
4148      char *fname;
4149      FILE_BUF *op;
4150      int system_header_p;
4151      struct file_name_list *dirptr;
4152 {
4153   int st_mode;
4154   long st_size;
4155   long i;
4156   FILE_BUF *fp;                 /* For input stack frame */
4157   int missing_newline = 0;
4158
4159   CHECK_DEPTH (return;);
4160
4161   if (file_size_and_mode (f, &st_mode, &st_size) < 0)
4162     {
4163       perror_with_name (fname);
4164       close (f);
4165       return;
4166     }
4167
4168   fp = &instack[indepth + 1];
4169   bzero (fp, sizeof (FILE_BUF));
4170   fp->nominal_fname = fp->fname = fname;
4171   fp->length = 0;
4172   fp->lineno = 1;
4173   fp->if_stack = if_stack;
4174   fp->system_header_p = system_header_p;
4175   fp->dir = dirptr;
4176
4177   if (S_ISREG (st_mode)) {
4178     fp->buf = (U_CHAR *) xmalloc (st_size + 2);
4179     fp->bufp = fp->buf;
4180
4181     /* Read the file contents, knowing that st_size is an upper bound
4182        on the number of bytes we can read.  */
4183     while (st_size > 0) {
4184       i = read (f, fp->buf + fp->length, st_size);
4185       if (i <= 0) {
4186         if (i == 0) break;
4187         goto nope;
4188       }
4189       fp->length += i;
4190       st_size -= i;
4191     }
4192   }
4193   else if (S_ISDIR (st_mode)) {
4194     error ("directory `%s' specified in #include", fname);
4195     close (f);
4196     return;
4197   } else {
4198     /* Cannot count its file size before reading.
4199        First read the entire file into heap and
4200        copy them into buffer on stack. */
4201
4202     U_CHAR *bufp;
4203     U_CHAR *basep;
4204     int bsize = 2000;
4205
4206     st_size = 0;
4207     basep = (U_CHAR *) xmalloc (bsize + 2);
4208     fp->buf = basep; /* So it will get freed, on error.  */
4209     bufp = basep;
4210
4211     for (;;) {
4212       i = read (f, bufp, bsize - st_size);
4213       if (i < 0)
4214         goto nope;      /* error! */
4215       if (i == 0)
4216         break;  /* End of file */
4217       st_size += i;
4218       bufp += i;
4219       if (bsize == st_size) {   /* Buffer is full! */
4220           bsize *= 2;
4221           basep = (U_CHAR *) xrealloc (basep, bsize + 2);
4222           fp->buf = basep;
4223           bufp = basep + st_size;       /* May have moved */
4224         }
4225     }
4226     fp->bufp = fp->buf;
4227     fp->length = st_size;
4228   }
4229
4230   if ((fp->length > 0 && fp->buf[fp->length - 1] != '\n')
4231       /* Backslash-newline at end is not good enough.  */
4232       || (fp->length > 1 && fp->buf[fp->length - 2] == '\\')) {
4233     fp->buf[fp->length++] = '\n';
4234     missing_newline = 1;
4235   }
4236   fp->buf[fp->length] = '\0';
4237
4238   /* Close descriptor now, so nesting does not use lots of descriptors.  */
4239   close (f);
4240
4241   /* Must do this before calling trigraph_pcp, so that the correct file name
4242      will be printed in warning messages.  */
4243
4244   indepth++;
4245   input_file_stack_tick++;
4246
4247   if (!no_trigraphs)
4248     trigraph_pcp (fp);
4249
4250   output_line_command (fp, op, 0, enter_file);
4251   rescan (op, 0);
4252
4253   if (missing_newline)
4254     fp->lineno--;
4255
4256   if (pedantic && missing_newline)
4257     pedwarn ("file does not end in newline");
4258
4259   indepth--;
4260   input_file_stack_tick++;
4261   output_line_command (&instack[indepth], op, 0, leave_file);
4262   free (fp->buf);
4263   return;
4264
4265  nope:
4266
4267   perror_with_name (fname);
4268   close (f);
4269   free (fp->buf);
4270 }
4271
4272 /* Record that inclusion of the file named FILE
4273    should be controlled by the macro named MACRO_NAME.
4274    This means that trying to include the file again
4275    will do something if that macro is defined.  */
4276
4277 static void
4278 record_control_macro (file, macro_name)
4279      char *file;
4280      U_CHAR *macro_name;
4281 {
4282   struct file_name_list *new;
4283
4284   for (new = all_include_files; new; new = new->next) {
4285     if (!strcmp (new->fname, file)) {
4286       new->control_macro = macro_name;
4287       return;
4288     }
4289   }
4290
4291   /* If the file is not in all_include_files, something's wrong.  */
4292   abort ();
4293 }
4294 \f
4295 /* Maintain and search list of included files, for #import.  */
4296
4297 #define IMPORT_HASH_SIZE 31
4298
4299 struct import_file {
4300   char *name;
4301   ino_t inode;
4302   dev_t dev;
4303   struct import_file *next;
4304 };
4305
4306 /* Hash table of files already included with #include or #import.  */
4307
4308 static struct import_file *import_hash_table[IMPORT_HASH_SIZE];
4309
4310 /* Hash a file name for import_hash_table.  */
4311
4312 static int 
4313 import_hash (f)
4314      char *f;
4315 {
4316   int val = 0;
4317
4318   while (*f) val += *f++;
4319   return (val%IMPORT_HASH_SIZE);
4320 }
4321
4322 /* Search for file FILENAME in import_hash_table.
4323    Return -2 if found, either a matching name or a matching inode.
4324    Otherwise, open the file and return a file descriptor if successful
4325    or -1 if unsuccessful.  */
4326
4327 static int
4328 lookup_import (filename)
4329      char *filename;
4330 {
4331   struct import_file *i;
4332   int h;
4333   int hashval;
4334   struct stat sb;
4335   int fd;
4336
4337   hashval = import_hash (filename);
4338
4339   /* Attempt to find file in list of already included files */
4340   i = import_hash_table[hashval];
4341
4342   while (i) {
4343     if (!strcmp (filename, i->name))
4344       return -2;                /* return found */
4345     i = i->next;
4346   }
4347   /* Open it and try a match on inode/dev */
4348   fd = open (filename, O_RDONLY, 0666);
4349   if (fd < 0)
4350     return fd;
4351   fstat (fd, &sb);
4352   for (h = 0; h < IMPORT_HASH_SIZE; h++) {
4353     i = import_hash_table[h];
4354     while (i) {
4355       /* Compare the inode and the device.
4356          Supposedly on some systems the inode is not a scalar.  */
4357       if (!bcmp (&i->inode, &sb.st_ino, sizeof (sb.st_ino))
4358           && i->dev == sb.st_dev) {
4359         close (fd);
4360         return -2;              /* return found */
4361       }
4362       i = i->next;
4363     }
4364   }
4365   return fd;                    /* Not found, return open file */
4366 }
4367
4368 /* Add the file FNAME, open on descriptor FD, to import_hash_table.  */
4369
4370 static void
4371 add_import (fd, fname)
4372      int fd;
4373      char *fname;
4374 {
4375   struct import_file *i;
4376   int hashval;
4377   struct stat sb;
4378
4379   hashval = import_hash (fname);
4380   fstat (fd, &sb);
4381   i = (struct import_file *)xmalloc (sizeof (struct import_file));
4382   i->name = (char *)xmalloc (strlen (fname)+1);
4383   strcpy (i->name, fname);
4384   bcopy (&sb.st_ino, &i->inode, sizeof (sb.st_ino));
4385   i->dev = sb.st_dev;
4386   i->next = import_hash_table[hashval];
4387   import_hash_table[hashval] = i;
4388 }
4389 \f
4390 /* Load the specified precompiled header into core, and verify its
4391    preconditions.  PCF indicates the file descriptor to read, which must
4392    be a regular file.  FNAME indicates the file name of the original 
4393    header.  *LIMIT will be set to an address one past the end of the file.
4394    If the preconditions of the file are not satisfied, the buffer is 
4395    freed and we return 0.  If the preconditions are satisfied, return
4396    the address of the buffer following the preconditions.  The buffer, in
4397    this case, should never be freed because various pieces of it will
4398    be referred to until all precompiled strings are output at the end of
4399    the run.
4400 */
4401 static char *
4402 check_precompiled (pcf, fname, limit)
4403      int pcf;
4404      char *fname;
4405      char **limit;
4406 {
4407   int st_mode;
4408   long st_size;
4409   int length = 0;
4410   char *buf;
4411   char *dollar_loc;
4412   int i;
4413   char *cp;
4414
4415   if (pcp_outfile)
4416     return 0;
4417   
4418   if (file_size_and_mode (pcf, &st_mode, &st_size) < 0)
4419     return 0;
4420
4421   if (S_ISREG (st_mode))
4422     {
4423       buf = xmalloc (st_size + 2);
4424       while (st_size > 0)
4425         {
4426           i = read (pcf, buf + length, st_size);
4427           if (i < 0)
4428             goto nope;
4429           if (i == 0)
4430             break;
4431           length += i;
4432           st_size -= i;
4433         }         
4434     }
4435   else
4436     abort ();
4437     
4438   if (length > 0 && buf[length-1] != '\n')
4439     buf[length++] = '\n';
4440   buf[length] = '\0';
4441   
4442   *limit = buf + length;
4443
4444   /* File is in core.  Check the preconditions. */
4445   if (!check_preconditions (buf))
4446     goto nope;
4447   for (cp = buf; *cp; cp++)
4448     ;
4449 #ifdef DEBUG_PCP
4450   fprintf (stderr, "Using preinclude %s\n", fname);
4451 #endif
4452   return cp + 1;
4453
4454  nope:
4455 #ifdef DEBUG_PCP
4456   fprintf (stderr, "Cannot use preinclude %s\n", fname);
4457 #endif
4458   free (buf);
4459   return 0;
4460 }
4461
4462 /* PREC (null terminated) points to the preconditions of a
4463    precompiled header.  These are a series of #define and #undef
4464    lines which must match the current contents of the hash
4465    table.  */
4466 static int 
4467 check_preconditions (prec)
4468      char *prec;
4469 {
4470   MACRODEF mdef;
4471   char *lineend;
4472   
4473   while (*prec) {
4474     lineend = (char *) index (prec, '\n');
4475     
4476     if (*prec++ != '#') {
4477       error ("Bad format encountered while reading precompiled file");
4478       return 0;
4479     }
4480     if (!strncmp (prec, "define", 6)) {
4481       HASHNODE *hp;
4482       
4483       prec += 6;
4484       mdef = create_definition (prec, lineend, NULL_PTR);
4485
4486       if (mdef.defn == 0)
4487         abort ();
4488       
4489       if ((hp = lookup (mdef.symnam, mdef.symlen, -1)) == NULL
4490           || (hp->type != T_MACRO && hp->type != T_CONST)
4491           || (hp->type == T_MACRO
4492               && !compare_defs (mdef.defn, hp->value.defn)
4493               && (mdef.defn->length != 2
4494                   || mdef.defn->expansion[0] != '\n'
4495                   || mdef.defn->expansion[1] != ' ')))
4496         return 0;
4497     } else if (!strncmp (prec, "undef", 5)) {
4498       char *name;
4499       int len;
4500       
4501       prec += 5;
4502       while (is_hor_space[(U_CHAR) *prec])
4503         prec++;
4504       name = prec;
4505       while (is_idchar[(U_CHAR) *prec])
4506         prec++;
4507       len = prec - name;
4508       
4509       if (lookup (name, len, -1))
4510         return 0;
4511     } else {
4512       error ("Bad format encountered while reading precompiled file");
4513       return 0;
4514     }
4515     prec = lineend + 1;
4516   }
4517   /* They all passed successfully */
4518   return 1;
4519 }
4520
4521 /* Process the main body of a precompiled file.  BUF points to the
4522    string section of the file, following the preconditions.  LIMIT is one
4523    character past the end.  NAME is the name of the file being read
4524    in.  OP is the main output buffer */
4525 static void
4526 pcfinclude (buf, limit, name, op)
4527      U_CHAR *buf, *limit, *name;
4528      FILE_BUF *op;
4529 {
4530   FILE_BUF tmpbuf;
4531   int nstrings;
4532   U_CHAR *cp = buf;
4533
4534   /* First in the file comes 4 bytes indicating the number of strings, */
4535   /* in network byte order. (MSB first).  */
4536   nstrings = *cp++;
4537   nstrings = (nstrings << 8) | *cp++;
4538   nstrings = (nstrings << 8) | *cp++;
4539   nstrings = (nstrings << 8) | *cp++;
4540   
4541   /* Looping over each string... */
4542   while (nstrings--) {
4543     U_CHAR *string_start;
4544     U_CHAR *endofthiskey;
4545     STRINGDEF *str;
4546     int nkeys;
4547     
4548     /* Each string starts with a STRINGDEF structure (str), followed */
4549     /* by the text of the string (string_start) */
4550
4551     /* First skip to a longword boundary */
4552     /* ??? Why a 4-byte boundary?  On all machines? */
4553     /* NOTE: This works correctly even if HOST_WIDE_INT
4554        is narrower than a pointer.
4555        Do not try risky measures here to get another type to use!
4556        Do not include gstddef.h or stddef.h--either one will fail!  */
4557     if ((HOST_WIDE_INT) cp & 3)
4558       cp += 4 - ((HOST_WIDE_INT) cp & 3);
4559     
4560     /* Now get the string. */
4561     str = (STRINGDEF *) cp;
4562     string_start = cp += sizeof (STRINGDEF);
4563     
4564     for (; *cp; cp++)           /* skip the string */
4565       ;
4566     
4567     /* We need to macro expand the string here to ensure that the
4568        proper definition environment is in place.  If it were only
4569        expanded when we find out it is needed, macros necessary for
4570        its proper expansion might have had their definitions changed. */
4571     tmpbuf = expand_to_temp_buffer (string_start, cp++, 0, 0);
4572     /* Lineno is already set in the precompiled file */
4573     str->contents = tmpbuf.buf;
4574     str->len = tmpbuf.length;
4575     str->writeflag = 0;
4576     str->filename = name;
4577     str->output_mark = outbuf.bufp - outbuf.buf;
4578     
4579     str->chain = 0;
4580     *stringlist_tailp = str;
4581     stringlist_tailp = &str->chain;
4582     
4583     /* Next comes a fourbyte number indicating the number of keys */
4584     /* for this string. */
4585     nkeys = *cp++;
4586     nkeys = (nkeys << 8) | *cp++;
4587     nkeys = (nkeys << 8) | *cp++;
4588     nkeys = (nkeys << 8) | *cp++;
4589
4590     /* If this number is -1, then the string is mandatory. */
4591     if (nkeys == -1)
4592       str->writeflag = 1;
4593     else
4594       /* Otherwise, for each key, */
4595       for (; nkeys--; free (tmpbuf.buf), cp = endofthiskey + 1) {
4596         KEYDEF *kp = (KEYDEF *) cp;
4597         HASHNODE *hp;
4598         
4599         /* It starts with a KEYDEF structure */
4600         cp += sizeof (KEYDEF);
4601         
4602         /* Find the end of the key.  At the end of this for loop we
4603            advance CP to the start of the next key using this variable. */
4604         endofthiskey = cp + strlen (cp);
4605         kp->str = str;
4606         
4607         /* Expand the key, and enter it into the hash table. */
4608         tmpbuf = expand_to_temp_buffer (cp, endofthiskey, 0, 0);
4609         tmpbuf.bufp = tmpbuf.buf;
4610         
4611         while (is_hor_space[*tmpbuf.bufp])
4612           tmpbuf.bufp++;
4613         if (!is_idstart[*tmpbuf.bufp]
4614             || tmpbuf.bufp == tmpbuf.buf + tmpbuf.length) {
4615           str->writeflag = 1;
4616           continue;
4617         }
4618             
4619         hp = lookup (tmpbuf.bufp, -1, -1);
4620         if (hp == NULL) {
4621           kp->chain = 0;
4622           install (tmpbuf.bufp, -1, T_PCSTRING, 0, (char *) kp, -1);
4623         }
4624         else if (hp->type == T_PCSTRING) {
4625           kp->chain = hp->value.keydef;
4626           hp->value.keydef = kp;
4627         }
4628         else
4629           str->writeflag = 1;
4630       }
4631   }
4632   /* This output_line_command serves to switch us back to the current
4633      input file in case some of these strings get output (which will 
4634      result in line commands for the header file being output). */
4635   output_line_command (&instack[indepth], op, 0, enter_file);
4636 }
4637
4638 /* Called from rescan when it hits a key for strings.  Mark them all */
4639  /* used and clean up. */
4640 static void
4641 pcstring_used (hp)
4642      HASHNODE *hp;
4643 {
4644   KEYDEF *kp, *tmp;
4645   
4646   for (kp = hp->value.keydef; kp; kp = kp->chain)
4647     kp->str->writeflag = 1;
4648   delete_macro (hp);
4649 }
4650
4651 /* Write the output, interspersing precompiled strings in their */
4652  /* appropriate places. */
4653 static void
4654 write_output ()
4655 {
4656   STRINGDEF *next_string;
4657   U_CHAR *cur_buf_loc;
4658   int line_command_len = 80;
4659   char *line_command = xmalloc (line_command_len);
4660   int len;
4661
4662   /* In each run through the loop, either cur_buf_loc == */
4663   /* next_string_loc, in which case we print a series of strings, or */
4664   /* it is less than next_string_loc, in which case we write some of */
4665   /* the buffer. */
4666   cur_buf_loc = outbuf.buf; 
4667   next_string = stringlist;
4668   
4669   while (cur_buf_loc < outbuf.bufp || next_string) {
4670     if (next_string
4671         && cur_buf_loc - outbuf.buf == next_string->output_mark) {
4672       if (next_string->writeflag) {
4673         len = strlen (next_string->filename);
4674         if (len > line_command_len)
4675           line_command = xrealloc (line_command, 
4676                                    line_command_len *= 2);
4677         sprintf (line_command, "\n# %d \"%s\"\n",
4678                  next_string->lineno, next_string->filename);
4679         if (write (fileno (stdout), line_command, strlen (line_command)) < 0)
4680           pfatal_with_name (out_fname);
4681         if (write (fileno (stdout), next_string->contents, next_string->len) < 0)
4682           pfatal_with_name (out_fname);
4683       }       
4684       next_string = next_string->chain;
4685     }
4686     else {
4687       len = (next_string
4688              ? (next_string->output_mark 
4689                 - (cur_buf_loc - outbuf.buf))
4690              : outbuf.bufp - cur_buf_loc);
4691       
4692       if (write (fileno (stdout), cur_buf_loc, len) < len)
4693         pfatal_with_name (out_fname);
4694       cur_buf_loc += len;
4695     }
4696   }
4697   free (line_command);
4698 }
4699
4700 /* Pass a directive through to the output file.
4701    BUF points to the contents of the directive, as a contiguous string.
4702    LIMIT points to the first character past the end of the directive.
4703    KEYWORD is the keyword-table entry for the directive.  */
4704
4705 static void
4706 pass_thru_directive (buf, limit, op, keyword)
4707      U_CHAR *buf, *limit;
4708      FILE_BUF *op;
4709      struct directive *keyword;
4710 {
4711   register unsigned keyword_length = keyword->length;
4712
4713   check_expand (op, 1 + keyword_length + (limit - buf));
4714   *op->bufp++ = '#';
4715   bcopy (keyword->name, op->bufp, keyword_length);
4716   op->bufp += keyword_length;
4717   if (limit != buf && buf[0] != ' ')
4718     *op->bufp++ = ' ';
4719   bcopy (buf, op->bufp, limit - buf);
4720   op->bufp += (limit - buf);
4721 #if 0
4722   *op->bufp++ = '\n';
4723   /* Count the line we have just made in the output,
4724      to get in sync properly.  */
4725   op->lineno++;
4726 #endif
4727 }
4728 \f
4729 /* The arglist structure is built by do_define to tell
4730    collect_definition where the argument names begin.  That
4731    is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
4732    would contain pointers to the strings x, y, and z.
4733    Collect_definition would then build a DEFINITION node,
4734    with reflist nodes pointing to the places x, y, and z had
4735    appeared.  So the arglist is just convenience data passed
4736    between these two routines.  It is not kept around after
4737    the current #define has been processed and entered into the
4738    hash table. */
4739
4740 struct arglist {
4741   struct arglist *next;
4742   U_CHAR *name;
4743   int length;
4744   int argno;
4745   char rest_args;
4746 };
4747
4748 /* Create a DEFINITION node from a #define directive.  Arguments are 
4749    as for do_define. */
4750 static MACRODEF
4751 create_definition (buf, limit, op)
4752      U_CHAR *buf, *limit;
4753      FILE_BUF *op;
4754 {
4755   U_CHAR *bp;                   /* temp ptr into input buffer */
4756   U_CHAR *symname;              /* remember where symbol name starts */
4757   int sym_length;               /* and how long it is */
4758   int line = instack[indepth].lineno;
4759   char *file = instack[indepth].nominal_fname;
4760   int rest_args = 0;
4761
4762   DEFINITION *defn;
4763   int arglengths = 0;           /* Accumulate lengths of arg names
4764                                    plus number of args.  */
4765   MACRODEF mdef;
4766
4767   bp = buf;
4768
4769   while (is_hor_space[*bp])
4770     bp++;
4771
4772   symname = bp;                 /* remember where it starts */
4773   sym_length = check_macro_name (bp, "macro");
4774   bp += sym_length;
4775
4776   /* Lossage will occur if identifiers or control keywords are broken
4777      across lines using backslash.  This is not the right place to take
4778      care of that. */
4779
4780   if (*bp == '(') {
4781     struct arglist *arg_ptrs = NULL;
4782     int argno = 0;
4783
4784     bp++;                       /* skip '(' */
4785     SKIP_WHITE_SPACE (bp);
4786
4787     /* Loop over macro argument names.  */
4788     while (*bp != ')') {
4789       struct arglist *temp;
4790
4791       temp = (struct arglist *) alloca (sizeof (struct arglist));
4792       temp->name = bp;
4793       temp->next = arg_ptrs;
4794       temp->argno = argno++;
4795       temp->rest_args = 0;
4796       arg_ptrs = temp;
4797
4798       if (rest_args)
4799         pedwarn ("another parameter follows `%s'",
4800                  rest_extension);
4801
4802       if (!is_idstart[*bp])
4803         pedwarn ("invalid character in macro parameter name");
4804       
4805       /* Find the end of the arg name.  */
4806       while (is_idchar[*bp]) {
4807         bp++;
4808         /* do we have a "special" rest-args extension here? */
4809         if (limit - bp > REST_EXTENSION_LENGTH &&
4810             strncmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) {
4811           rest_args = 1;
4812           temp->rest_args = 1;
4813           break;
4814         }
4815       }
4816       temp->length = bp - temp->name;
4817       if (rest_args == 1)
4818         bp += REST_EXTENSION_LENGTH;
4819       arglengths += temp->length + 2;
4820       SKIP_WHITE_SPACE (bp);
4821       if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
4822         error ("badly punctuated parameter list in `#define'");
4823         goto nope;
4824       }
4825       if (*bp == ',') {
4826         bp++;
4827         SKIP_WHITE_SPACE (bp);
4828       }
4829       if (bp >= limit) {
4830         error ("unterminated parameter list in `#define'");
4831         goto nope;
4832       }
4833       {
4834         struct arglist *otemp;
4835
4836         for (otemp = temp->next; otemp != NULL; otemp = otemp->next)
4837           if (temp->length == otemp->length &&
4838             strncmp (temp->name, otemp->name, temp->length) == 0) {
4839               U_CHAR *name;
4840
4841               name = (U_CHAR *) alloca (temp->length + 1);
4842               (void) strncpy (name, temp->name, temp->length);
4843               name[temp->length] = '\0';
4844               error ("duplicate argument name `%s' in `#define'", name);
4845               goto nope;
4846           }
4847       }
4848     }
4849
4850     ++bp;                       /* skip paren */
4851     /* Skip exactly one space or tab if any.  */
4852     if (bp < limit && (*bp == ' ' || *bp == '\t')) ++bp;
4853     /* now everything from bp before limit is the definition. */
4854     defn = collect_expansion (bp, limit, argno, arg_ptrs);
4855     defn->rest_args = rest_args;
4856
4857     /* Now set defn->args.argnames to the result of concatenating
4858        the argument names in reverse order
4859        with comma-space between them.  */
4860     defn->args.argnames = (U_CHAR *) xmalloc (arglengths + 1);
4861     {
4862       struct arglist *temp;
4863       int i = 0;
4864       for (temp = arg_ptrs; temp; temp = temp->next) {
4865         bcopy (temp->name, &defn->args.argnames[i], temp->length);
4866         i += temp->length;
4867         if (temp->next != 0) {
4868           defn->args.argnames[i++] = ',';
4869           defn->args.argnames[i++] = ' ';
4870         }
4871       }
4872       defn->args.argnames[i] = 0;
4873     }
4874   } else {
4875     /* simple expansion or empty definition; gobble it */
4876     if (is_hor_space[*bp])
4877       ++bp;             /* skip exactly one blank/tab char */
4878     /* now everything from bp before limit is the definition. */
4879     defn = collect_expansion (bp, limit, -1, NULL_PTR);
4880     defn->args.argnames = (U_CHAR *) "";
4881   }
4882
4883   defn->line = line;
4884   defn->file = file;
4885
4886   /* OP is null if this is a predefinition */
4887   defn->predefined = !op;
4888   mdef.defn = defn;
4889   mdef.symnam = symname;
4890   mdef.symlen = sym_length;
4891
4892   return mdef;
4893
4894  nope:
4895   mdef.defn = 0;
4896   return mdef;
4897 }
4898  
4899 /* Process a #define command.
4900 BUF points to the contents of the #define command, as a contiguous string.
4901 LIMIT points to the first character past the end of the definition.
4902 KEYWORD is the keyword-table entry for #define.  */
4903
4904 static int
4905 do_define (buf, limit, op, keyword)
4906      U_CHAR *buf, *limit;
4907      FILE_BUF *op;
4908      struct directive *keyword;
4909 {
4910   int hashcode;
4911   MACRODEF mdef;
4912
4913   /* If this is a precompiler run (with -pcp) pass thru #define commands.  */
4914   if (pcp_outfile && op)
4915     pass_thru_directive (buf, limit, op, keyword);
4916
4917   mdef = create_definition (buf, limit, op);
4918   if (mdef.defn == 0)
4919     goto nope;
4920
4921   hashcode = hashf (mdef.symnam, mdef.symlen, HASHSIZE);
4922
4923   {
4924     HASHNODE *hp;
4925     if ((hp = lookup (mdef.symnam, mdef.symlen, hashcode)) != NULL) {
4926       int ok = 0;
4927       /* Redefining a precompiled key is ok.  */
4928       if (hp->type == T_PCSTRING)
4929         ok = 1;
4930       /* Redefining a macro is ok if the definitions are the same.  */
4931       else if (hp->type == T_MACRO)
4932         ok = ! compare_defs (mdef.defn, hp->value.defn);
4933       /* Redefining a constant is ok with -D.  */
4934       else if (hp->type == T_CONST)
4935         ok = ! done_initializing;
4936       /* Print the warning if it's not ok.  */
4937       if (!ok) {
4938         U_CHAR *msg;            /* what pain... */
4939
4940         /* If we are passing through #define and #undef directives, do
4941            that for this re-definition now.  */
4942         if (debug_output && op)
4943           pass_thru_directive (buf, limit, op, keyword);
4944
4945         msg = (U_CHAR *) alloca (mdef.symlen + 22);
4946         *msg = '`';
4947         bcopy (mdef.symnam, msg + 1, mdef.symlen);
4948         strcpy ((char *) (msg + mdef.symlen + 1), "' redefined");
4949         pedwarn (msg);
4950         if (hp->type == T_MACRO)
4951           pedwarn_with_file_and_line (hp->value.defn->file, hp->value.defn->line,
4952                                       "this is the location of the previous definition");
4953       }
4954       /* Replace the old definition.  */
4955       hp->type = T_MACRO;
4956       hp->value.defn = mdef.defn;
4957     } else {
4958       /* If we are passing through #define and #undef directives, do
4959          that for this new definition now.  */
4960       if (debug_output && op)
4961         pass_thru_directive (buf, limit, op, keyword);
4962       install (mdef.symnam, mdef.symlen, T_MACRO, 0,
4963                (char *) mdef.defn, hashcode);
4964     }
4965   }
4966
4967   return 0;
4968
4969 nope:
4970
4971   return 1;
4972 }
4973 \f
4974 /* Check a purported macro name SYMNAME, and yield its length.
4975    USAGE is the kind of name this is intended for.  */
4976
4977 static int
4978 check_macro_name (symname, usage)
4979      U_CHAR *symname;
4980      char *usage;
4981 {
4982   U_CHAR *p;
4983   int sym_length;
4984
4985   for (p = symname; is_idchar[*p]; p++)
4986     ;
4987   sym_length = p - symname;
4988   if (sym_length == 0)
4989     error ("invalid %s name", usage);
4990   else if (!is_idstart[*symname]) {
4991     U_CHAR *msg;                        /* what pain... */
4992     msg = (U_CHAR *) alloca (sym_length + 1);
4993     bcopy (symname, msg, sym_length);
4994     msg[sym_length] = 0;
4995     error ("invalid %s name `%s'", usage, msg);
4996   } else {
4997     if (! strncmp (symname, "defined", 7) && sym_length == 7)
4998       error ("invalid %s name `defined'", usage);
4999   }
5000   return sym_length;
5001 }
5002
5003 /*
5004  * return zero if two DEFINITIONs are isomorphic
5005  */
5006 static int
5007 compare_defs (d1, d2)
5008      DEFINITION *d1, *d2;
5009 {
5010   register struct reflist *a1, *a2;
5011   register U_CHAR *p1 = d1->expansion;
5012   register U_CHAR *p2 = d2->expansion;
5013   int first = 1;
5014
5015   if (d1->nargs != d2->nargs)
5016     return 1;
5017   if (strcmp ((char *)d1->args.argnames, (char *)d2->args.argnames))
5018     return 1;
5019   for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
5020        a1 = a1->next, a2 = a2->next) {
5021     if (!((a1->nchars == a2->nchars && ! strncmp (p1, p2, a1->nchars))
5022           || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
5023         || a1->argno != a2->argno
5024         || a1->stringify != a2->stringify
5025         || a1->raw_before != a2->raw_before
5026         || a1->raw_after != a2->raw_after)
5027       return 1;
5028     first = 0;
5029     p1 += a1->nchars;
5030     p2 += a2->nchars;
5031   }
5032   if (a1 != a2)
5033     return 1;
5034   if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
5035                      p2, d2->length - (p2 - d2->expansion), 1))
5036     return 1;
5037   return 0;
5038 }
5039
5040 /* Return 1 if two parts of two macro definitions are effectively different.
5041    One of the parts starts at BEG1 and has LEN1 chars;
5042    the other has LEN2 chars at BEG2.
5043    Any sequence of whitespace matches any other sequence of whitespace.
5044    FIRST means these parts are the first of a macro definition;
5045     so ignore leading whitespace entirely.
5046    LAST means these parts are the last of a macro definition;
5047     so ignore trailing whitespace entirely.  */
5048
5049 static int
5050 comp_def_part (first, beg1, len1, beg2, len2, last)
5051      int first;
5052      U_CHAR *beg1, *beg2;
5053      int len1, len2;
5054      int last;
5055 {
5056   register U_CHAR *end1 = beg1 + len1;
5057   register U_CHAR *end2 = beg2 + len2;
5058   if (first) {
5059     while (beg1 != end1 && is_space[*beg1]) beg1++;
5060     while (beg2 != end2 && is_space[*beg2]) beg2++;
5061   }
5062   if (last) {
5063     while (beg1 != end1 && is_space[end1[-1]]) end1--;
5064     while (beg2 != end2 && is_space[end2[-1]]) end2--;
5065   }
5066   while (beg1 != end1 && beg2 != end2) {
5067     if (is_space[*beg1] && is_space[*beg2]) {
5068       while (beg1 != end1 && is_space[*beg1]) beg1++;
5069       while (beg2 != end2 && is_space[*beg2]) beg2++;
5070     } else if (*beg1 == *beg2) {
5071       beg1++; beg2++;
5072     } else break;
5073   }
5074   return (beg1 != end1) || (beg2 != end2);
5075 }
5076 \f
5077 /* Read a replacement list for a macro with parameters.
5078    Build the DEFINITION structure.
5079    Reads characters of text starting at BUF until END.
5080    ARGLIST specifies the formal parameters to look for
5081    in the text of the definition; NARGS is the number of args
5082    in that list, or -1 for a macro name that wants no argument list.
5083    MACRONAME is the macro name itself (so we can avoid recursive expansion)
5084    and NAMELEN is its length in characters.
5085    
5086 Note that comments and backslash-newlines have already been deleted
5087 from the argument.  */
5088
5089 /* Leading and trailing Space, Tab, etc. are converted to markers
5090    Newline Space, Newline Tab, etc.
5091    Newline Space makes a space in the final output
5092    but is discarded if stringified.  (Newline Tab is similar but
5093    makes a Tab instead.)
5094
5095    If there is no trailing whitespace, a Newline Space is added at the end
5096    to prevent concatenation that would be contrary to the standard.  */
5097
5098 static DEFINITION *
5099 collect_expansion (buf, end, nargs, arglist)
5100      U_CHAR *buf, *end;
5101      int nargs;
5102      struct arglist *arglist;
5103 {
5104   DEFINITION *defn;
5105   register U_CHAR *p, *limit, *lastp, *exp_p;
5106   struct reflist *endpat = NULL;
5107   /* Pointer to first nonspace after last ## seen.  */
5108   U_CHAR *concat = 0;
5109   /* Pointer to first nonspace after last single-# seen.  */
5110   U_CHAR *stringify = 0;
5111   int maxsize;
5112   int expected_delimiter = '\0';
5113
5114   /* Scan thru the replacement list, ignoring comments and quoted
5115      strings, picking up on the macro calls.  It does a linear search
5116      thru the arg list on every potential symbol.  Profiling might say
5117      that something smarter should happen. */
5118
5119   if (end < buf)
5120     abort ();
5121
5122   /* Find the beginning of the trailing whitespace.  */
5123   /* Find end of leading whitespace.  */
5124   limit = end;
5125   p = buf;
5126   while (p < limit && is_space[limit[-1]]) limit--;
5127   while (p < limit && is_space[*p]) p++;
5128
5129   /* Allocate space for the text in the macro definition.
5130      Leading and trailing whitespace chars need 2 bytes each.
5131      Each other input char may or may not need 1 byte,
5132      so this is an upper bound.
5133      The extra 2 are for invented trailing newline-marker and final null.  */
5134   maxsize = (sizeof (DEFINITION)
5135              + 2 * (end - limit) + 2 * (p - buf)
5136              + (limit - p) + 3);
5137   defn = (DEFINITION *) xcalloc (1, maxsize);
5138
5139   defn->nargs = nargs;
5140   exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
5141   lastp = exp_p;
5142
5143   p = buf;
5144
5145   /* Convert leading whitespace to Newline-markers.  */
5146   while (p < limit && is_space[*p]) {
5147     *exp_p++ = '\n';
5148     *exp_p++ = *p++;
5149   }
5150
5151   if (limit - p >= 2 && p[0] == '#' && p[1] == '#') {
5152     error ("`##' at start of macro definition");
5153     p += 2;
5154   }
5155
5156   /* Process the main body of the definition.  */
5157   while (p < limit) {
5158     int skipped_arg = 0;
5159     register U_CHAR c = *p++;
5160
5161     *exp_p++ = c;
5162
5163     if (!traditional) {
5164       switch (c) {
5165       case '\'':
5166       case '\"':
5167         if (expected_delimiter != '\0') {
5168           if (c == expected_delimiter)
5169             expected_delimiter = '\0';
5170         } else
5171           expected_delimiter = c;
5172         break;
5173
5174         /* Special hack: if a \# is written in the #define
5175            include a # in the definition.  This is useless for C code
5176            but useful for preprocessing other things.  */
5177
5178       case '\\':
5179         /* \# quotes a # even outside of strings.  */
5180         if (p < limit && *p == '#' && !expected_delimiter) {
5181           exp_p--;
5182           *exp_p++ = *p++;
5183         } else if (p < limit && expected_delimiter) {
5184           /* In a string, backslash goes through
5185              and makes next char ordinary.  */
5186           *exp_p++ = *p++;
5187         }
5188         break;
5189
5190       case '#':
5191         /* # is ordinary inside a string.  */
5192         if (expected_delimiter)
5193           break;
5194         if (p < limit && *p == '#') {
5195           /* ##: concatenate preceding and following tokens.  */
5196           /* Take out the first #, discard preceding whitespace.  */
5197           exp_p--;
5198           while (exp_p > lastp && is_hor_space[exp_p[-1]])
5199             --exp_p;
5200           /* Skip the second #.  */
5201           p++;
5202           /* Discard following whitespace.  */
5203           SKIP_WHITE_SPACE (p);
5204           concat = p;
5205           if (p == limit)
5206             error ("`##' at end of macro definition");
5207         } else if (nargs >= 0) {
5208           /* Single #: stringify following argument ref.
5209              Don't leave the # in the expansion.  */
5210           exp_p--;
5211           SKIP_WHITE_SPACE (p);
5212           if (p == limit || ! is_idstart[*p])
5213             error ("`#' operator is not followed by a macro argument name");
5214           else
5215             stringify = p;
5216         }
5217         break;
5218       }
5219     } else {
5220       /* In -traditional mode, recognize arguments inside strings and
5221          and character constants, and ignore special properties of #.
5222          Arguments inside strings are considered "stringified", but no
5223          extra quote marks are supplied.  */
5224       switch (c) {
5225       case '\'':
5226       case '\"':
5227         if (expected_delimiter != '\0') {
5228           if (c == expected_delimiter)
5229             expected_delimiter = '\0';
5230         } else
5231           expected_delimiter = c;
5232         break;
5233
5234       case '\\':
5235         /* Backslash quotes delimiters and itself, but not macro args.  */
5236         if (expected_delimiter != 0 && p < limit
5237             && (*p == expected_delimiter || *p == '\\')) {
5238           *exp_p++ = *p++;
5239           continue;
5240         }
5241         break;
5242
5243       case '/':
5244         if (expected_delimiter != '\0') /* No comments inside strings.  */
5245           break;
5246         if (*p == '*') {
5247           /* If we find a comment that wasn't removed by handle_directive,
5248              this must be -traditional.  So replace the comment with
5249              nothing at all.  */
5250           exp_p--;
5251           p += 1;
5252           while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
5253             p++;
5254 #if 0
5255           /* Mark this as a concatenation-point, as if it had been ##.  */
5256           concat = p;
5257 #endif
5258         }
5259         break;
5260       }
5261     }
5262
5263     /* Handle the start of a symbol.  */
5264     if (is_idchar[c] && nargs > 0) {
5265       U_CHAR *id_beg = p - 1;
5266       int id_len;
5267
5268       --exp_p;
5269       while (p != limit && is_idchar[*p]) p++;
5270       id_len = p - id_beg;
5271
5272       if (is_idstart[c]) {
5273         register struct arglist *arg;
5274
5275         for (arg = arglist; arg != NULL; arg = arg->next) {
5276           struct reflist *tpat;
5277
5278           if (arg->name[0] == c
5279               && arg->length == id_len
5280               && strncmp (arg->name, id_beg, id_len) == 0) {
5281             if (expected_delimiter && warn_stringify) {
5282               if (traditional) {
5283                 warning ("macro argument `%.*s' is stringified.",
5284                          id_len, arg->name);
5285               } else {
5286                 warning ("macro arg `%.*s' would be stringified with -traditional.",
5287                          id_len, arg->name);
5288               }
5289             }
5290             /* If ANSI, don't actually substitute inside a string.  */
5291             if (!traditional && expected_delimiter)
5292               break;
5293             /* make a pat node for this arg and append it to the end of
5294                the pat list */
5295             tpat = (struct reflist *) xmalloc (sizeof (struct reflist));
5296             tpat->next = NULL;
5297             tpat->raw_before = concat == id_beg;
5298             tpat->raw_after = 0;
5299             tpat->rest_args = arg->rest_args;
5300             tpat->stringify = (traditional ? expected_delimiter != '\0'
5301                                : stringify == id_beg);
5302
5303             if (endpat == NULL)
5304               defn->pattern = tpat;
5305             else
5306               endpat->next = tpat;
5307             endpat = tpat;
5308
5309             tpat->argno = arg->argno;
5310             tpat->nchars = exp_p - lastp;
5311             {
5312               register U_CHAR *p1 = p;
5313               SKIP_WHITE_SPACE (p1);
5314               if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
5315                 tpat->raw_after = 1;
5316             }
5317             lastp = exp_p;      /* place to start copying from next time */
5318             skipped_arg = 1;
5319             break;
5320           }
5321         }
5322       }
5323
5324       /* If this was not a macro arg, copy it into the expansion.  */
5325       if (! skipped_arg) {
5326         register U_CHAR *lim1 = p;
5327         p = id_beg;
5328         while (p != lim1)
5329           *exp_p++ = *p++;
5330         if (stringify == id_beg)
5331           error ("`#' operator should be followed by a macro argument name");
5332       }
5333     }
5334   }
5335
5336   if (limit < end) {
5337     /* Convert trailing whitespace to Newline-markers.  */
5338     while (limit < end && is_space[*limit]) {
5339       *exp_p++ = '\n';
5340       *exp_p++ = *limit++;
5341     }
5342   } else if (!traditional && expected_delimiter == 0) {
5343     /* There is no trailing whitespace, so invent some in ANSI mode.
5344        But not if "inside a string" (which in ANSI mode
5345        happens only for -D option).  */
5346     *exp_p++ = '\n';
5347     *exp_p++ = ' ';
5348   }
5349
5350   *exp_p = '\0';
5351
5352   defn->length = exp_p - defn->expansion;
5353
5354   /* Crash now if we overrun the allocated size.  */
5355   if (defn->length + 1 > maxsize)
5356     abort ();
5357
5358 #if 0
5359 /* This isn't worth the time it takes.  */
5360   /* give back excess storage */
5361   defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
5362 #endif
5363
5364   return defn;
5365 }
5366 \f
5367 static int
5368 do_assert (buf, limit, op, keyword)
5369      U_CHAR *buf, *limit;
5370      FILE_BUF *op;
5371      struct directive *keyword;
5372 {
5373   U_CHAR *bp;                   /* temp ptr into input buffer */
5374   U_CHAR *symname;              /* remember where symbol name starts */
5375   int sym_length;               /* and how long it is */
5376   struct arglist *tokens = NULL;
5377
5378   if (pedantic && done_initializing && !instack[indepth].system_header_p)
5379     pedwarn ("ANSI C does not allow `#assert'");
5380
5381   bp = buf;
5382
5383   while (is_hor_space[*bp])
5384     bp++;
5385
5386   symname = bp;                 /* remember where it starts */
5387   sym_length = check_macro_name (bp, "assertion");
5388   bp += sym_length;
5389   /* #define doesn't do this, but we should.  */
5390   SKIP_WHITE_SPACE (bp);
5391
5392   /* Lossage will occur if identifiers or control tokens are broken
5393      across lines using backslash.  This is not the right place to take
5394      care of that. */
5395
5396   if (*bp != '(') {
5397     error ("missing token-sequence in `#assert'");
5398     return 1;
5399   }
5400
5401   {
5402     int error_flag = 0;
5403
5404     bp++;                       /* skip '(' */
5405     SKIP_WHITE_SPACE (bp);
5406
5407     tokens = read_token_list (&bp, limit, &error_flag);
5408     if (error_flag)
5409       return 1;
5410     if (tokens == 0) {
5411       error ("empty token-sequence in `#assert'");
5412       return 1;
5413     }
5414
5415     ++bp;                       /* skip paren */
5416     SKIP_WHITE_SPACE (bp);
5417   }
5418
5419   /* If this name isn't already an assertion name, make it one.
5420      Error if it was already in use in some other way.  */
5421
5422   {
5423     ASSERTION_HASHNODE *hp;
5424     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
5425     struct tokenlist_list *value
5426       = (struct tokenlist_list *) xmalloc (sizeof (struct tokenlist_list));
5427
5428     hp = assertion_lookup (symname, sym_length, hashcode);
5429     if (hp == NULL) {
5430       if (sym_length == 7 && ! strncmp (symname, "defined", sym_length))
5431         error ("`defined' redefined as assertion");
5432       hp = assertion_install (symname, sym_length, hashcode);
5433     }
5434
5435     /* Add the spec'd token-sequence to the list of such.  */
5436     value->tokens = tokens;
5437     value->next = hp->value;
5438     hp->value = value;
5439   }
5440
5441   return 0;
5442 }
5443 \f
5444 static int
5445 do_unassert (buf, limit, op, keyword)
5446      U_CHAR *buf, *limit;
5447      FILE_BUF *op;
5448      struct directive *keyword;
5449 {
5450   U_CHAR *bp;                   /* temp ptr into input buffer */
5451   U_CHAR *symname;              /* remember where symbol name starts */
5452   int sym_length;               /* and how long it is */
5453
5454   struct arglist *tokens = NULL;
5455   int tokens_specified = 0;
5456
5457   if (pedantic && done_initializing && !instack[indepth].system_header_p)
5458     pedwarn ("ANSI C does not allow `#unassert'");
5459
5460   bp = buf;
5461
5462   while (is_hor_space[*bp])
5463     bp++;
5464
5465   symname = bp;                 /* remember where it starts */
5466   sym_length = check_macro_name (bp, "assertion");
5467   bp += sym_length;
5468   /* #define doesn't do this, but we should.  */
5469   SKIP_WHITE_SPACE (bp);
5470
5471   /* Lossage will occur if identifiers or control tokens are broken
5472      across lines using backslash.  This is not the right place to take
5473      care of that. */
5474
5475   if (*bp == '(') {
5476     int error_flag = 0;
5477
5478     bp++;                       /* skip '(' */
5479     SKIP_WHITE_SPACE (bp);
5480
5481     tokens = read_token_list (&bp, limit, &error_flag);
5482     if (error_flag)
5483       return 1;
5484     if (tokens == 0) {
5485       error ("empty token list in `#unassert'");
5486       return 1;
5487     }
5488
5489     tokens_specified = 1;
5490
5491     ++bp;                       /* skip paren */
5492     SKIP_WHITE_SPACE (bp);
5493   }
5494
5495   {
5496     ASSERTION_HASHNODE *hp;
5497     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
5498     struct tokenlist_list *tail, *prev;
5499
5500     hp = assertion_lookup (symname, sym_length, hashcode);
5501     if (hp == NULL)
5502       return 1;
5503
5504     /* If no token list was specified, then eliminate this assertion
5505        entirely.  */
5506     if (! tokens_specified) {
5507       struct tokenlist_list *next;
5508       for (tail = hp->value; tail; tail = next) {
5509         next = tail->next;
5510         free_token_list (tail->tokens);
5511         free (tail);
5512       }
5513       delete_assertion (hp);
5514     } else {
5515       /* If a list of tokens was given, then delete any matching list.  */
5516
5517       tail = hp->value;
5518       prev = 0;
5519       while (tail) {
5520         struct tokenlist_list *next = tail->next;
5521         if (compare_token_lists (tail->tokens, tokens)) {
5522           if (prev)
5523             prev->next = next;
5524           else
5525             hp->value = tail->next;
5526           free_token_list (tail->tokens);
5527           free (tail);
5528         } else {
5529           prev = tail;
5530         }
5531         tail = next;
5532       }
5533     }
5534   }
5535
5536   return 0;
5537 }
5538 \f
5539 /* Test whether there is an assertion named NAME
5540    and optionally whether it has an asserted token list TOKENS.
5541    NAME is not null terminated; its length is SYM_LENGTH.
5542    If TOKENS_SPECIFIED is 0, then don't check for any token list.  */
5543
5544 int
5545 check_assertion (name, sym_length, tokens_specified, tokens)
5546      U_CHAR *name;
5547      int sym_length;
5548      int tokens_specified;
5549      struct arglist *tokens;
5550 {
5551   ASSERTION_HASHNODE *hp;
5552   int hashcode = hashf (name, sym_length, ASSERTION_HASHSIZE);
5553
5554   if (pedantic && !instack[indepth].system_header_p)
5555     pedwarn ("ANSI C does not allow testing assertions");
5556
5557   hp = assertion_lookup (name, sym_length, hashcode);
5558   if (hp == NULL)
5559     /* It is not an assertion; just return false.  */
5560     return 0;
5561
5562   /* If no token list was specified, then value is 1.  */
5563   if (! tokens_specified)
5564     return 1;
5565
5566   {
5567     struct tokenlist_list *tail;
5568
5569     tail = hp->value;
5570
5571     /* If a list of tokens was given,
5572        then succeed if the assertion records a matching list.  */
5573
5574     while (tail) {
5575       if (compare_token_lists (tail->tokens, tokens))
5576         return 1;
5577       tail = tail->next;
5578     }
5579
5580     /* Fail if the assertion has no matching list.  */
5581     return 0;
5582   }
5583 }
5584
5585 /* Compare two lists of tokens for equality including order of tokens.  */
5586
5587 static int
5588 compare_token_lists (l1, l2)
5589      struct arglist *l1, *l2;
5590 {
5591   while (l1 && l2) {
5592     if (l1->length != l2->length)
5593       return 0;
5594     if (strncmp (l1->name, l2->name, l1->length))
5595       return 0;
5596     l1 = l1->next;
5597     l2 = l2->next;
5598   }
5599
5600   /* Succeed if both lists end at the same time.  */
5601   return l1 == l2;
5602 }
5603 \f
5604 /* Read a space-separated list of tokens ending in a close parenthesis.
5605    Return a list of strings, in the order they were written.
5606    (In case of error, return 0 and store -1 in *ERROR_FLAG.)
5607    Parse the text starting at *BPP, and update *BPP.
5608    Don't parse beyond LIMIT.  */
5609
5610 static struct arglist *
5611 read_token_list (bpp, limit, error_flag)
5612      U_CHAR **bpp;
5613      U_CHAR *limit;
5614      int *error_flag;
5615 {
5616   struct arglist *token_ptrs = 0;
5617   U_CHAR *bp = *bpp;
5618   int depth = 1;
5619
5620   *error_flag = 0;
5621
5622   /* Loop over the assertion value tokens.  */
5623   while (depth > 0) {
5624     struct arglist *temp;
5625     int eofp = 0;
5626     U_CHAR *beg = bp;
5627
5628     /* Find the end of the token.  */
5629     if (*bp == '(') {
5630       bp++;
5631       depth++;
5632     } else if (*bp == ')') {
5633       depth--;
5634       if (depth == 0)
5635         break;
5636       bp++;
5637     } else if (*bp == '"' || *bp == '\'')
5638       bp = skip_quoted_string (bp, limit, 0, NULL_PTR, NULL_PTR, &eofp);
5639     else
5640       while (! is_hor_space[*bp] && *bp != '(' && *bp != ')'
5641              && *bp != '"' && *bp != '\'' && bp != limit)
5642         bp++;
5643
5644     temp = (struct arglist *) xmalloc (sizeof (struct arglist));
5645     temp->name = (U_CHAR *) xmalloc (bp - beg + 1);
5646     bcopy (beg, temp->name, bp - beg);
5647     temp->name[bp - beg] = 0;
5648     temp->next = token_ptrs;
5649     token_ptrs = temp;
5650     temp->length = bp - beg;
5651
5652     SKIP_WHITE_SPACE (bp);
5653
5654     if (bp >= limit) {
5655       error ("unterminated token sequence in `#assert' or `#unassert'");
5656       *error_flag = -1;
5657       return 0;
5658     }
5659   }
5660   *bpp = bp;
5661
5662   /* We accumulated the names in reverse order.
5663      Now reverse them to get the proper order.  */
5664   {
5665     register struct arglist *prev = 0, *this, *next;
5666     for (this = token_ptrs; this; this = next) {
5667       next = this->next;
5668       this->next = prev;
5669       prev = this;
5670     }
5671     return prev;
5672   }
5673 }
5674
5675 static void
5676 free_token_list (tokens)
5677      struct arglist *tokens;
5678 {
5679   while (tokens) {
5680     struct arglist *next = tokens->next;
5681     free (tokens->name);
5682     free (tokens);
5683     tokens = next;
5684   }
5685 }
5686 \f
5687 /*
5688  * Install a name in the assertion hash table.
5689  *
5690  * If LEN is >= 0, it is the length of the name.
5691  * Otherwise, compute the length by scanning the entire name.
5692  *
5693  * If HASH is >= 0, it is the precomputed hash code.
5694  * Otherwise, compute the hash code.
5695  */
5696 static ASSERTION_HASHNODE *
5697 assertion_install (name, len, hash)
5698      U_CHAR *name;
5699      int len;
5700      int hash;
5701 {
5702   register ASSERTION_HASHNODE *hp;
5703   register int i, bucket;
5704   register U_CHAR *p, *q;
5705
5706   i = sizeof (ASSERTION_HASHNODE) + len + 1;
5707   hp = (ASSERTION_HASHNODE *) xmalloc (i);
5708   bucket = hash;
5709   hp->bucket_hdr = &assertion_hashtab[bucket];
5710   hp->next = assertion_hashtab[bucket];
5711   assertion_hashtab[bucket] = hp;
5712   hp->prev = NULL;
5713   if (hp->next != NULL)
5714     hp->next->prev = hp;
5715   hp->length = len;
5716   hp->value = 0;
5717   hp->name = ((U_CHAR *) hp) + sizeof (ASSERTION_HASHNODE);
5718   p = hp->name;
5719   q = name;
5720   for (i = 0; i < len; i++)
5721     *p++ = *q++;
5722   hp->name[len] = 0;
5723   return hp;
5724 }
5725
5726 /*
5727  * find the most recent hash node for name name (ending with first
5728  * non-identifier char) installed by install
5729  *
5730  * If LEN is >= 0, it is the length of the name.
5731  * Otherwise, compute the length by scanning the entire name.
5732  *
5733  * If HASH is >= 0, it is the precomputed hash code.
5734  * Otherwise, compute the hash code.
5735  */
5736 static ASSERTION_HASHNODE *
5737 assertion_lookup (name, len, hash)
5738      U_CHAR *name;
5739      int len;
5740      int hash;
5741 {
5742   register U_CHAR *bp;
5743   register ASSERTION_HASHNODE *bucket;
5744
5745   bucket = assertion_hashtab[hash];
5746   while (bucket) {
5747     if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
5748       return bucket;
5749     bucket = bucket->next;
5750   }
5751   return NULL;
5752 }
5753
5754 static void
5755 delete_assertion (hp)
5756      ASSERTION_HASHNODE *hp;
5757 {
5758
5759   if (hp->prev != NULL)
5760     hp->prev->next = hp->next;
5761   if (hp->next != NULL)
5762     hp->next->prev = hp->prev;
5763
5764   /* make sure that the bucket chain header that
5765      the deleted guy was on points to the right thing afterwards. */
5766   if (hp == *hp->bucket_hdr)
5767     *hp->bucket_hdr = hp->next;
5768
5769   free (hp);
5770 }
5771 \f
5772 /*
5773  * interpret #line command.  Remembers previously seen fnames
5774  * in its very own hash table.
5775  */
5776 #define FNAME_HASHSIZE 37
5777
5778 static int
5779 do_line (buf, limit, op, keyword)
5780      U_CHAR *buf, *limit;
5781      FILE_BUF *op;
5782      struct directive *keyword;
5783 {
5784   register U_CHAR *bp;
5785   FILE_BUF *ip = &instack[indepth];
5786   FILE_BUF tem;
5787   int new_lineno;
5788   enum file_change_code file_change = same_file;
5789
5790   /* Expand any macros.  */
5791   tem = expand_to_temp_buffer (buf, limit, 0, 0);
5792
5793   /* Point to macroexpanded line, which is null-terminated now.  */
5794   bp = tem.buf;
5795   SKIP_WHITE_SPACE (bp);
5796
5797   if (!isdigit (*bp)) {
5798     error ("invalid format `#line' command");
5799     return 0;
5800   }
5801
5802   /* The Newline at the end of this line remains to be processed.
5803      To put the next line at the specified line number,
5804      we must store a line number now that is one less.  */
5805   new_lineno = atoi (bp) - 1;
5806
5807   /* NEW_LINENO is one less than the actual line number here.  */
5808   if (pedantic && new_lineno < 0)
5809     pedwarn ("line number out of range in `#line' command");
5810
5811   /* skip over the line number.  */
5812   while (isdigit (*bp))
5813     bp++;
5814
5815 #if 0 /* #line 10"foo.c" is supposed to be allowed.  */
5816   if (*bp && !is_space[*bp]) {
5817     error ("invalid format `#line' command");
5818     return;
5819   }
5820 #endif
5821
5822   SKIP_WHITE_SPACE (bp);
5823
5824   if (*bp == '\"') {
5825     static HASHNODE *fname_table[FNAME_HASHSIZE];
5826     HASHNODE *hp, **hash_bucket;
5827     U_CHAR *fname;
5828     int fname_length;
5829
5830     fname = ++bp;
5831
5832     while (*bp && *bp != '\"')
5833       bp++;
5834     if (*bp != '\"') {
5835       error ("invalid format `#line' command");
5836       return 0;
5837     }
5838
5839     fname_length = bp - fname;
5840
5841     bp++;
5842     SKIP_WHITE_SPACE (bp);
5843     if (*bp) {
5844       if (pedantic)
5845         pedwarn ("garbage at end of `#line' command");
5846       if (*bp == '1')
5847         file_change = enter_file;
5848       else if (*bp == '2')
5849         file_change = leave_file;
5850       else if (*bp == '3')
5851         ip->system_header_p = 1;
5852       else {
5853         error ("invalid format `#line' command");
5854         return 0;
5855       }
5856
5857       bp++;
5858       SKIP_WHITE_SPACE (bp);
5859       if (*bp == '3') {
5860         ip->system_header_p = 1;
5861         bp++;
5862         SKIP_WHITE_SPACE (bp);
5863       }
5864       if (*bp) {
5865         error ("invalid format `#line' command");
5866         return 0;
5867       }
5868     }
5869
5870     hash_bucket =
5871       &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)];
5872     for (hp = *hash_bucket; hp != NULL; hp = hp->next)
5873       if (hp->length == fname_length &&
5874           strncmp (hp->value.cpval, fname, fname_length) == 0) {
5875         ip->nominal_fname = hp->value.cpval;
5876         break;
5877       }
5878     if (hp == 0) {
5879       /* Didn't find it; cons up a new one.  */
5880       hp = (HASHNODE *) xcalloc (1, sizeof (HASHNODE) + fname_length + 1);
5881       hp->next = *hash_bucket;
5882       *hash_bucket = hp;
5883
5884       hp->length = fname_length;
5885       ip->nominal_fname = hp->value.cpval = ((char *) hp) + sizeof (HASHNODE);
5886       bcopy (fname, hp->value.cpval, fname_length);
5887     }
5888   } else if (*bp) {
5889     error ("invalid format `#line' command");
5890     return 0;
5891   }
5892
5893   ip->lineno = new_lineno;
5894   output_line_command (ip, op, 0, file_change);
5895   check_expand (op, ip->length - (ip->bufp - ip->buf));
5896   return 0;
5897 }
5898
5899 /*
5900  * remove the definition of a symbol from the symbol table.
5901  * according to un*x /lib/cpp, it is not an error to undef
5902  * something that has no definitions, so it isn't one here either.
5903  */
5904
5905 static int
5906 do_undef (buf, limit, op, keyword)
5907      U_CHAR *buf, *limit;
5908      FILE_BUF *op;
5909      struct directive *keyword;
5910 {
5911   int sym_length;
5912   HASHNODE *hp;
5913   U_CHAR *orig_buf = buf;
5914
5915   /* If this is a precompiler run (with -pcp) pass thru #undef commands.  */
5916   if (pcp_outfile && op)
5917     pass_thru_directive (buf, limit, op, keyword);
5918
5919   SKIP_WHITE_SPACE (buf);
5920   sym_length = check_macro_name (buf, "macro");
5921
5922   while ((hp = lookup (buf, sym_length, -1)) != NULL) {
5923     /* If we are generating additional info for debugging (with -g) we
5924        need to pass through all effective #undef commands.  */
5925     if (debug_output && op)
5926       pass_thru_directive (orig_buf, limit, op, keyword);
5927     if (hp->type != T_MACRO)
5928       warning ("undefining `%s'", hp->name);
5929     delete_macro (hp);
5930   }
5931
5932   if (pedantic) {
5933     buf += sym_length;
5934     SKIP_WHITE_SPACE (buf);
5935     if (buf != limit)
5936       pedwarn ("garbage after `#undef' directive");
5937   }
5938   return 0;
5939 }
5940 \f
5941 /*
5942  * Report a fatal error detected by the program we are processing.
5943  * Use the text of the line in the error message, then terminate.
5944  * (We use error because it prints the filename & line#.)
5945  */
5946
5947 static int
5948 do_error (buf, limit, op, keyword)
5949      U_CHAR *buf, *limit;
5950      FILE_BUF *op;
5951      struct directive *keyword;
5952 {
5953   int length = limit - buf;
5954   U_CHAR *copy = (U_CHAR *) xmalloc (length + 1);
5955   bcopy (buf, copy, length);
5956   copy[length] = 0;
5957   SKIP_WHITE_SPACE (copy);
5958   error ("#error %s", copy);
5959   exit (FAILURE_EXIT_CODE);
5960   /* NOTREACHED */
5961   return 0;
5962 }
5963
5964 /*
5965  * Report a warning detected by the program we are processing.
5966  * Use the text of the line in the warning message, then continue.
5967  * (We use error because it prints the filename & line#.)
5968  */
5969
5970 static int
5971 do_warning (buf, limit, op, keyword)
5972      U_CHAR *buf, *limit;
5973      FILE_BUF *op;
5974      struct directive *keyword;
5975 {
5976   int length = limit - buf;
5977   U_CHAR *copy = (U_CHAR *) xmalloc (length + 1);
5978   bcopy (buf, copy, length);
5979   copy[length] = 0;
5980   SKIP_WHITE_SPACE (copy);
5981   warning ("#warning %s", copy);
5982   return 0;
5983 }
5984
5985 /* Remember the name of the current file being read from so that we can
5986    avoid ever including it again.  */
5987
5988 static int
5989 do_once ()
5990 {
5991   int i;
5992   FILE_BUF *ip = NULL;
5993
5994   for (i = indepth; i >= 0; i--)
5995     if (instack[i].fname != NULL) {
5996       ip = &instack[i];
5997       break;
5998     }
5999
6000   if (ip != NULL) {
6001     struct file_name_list *new;
6002     
6003     new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
6004     new->next = dont_repeat_files;
6005     dont_repeat_files = new;
6006     new->fname = savestring (ip->fname);
6007     new->control_macro = 0;
6008   }
6009   return 0;
6010 }
6011
6012 /* #ident has already been copied to the output file, so just ignore it.  */
6013
6014 static int
6015 do_ident (buf, limit)
6016      U_CHAR *buf, *limit;
6017 {
6018   /* Allow #ident in system headers, since that's not user's fault.  */
6019   if (pedantic && !instack[indepth].system_header_p)
6020     pedwarn ("ANSI C does not allow `#ident'");
6021   return 0;
6022 }
6023
6024 /* #pragma and its argument line have already been copied to the output file.
6025    Just check for some recognized pragmas that need validation here.  */
6026
6027 static int
6028 do_pragma (buf, limit)
6029      U_CHAR *buf, *limit;
6030 {
6031   while (*buf == ' ' || *buf == '\t')
6032     buf++;
6033   if (!strncmp (buf, "once", 4)) {
6034     /* Allow #pragma once in system headers, since that's not the user's
6035        fault.  */
6036     if (!instack[indepth].system_header_p)
6037       warning ("`#pragma once' is obsolete");
6038     do_once ();
6039   }
6040
6041   if (!strncmp (buf, "implementation", 14)) {
6042     /* Be quiet about `#pragma implementation' for a file only if it hasn't
6043        been included yet.  */
6044     struct file_name_list *ptr;
6045     U_CHAR *p = buf + 14, *fname, *inc_fname;
6046     SKIP_WHITE_SPACE (p);
6047     if (*p == '\n' || *p != '\"')
6048       return 0;
6049
6050     fname = p + 1;
6051     if (p = (U_CHAR *) index (fname, '\"'))
6052       *p = '\0';
6053     
6054     for (ptr = all_include_files; ptr; ptr = ptr->next) {
6055       inc_fname = (U_CHAR *) rindex (ptr->fname, '/');
6056       inc_fname = inc_fname ? inc_fname + 1 : (U_CHAR *) ptr->fname;
6057       if (inc_fname && !strcmp (inc_fname, fname))
6058         warning ("`#pragma implementation' for `%s' appears after file is included",
6059                  fname);
6060     }
6061   }
6062
6063   return 0;
6064 }
6065
6066 #if 0
6067 /* This was a fun hack, but #pragma seems to start to be useful.
6068    By failing to recognize it, we pass it through unchanged to cc1.  */
6069
6070 /*
6071  * the behavior of the #pragma directive is implementation defined.
6072  * this implementation defines it as follows.
6073  */
6074
6075 static int
6076 do_pragma ()
6077 {
6078   close (0);
6079   if (open ("/dev/tty", O_RDONLY, 0666) != 0)
6080     goto nope;
6081   close (1);
6082   if (open ("/dev/tty", O_WRONLY, 0666) != 1)
6083     goto nope;
6084   execl ("/usr/games/hack", "#pragma", 0);
6085   execl ("/usr/games/rogue", "#pragma", 0);
6086   execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
6087   execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
6088 nope:
6089   fatal ("You are in a maze of twisty compiler features, all different");
6090 }
6091 #endif
6092
6093 /* Just ignore #sccs, on systems where we define it at all.  */
6094
6095 static int
6096 do_sccs ()
6097 {
6098   if (pedantic)
6099     pedwarn ("ANSI C does not allow `#sccs'");
6100   return 0;
6101 }
6102 \f
6103 /*
6104  * handle #if command by
6105  *   1) inserting special `defined' keyword into the hash table
6106  *      that gets turned into 0 or 1 by special_symbol (thus,
6107  *      if the luser has a symbol called `defined' already, it won't
6108  *      work inside the #if command)
6109  *   2) rescan the input into a temporary output buffer
6110  *   3) pass the output buffer to the yacc parser and collect a value
6111  *   4) clean up the mess left from steps 1 and 2.
6112  *   5) call conditional_skip to skip til the next #endif (etc.),
6113  *      or not, depending on the value from step 3.
6114  */
6115
6116 static int
6117 do_if (buf, limit, op, keyword)
6118      U_CHAR *buf, *limit;
6119      FILE_BUF *op;
6120      struct directive *keyword;
6121 {
6122   int value;
6123   FILE_BUF *ip = &instack[indepth];
6124
6125   value = eval_if_expression (buf, limit - buf);
6126   conditional_skip (ip, value == 0, T_IF, NULL_PTR);
6127   return 0;
6128 }
6129
6130 /*
6131  * handle a #elif directive by not changing  if_stack  either.
6132  * see the comment above do_else.
6133  */
6134
6135 static int
6136 do_elif (buf, limit, op, keyword)
6137      U_CHAR *buf, *limit;
6138      FILE_BUF *op;
6139      struct directive *keyword;
6140 {
6141   int value;
6142   FILE_BUF *ip = &instack[indepth];
6143
6144   if (if_stack == instack[indepth].if_stack) {
6145     error ("`#elif' not within a conditional");
6146     return 0;
6147   } else {
6148     if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
6149       error ("`#elif' after `#else'");
6150       fprintf (stderr, " (matches line %d", if_stack->lineno);
6151       if (if_stack->fname != NULL && ip->fname != NULL &&
6152           strcmp (if_stack->fname, ip->nominal_fname) != 0)
6153         fprintf (stderr, ", file %s", if_stack->fname);
6154       fprintf (stderr, ")\n");
6155     }
6156     if_stack->type = T_ELIF;
6157   }
6158
6159   if (if_stack->if_succeeded)
6160     skip_if_group (ip, 0);
6161   else {
6162     value = eval_if_expression (buf, limit - buf);
6163     if (value == 0)
6164       skip_if_group (ip, 0);
6165     else {
6166       ++if_stack->if_succeeded; /* continue processing input */
6167       output_line_command (ip, op, 1, same_file);
6168     }
6169   }
6170   return 0;
6171 }
6172
6173 /*
6174  * evaluate a #if expression in BUF, of length LENGTH,
6175  * then parse the result as a C expression and return the value as an int.
6176  */
6177 static int
6178 eval_if_expression (buf, length)
6179      U_CHAR *buf;
6180      int length;
6181 {
6182   FILE_BUF temp_obuf;
6183   HASHNODE *save_defined;
6184   int value;
6185
6186   save_defined = install ("defined", -1, T_SPEC_DEFINED, 0, 0, -1);
6187   pcp_inside_if = 1;
6188   temp_obuf = expand_to_temp_buffer (buf, buf + length, 0, 1);
6189   pcp_inside_if = 0;
6190   delete_macro (save_defined);  /* clean up special symbol */
6191
6192   value = parse_c_expression (temp_obuf.buf);
6193
6194   free (temp_obuf.buf);
6195
6196   return value;
6197 }
6198
6199 /*
6200  * routine to handle ifdef/ifndef.  Try to look up the symbol,
6201  * then do or don't skip to the #endif/#else/#elif depending
6202  * on what directive is actually being processed.
6203  */
6204
6205 static int
6206 do_xifdef (buf, limit, op, keyword)
6207      U_CHAR *buf, *limit;
6208      FILE_BUF *op;
6209      struct directive *keyword;
6210 {
6211   int skip;
6212   FILE_BUF *ip = &instack[indepth];
6213   U_CHAR *end; 
6214   int start_of_file = 0;
6215   U_CHAR *control_macro = 0;
6216
6217   /* Detect a #ifndef at start of file (not counting comments).  */
6218   if (ip->fname != 0 && keyword->type == T_IFNDEF) {
6219     U_CHAR *p = ip->buf;
6220     while (p != directive_start) {
6221       U_CHAR c = *p++;
6222       if (is_space[c])
6223         ;
6224       else if (c == '/' && p != ip->bufp && *p == '*') {
6225         /* Skip this comment.  */
6226         int junk;
6227         U_CHAR *save_bufp = ip->bufp;
6228         ip->bufp = p + 1;
6229         p = skip_to_end_of_comment (ip, &junk, 1);
6230         ip->bufp = save_bufp;
6231       } else {
6232         goto fail;
6233       }
6234     }
6235     /* If we get here, this conditional is the beginning of the file.  */
6236     start_of_file = 1;
6237   fail: ;
6238   }
6239
6240   /* Discard leading and trailing whitespace.  */
6241   SKIP_WHITE_SPACE (buf);
6242   while (limit != buf && is_hor_space[limit[-1]]) limit--;
6243
6244   /* Find the end of the identifier at the beginning.  */
6245   for (end = buf; is_idchar[*end]; end++);
6246
6247   if (end == buf) {
6248     skip = (keyword->type == T_IFDEF);
6249     if (! traditional)
6250       pedwarn (end == limit ? "`#%s' with no argument"
6251                : "`#%s' argument starts with punctuation",
6252                keyword->name);
6253   } else {
6254     HASHNODE *hp;
6255
6256     if (pedantic && buf[0] >= '0' && buf[0] <= '9')
6257       pedwarn ("`#%s' argument starts with a digit", keyword->name);
6258     else if (end != limit && !traditional)
6259       pedwarn ("garbage at end of `#%s' argument", keyword->name);
6260
6261     hp = lookup (buf, end-buf, -1);
6262
6263     if (pcp_outfile) {
6264       /* Output a precondition for this macro.  */
6265       if (hp && hp->value.defn->predefined)
6266         fprintf (pcp_outfile, "#define %s\n", hp->name);
6267       else {
6268         U_CHAR *cp = buf;
6269         fprintf (pcp_outfile, "#undef ");
6270         while (is_idchar[*cp]) /* Ick! */
6271           fputc (*cp++, pcp_outfile);
6272         putc ('\n', pcp_outfile);
6273       }
6274     }
6275
6276     skip = (hp == NULL) ^ (keyword->type == T_IFNDEF);
6277     if (start_of_file && !skip) {
6278       control_macro = (U_CHAR *) xmalloc (end - buf + 1);
6279       bcopy (buf, control_macro, end - buf);
6280       control_macro[end - buf] = 0;
6281     }
6282   }
6283   
6284   conditional_skip (ip, skip, T_IF, control_macro);
6285   return 0;
6286 }
6287
6288 /* Push TYPE on stack; then, if SKIP is nonzero, skip ahead.
6289    If this is a #ifndef starting at the beginning of a file,
6290    CONTROL_MACRO is the macro name tested by the #ifndef.
6291    Otherwise, CONTROL_MACRO is 0.  */
6292
6293 static void
6294 conditional_skip (ip, skip, type, control_macro)
6295      FILE_BUF *ip;
6296      int skip;
6297      enum node_type type;
6298      U_CHAR *control_macro;
6299 {
6300   IF_STACK_FRAME *temp;
6301
6302   temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
6303   temp->fname = ip->nominal_fname;
6304   temp->lineno = ip->lineno;
6305   temp->next = if_stack;
6306   temp->control_macro = control_macro;
6307   if_stack = temp;
6308
6309   if_stack->type = type;
6310
6311   if (skip != 0) {
6312     skip_if_group (ip, 0);
6313     return;
6314   } else {
6315     ++if_stack->if_succeeded;
6316     output_line_command (ip, &outbuf, 1, same_file);
6317   }
6318 }
6319
6320 /*
6321  * skip to #endif, #else, or #elif.  adjust line numbers, etc.
6322  * leaves input ptr at the sharp sign found.
6323  * If ANY is nonzero, return at next directive of any sort.
6324  */
6325 static void
6326 skip_if_group (ip, any)
6327      FILE_BUF *ip;
6328      int any;
6329 {
6330   register U_CHAR *bp = ip->bufp, *cp;
6331   register U_CHAR *endb = ip->buf + ip->length;
6332   struct directive *kt;
6333   IF_STACK_FRAME *save_if_stack = if_stack; /* don't pop past here */
6334   U_CHAR *beg_of_line = bp;
6335   register int ident_length;
6336   U_CHAR *ident, *after_ident;
6337
6338   while (bp < endb) {
6339     switch (*bp++) {
6340     case '/':                   /* possible comment */
6341       if (*bp == '\\' && bp[1] == '\n')
6342         newline_fix (bp);
6343       if (*bp == '*'
6344           || (cplusplus_comments && *bp == '/')) {
6345         ip->bufp = ++bp;
6346         bp = skip_to_end_of_comment (ip, &ip->lineno, 0);
6347       }
6348       break;
6349     case '\"':
6350     case '\'':
6351       bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno,
6352                                NULL_PTR, NULL_PTR);
6353       break;
6354     case '\\':
6355       /* Char after backslash loses its special meaning.  */
6356       if (bp < endb) {
6357         if (*bp == '\n')
6358           ++ip->lineno;         /* But do update the line-count.  */
6359         bp++;
6360       }
6361       break;
6362     case '\n':
6363       ++ip->lineno;
6364       beg_of_line = bp;
6365       break;
6366     case '#':
6367       ip->bufp = bp - 1;
6368
6369       /* # keyword: a # must be first nonblank char on the line */
6370       if (beg_of_line == 0)
6371         break;
6372       /* Scan from start of line, skipping whitespace, comments
6373          and backslash-newlines, and see if we reach this #.
6374          If not, this # is not special.  */
6375       bp = beg_of_line;
6376       while (1) {
6377         if (is_hor_space[*bp])
6378           bp++;
6379         else if (*bp == '\\' && bp[1] == '\n')
6380           bp += 2;
6381         else if (*bp == '/' && bp[1] == '*') {
6382           bp += 2;
6383           while (!(*bp == '*' && bp[1] == '/'))
6384             bp++;
6385           bp += 2;
6386         } else if (cplusplus_comments && *bp == '/' && bp[1] == '/') {
6387           bp += 2;
6388           while (*bp++ != '\n') ;
6389         }
6390         else break;
6391       }
6392       if (bp != ip->bufp) {
6393         bp = ip->bufp + 1;      /* Reset bp to after the #.  */
6394         break;
6395       }
6396
6397       bp = ip->bufp + 1;        /* Point after the '#' */
6398
6399       /* Skip whitespace and \-newline.  */
6400       while (1) {
6401         if (is_hor_space[*bp])
6402           bp++;
6403         else if (*bp == '\\' && bp[1] == '\n')
6404           bp += 2;
6405         else if (*bp == '/' && bp[1] == '*') {
6406           bp += 2;
6407           while (!(*bp == '*' && bp[1] == '/')) {
6408             if (*bp == '\n')
6409               ip->lineno++;
6410             bp++;
6411           }
6412           bp += 2;
6413         } else if (cplusplus_comments && *bp == '/' && bp[1] == '/') {
6414           bp += 2;
6415           while (*bp++ != '\n') ;
6416         }
6417         else break;
6418       }
6419
6420       cp = bp;
6421
6422       /* Now find end of directive name.
6423          If we encounter a backslash-newline, exchange it with any following
6424          symbol-constituents so that we end up with a contiguous name.  */
6425
6426       while (1) {
6427         if (is_idchar[*bp])
6428           bp++;
6429         else {
6430           if (*bp == '\\' && bp[1] == '\n')
6431             name_newline_fix (bp);
6432           if (is_idchar[*bp])
6433             bp++;
6434           else break;
6435         }
6436       }
6437       ident_length = bp - cp;
6438       ident = cp;
6439       after_ident = bp;
6440
6441       /* A line of just `#' becomes blank.  */
6442
6443       if (ident_length == 0 && *after_ident == '\n') {
6444         continue;
6445       }
6446
6447       if (ident_length == 0 || !is_idstart[*ident]) {
6448         U_CHAR *p = ident;
6449         while (is_idchar[*p]) {
6450           if (*p < '0' || *p > '9')
6451             break;
6452           p++;
6453         }
6454         /* Handle # followed by a line number.  */
6455         if (p != ident && !is_idchar[*p]) {
6456           if (pedantic)
6457             pedwarn ("`#' followed by integer");
6458           continue;
6459         }
6460
6461         /* Avoid error for `###' and similar cases unless -pedantic.  */
6462         if (p == ident) {
6463           while (*p == '#' || is_hor_space[*p]) p++;
6464           if (*p == '\n') {
6465             if (pedantic && !lang_asm)
6466               pedwarn ("invalid preprocessor directive");
6467             continue;
6468           }
6469         }
6470
6471         if (!lang_asm && pedantic)
6472           pedwarn ("invalid preprocessor directive name");
6473         continue;
6474       }
6475
6476       for (kt = directive_table; kt->length >= 0; kt++) {
6477         IF_STACK_FRAME *temp;
6478         if (ident_length == kt->length
6479             && strncmp (cp, kt->name, kt->length) == 0) {
6480           /* If we are asked to return on next directive, do so now.  */
6481           if (any)
6482             return;
6483
6484           switch (kt->type) {
6485           case T_IF:
6486           case T_IFDEF:
6487           case T_IFNDEF:
6488             temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
6489             temp->next = if_stack;
6490             if_stack = temp;
6491             temp->lineno = ip->lineno;
6492             temp->fname = ip->nominal_fname;
6493             temp->type = kt->type;
6494             break;
6495           case T_ELSE:
6496           case T_ENDIF:
6497             if (pedantic && if_stack != save_if_stack)
6498               validate_else (bp);
6499           case T_ELIF:
6500             if (if_stack == instack[indepth].if_stack) {
6501               error ("`#%s' not within a conditional", kt->name);
6502               break;
6503             }
6504             else if (if_stack == save_if_stack)
6505               return;           /* found what we came for */
6506
6507             if (kt->type != T_ENDIF) {
6508               if (if_stack->type == T_ELSE)
6509                 error ("`#else' or `#elif' after `#else'");
6510               if_stack->type = kt->type;
6511               break;
6512             }
6513
6514             temp = if_stack;
6515             if_stack = if_stack->next;
6516             free (temp);
6517             break;
6518           }
6519           break;
6520         }
6521       }
6522       /* Don't let erroneous code go by.  */
6523       if (kt->length < 0 && !lang_asm && pedantic)
6524         pedwarn ("invalid preprocessor directive name");
6525     }
6526   }
6527   ip->bufp = bp;
6528   /* after this returns, rescan will exit because ip->bufp
6529      now points to the end of the buffer.
6530      rescan is responsible for the error message also.  */
6531 }
6532
6533 /*
6534  * handle a #else directive.  Do this by just continuing processing
6535  * without changing  if_stack ;  this is so that the error message
6536  * for missing #endif's etc. will point to the original #if.  It
6537  * is possible that something different would be better.
6538  */
6539
6540 static int
6541 do_else (buf, limit, op, keyword)
6542      U_CHAR *buf, *limit;
6543      FILE_BUF *op;
6544      struct directive *keyword;
6545 {
6546   FILE_BUF *ip = &instack[indepth];
6547
6548   if (pedantic) {
6549     SKIP_WHITE_SPACE (buf);
6550     if (buf != limit)
6551       pedwarn ("text following `#else' violates ANSI standard");
6552   }
6553
6554   if (if_stack == instack[indepth].if_stack) {
6555     error ("`#else' not within a conditional");
6556     return 0;
6557   } else {
6558     /* #ifndef can't have its special treatment for containing the whole file
6559        if it has a #else clause.  */
6560     if_stack->control_macro = 0;
6561
6562     if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
6563       error ("`#else' after `#else'");
6564       fprintf (stderr, " (matches line %d", if_stack->lineno);
6565       if (strcmp (if_stack->fname, ip->nominal_fname) != 0)
6566         fprintf (stderr, ", file %s", if_stack->fname);
6567       fprintf (stderr, ")\n");
6568     }
6569     if_stack->type = T_ELSE;
6570   }
6571
6572   if (if_stack->if_succeeded)
6573     skip_if_group (ip, 0);
6574   else {
6575     ++if_stack->if_succeeded;   /* continue processing input */
6576     output_line_command (ip, op, 1, same_file);
6577   }
6578   return 0;
6579 }
6580
6581 /*
6582  * unstack after #endif command
6583  */
6584
6585 static int
6586 do_endif (buf, limit, op, keyword)
6587      U_CHAR *buf, *limit;
6588      FILE_BUF *op;
6589      struct directive *keyword;
6590 {
6591   if (pedantic) {
6592     SKIP_WHITE_SPACE (buf);
6593     if (buf != limit)
6594       pedwarn ("text following `#endif' violates ANSI standard");
6595   }
6596
6597   if (if_stack == instack[indepth].if_stack)
6598     error ("unbalanced `#endif'");
6599   else {
6600     IF_STACK_FRAME *temp = if_stack;
6601     if_stack = if_stack->next;
6602     if (temp->control_macro != 0) {
6603       /* This #endif matched a #ifndef at the start of the file.
6604          See if it is at the end of the file.  */
6605       FILE_BUF *ip = &instack[indepth];
6606       U_CHAR *p = ip->bufp;
6607       U_CHAR *ep = ip->buf + ip->length;
6608
6609       while (p != ep) {
6610         U_CHAR c = *p++;
6611         switch (c) {
6612         case ' ':
6613         case '\t':
6614         case '\n':
6615           break;
6616         case '/':
6617           if (p != ep && *p == '*') {
6618             /* Skip this comment.  */
6619             int junk;
6620             U_CHAR *save_bufp = ip->bufp;
6621             ip->bufp = p + 1;
6622             p = skip_to_end_of_comment (ip, &junk, 1);
6623             ip->bufp = save_bufp;
6624           }
6625           break;
6626         default:
6627           goto fail;
6628         }
6629       }
6630       /* If we get here, this #endif ends a #ifndef
6631          that contains all of the file (aside from whitespace).
6632          Arrange not to include the file again
6633          if the macro that was tested is defined.  */
6634       if (indepth != 0)
6635         record_control_macro (ip->fname, temp->control_macro);
6636     fail: ;
6637     }
6638     free (temp);
6639     output_line_command (&instack[indepth], op, 1, same_file);
6640   }
6641   return 0;
6642 }
6643
6644 /* When an #else or #endif is found while skipping failed conditional,
6645    if -pedantic was specified, this is called to warn about text after
6646    the command name.  P points to the first char after the command name.  */
6647
6648 static void
6649 validate_else (p)
6650      register U_CHAR *p;
6651 {
6652   /* Advance P over whitespace and comments.  */
6653   while (1) {
6654     if (*p == '\\' && p[1] == '\n')
6655       p += 2;
6656     if (is_hor_space[*p])
6657       p++;
6658     else if (*p == '/') {
6659       if (p[1] == '\\' && p[2] == '\n')
6660         newline_fix (p + 1);
6661       if (p[1] == '*') {
6662         p += 2;
6663         /* Don't bother warning about unterminated comments
6664            since that will happen later.  Just be sure to exit.  */
6665         while (*p) {
6666           if (p[1] == '\\' && p[2] == '\n')
6667             newline_fix (p + 1);
6668           if (*p == '*' && p[1] == '/') {
6669             p += 2;
6670             break;
6671           }
6672           p++;
6673         }
6674       }
6675       else if (cplusplus_comments && p[1] == '/') {
6676         p += 2;
6677         while (*p && *p++ != '\n') ;
6678       }
6679     } else break;
6680   }
6681   if (*p && *p != '\n')
6682     pedwarn ("text following `#else' or `#endif' violates ANSI standard");
6683 }
6684 \f
6685 /* Skip a comment, assuming the input ptr immediately follows the
6686    initial slash-star.  Bump *LINE_COUNTER for each newline.
6687    (The canonical line counter is &ip->lineno.)
6688    Don't use this routine (or the next one) if bumping the line
6689    counter is not sufficient to deal with newlines in the string.
6690
6691    If NOWARN is nonzero, don't warn about slash-star inside a comment.
6692    This feature is useful when processing a comment that is going to be
6693    processed or was processed at another point in the preprocessor,
6694    to avoid a duplicate warning.  */
6695 static U_CHAR *
6696 skip_to_end_of_comment (ip, line_counter, nowarn)
6697      register FILE_BUF *ip;
6698      int *line_counter;         /* place to remember newlines, or NULL */
6699      int nowarn;
6700 {
6701   register U_CHAR *limit = ip->buf + ip->length;
6702   register U_CHAR *bp = ip->bufp;
6703   FILE_BUF *op = &outbuf;       /* JF */
6704   int output = put_out_comments && !line_counter;
6705
6706         /* JF this line_counter stuff is a crock to make sure the
6707            comment is only put out once, no matter how many times
6708            the comment is skipped.  It almost works */
6709   if (output) {
6710     *op->bufp++ = '/';
6711     *op->bufp++ = '*';
6712   }
6713   if (cplusplus_comments && bp[-1] == '/') {
6714     if (output) {
6715       while (bp < limit)
6716         if ((*op->bufp++ = *bp++) == '\n') {
6717           bp--;
6718           break;
6719         }
6720       op->bufp[-1] = '*';
6721       *op->bufp++ = '/';
6722       *op->bufp++ = '\n';
6723     } else {
6724       while (bp < limit) {
6725         if (*bp++ == '\n') {
6726           bp--;
6727           break;
6728         }
6729       }
6730     }
6731     ip->bufp = bp;
6732     return bp;
6733   }
6734   while (bp < limit) {
6735     if (output)
6736       *op->bufp++ = *bp;
6737     switch (*bp++) {
6738     case '/':
6739       if (warn_comments && !nowarn && bp < limit && *bp == '*')
6740         warning ("`/*' within comment");
6741       break;
6742     case '\n':
6743       if (line_counter != NULL)
6744         ++*line_counter;
6745       if (output)
6746         ++op->lineno;
6747       break;
6748     case '*':
6749       if (*bp == '\\' && bp[1] == '\n')
6750         newline_fix (bp);
6751       if (*bp == '/') {
6752         if (output)
6753           *op->bufp++ = '/';
6754         ip->bufp = ++bp;
6755         return bp;
6756       }
6757       break;
6758     }
6759   }
6760   ip->bufp = bp;
6761   return bp;
6762 }
6763
6764 /*
6765  * Skip over a quoted string.  BP points to the opening quote.
6766  * Returns a pointer after the closing quote.  Don't go past LIMIT.
6767  * START_LINE is the line number of the starting point (but it need
6768  * not be valid if the starting point is inside a macro expansion).
6769  *
6770  * The input stack state is not changed.
6771  *
6772  * If COUNT_NEWLINES is nonzero, it points to an int to increment
6773  * for each newline passed.
6774  *
6775  * If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
6776  * if we pass a backslash-newline.
6777  *
6778  * If EOFP is nonzero, set *EOFP to 1 if the string is unterminated.
6779  */
6780 static U_CHAR *
6781 skip_quoted_string (bp, limit, start_line, count_newlines, backslash_newlines_p, eofp)
6782      register U_CHAR *bp;
6783      register U_CHAR *limit;
6784      int start_line;
6785      int *count_newlines;
6786      int *backslash_newlines_p;
6787      int *eofp;
6788 {
6789   register U_CHAR c, match;
6790
6791   match = *bp++;
6792   while (1) {
6793     if (bp >= limit) {
6794       error_with_line (line_for_error (start_line),
6795                        "unterminated string or character constant");
6796       error_with_line (multiline_string_line,
6797                        "possible real start of unterminated constant");
6798       multiline_string_line = 0;
6799       if (eofp)
6800         *eofp = 1;
6801       break;
6802     }
6803     c = *bp++;
6804     if (c == '\\') {
6805       while (*bp == '\\' && bp[1] == '\n') {
6806         if (backslash_newlines_p)
6807           *backslash_newlines_p = 1;
6808         if (count_newlines)
6809           ++*count_newlines;
6810         bp += 2;
6811       }
6812       if (*bp == '\n' && count_newlines) {
6813         if (backslash_newlines_p)
6814           *backslash_newlines_p = 1;
6815         ++*count_newlines;
6816       }
6817       bp++;
6818     } else if (c == '\n') {
6819       if (traditional) {
6820         /* Unterminated strings and character constants are 'legal'.  */
6821         bp--;   /* Don't consume the newline. */
6822         if (eofp)
6823           *eofp = 1;
6824         break;
6825       }
6826       if (pedantic || match == '\'') {
6827         error_with_line (line_for_error (start_line),
6828                          "unterminated string or character constant");
6829         bp--;
6830         if (eofp)
6831           *eofp = 1;
6832         break;
6833       }
6834       /* If not traditional, then allow newlines inside strings.  */
6835       if (count_newlines)
6836         ++*count_newlines;
6837       if (multiline_string_line == 0)
6838         multiline_string_line = start_line;
6839     } else if (c == match)
6840       break;
6841   }
6842   return bp;
6843 }
6844
6845 /* Skip across a group of balanced parens, starting from IP->bufp.
6846    IP->bufp is updated.  Use this with IP->bufp pointing at an open-paren.
6847
6848    This does not handle newlines, because it's used for the arg of #if,
6849    where there aren't any newlines.  Also, backslash-newline can't appear.  */
6850
6851 static U_CHAR *
6852 skip_paren_group (ip)
6853      register FILE_BUF *ip;
6854 {
6855   U_CHAR *limit = ip->buf + ip->length;
6856   U_CHAR *p = ip->bufp;
6857   int depth = 0;
6858   int lines_dummy = 0;
6859
6860   while (p != limit) {
6861     int c = *p++;
6862     switch (c) {
6863     case '(':
6864       depth++;
6865       break;
6866
6867     case ')':
6868       depth--;
6869       if (depth == 0)
6870         return ip->bufp = p;
6871       break;
6872
6873     case '/':
6874       if (*p == '*') {
6875         ip->bufp = p;
6876         p = skip_to_end_of_comment (ip, &lines_dummy, 0);
6877         p = ip->bufp;
6878       }
6879
6880     case '"':
6881     case '\'':
6882       {
6883         int eofp = 0;
6884         p = skip_quoted_string (p - 1, limit, 0, NULL_PTR, NULL_PTR, &eofp);
6885         if (eofp)
6886           return ip->bufp = p;
6887       }
6888       break;
6889     }
6890   }
6891
6892   ip->bufp = p;
6893   return p;
6894 }
6895 \f
6896 /*
6897  * write out a #line command, for instance, after an #include file.
6898  * If CONDITIONAL is nonzero, we can omit the #line if it would
6899  * appear to be a no-op, and we can output a few newlines instead
6900  * if we want to increase the line number by a small amount.
6901  * FILE_CHANGE says whether we are entering a file, leaving, or neither.
6902  */
6903
6904 static void
6905 output_line_command (ip, op, conditional, file_change)
6906      FILE_BUF *ip, *op;
6907      int conditional;
6908      enum file_change_code file_change;
6909 {
6910   int len;
6911   char *line_cmd_buf;
6912
6913   if (no_line_commands
6914       || ip->fname == NULL
6915       || no_output) {
6916     op->lineno = ip->lineno;
6917     return;
6918   }
6919
6920   if (conditional) {
6921     if (ip->lineno == op->lineno)
6922       return;
6923
6924     /* If the inherited line number is a little too small,
6925        output some newlines instead of a #line command.  */
6926     if (ip->lineno > op->lineno && ip->lineno < op->lineno + 8) {
6927       check_expand (op, 10);
6928       while (ip->lineno > op->lineno) {
6929         *op->bufp++ = '\n';
6930         op->lineno++;
6931       }
6932       return;
6933     }
6934   }
6935
6936   /* Don't output a line number of 0 if we can help it.  */
6937   if (ip->lineno == 0 && ip->bufp - ip->buf < ip->length
6938       && *ip->bufp == '\n') {
6939     ip->lineno++;
6940     ip->bufp++;
6941   }
6942
6943   line_cmd_buf = (char *) alloca (strlen (ip->nominal_fname) + 100);
6944 #ifdef OUTPUT_LINE_COMMANDS
6945   sprintf (line_cmd_buf, "#line %d \"%s\"", ip->lineno, ip->nominal_fname);
6946 #else
6947   sprintf (line_cmd_buf, "# %d \"%s\"", ip->lineno, ip->nominal_fname);
6948 #endif
6949   if (file_change != same_file)
6950     strcat (line_cmd_buf, file_change == enter_file ? " 1" : " 2");
6951   /* Tell cc1 if following text comes from a system header file.  */
6952   if (ip->system_header_p)
6953     strcat (line_cmd_buf, " 3");
6954   len = strlen (line_cmd_buf);
6955   line_cmd_buf[len++] = '\n';
6956   check_expand (op, len + 1);
6957   if (op->bufp > op->buf && op->bufp[-1] != '\n')
6958     *op->bufp++ = '\n';
6959   bcopy (line_cmd_buf, op->bufp, len);
6960   op->bufp += len;
6961   op->lineno = ip->lineno;
6962 }
6963 \f
6964 /* This structure represents one parsed argument in a macro call.
6965    `raw' points to the argument text as written (`raw_length' is its length).
6966    `expanded' points to the argument's macro-expansion
6967    (its length is `expand_length').
6968    `stringified_length' is the length the argument would have
6969    if stringified.
6970    `use_count' is the number of times this macro arg is substituted
6971    into the macro.  If the actual use count exceeds 10, 
6972    the value stored is 10.
6973    `free1' and `free2', if nonzero, point to blocks to be freed
6974    when the macro argument data is no longer needed.  */
6975
6976 struct argdata {
6977   U_CHAR *raw, *expanded;
6978   int raw_length, expand_length;
6979   int stringified_length;
6980   U_CHAR *free1, *free2;
6981   char newlines;
6982   char comments;
6983   char use_count;
6984 };
6985
6986 /* Expand a macro call.
6987    HP points to the symbol that is the macro being called.
6988    Put the result of expansion onto the input stack
6989    so that subsequent input by our caller will use it.
6990
6991    If macro wants arguments, caller has already verified that
6992    an argument list follows; arguments come from the input stack.  */
6993
6994 static void
6995 macroexpand (hp, op)
6996      HASHNODE *hp;
6997      FILE_BUF *op;
6998 {
6999   int nargs;
7000   DEFINITION *defn = hp->value.defn;
7001   register U_CHAR *xbuf;
7002   int xbuf_len;
7003   int start_line = instack[indepth].lineno;
7004   int rest_args, rest_zero;
7005
7006   CHECK_DEPTH (return;);
7007
7008   /* it might not actually be a macro.  */
7009   if (hp->type != T_MACRO) {
7010     special_symbol (hp, op);
7011     return;
7012   }
7013
7014   /* This macro is being used inside a #if, which means it must be */
7015   /* recorded as a precondition.  */
7016   if (pcp_inside_if && pcp_outfile && defn->predefined)
7017     dump_single_macro (hp, pcp_outfile);
7018   
7019   nargs = defn->nargs;
7020
7021   if (nargs >= 0) {
7022     register int i;
7023     struct argdata *args;
7024     char *parse_error = 0;
7025
7026     args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
7027
7028     for (i = 0; i < nargs; i++) {
7029       args[i].raw = (U_CHAR *) "";
7030       args[i].expanded = 0;
7031       args[i].raw_length = args[i].expand_length
7032         = args[i].stringified_length = 0;
7033       args[i].free1 = args[i].free2 = 0;
7034       args[i].use_count = 0;
7035     }
7036
7037     /* Parse all the macro args that are supplied.  I counts them.
7038        The first NARGS args are stored in ARGS.
7039        The rest are discarded.
7040        If rest_args is set then we assume macarg absorbed the rest of the args.
7041        */
7042     i = 0;
7043     rest_args = 0;
7044     do {
7045       /* Discard the open-parenthesis or comma before the next arg.  */
7046       ++instack[indepth].bufp;
7047       if (rest_args)
7048         continue;
7049       if (i < nargs || (nargs == 0 && i == 0)) {
7050         /* if we are working on last arg which absorbs rest of args... */
7051         if (i == nargs - 1 && defn->rest_args)
7052           rest_args = 1;
7053         parse_error = macarg (&args[i], rest_args);
7054       }
7055       else
7056         parse_error = macarg (NULL_PTR, 0);
7057       if (parse_error) {
7058         error_with_line (line_for_error (start_line), parse_error);
7059         break;
7060       }
7061       i++;
7062     } while (*instack[indepth].bufp != ')');
7063
7064     /* If we got one arg but it was just whitespace, call that 0 args.  */
7065     if (i == 1) {
7066       register U_CHAR *bp = args[0].raw;
7067       register U_CHAR *lim = bp + args[0].raw_length;
7068       while (bp != lim && is_space[*bp]) bp++;
7069       if (bp == lim)
7070         i = 0;
7071     }
7072
7073     /* Don't output an error message if we have already output one for
7074        a parse error above.  */
7075     rest_zero = 0;
7076     if (nargs == 0 && i > 0) {
7077       if (! parse_error)
7078         error ("arguments given to macro `%s'", hp->name);
7079     } else if (i < nargs) {
7080       /* traditional C allows foo() if foo wants one argument.  */
7081       if (nargs == 1 && i == 0 && traditional)
7082         ;
7083       /* the rest args token is allowed to absorb 0 tokens */
7084       else if (i == nargs - 1 && defn->rest_args)
7085         rest_zero = 1;
7086       else if (parse_error)
7087         ;
7088       else if (i == 0)
7089         error ("macro `%s' used without args", hp->name);
7090       else if (i == 1)
7091         error ("macro `%s' used with just one arg", hp->name);
7092       else
7093         error ("macro `%s' used with only %d args", hp->name, i);
7094     } else if (i > nargs) {
7095       if (! parse_error)
7096         error ("macro `%s' used with too many (%d) args", hp->name, i);
7097     }
7098
7099     /* Swallow the closeparen.  */
7100     ++instack[indepth].bufp;
7101
7102     /* If macro wants zero args, we parsed the arglist for checking only.
7103        Read directly from the macro definition.  */
7104     if (nargs == 0) {
7105       xbuf = defn->expansion;
7106       xbuf_len = defn->length;
7107     } else {
7108       register U_CHAR *exp = defn->expansion;
7109       register int offset;      /* offset in expansion,
7110                                    copied a piece at a time */
7111       register int totlen;      /* total amount of exp buffer filled so far */
7112
7113       register struct reflist *ap, *last_ap;
7114
7115       /* Macro really takes args.  Compute the expansion of this call.  */
7116
7117       /* Compute length in characters of the macro's expansion.
7118          Also count number of times each arg is used.  */
7119       xbuf_len = defn->length;
7120       for (ap = defn->pattern; ap != NULL; ap = ap->next) {
7121         if (ap->stringify)
7122           xbuf_len += args[ap->argno].stringified_length;
7123         else if (ap->raw_before || ap->raw_after || traditional)
7124           /* Add 4 for two newline-space markers to prevent
7125              token concatenation.  */
7126           xbuf_len += args[ap->argno].raw_length + 4;
7127         else {
7128           /* We have an ordinary (expanded) occurrence of the arg.
7129              So compute its expansion, if we have not already.  */
7130           if (args[ap->argno].expanded == 0) {
7131             FILE_BUF obuf;
7132             obuf = expand_to_temp_buffer (args[ap->argno].raw,
7133                                           args[ap->argno].raw + args[ap->argno].raw_length,
7134                                           1, 0);
7135
7136             args[ap->argno].expanded = obuf.buf;
7137             args[ap->argno].expand_length = obuf.length;
7138             args[ap->argno].free2 = obuf.buf;
7139           }
7140
7141           /* Add 4 for two newline-space markers to prevent
7142              token concatenation.  */
7143           xbuf_len += args[ap->argno].expand_length + 4;
7144         }
7145         if (args[ap->argno].use_count < 10)
7146           args[ap->argno].use_count++;
7147       }
7148
7149       xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
7150
7151       /* Generate in XBUF the complete expansion
7152          with arguments substituted in.
7153          TOTLEN is the total size generated so far.
7154          OFFSET is the index in the definition
7155          of where we are copying from.  */
7156       offset = totlen = 0;
7157       for (last_ap = NULL, ap = defn->pattern; ap != NULL;
7158            last_ap = ap, ap = ap->next) {
7159         register struct argdata *arg = &args[ap->argno];
7160         int count_before = totlen;
7161
7162         /* Add chars to XBUF.  */
7163         for (i = 0; i < ap->nchars; i++, offset++)
7164           xbuf[totlen++] = exp[offset];
7165
7166         /* If followed by an empty rest arg with concatenation,
7167            delete the last run of nonwhite chars.  */
7168         if (rest_zero && totlen > count_before
7169             && ((ap->rest_args && ap->raw_before)
7170                 || (last_ap != NULL && last_ap->rest_args
7171                     && last_ap->raw_after))) {
7172           /* Delete final whitespace.  */
7173           while (totlen > count_before && is_space[xbuf[totlen - 1]]) {
7174             totlen--;
7175           }
7176
7177           /* Delete the nonwhites before them.  */
7178           while (totlen > count_before && ! is_space[xbuf[totlen - 1]]) {
7179             totlen--;
7180           }
7181         }
7182
7183         if (ap->stringify != 0) {
7184           int arglen = arg->raw_length;
7185           int escaped = 0;
7186           int in_string = 0;
7187           int c;
7188           i = 0;
7189           while (i < arglen
7190                  && (c = arg->raw[i], is_space[c]))
7191             i++;
7192           while (i < arglen
7193                  && (c = arg->raw[arglen - 1], is_space[c]))
7194             arglen--;
7195           if (!traditional)
7196             xbuf[totlen++] = '\"'; /* insert beginning quote */
7197           for (; i < arglen; i++) {
7198             c = arg->raw[i];
7199
7200             /* Special markers Newline Space
7201                generate nothing for a stringified argument.  */
7202             if (c == '\n' && arg->raw[i+1] != '\n') {
7203               i++;
7204               continue;
7205             }
7206
7207             /* Internal sequences of whitespace are replaced by one space
7208                except within an string or char token.  */
7209             if (! in_string
7210                 && (c == '\n' ? arg->raw[i+1] == '\n' : is_space[c])) {
7211               while (1) {
7212                 /* Note that Newline Space does occur within whitespace
7213                    sequences; consider it part of the sequence.  */
7214                 if (c == '\n' && is_space[arg->raw[i+1]])
7215                   i += 2;
7216                 else if (c != '\n' && is_space[c])
7217                   i++;
7218                 else break;
7219                 c = arg->raw[i];
7220               }
7221               i--;
7222               c = ' ';
7223             }
7224
7225             if (escaped)
7226               escaped = 0;
7227             else {
7228               if (c == '\\')
7229                 escaped = 1;
7230               if (in_string) {
7231                 if (c == in_string)
7232                   in_string = 0;
7233               } else if (c == '\"' || c == '\'')
7234                 in_string = c;
7235             }
7236
7237             /* Escape these chars */
7238             if (c == '\"' || (in_string && c == '\\'))
7239               xbuf[totlen++] = '\\';
7240             if (isprint (c))
7241               xbuf[totlen++] = c;
7242             else {
7243               sprintf ((char *) &xbuf[totlen], "\\%03o", (unsigned int) c);
7244               totlen += 4;
7245             }
7246           }
7247           if (!traditional)
7248             xbuf[totlen++] = '\"'; /* insert ending quote */
7249         } else if (ap->raw_before || ap->raw_after || traditional) {
7250           U_CHAR *p1 = arg->raw;
7251           U_CHAR *l1 = p1 + arg->raw_length;
7252           if (ap->raw_before) {
7253             while (p1 != l1 && is_space[*p1]) p1++;
7254             while (p1 != l1 && is_idchar[*p1])
7255               xbuf[totlen++] = *p1++;
7256             /* Delete any no-reexpansion marker that follows
7257                an identifier at the beginning of the argument
7258                if the argument is concatenated with what precedes it.  */
7259             if (p1[0] == '\n' && p1[1] == '-')
7260               p1 += 2;
7261           } else if (!traditional) {
7262           /* Ordinary expanded use of the argument.
7263              Put in newline-space markers to prevent token pasting.  */
7264             xbuf[totlen++] = '\n';
7265             xbuf[totlen++] = ' ';
7266           }
7267           if (ap->raw_after) {
7268             /* Arg is concatenated after: delete trailing whitespace,
7269                whitespace markers, and no-reexpansion markers.  */
7270             while (p1 != l1) {
7271               if (is_space[l1[-1]]) l1--;
7272               else if (l1[-1] == '-') {
7273                 U_CHAR *p2 = l1 - 1;
7274                 /* If a `-' is preceded by an odd number of newlines then it
7275                    and the last newline are a no-reexpansion marker.  */
7276                 while (p2 != p1 && p2[-1] == '\n') p2--;
7277                 if ((l1 - 1 - p2) & 1) {
7278                   l1 -= 2;
7279                 }
7280                 else break;
7281               }
7282               else break;
7283             }
7284           }
7285
7286           bcopy (p1, xbuf + totlen, l1 - p1);
7287           totlen += l1 - p1;
7288           if (!traditional && !ap->raw_after) {
7289             /* Ordinary expanded use of the argument.
7290                Put in newline-space markers to prevent token pasting.  */
7291             xbuf[totlen++] = '\n';
7292             xbuf[totlen++] = ' ';
7293           }
7294         } else {
7295           /* Ordinary expanded use of the argument.
7296              Put in newline-space markers to prevent token pasting.  */
7297           if (!traditional) {
7298             xbuf[totlen++] = '\n';
7299             xbuf[totlen++] = ' ';
7300           }
7301           bcopy (arg->expanded, xbuf + totlen, arg->expand_length);
7302           totlen += arg->expand_length;
7303           if (!traditional) {
7304             xbuf[totlen++] = '\n';
7305             xbuf[totlen++] = ' ';
7306           }
7307           /* If a macro argument with newlines is used multiple times,
7308              then only expand the newlines once.  This avoids creating output
7309              lines which don't correspond to any input line, which confuses
7310              gdb and gcov.  */
7311           if (arg->use_count > 1 && arg->newlines > 0) {
7312             /* Don't bother doing change_newlines for subsequent
7313                uses of arg.  */
7314             arg->use_count = 1;
7315             arg->expand_length
7316               = change_newlines (arg->expanded, arg->expand_length);
7317           }
7318         }
7319
7320         if (totlen > xbuf_len)
7321           abort ();
7322       }
7323
7324       /* if there is anything left of the definition
7325          after handling the arg list, copy that in too. */
7326
7327       for (i = offset; i < defn->length; i++) {
7328         /* if we've reached the end of the macro */
7329         if (exp[i] == ')')
7330           rest_zero = 0;
7331         if (! (rest_zero && last_ap != NULL && last_ap->rest_args
7332                && last_ap->raw_after))
7333           xbuf[totlen++] = exp[i];
7334       }
7335
7336       xbuf[totlen] = 0;
7337       xbuf_len = totlen;
7338
7339       for (i = 0; i < nargs; i++) {
7340         if (args[i].free1 != 0)
7341           free (args[i].free1);
7342         if (args[i].free2 != 0)
7343           free (args[i].free2);
7344       }
7345     }
7346   } else {
7347     xbuf = defn->expansion;
7348     xbuf_len = defn->length;
7349   }
7350
7351   /* Now put the expansion on the input stack
7352      so our caller will commence reading from it.  */
7353   {
7354     register FILE_BUF *ip2;
7355
7356     ip2 = &instack[++indepth];
7357
7358     ip2->fname = 0;
7359     ip2->nominal_fname = 0;
7360     ip2->lineno = 0;
7361     ip2->buf = xbuf;
7362     ip2->length = xbuf_len;
7363     ip2->bufp = xbuf;
7364     ip2->free_ptr = (nargs > 0) ? xbuf : 0;
7365     ip2->macro = hp;
7366     ip2->if_stack = if_stack;
7367     ip2->system_header_p = 0;
7368
7369     /* Recursive macro use sometimes works traditionally.
7370        #define foo(x,y) bar (x (y,0), y)
7371        foo (foo, baz)  */
7372
7373     if (!traditional)
7374       hp->type = T_DISABLED;
7375   }
7376 }
7377 \f
7378 /*
7379  * Parse a macro argument and store the info on it into *ARGPTR.
7380  * REST_ARGS is passed to macarg1 to make it absorb the rest of the args.
7381  * Return nonzero to indicate a syntax error.
7382  */
7383
7384 static char *
7385 macarg (argptr, rest_args)
7386      register struct argdata *argptr;
7387      int rest_args;
7388 {
7389   FILE_BUF *ip = &instack[indepth];
7390   int paren = 0;
7391   int newlines = 0;
7392   int comments = 0;
7393
7394   /* Try to parse as much of the argument as exists at this
7395      input stack level.  */
7396   U_CHAR *bp = macarg1 (ip->bufp, ip->buf + ip->length,
7397                         &paren, &newlines, &comments, rest_args);
7398
7399   /* If we find the end of the argument at this level,
7400      set up *ARGPTR to point at it in the input stack.  */
7401   if (!(ip->fname != 0 && (newlines != 0 || comments != 0))
7402       && bp != ip->buf + ip->length) {
7403     if (argptr != 0) {
7404       argptr->raw = ip->bufp;
7405       argptr->raw_length = bp - ip->bufp;
7406       argptr->newlines = newlines;
7407     }
7408     ip->bufp = bp;
7409   } else {
7410     /* This input stack level ends before the macro argument does.
7411        We must pop levels and keep parsing.
7412        Therefore, we must allocate a temporary buffer and copy
7413        the macro argument into it.  */
7414     int bufsize = bp - ip->bufp;
7415     int extra = newlines;
7416     U_CHAR *buffer = (U_CHAR *) xmalloc (bufsize + extra + 1);
7417     int final_start = 0;
7418
7419     bcopy (ip->bufp, buffer, bufsize);
7420     ip->bufp = bp;
7421     ip->lineno += newlines;
7422
7423     while (bp == ip->buf + ip->length) {
7424       if (instack[indepth].macro == 0) {
7425         free (buffer);
7426         return "unterminated macro call";
7427       }
7428       ip->macro->type = T_MACRO;
7429       if (ip->free_ptr)
7430         free (ip->free_ptr);
7431       ip = &instack[--indepth];
7432       newlines = 0;
7433       comments = 0;
7434       bp = macarg1 (ip->bufp, ip->buf + ip->length, &paren,
7435                     &newlines, &comments, rest_args);
7436       final_start = bufsize;
7437       bufsize += bp - ip->bufp;
7438       extra += newlines;
7439       buffer = (U_CHAR *) xrealloc (buffer, bufsize + extra + 1);
7440       bcopy (ip->bufp, buffer + bufsize - (bp - ip->bufp), bp - ip->bufp);
7441       ip->bufp = bp;
7442       ip->lineno += newlines;
7443     }
7444
7445     /* Now, if arg is actually wanted, record its raw form,
7446        discarding comments and duplicating newlines in whatever
7447        part of it did not come from a macro expansion.
7448        EXTRA space has been preallocated for duplicating the newlines.
7449        FINAL_START is the index of the start of that part.  */
7450     if (argptr != 0) {
7451       argptr->raw = buffer;
7452       argptr->raw_length = bufsize;
7453       argptr->free1 = buffer;
7454       argptr->newlines = newlines;
7455       argptr->comments = comments;
7456       if ((newlines || comments) && ip->fname != 0)
7457         argptr->raw_length
7458           = final_start +
7459             discard_comments (argptr->raw + final_start,
7460                               argptr->raw_length - final_start,
7461                               newlines);
7462       argptr->raw[argptr->raw_length] = 0;
7463       if (argptr->raw_length > bufsize + extra)
7464         abort ();
7465     }
7466   }
7467
7468   /* If we are not discarding this argument,
7469      macroexpand it and compute its length as stringified.
7470      All this info goes into *ARGPTR.  */
7471
7472   if (argptr != 0) {
7473     register U_CHAR *buf, *lim;
7474     register int totlen;
7475
7476     buf = argptr->raw;
7477     lim = buf + argptr->raw_length;
7478
7479     while (buf != lim && is_space[*buf])
7480       buf++;
7481     while (buf != lim && is_space[lim[-1]])
7482       lim--;
7483     totlen = traditional ? 0 : 2;       /* Count opening and closing quote.  */
7484     while (buf != lim) {
7485       register U_CHAR c = *buf++;
7486       totlen++;
7487       /* Internal sequences of whitespace are replaced by one space
7488          in most cases, but not always.  So count all the whitespace
7489          in case we need to keep it all.  */
7490 #if 0
7491       if (is_space[c])
7492         SKIP_ALL_WHITE_SPACE (buf);
7493       else
7494 #endif
7495       if (c == '\"' || c == '\\') /* escape these chars */
7496         totlen++;
7497       else if (!isprint (c))
7498         totlen += 3;
7499     }
7500     argptr->stringified_length = totlen;
7501   }
7502   return 0;
7503 }
7504 \f
7505 /* Scan text from START (inclusive) up to LIMIT (exclusive),
7506    counting parens in *DEPTHPTR,
7507    and return if reach LIMIT
7508    or before a `)' that would make *DEPTHPTR negative
7509    or before a comma when *DEPTHPTR is zero.
7510    Single and double quotes are matched and termination
7511    is inhibited within them.  Comments also inhibit it.
7512    Value returned is pointer to stopping place.
7513
7514    Increment *NEWLINES each time a newline is passed.
7515    REST_ARGS notifies macarg1 that it should absorb the rest of the args.
7516    Set *COMMENTS to 1 if a comment is seen.  */
7517
7518 static U_CHAR *
7519 macarg1 (start, limit, depthptr, newlines, comments, rest_args)
7520      U_CHAR *start;
7521      register U_CHAR *limit;
7522      int *depthptr, *newlines, *comments;
7523      int rest_args;
7524 {
7525   register U_CHAR *bp = start;
7526
7527   while (bp < limit) {
7528     switch (*bp) {
7529     case '(':
7530       (*depthptr)++;
7531       break;
7532     case ')':
7533       if (--(*depthptr) < 0)
7534         return bp;
7535       break;
7536     case '\\':
7537       /* Traditionally, backslash makes following char not special.  */
7538       if (bp + 1 < limit && traditional)
7539         {
7540           bp++;
7541           /* But count source lines anyway.  */
7542           if (*bp == '\n')
7543             ++*newlines;
7544         }
7545       break;
7546     case '\n':
7547       ++*newlines;
7548       break;
7549     case '/':
7550       if (bp[1] == '\\' && bp[2] == '\n')
7551         newline_fix (bp + 1);
7552       if (cplusplus_comments && bp[1] == '/') {
7553         *comments = 1;
7554         bp += 2;
7555         while (bp < limit && *bp++ != '\n') ;
7556         ++*newlines;
7557         break;
7558       }
7559       if (bp[1] != '*' || bp + 1 >= limit)
7560         break;
7561       *comments = 1;
7562       bp += 2;
7563       while (bp + 1 < limit) {
7564         if (bp[0] == '*'
7565             && bp[1] == '\\' && bp[2] == '\n')
7566           newline_fix (bp + 1);
7567         if (bp[0] == '*' && bp[1] == '/')
7568           break;
7569         if (*bp == '\n') ++*newlines;
7570         bp++;
7571       }
7572       break;
7573     case '\'':
7574     case '\"':
7575       {
7576         int quotec;
7577         for (quotec = *bp++; bp + 1 < limit && *bp != quotec; bp++) {
7578           if (*bp == '\\') {
7579             bp++;
7580             if (*bp == '\n')
7581               ++*newlines;
7582             while (*bp == '\\' && bp[1] == '\n') {
7583               bp += 2;
7584             }
7585           } else if (*bp == '\n') {
7586             ++*newlines;
7587             if (quotec == '\'')
7588               break;
7589           }
7590         }
7591       }
7592       break;
7593     case ',':
7594       /* if we've returned to lowest level and we aren't absorbing all args */
7595       if ((*depthptr) == 0 && rest_args == 0)
7596         return bp;
7597       break;
7598     }
7599     bp++;
7600   }
7601
7602   return bp;
7603 }
7604 \f
7605 /* Discard comments and duplicate newlines
7606    in the string of length LENGTH at START,
7607    except inside of string constants.
7608    The string is copied into itself with its beginning staying fixed.  
7609
7610    NEWLINES is the number of newlines that must be duplicated.
7611    We assume that that much extra space is available past the end
7612    of the string.  */
7613
7614 static int
7615 discard_comments (start, length, newlines)
7616      U_CHAR *start;
7617      int length;
7618      int newlines;
7619 {
7620   register U_CHAR *ibp;
7621   register U_CHAR *obp;
7622   register U_CHAR *limit;
7623   register int c;
7624
7625   /* If we have newlines to duplicate, copy everything
7626      that many characters up.  Then, in the second part,
7627      we will have room to insert the newlines
7628      while copying down.
7629      NEWLINES may actually be too large, because it counts
7630      newlines in string constants, and we don't duplicate those.
7631      But that does no harm.  */
7632   if (newlines > 0) {
7633     ibp = start + length;
7634     obp = ibp + newlines;
7635     limit = start;
7636     while (limit != ibp)
7637       *--obp = *--ibp;
7638   }
7639
7640   ibp = start + newlines;
7641   limit = start + length + newlines;
7642   obp = start;
7643
7644   while (ibp < limit) {
7645     *obp++ = c = *ibp++;
7646     switch (c) {
7647     case '\n':
7648       /* Duplicate the newline.  */
7649       *obp++ = '\n';
7650       break;
7651
7652     case '\\':
7653       if (*ibp == '\n') {
7654         obp--;
7655         ibp++;
7656       }
7657       break;
7658
7659     case '/':
7660       if (*ibp == '\\' && ibp[1] == '\n')
7661         newline_fix (ibp);
7662       /* Delete any comment.  */
7663       if (cplusplus_comments && ibp[0] == '/') {
7664         obp--;
7665         ibp++;
7666         while (ibp < limit && *ibp++ != '\n') ;
7667         break;
7668       }
7669       if (ibp[0] != '*' || ibp + 1 >= limit)
7670         break;
7671       obp--;
7672       ibp++;
7673       while (ibp + 1 < limit) {
7674         if (ibp[0] == '*'
7675             && ibp[1] == '\\' && ibp[2] == '\n')
7676           newline_fix (ibp + 1);
7677         if (ibp[0] == '*' && ibp[1] == '/')
7678           break;
7679         ibp++;
7680       }
7681       ibp += 2;
7682       break;
7683
7684     case '\'':
7685     case '\"':
7686       /* Notice and skip strings, so that we don't
7687          think that comments start inside them,
7688          and so we don't duplicate newlines in them.  */
7689       {
7690         int quotec = c;
7691         while (ibp < limit) {
7692           *obp++ = c = *ibp++;
7693           if (c == quotec)
7694             break;
7695           if (c == '\n' && quotec == '\'')
7696             break;
7697           if (c == '\\' && ibp < limit) {
7698             while (*ibp == '\\' && ibp[1] == '\n')
7699               ibp += 2;
7700             *obp++ = *ibp++;
7701           }
7702         }
7703       }
7704       break;
7705     }
7706   }
7707
7708   return obp - start;
7709 }
7710 \f
7711 /* Turn newlines to spaces in the string of length LENGTH at START,
7712    except inside of string constants.
7713    The string is copied into itself with its beginning staying fixed.  */
7714
7715 static int
7716 change_newlines (start, length)
7717      U_CHAR *start;
7718      int length;
7719 {
7720   register U_CHAR *ibp;
7721   register U_CHAR *obp;
7722   register U_CHAR *limit;
7723   register int c;
7724
7725   ibp = start;
7726   limit = start + length;
7727   obp = start;
7728
7729   while (ibp < limit) {
7730     *obp++ = c = *ibp++;
7731     switch (c) {
7732     case '\n':
7733       /* If this is a NEWLINE NEWLINE, then this is a real newline in the
7734          string.  Skip past the newline and its duplicate.
7735          Put a space in the output.  */
7736       if (*ibp == '\n')
7737         {
7738           ibp++;
7739           obp--;
7740           *obp++ = ' ';
7741         }
7742       break;
7743
7744     case '\'':
7745     case '\"':
7746       /* Notice and skip strings, so that we don't delete newlines in them.  */
7747       {
7748         int quotec = c;
7749         while (ibp < limit) {
7750           *obp++ = c = *ibp++;
7751           if (c == quotec)
7752             break;
7753           if (c == '\n' && quotec == '\'')
7754             break;
7755         }
7756       }
7757       break;
7758     }
7759   }
7760
7761   return obp - start;
7762 }
7763 \f
7764 /*
7765  * error - print error message and increment count of errors.
7766  */
7767
7768 void
7769 error (msg, arg1, arg2, arg3)
7770      char *msg;
7771      char *arg1, *arg2, *arg3;
7772 {
7773   int i;
7774   FILE_BUF *ip = NULL;
7775
7776   print_containing_files ();
7777
7778   for (i = indepth; i >= 0; i--)
7779     if (instack[i].fname != NULL) {
7780       ip = &instack[i];
7781       break;
7782     }
7783
7784   if (ip != NULL)
7785     fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno);
7786   fprintf (stderr, msg, arg1, arg2, arg3);
7787   fprintf (stderr, "\n");
7788   errors++;
7789 }
7790
7791 /* Error including a message from `errno'.  */
7792
7793 static void
7794 error_from_errno (name)
7795      char *name;
7796 {
7797   int i;
7798   FILE_BUF *ip = NULL;
7799
7800   print_containing_files ();
7801
7802   for (i = indepth; i >= 0; i--)
7803     if (instack[i].fname != NULL) {
7804       ip = &instack[i];
7805       break;
7806     }
7807
7808   if (ip != NULL)
7809     fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno);
7810
7811   if (errno < sys_nerr)
7812     fprintf (stderr, "%s: %s\n", name, sys_errlist[errno]);
7813   else
7814     fprintf (stderr, "%s: undocumented I/O error\n", name);
7815
7816   errors++;
7817 }
7818
7819 /* Print error message but don't count it.  */
7820
7821 void
7822 warning (msg, arg1, arg2, arg3)
7823      char *msg;
7824      char *arg1, *arg2, *arg3;
7825 {
7826   int i;
7827   FILE_BUF *ip = NULL;
7828
7829   if (inhibit_warnings)
7830     return;
7831
7832   if (warnings_are_errors)
7833     errors++;
7834
7835   print_containing_files ();
7836
7837   for (i = indepth; i >= 0; i--)
7838     if (instack[i].fname != NULL) {
7839       ip = &instack[i];
7840       break;
7841     }
7842
7843   if (ip != NULL)
7844     fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno);
7845   fprintf (stderr, "warning: ");
7846   fprintf (stderr, msg, arg1, arg2, arg3);
7847   fprintf (stderr, "\n");
7848 }
7849
7850 static void
7851 error_with_line (line, msg, arg1, arg2, arg3)
7852      int line;
7853      char *msg;
7854      char *arg1, *arg2, *arg3;
7855 {
7856   int i;
7857   FILE_BUF *ip = NULL;
7858
7859   print_containing_files ();
7860
7861   for (i = indepth; i >= 0; i--)
7862     if (instack[i].fname != NULL) {
7863       ip = &instack[i];
7864       break;
7865     }
7866
7867   if (ip != NULL)
7868     fprintf (stderr, "%s:%d: ", ip->nominal_fname, line);
7869   fprintf (stderr, msg, arg1, arg2, arg3);
7870   fprintf (stderr, "\n");
7871   errors++;
7872 }
7873
7874 static void
7875 warning_with_line (line, msg, arg1, arg2, arg3)
7876      int line;
7877      char *msg;
7878      char *arg1, *arg2, *arg3;
7879 {
7880   int i;
7881   FILE_BUF *ip = NULL;
7882
7883   if (inhibit_warnings)
7884     return;
7885
7886   if (warnings_are_errors)
7887     errors++;
7888
7889   print_containing_files ();
7890
7891   for (i = indepth; i >= 0; i--)
7892     if (instack[i].fname != NULL) {
7893       ip = &instack[i];
7894       break;
7895     }
7896
7897   if (ip != NULL)
7898     fprintf (stderr, "%s:%d: ", ip->nominal_fname, line);
7899   fprintf (stderr, "warning: ");
7900   fprintf (stderr, msg, arg1, arg2, arg3);
7901   fprintf (stderr, "\n");
7902 }
7903
7904 /* print an error message and maybe count it.  */
7905
7906 void
7907 pedwarn (msg, arg1, arg2, arg3)
7908      char *msg;
7909      char *arg1, *arg2, *arg3;
7910 {
7911   if (pedantic_errors)
7912     error (msg, arg1, arg2, arg3);
7913   else
7914     warning (msg, arg1, arg2, arg3);
7915 }
7916
7917 void
7918 pedwarn_with_line (line, msg, arg1, arg2, arg3)
7919      int line;
7920      char *msg;
7921      char *arg1, *arg2, *arg3;
7922 {
7923   if (pedantic_errors)
7924     error_with_line (line, msg, arg1, arg2, arg3);
7925   else
7926     warning_with_line (line, msg, arg1, arg2, arg3);
7927 }
7928
7929 /* Report a warning (or an error if pedantic_errors)
7930    giving specified file name and line number, not current.  */
7931
7932 static void
7933 pedwarn_with_file_and_line (file, line, msg, arg1, arg2, arg3)
7934      char *file;
7935      int line;
7936      char *msg;
7937      char *arg1, *arg2, *arg3;
7938 {
7939   int i;
7940   if (!pedantic_errors && inhibit_warnings)
7941     return;
7942   if (file != NULL)
7943     fprintf (stderr, "%s:%d: ", file, line);
7944   if (pedantic_errors)
7945     errors++;
7946   if (!pedantic_errors)
7947     fprintf (stderr, "warning: ");
7948   fprintf (stderr, msg, arg1, arg2, arg3);
7949   fprintf (stderr, "\n");
7950 }
7951 \f
7952 /* Print the file names and line numbers of the #include
7953    commands which led to the current file.  */
7954
7955 static void
7956 print_containing_files ()
7957 {
7958   FILE_BUF *ip = NULL;
7959   int i;
7960   int first = 1;
7961
7962   /* If stack of files hasn't changed since we last printed
7963      this info, don't repeat it.  */
7964   if (last_error_tick == input_file_stack_tick)
7965     return;
7966
7967   for (i = indepth; i >= 0; i--)
7968     if (instack[i].fname != NULL) {
7969       ip = &instack[i];
7970       break;
7971     }
7972
7973   /* Give up if we don't find a source file.  */
7974   if (ip == NULL)
7975     return;
7976
7977   /* Find the other, outer source files.  */
7978   for (i--; i >= 0; i--)
7979     if (instack[i].fname != NULL) {
7980       ip = &instack[i];
7981       if (first) {
7982         first = 0;
7983         fprintf (stderr, "In file included");
7984       } else {
7985         fprintf (stderr, ",");
7986       }
7987
7988       fprintf (stderr, " from %s:%d", ip->nominal_fname, ip->lineno);
7989     }
7990   if (! first)
7991     fprintf (stderr, ":\n");
7992
7993   /* Record we have printed the status as of this time.  */
7994   last_error_tick = input_file_stack_tick;
7995 }
7996 \f
7997 /* Return the line at which an error occurred.
7998    The error is not necessarily associated with the current spot
7999    in the input stack, so LINE says where.  LINE will have been
8000    copied from ip->lineno for the current input level.
8001    If the current level is for a file, we return LINE.
8002    But if the current level is not for a file, LINE is meaningless.
8003    In that case, we return the lineno of the innermost file.  */
8004
8005 static int
8006 line_for_error (line)
8007      int line;
8008 {
8009   int i;
8010   int line1 = line;
8011
8012   for (i = indepth; i >= 0; ) {
8013     if (instack[i].fname != 0)
8014       return line1;
8015     i--;
8016     if (i < 0)
8017       return 0;
8018     line1 = instack[i].lineno;
8019   }
8020   abort ();
8021   /*NOTREACHED*/
8022   return 0;
8023 }
8024
8025 /*
8026  * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
8027  *
8028  * As things stand, nothing is ever placed in the output buffer to be
8029  * removed again except when it's KNOWN to be part of an identifier,
8030  * so flushing and moving down everything left, instead of expanding,
8031  * should work ok.
8032  */
8033
8034 /* You might think void was cleaner for the return type,
8035    but that would get type mismatch in check_expand in strict ANSI.  */
8036 static int
8037 grow_outbuf (obuf, needed)
8038      register FILE_BUF *obuf;
8039      register int needed;
8040 {
8041   register U_CHAR *p;
8042   int minsize;
8043
8044   if (obuf->length - (obuf->bufp - obuf->buf) > needed)
8045     return 0;
8046
8047   /* Make it at least twice as big as it is now.  */
8048   obuf->length *= 2;
8049   /* Make it have at least 150% of the free space we will need.  */
8050   minsize = (3 * needed) / 2 + (obuf->bufp - obuf->buf);
8051   if (minsize > obuf->length)
8052     obuf->length = minsize;
8053
8054   if ((p = (U_CHAR *) xrealloc (obuf->buf, obuf->length)) == NULL)
8055     memory_full ();
8056
8057   obuf->bufp = p + (obuf->bufp - obuf->buf);
8058   obuf->buf = p;
8059
8060   return 0;
8061 }
8062 \f
8063 /* Symbol table for macro names and special symbols */
8064
8065 /*
8066  * install a name in the main hash table, even if it is already there.
8067  *   name stops with first non alphanumeric, except leading '#'.
8068  * caller must check against redefinition if that is desired.
8069  * delete_macro () removes things installed by install () in fifo order.
8070  * this is important because of the `defined' special symbol used
8071  * in #if, and also if pushdef/popdef directives are ever implemented.
8072  *
8073  * If LEN is >= 0, it is the length of the name.
8074  * Otherwise, compute the length by scanning the entire name.
8075  *
8076  * If HASH is >= 0, it is the precomputed hash code.
8077  * Otherwise, compute the hash code.
8078  */
8079 static HASHNODE *
8080 install (name, len, type, ivalue, value, hash)
8081      U_CHAR *name;
8082      int len;
8083      enum node_type type;
8084      int ivalue;
8085      char *value;
8086      int hash;
8087 {
8088   register HASHNODE *hp;
8089   register int i, bucket;
8090   register U_CHAR *p, *q;
8091
8092   if (len < 0) {
8093     p = name;
8094     while (is_idchar[*p])
8095       p++;
8096     len = p - name;
8097   }
8098
8099   if (hash < 0)
8100     hash = hashf (name, len, HASHSIZE);
8101
8102   i = sizeof (HASHNODE) + len + 1;
8103   hp = (HASHNODE *) xmalloc (i);
8104   bucket = hash;
8105   hp->bucket_hdr = &hashtab[bucket];
8106   hp->next = hashtab[bucket];
8107   hashtab[bucket] = hp;
8108   hp->prev = NULL;
8109   if (hp->next != NULL)
8110     hp->next->prev = hp;
8111   hp->type = type;
8112   hp->length = len;
8113   if (hp->type == T_CONST)
8114     hp->value.ival = ivalue;
8115   else
8116     hp->value.cpval = value;
8117   hp->name = ((U_CHAR *) hp) + sizeof (HASHNODE);
8118   p = hp->name;
8119   q = name;
8120   for (i = 0; i < len; i++)
8121     *p++ = *q++;
8122   hp->name[len] = 0;
8123   return hp;
8124 }
8125
8126 /*
8127  * find the most recent hash node for name name (ending with first
8128  * non-identifier char) installed by install
8129  *
8130  * If LEN is >= 0, it is the length of the name.
8131  * Otherwise, compute the length by scanning the entire name.
8132  *
8133  * If HASH is >= 0, it is the precomputed hash code.
8134  * Otherwise, compute the hash code.
8135  */
8136 HASHNODE *
8137 lookup (name, len, hash)
8138      U_CHAR *name;
8139      int len;
8140      int hash;
8141 {
8142   register U_CHAR *bp;
8143   register HASHNODE *bucket;
8144
8145   if (len < 0) {
8146     for (bp = name; is_idchar[*bp]; bp++) ;
8147     len = bp - name;
8148   }
8149
8150   if (hash < 0)
8151     hash = hashf (name, len, HASHSIZE);
8152
8153   bucket = hashtab[hash];
8154   while (bucket) {
8155     if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
8156       return bucket;
8157     bucket = bucket->next;
8158   }
8159   return NULL;
8160 }
8161
8162 /*
8163  * Delete a hash node.  Some weirdness to free junk from macros.
8164  * More such weirdness will have to be added if you define more hash
8165  * types that need it.
8166  */
8167
8168 /* Note that the DEFINITION of a macro is removed from the hash table
8169    but its storage is not freed.  This would be a storage leak
8170    except that it is not reasonable to keep undefining and redefining
8171    large numbers of macros many times.
8172    In any case, this is necessary, because a macro can be #undef'd
8173    in the middle of reading the arguments to a call to it.
8174    If #undef freed the DEFINITION, that would crash.  */
8175
8176 static void
8177 delete_macro (hp)
8178      HASHNODE *hp;
8179 {
8180
8181   if (hp->prev != NULL)
8182     hp->prev->next = hp->next;
8183   if (hp->next != NULL)
8184     hp->next->prev = hp->prev;
8185
8186   /* make sure that the bucket chain header that
8187      the deleted guy was on points to the right thing afterwards. */
8188   if (hp == *hp->bucket_hdr)
8189     *hp->bucket_hdr = hp->next;
8190
8191 #if 0
8192   if (hp->type == T_MACRO) {
8193     DEFINITION *d = hp->value.defn;
8194     struct reflist *ap, *nextap;
8195
8196     for (ap = d->pattern; ap != NULL; ap = nextap) {
8197       nextap = ap->next;
8198       free (ap);
8199     }
8200     free (d);
8201   }
8202 #endif
8203   free (hp);
8204 }
8205
8206 /*
8207  * return hash function on name.  must be compatible with the one
8208  * computed a step at a time, elsewhere
8209  */
8210 static int
8211 hashf (name, len, hashsize)
8212      register U_CHAR *name;
8213      register int len;
8214      int hashsize;
8215 {
8216   register int r = 0;
8217
8218   while (len--)
8219     r = HASHSTEP (r, *name++);
8220
8221   return MAKE_POS (r) % hashsize;
8222 }
8223 \f
8224
8225 /* Dump the definition of a single macro HP to OF.  */
8226 static void
8227 dump_single_macro (hp, of)
8228      register HASHNODE *hp;
8229      FILE *of;
8230 {
8231   register DEFINITION *defn = hp->value.defn;
8232   struct reflist *ap;
8233   int offset;
8234   int concat;
8235
8236
8237   /* Print the definition of the macro HP.  */
8238
8239   fprintf (of, "#define %s", hp->name);
8240
8241   if (defn->nargs >= 0) {
8242     int i;
8243
8244     fprintf (of, "(");
8245     for (i = 0; i < defn->nargs; i++) {
8246       dump_arg_n (defn, i, of);
8247       if (i + 1 < defn->nargs)
8248         fprintf (of, ", ");
8249     }
8250     fprintf (of, ")");
8251   }
8252
8253   fprintf (of, " ");
8254
8255   offset = 0;
8256   concat = 0;
8257   for (ap = defn->pattern; ap != NULL; ap = ap->next) {
8258     dump_defn_1 (defn->expansion, offset, ap->nchars, of);
8259     if (ap->nchars != 0)
8260       concat = 0;
8261     offset += ap->nchars;
8262     if (ap->stringify)
8263       fprintf (of, " #");
8264     if (ap->raw_before && !concat)
8265       fprintf (of, " ## ");
8266     concat = 0;
8267     dump_arg_n (defn, ap->argno, of);
8268     if (ap->raw_after) {
8269       fprintf (of, " ## ");
8270       concat = 1;
8271     }
8272   }
8273   dump_defn_1 (defn->expansion, offset, defn->length - offset, of);
8274   fprintf (of, "\n");
8275 }
8276
8277 /* Dump all macro definitions as #defines to stdout.  */
8278
8279 static void
8280 dump_all_macros ()
8281 {
8282   int bucket;
8283
8284   for (bucket = 0; bucket < HASHSIZE; bucket++) {
8285     register HASHNODE *hp;
8286
8287     for (hp = hashtab[bucket]; hp; hp= hp->next) {
8288       if (hp->type == T_MACRO)
8289         dump_single_macro (hp, stdout);
8290     }
8291   }
8292 }
8293
8294 /* Output to OF a substring of a macro definition.
8295    BASE is the beginning of the definition.
8296    Output characters START thru LENGTH.
8297    Discard newlines outside of strings, thus
8298    converting funny-space markers to ordinary spaces.  */
8299
8300 static void
8301 dump_defn_1 (base, start, length, of)
8302      U_CHAR *base;
8303      int start;
8304      int length;
8305      FILE *of;
8306 {
8307   U_CHAR *p = base + start;
8308   U_CHAR *limit = base + start + length;
8309
8310   while (p < limit) {
8311     if (*p != '\n')
8312       putc (*p, of);
8313     else if (*p == '\"' || *p =='\'') {
8314       U_CHAR *p1 = skip_quoted_string (p, limit, 0, NULL_PTR,
8315                                        NULL_PTR, NULL_PTR);
8316       fwrite (p, p1 - p, 1, of);
8317       p = p1 - 1;
8318     }
8319     p++;
8320   }
8321 }
8322
8323 /* Print the name of argument number ARGNUM of macro definition DEFN
8324    to OF.
8325    Recall that DEFN->args.argnames contains all the arg names
8326    concatenated in reverse order with comma-space in between.  */
8327
8328 static void
8329 dump_arg_n (defn, argnum, of)
8330      DEFINITION *defn;
8331      int argnum;
8332      FILE *of;
8333 {
8334   register U_CHAR *p = defn->args.argnames;
8335   while (argnum + 1 < defn->nargs) {
8336     p = (U_CHAR *) index (p, ' ') + 1;
8337     argnum++;
8338   }
8339
8340   while (*p && *p != ',') {
8341     putc (*p, of);
8342     p++;
8343   }
8344 }
8345 \f
8346 /* Initialize syntactic classifications of characters.  */
8347
8348 static void
8349 initialize_char_syntax ()
8350 {
8351   register int i;
8352
8353   /*
8354    * Set up is_idchar and is_idstart tables.  These should be
8355    * faster than saying (is_alpha (c) || c == '_'), etc.
8356    * Set up these things before calling any routines tthat
8357    * refer to them.
8358    */
8359   for (i = 'a'; i <= 'z'; i++) {
8360     is_idchar[i - 'a' + 'A'] = 1;
8361     is_idchar[i] = 1;
8362     is_idstart[i - 'a' + 'A'] = 1;
8363     is_idstart[i] = 1;
8364   }
8365   for (i = '0'; i <= '9'; i++)
8366     is_idchar[i] = 1;
8367   is_idchar['_'] = 1;
8368   is_idstart['_'] = 1;
8369   is_idchar['$'] = dollars_in_ident;
8370   is_idstart['$'] = dollars_in_ident;
8371
8372   /* horizontal space table */
8373   is_hor_space[' '] = 1;
8374   is_hor_space['\t'] = 1;
8375   is_hor_space['\v'] = 1;
8376   is_hor_space['\f'] = 1;
8377   is_hor_space['\r'] = 1;
8378
8379   is_space[' '] = 1;
8380   is_space['\t'] = 1;
8381   is_space['\v'] = 1;
8382   is_space['\f'] = 1;
8383   is_space['\n'] = 1;
8384   is_space['\r'] = 1;
8385 }
8386
8387 /* Initialize the built-in macros.  */
8388
8389 static void
8390 initialize_builtins (inp, outp)
8391      FILE_BUF *inp;
8392      FILE_BUF *outp;
8393 {
8394   install ("__LINE__", -1, T_SPECLINE, 0, 0, -1);
8395   install ("__DATE__", -1, T_DATE, 0, 0, -1);
8396   install ("__FILE__", -1, T_FILE, 0, 0, -1);
8397   install ("__BASE_FILE__", -1, T_BASE_FILE, 0, 0, -1);
8398   install ("__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, 0, 0, -1);
8399   install ("__VERSION__", -1, T_VERSION, 0, 0, -1);
8400 #ifndef NO_BUILTIN_SIZE_TYPE
8401   install ("__SIZE_TYPE__", -1, T_SIZE_TYPE, 0, 0, -1);
8402 #endif
8403 #ifndef NO_BUILTIN_PTRDIFF_TYPE
8404   install ("__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, 0, 0, -1);
8405 #endif
8406   install ("__WCHAR_TYPE__", -1, T_WCHAR_TYPE, 0, 0, -1);
8407   install ("__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE, 0, 0, -1);
8408   install ("__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, 0, 0, -1);
8409   install ("__TIME__", -1, T_TIME, 0, 0, -1);
8410   if (!traditional)
8411     install ("__STDC__", -1, T_CONST, STDC_VALUE, 0, -1);
8412   if (objc)
8413     install ("__OBJC__", -1, T_CONST, 1, 0, -1);
8414 /*  This is supplied using a -D by the compiler driver
8415     so that it is present only when truly compiling with GNU C.  */
8416 /*  install ("__GNUC__", -1, T_CONST, 2, 0, -1);  */
8417
8418   if (debug_output)
8419     {
8420       char directive[2048];
8421       register struct directive *dp = &directive_table[0];
8422       struct tm *timebuf = timestamp ();
8423
8424       sprintf (directive, " __BASE_FILE__ \"%s\"\n",
8425                instack[0].nominal_fname);
8426       output_line_command (inp, outp, 0, same_file);
8427       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
8428
8429       sprintf (directive, " __VERSION__ \"%s\"\n", version_string);
8430       output_line_command (inp, outp, 0, same_file);
8431       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
8432
8433       sprintf (directive, " __SIZE_TYPE__ %s\n", SIZE_TYPE);
8434       output_line_command (inp, outp, 0, same_file);
8435       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
8436
8437       sprintf (directive, " __PTRDIFF_TYPE__ %s\n", PTRDIFF_TYPE);
8438       output_line_command (inp, outp, 0, same_file);
8439       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
8440
8441       sprintf (directive, " __WCHAR_TYPE__ %s\n", WCHAR_TYPE);
8442       output_line_command (inp, outp, 0, same_file);
8443       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
8444
8445       sprintf (directive, " __DATE__ \"%s %2d %4d\"\n",
8446                monthnames[timebuf->tm_mon],
8447                timebuf->tm_mday, timebuf->tm_year + 1900);
8448       output_line_command (inp, outp, 0, same_file);
8449       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
8450
8451       sprintf (directive, " __TIME__ \"%02d:%02d:%02d\"\n",
8452                timebuf->tm_hour, timebuf->tm_min, timebuf->tm_sec);
8453       output_line_command (inp, outp, 0, same_file);
8454       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
8455
8456       if (!traditional)
8457         {
8458           sprintf (directive, " __STDC__ 1");
8459           output_line_command (inp, outp, 0, same_file);
8460           pass_thru_directive (directive, &directive[strlen (directive)],
8461                                outp, dp);
8462         }
8463       if (objc)
8464         {
8465           sprintf (directive, " __OBJC__ 1");
8466           output_line_command (inp, outp, 0, same_file);
8467           pass_thru_directive (directive, &directive[strlen (directive)],
8468                                outp, dp);
8469         }
8470     }
8471 }
8472 \f
8473 /*
8474  * process a given definition string, for initialization
8475  * If STR is just an identifier, define it with value 1.
8476  * If STR has anything after the identifier, then it should
8477  * be identifier=definition.
8478  */
8479
8480 static void
8481 make_definition (str, op)
8482      U_CHAR *str;
8483      FILE_BUF *op;
8484 {
8485   FILE_BUF *ip;
8486   struct directive *kt;
8487   U_CHAR *buf, *p;
8488
8489   buf = str;
8490   p = str;
8491   if (!is_idstart[*p]) {
8492     error ("malformed option `-D %s'", str);
8493     return;
8494   }
8495   while (is_idchar[*++p])
8496     ;
8497   if (*p == 0) {
8498     buf = (U_CHAR *) alloca (p - buf + 4);
8499     strcpy ((char *)buf, str);
8500     strcat ((char *)buf, " 1");
8501   } else if (*p != '=') {
8502     error ("malformed option `-D %s'", str);
8503     return;
8504   } else {
8505     U_CHAR *q;
8506     /* Copy the entire option so we can modify it.  */
8507     buf = (U_CHAR *) alloca (2 * strlen (str) + 1);
8508     strncpy (buf, str, p - str);
8509     /* Change the = to a space.  */
8510     buf[p - str] = ' ';
8511     /* Scan for any backslash-newline and remove it.  */
8512     p++;
8513     q = &buf[p - str];
8514     while (*p) {
8515       if (*p == '\\' && p[1] == '\n')
8516         p += 2;
8517       /* Change newline chars into newline-markers.  */
8518       else if (*p == '\n')
8519         {
8520           *q++ = '\n';
8521           *q++ = '\n';
8522           p++;
8523         }
8524       else
8525         *q++ = *p++;
8526     }
8527     *q = 0;
8528   }
8529   
8530   ip = &instack[++indepth];
8531   ip->nominal_fname = ip->fname = "*Initialization*";
8532
8533   ip->buf = ip->bufp = buf;
8534   ip->length = strlen (buf);
8535   ip->lineno = 1;
8536   ip->macro = 0;
8537   ip->free_ptr = 0;
8538   ip->if_stack = if_stack;
8539   ip->system_header_p = 0;
8540
8541   for (kt = directive_table; kt->type != T_DEFINE; kt++)
8542     ;
8543
8544   /* Pass NULL instead of OP, since this is a "predefined" macro.  */
8545   do_define (buf, buf + strlen (buf), NULL, kt);
8546   --indepth;
8547 }
8548
8549 /* JF, this does the work for the -U option */
8550
8551 static void
8552 make_undef (str, op)
8553      U_CHAR *str;
8554      FILE_BUF *op;
8555 {
8556   FILE_BUF *ip;
8557   struct directive *kt;
8558
8559   ip = &instack[++indepth];
8560   ip->nominal_fname = ip->fname = "*undef*";
8561
8562   ip->buf = ip->bufp = str;
8563   ip->length = strlen (str);
8564   ip->lineno = 1;
8565   ip->macro = 0;
8566   ip->free_ptr = 0;
8567   ip->if_stack = if_stack;
8568   ip->system_header_p = 0;
8569
8570   for (kt = directive_table; kt->type != T_UNDEF; kt++)
8571     ;
8572
8573   do_undef (str, str + strlen (str), op, kt);
8574   --indepth;
8575 }
8576 \f
8577 /* Process the string STR as if it appeared as the body of a #assert.
8578    OPTION is the option name for which STR was the argument.  */
8579
8580 static void
8581 make_assertion (option, str)
8582      char *option;
8583      U_CHAR *str;
8584 {
8585   FILE_BUF *ip;
8586   struct directive *kt;
8587   U_CHAR *buf, *p, *q;
8588
8589   /* Copy the entire option so we can modify it.  */
8590   buf = (U_CHAR *) alloca (strlen (str) + 1);
8591   strcpy ((char *) buf, str);
8592   /* Scan for any backslash-newline and remove it.  */
8593   p = q = buf;
8594   while (*p) {
8595     if (*p == '\\' && p[1] == '\n')
8596       p += 2;
8597     else
8598       *q++ = *p++;
8599   }
8600   *q = 0;
8601
8602   p = buf;
8603   if (!is_idstart[*p]) {
8604     error ("malformed option `%s %s'", option, str);
8605     return;
8606   }
8607   while (is_idchar[*++p])
8608     ;
8609   while (*p == ' ' || *p == '\t') p++;
8610   if (! (*p == 0 || *p == '(')) {
8611     error ("malformed option `%s %s'", option, str);
8612     return;
8613   }
8614   
8615   ip = &instack[++indepth];
8616   ip->nominal_fname = ip->fname = "*Initialization*";
8617
8618   ip->buf = ip->bufp = buf;
8619   ip->length = strlen (buf);
8620   ip->lineno = 1;
8621   ip->macro = 0;
8622   ip->free_ptr = 0;
8623   ip->if_stack = if_stack;
8624   ip->system_header_p = 0;
8625
8626   for (kt = directive_table; kt->type != T_ASSERT; kt++)
8627     ;
8628
8629   /* pass NULL as output ptr to do_define since we KNOW it never
8630      does any output.... */
8631   do_assert (buf, buf + strlen (buf) , NULL_PTR, kt);
8632   --indepth;
8633 }
8634 \f
8635 /* Append a chain of `struct file_name_list's
8636    to the end of the main include chain.
8637    FIRST is the beginning of the chain to append, and LAST is the end.  */
8638
8639 static void
8640 append_include_chain (first, last)
8641      struct file_name_list *first, *last;
8642 {
8643   struct file_name_list *dir;
8644
8645   if (!first || !last)
8646     return;
8647
8648   if (include == 0)
8649     include = first;
8650   else
8651     last_include->next = first;
8652
8653   if (first_bracket_include == 0)
8654     first_bracket_include = first;
8655
8656   for (dir = first; ; dir = dir->next) {
8657     int len = strlen (dir->fname) + INCLUDE_LEN_FUDGE;
8658     if (len > max_include_len)
8659       max_include_len = len;
8660     if (dir == last)
8661       break;
8662   }
8663
8664   last->next = NULL;
8665   last_include = last;
8666 }
8667 \f
8668 /* Add output to `deps_buffer' for the -M switch.
8669    STRING points to the text to be output.
8670    SIZE is the number of bytes, or 0 meaning output until a null.
8671    Outputting the empty string breaks the line if it is long enough.  */
8672
8673 static void
8674 deps_output (string, size)
8675      char *string;
8676      unsigned size;
8677 {
8678   if (size == 0)
8679     size = strlen (string);
8680
8681 #ifndef MAX_OUTPUT_COLUMNS
8682 #define MAX_OUTPUT_COLUMNS 75
8683 #endif
8684   if (size == 0 && deps_column != 0
8685       && size + deps_column > MAX_OUTPUT_COLUMNS) {
8686     deps_output ("\\\n  ", 0);
8687     deps_column = 0;
8688   }
8689
8690   if (deps_size + size + 1 > deps_allocated_size) {
8691     deps_allocated_size = deps_size + size + 50;
8692     deps_allocated_size *= 2;
8693     deps_buffer = (char *) xrealloc (deps_buffer, deps_allocated_size);
8694   }
8695   bcopy (string, &deps_buffer[deps_size], size);
8696   deps_size += size;
8697   deps_column += size;
8698   deps_buffer[deps_size] = 0;
8699 }
8700 \f
8701 #if defined(USG) || defined(VMS)
8702 #ifndef BSTRING
8703
8704 void
8705 bzero (b, length)
8706      register char *b;
8707      register unsigned length;
8708 {
8709   while (length-- > 0)
8710     *b++ = 0;
8711 }
8712
8713 void
8714 bcopy (b1, b2, length)
8715      register char *b1;
8716      register char *b2;
8717      register unsigned length;
8718 {
8719   while (length-- > 0)
8720     *b2++ = *b1++;
8721 }
8722
8723 int
8724 bcmp (b1, b2, length)   /* This could be a macro! */
8725      register char *b1;
8726      register char *b2;
8727      register unsigned length;
8728 {
8729    while (length-- > 0)
8730      if (*b1++ != *b2++)
8731        return 1;
8732
8733    return 0;
8734 }
8735 #endif /* not BSTRING */
8736 #endif /* USG or VMS */
8737
8738 \f
8739 static void
8740 fatal (str, arg)
8741      char *str, *arg;
8742 {
8743   fprintf (stderr, "%s: ", progname);
8744   fprintf (stderr, str, arg);
8745   fprintf (stderr, "\n");
8746   exit (FAILURE_EXIT_CODE);
8747 }
8748
8749 /* More 'friendly' abort that prints the line and file.
8750    config.h can #define abort fancy_abort if you like that sort of thing.  */
8751
8752 void
8753 fancy_abort ()
8754 {
8755   fatal ("Internal gcc abort.");
8756 }
8757
8758 static void
8759 perror_with_name (name)
8760      char *name;
8761 {
8762   fprintf (stderr, "%s: ", progname);
8763   if (errno < sys_nerr)
8764     fprintf (stderr, "%s: %s\n", name, sys_errlist[errno]);
8765   else
8766     fprintf (stderr, "%s: undocumented I/O error\n", name);
8767   errors++;
8768 }
8769
8770 static void
8771 pfatal_with_name (name)
8772      char *name;
8773 {
8774   perror_with_name (name);
8775 #ifdef VMS
8776   exit (vaxc$errno);
8777 #else
8778   exit (FAILURE_EXIT_CODE);
8779 #endif
8780 }
8781
8782 /* Handler for SIGPIPE.  */
8783
8784 static void
8785 pipe_closed (signo)
8786      /* If this is missing, some compilers complain.  */
8787      int signo;
8788 {
8789   fatal ("output pipe has been closed");
8790 }
8791 \f
8792 static void
8793 memory_full ()
8794 {
8795   fatal ("Memory exhausted.");
8796 }
8797
8798
8799 char *
8800 xmalloc (size)
8801      unsigned size;
8802 {
8803   register char *ptr = (char *) malloc (size);
8804   if (ptr != 0) return (ptr);
8805   memory_full ();
8806   /*NOTREACHED*/
8807   return 0;
8808 }
8809
8810 static char *
8811 xrealloc (old, size)
8812      char *old;
8813      unsigned size;
8814 {
8815   register char *ptr = (char *) realloc (old, size);
8816   if (ptr != 0) return (ptr);
8817   memory_full ();
8818   /*NOTREACHED*/
8819   return 0;
8820 }
8821
8822 static char *
8823 xcalloc (number, size)
8824      unsigned number, size;
8825 {
8826   register unsigned total = number * size;
8827   register char *ptr = (char *) malloc (total);
8828   if (ptr != 0) {
8829     if (total > 100)
8830       bzero (ptr, total);
8831     else {
8832       /* It's not too long, so loop, zeroing by longs.
8833          It must be safe because malloc values are always well aligned.  */
8834       register long *zp = (long *) ptr;
8835       register long *zl = (long *) (ptr + total - 4);
8836       register int i = total - 4;
8837       while (zp < zl)
8838         *zp++ = 0;
8839       if (i < 0)
8840         i = 0;
8841       while (i < total)
8842         ptr[i++] = 0;
8843     }
8844     return ptr;
8845   }
8846   memory_full ();
8847   /*NOTREACHED*/
8848   return 0;
8849 }
8850
8851 static char *
8852 savestring (input)
8853      char *input;
8854 {
8855   unsigned size = strlen (input);
8856   char *output = xmalloc (size + 1);
8857   strcpy (output, input);
8858   return output;
8859 }
8860 \f
8861 /* Get the file-mode and data size of the file open on FD
8862    and store them in *MODE_POINTER and *SIZE_POINTER.  */
8863
8864 static int
8865 file_size_and_mode (fd, mode_pointer, size_pointer)
8866      int fd;
8867      int *mode_pointer;
8868      long int *size_pointer;
8869 {
8870   struct stat sbuf;
8871
8872   if (fstat (fd, &sbuf) < 0) return (-1);
8873   if (mode_pointer) *mode_pointer = sbuf.st_mode;
8874   if (size_pointer) *size_pointer = sbuf.st_size;
8875   return 0;
8876 }
8877 \f
8878 #ifdef VMS
8879
8880 /* Under VMS we need to fix up the "include" specification
8881    filename so that everything following the 1st slash is
8882    changed into its correct VMS file specification. */
8883
8884 static void
8885 hack_vms_include_specification (fname)
8886      char *fname;
8887 {
8888   register char *cp, *cp1, *cp2;
8889   int f, check_filename_before_returning, no_prefix_seen;
8890   char Local[512];
8891
8892   check_filename_before_returning = 0;
8893   no_prefix_seen = 0;
8894
8895   /* Ignore leading "./"s */
8896   while (fname[0] == '.' && fname[1] == '/') {
8897     strcpy (fname, fname+2);
8898     no_prefix_seen = 1;         /* mark this for later */
8899   }
8900   /* Look for the boundary between the VMS and UNIX filespecs */
8901   cp = rindex (fname, ']');     /* Look for end of dirspec. */
8902   if (cp == 0) cp = rindex (fname, '>'); /* ... Ditto               */
8903   if (cp == 0) cp = rindex (fname, ':'); /* Look for end of devspec. */
8904   if (cp) {
8905     cp++;
8906   } else {
8907     cp = index (fname, '/');    /* Look for the "/" */
8908   }
8909
8910   cp2 = Local;                  /* initialize */
8911
8912   /* We are trying to do a number of things here.  First of all, we are
8913      trying to hammer the filenames into a standard format, such that later
8914      processing can handle them.
8915      
8916      If the file name contains something like [dir.], then it recognizes this
8917      as a root, and strips the ".]".  Later processing will add whatever is
8918      needed to get things working properly.
8919      
8920      If no device is specified, then the first directory name is taken to be
8921      a device name (or a rooted logical). */
8922
8923   /* See if we found that 1st slash */
8924   if (cp == 0) return;          /* Nothing to do!!! */
8925   if (*cp != '/') return;       /* Nothing to do!!! */
8926   /* Point to the UNIX filename part (which needs to be fixed!) */
8927   cp1 = cp+1;
8928   /* If the directory spec is not rooted, we can just copy
8929      the UNIX filename part and we are done */
8930   if (((cp - fname) > 1) && ((cp[-1] == ']') || (cp[-1] == '>'))) {
8931     if (cp[-2] != '.') {
8932       /*
8933        * The VMS part ends in a `]', and the preceding character is not a `.'.
8934        * We strip the `]', and then splice the two parts of the name in the
8935        * usual way.  Given the default locations for include files in cccp.c,
8936        * we will only use this code if the user specifies alternate locations
8937        * with the /include (-I) switch on the command line.  */
8938       cp -= 1;                  /* Strip "]" */
8939       cp1--;                    /* backspace */
8940     } else {
8941       /*
8942        * The VMS part has a ".]" at the end, and this will not do.  Later
8943        * processing will add a second directory spec, and this would be a syntax
8944        * error.  Thus we strip the ".]", and thus merge the directory specs.
8945        * We also backspace cp1, so that it points to a '/'.  This inhibits the
8946        * generation of the 000000 root directory spec (which does not belong here
8947        * in this case).
8948        */
8949       cp -= 2;                  /* Strip ".]" */
8950       cp1--; };                 /* backspace */
8951   } else {
8952
8953     /* We drop in here if there is no VMS style directory specification yet.
8954      * If there is no device specification either, we make the first dir a
8955      * device and try that.  If we do not do this, then we will be essentially
8956      * searching the users default directory (as if they did a #include "asdf.h").
8957      *
8958      * Then all we need to do is to push a '[' into the output string. Later
8959      * processing will fill this in, and close the bracket.
8960      */
8961     if (cp[-1] != ':') *cp2++ = ':'; /* dev not in spec.  take first dir */
8962     *cp2++ = '[';               /* Open the directory specification */
8963   }
8964
8965   /* at this point we assume that we have the device spec, and (at least
8966      the opening "[" for a directory specification.  We may have directories
8967      specified already */
8968
8969   /* If there are no other slashes then the filename will be
8970      in the "root" directory.  Otherwise, we need to add
8971      directory specifications. */
8972   if (index (cp1, '/') == 0) {
8973     /* Just add "000000]" as the directory string */
8974     strcpy (cp2, "000000]");
8975     cp2 += strlen (cp2);
8976     check_filename_before_returning = 1; /* we might need to fool with this later */
8977   } else {
8978     /* As long as there are still subdirectories to add, do them. */
8979     while (index (cp1, '/') != 0) {
8980       /* If this token is "." we can ignore it */
8981       if ((cp1[0] == '.') && (cp1[1] == '/')) {
8982         cp1 += 2;
8983         continue;
8984       }
8985       /* Add a subdirectory spec. Do not duplicate "." */
8986       if (cp2[-1] != '.' && cp2[-1] != '[' && cp2[-1] != '<')
8987         *cp2++ = '.';
8988       /* If this is ".." then the spec becomes "-" */
8989       if ((cp1[0] == '.') && (cp1[1] == '.') && (cp[2] == '/')) {
8990         /* Add "-" and skip the ".." */
8991         *cp2++ = '-';
8992         cp1 += 3;
8993         continue;
8994       }
8995       /* Copy the subdirectory */
8996       while (*cp1 != '/') *cp2++= *cp1++;
8997       cp1++;                    /* Skip the "/" */
8998     }
8999     /* Close the directory specification */
9000     if (cp2[-1] == '.')         /* no trailing periods */
9001       cp2--;
9002     *cp2++ = ']';
9003   }
9004   /* Now add the filename */
9005   while (*cp1) *cp2++ = *cp1++;
9006   *cp2 = 0;
9007   /* Now append it to the original VMS spec. */
9008   strcpy (cp, Local);
9009
9010   /* If we put a [000000] in the filename, try to open it first. If this fails,
9011      remove the [000000], and return that name.  This provides flexibility
9012      to the user in that they can use both rooted and non-rooted logical names
9013      to point to the location of the file.  */
9014
9015   if (check_filename_before_returning && no_prefix_seen) {
9016     f = open (fname, O_RDONLY, 0666);
9017     if (f >= 0) {
9018       /* The file name is OK as it is, so return it as is.  */
9019       close (f);
9020       return;
9021     }
9022     /* The filename did not work.  Try to remove the [000000] from the name,
9023        and return it.  */
9024     cp = index (fname, '[');
9025     cp2 = index (fname, ']') + 1;
9026     strcpy (cp, cp2);           /* this gets rid of it */
9027   }
9028   return;
9029 }
9030 #endif  /* VMS */
9031 \f
9032 #ifdef  VMS
9033
9034 /* These are the read/write replacement routines for
9035    VAX-11 "C".  They make read/write behave enough
9036    like their UNIX counterparts that CCCP will work */
9037
9038 static int
9039 read (fd, buf, size)
9040      int fd;
9041      char *buf;
9042      int size;
9043 {
9044 #undef  read    /* Get back the REAL read routine */
9045   register int i;
9046   register int total = 0;
9047
9048   /* Read until the buffer is exhausted */
9049   while (size > 0) {
9050     /* Limit each read to 32KB */
9051     i = (size > (32*1024)) ? (32*1024) : size;
9052     i = read (fd, buf, i);
9053     if (i <= 0) {
9054       if (i == 0) return (total);
9055       return (i);
9056     }
9057     /* Account for this read */
9058     total += i;
9059     buf += i;
9060     size -= i;
9061   }
9062   return (total);
9063 }
9064
9065 static int
9066 write (fd, buf, size)
9067      int fd;
9068      char *buf;
9069      int size;
9070 {
9071 #undef  write   /* Get back the REAL write routine */
9072   int i;
9073   int j;
9074
9075   /* Limit individual writes to 32Kb */
9076   i = size;
9077   while (i > 0) {
9078     j = (i > (32*1024)) ? (32*1024) : i;
9079     if (write (fd, buf, j) < 0) return (-1);
9080     /* Account for the data written */
9081     buf += j;
9082     i -= j;
9083   }
9084   return (size);
9085 }
9086
9087 /* The following wrapper functions supply additional arguments to the VMS
9088    I/O routines to optimize performance with file handling.  The arguments
9089    are:
9090      "mbc=16" - Set multi-block count to 16 (use a 8192 byte buffer).
9091      "deq=64" - When extending the file, extend it in chunks of 32Kbytes.
9092      "fop=tef"- Truncate unused portions of file when closing file.
9093      "shr=nil"- Disallow file sharing while file is open.
9094  */
9095
9096 static FILE *
9097 freopen (fname, type, oldfile)
9098      char *fname;
9099      char *type;
9100      FILE *oldfile;
9101 {
9102 #undef  freopen /* Get back the REAL fopen routine */
9103   if (strcmp (type, "w") == 0)
9104     return freopen (fname, type, oldfile, "mbc=16", "deq=64", "fop=tef", "shr=nil");
9105   return freopen (fname, type, oldfile, "mbc=16");
9106 }
9107
9108 static FILE *
9109 fopen (fname, type)
9110      char *fname;
9111      char *type;
9112 {
9113 #undef fopen    /* Get back the REAL fopen routine */
9114   if (strcmp (type, "w") == 0)
9115     return fopen (fname, type, "mbc=16", "deq=64", "fop=tef", "shr=nil");
9116   return fopen (fname, type, "mbc=16");
9117 }
9118
9119 static int 
9120 open (fname, flags, prot)
9121      char *fname;
9122      int flags;
9123      int prot;
9124 {
9125 #undef open     /* Get back the REAL open routine */
9126   return open (fname, flags, prot, "mbc=16", "deq=64", "fop=tef");
9127 }
9128
9129 /* Avoid run-time library bug, where copying M out of N+M characters with
9130    N >= 65535 results in VAXCRTL's strncat falling into an infinite loop.
9131    gcc-cpp exercises this particular bug.  */
9132
9133 static char *
9134 strncat (dst, src, cnt)
9135      char *dst;
9136      const char *src;
9137      unsigned cnt;
9138 {
9139   register char *d = dst, *s = (char *) src;
9140   register int n = cnt; /* convert to _signed_ type */
9141
9142   while (*d) d++;       /* advance to end */
9143   while (--n >= 0)
9144     if (!(*d++ = *s++)) break;
9145   if (n < 0) *d = '\0';
9146   return dst;
9147 }
9148 #endif /* VMS */