OSDN Git Service

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