OSDN Git Service

Removed __NetBSD__ from conditional.
[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_command ();
309
310 /* Last arg to output_line_command.  */
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_commands;
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 command.  */
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 commands (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_commands = 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_commands = 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_command (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_command (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_command (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_command (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       if (ip->fname == 0 && beg_of_line == ip->buf)
2590         goto randomchar;
2591       while (*ibp == '\\' && ibp[1] == '\n') {
2592         ibp += 2;
2593         ++ip->lineno;
2594       }
2595       if (*ibp != ':')
2596         break;
2597       /* Treat this %: digraph as if it were #.  */
2598       /* Fall through.  */
2599
2600     case '#':
2601       if (assertions_flag) {
2602         /* Copy #foo (bar lose) without macro expansion.  */
2603         obp[-1] = '#';  /* In case it was '%'. */
2604         SKIP_WHITE_SPACE (ibp);
2605         while (is_idchar[*ibp])
2606           *obp++ = *ibp++;
2607         SKIP_WHITE_SPACE (ibp);
2608         if (*ibp == '(') {
2609           ip->bufp = ibp;
2610           skip_paren_group (ip);
2611           bcopy ((char *) ibp, (char *) obp, ip->bufp - ibp);
2612           obp += ip->bufp - ibp;
2613           ibp = ip->bufp;
2614         }
2615       }
2616
2617       /* If this is expanding a macro definition, don't recognize
2618          preprocessor directives.  */
2619       if (ip->macro != 0)
2620         goto randomchar;
2621       /* If this is expand_into_temp_buffer, recognize them
2622          only after an actual newline at this level,
2623          not at the beginning of the input level.  */
2624       if (ip->fname == 0 && beg_of_line == ip->buf)
2625         goto randomchar;
2626       if (ident_length)
2627         goto specialchar;
2628
2629       
2630       /* # keyword: a # must be first nonblank char on the line */
2631       if (beg_of_line == 0)
2632         goto randomchar;
2633       {
2634         U_CHAR *bp;
2635
2636         /* Scan from start of line, skipping whitespace, comments
2637            and backslash-newlines, and see if we reach this #.
2638            If not, this # is not special.  */
2639         bp = beg_of_line;
2640         /* If -traditional, require # to be at beginning of line.  */
2641         if (!traditional) {
2642           while (1) {
2643             if (is_hor_space[*bp])
2644               bp++;
2645             else if (*bp == '\\' && bp[1] == '\n')
2646               bp += 2;
2647             else if (*bp == '/' && bp[1] == '*') {
2648               bp += 2;
2649               while (!(*bp == '*' && bp[1] == '/'))
2650                 bp++;
2651               bp += 2;
2652             }
2653             /* There is no point in trying to deal with C++ // comments here,
2654                because if there is one, then this # must be part of the
2655                comment and we would never reach here.  */
2656             else break;
2657           }
2658           if (c == '%') {
2659             if (bp[0] != '%')
2660               break;
2661             while (bp[1] == '\\' && bp[2] == '\n')
2662               bp += 2;
2663             if (bp + 1 != ibp)
2664               break;
2665             /* %: appears at start of line; skip past the ':' too.  */
2666             bp++;
2667             ibp++;
2668           }
2669         }
2670         if (bp + 1 != ibp)
2671           goto randomchar;
2672       }
2673
2674       /* This # can start a directive.  */
2675
2676       --obp;            /* Don't copy the '#' */
2677
2678       ip->bufp = ibp;
2679       op->bufp = obp;
2680       if (! handle_directive (ip, op)) {
2681 #ifdef USE_C_ALLOCA
2682         alloca (0);
2683 #endif
2684         /* Not a known directive: treat it as ordinary text.
2685            IP, OP, IBP, etc. have not been changed.  */
2686         if (no_output && instack[indepth].fname) {
2687           /* If not generating expanded output,
2688              what we do with ordinary text is skip it.
2689              Discard everything until next # directive.  */
2690           skip_if_group (&instack[indepth], 1, 0);
2691           RECACHE;
2692           beg_of_line = ibp;
2693           break;
2694         }
2695         *obp++ = '#';   /* Copy # (even if it was originally %:).  */
2696         /* Don't expand an identifier that could be a macro directive.
2697            (Section 3.8.3 of the ANSI C standard)                       */
2698         SKIP_WHITE_SPACE (ibp);
2699         if (is_idstart[*ibp])
2700           {
2701             *obp++ = *ibp++;
2702             while (is_idchar[*ibp])
2703               *obp++ = *ibp++;
2704           }
2705         goto randomchar;
2706       }
2707 #ifdef USE_C_ALLOCA
2708       alloca (0);
2709 #endif
2710       /* A # directive has been successfully processed.  */
2711       /* If not generating expanded output, ignore everything until
2712          next # directive.  */
2713       if (no_output && instack[indepth].fname)
2714         skip_if_group (&instack[indepth], 1, 0);
2715       obp = op->bufp;
2716       RECACHE;
2717       beg_of_line = ibp;
2718       break;
2719
2720     case '\"':                  /* skip quoted string */
2721     case '\'':
2722       /* A single quoted string is treated like a double -- some
2723          programs (e.g., troff) are perverse this way */
2724
2725       if (ident_length)
2726         goto specialchar;
2727
2728       start_line = ip->lineno;
2729
2730       /* Skip ahead to a matching quote.  */
2731
2732       while (1) {
2733         if (ibp >= limit) {
2734           if (ip->macro != 0) {
2735             /* try harder: this string crosses a macro expansion boundary.
2736                This can happen naturally if -traditional.
2737                Otherwise, only -D can make a macro with an unmatched quote.  */
2738             POPMACRO;
2739             RECACHE;
2740             continue;
2741           }
2742           if (!traditional) {
2743             error_with_line (line_for_error (start_line),
2744                              "unterminated string or character constant");
2745             error_with_line (multiline_string_line,
2746                              "possible real start of unterminated constant");
2747             multiline_string_line = 0;
2748           }
2749           break;
2750         }
2751         *obp++ = *ibp;
2752         switch (*ibp++) {
2753         case '\n':
2754           ++ip->lineno;
2755           ++op->lineno;
2756           /* Traditionally, end of line ends a string constant with no error.
2757              So exit the loop and record the new line.  */
2758           if (traditional) {
2759             beg_of_line = ibp;
2760             goto while2end;
2761           }
2762           if (c == '\'') {
2763             error_with_line (line_for_error (start_line),
2764                              "unterminated character constant");
2765             goto while2end;
2766           }
2767           if (pedantic && multiline_string_line == 0) {
2768             pedwarn_with_line (line_for_error (start_line),
2769                                "string constant runs past end of line");
2770           }
2771           if (multiline_string_line == 0)
2772             multiline_string_line = ip->lineno - 1;
2773           break;
2774
2775         case '\\':
2776           if (ibp >= limit)
2777             break;
2778           if (*ibp == '\n') {
2779             /* Backslash newline is replaced by nothing at all,
2780                but keep the line counts correct.  */
2781             --obp;
2782             ++ibp;
2783             ++ip->lineno;
2784           } else {
2785             /* ANSI stupidly requires that in \\ the second \
2786                is *not* prevented from combining with a newline.  */
2787             while (*ibp == '\\' && ibp[1] == '\n') {
2788               ibp += 2;
2789               ++ip->lineno;
2790             }
2791             *obp++ = *ibp++;
2792           }
2793           break;
2794
2795         case '\"':
2796         case '\'':
2797           if (ibp[-1] == c)
2798             goto while2end;
2799           break;
2800         }
2801       }
2802     while2end:
2803       break;
2804
2805     case '/':
2806       if (*ibp == '\\' && ibp[1] == '\n')
2807         newline_fix (ibp);
2808
2809       if (*ibp != '*'
2810           && !(cplusplus_comments && *ibp == '/'))
2811         goto randomchar;
2812       if (ip->macro != 0)
2813         goto randomchar;
2814       if (ident_length)
2815         goto specialchar;
2816
2817       if (*ibp == '/') {
2818         /* C++ style comment... */
2819         start_line = ip->lineno;
2820
2821         --ibp;                  /* Back over the slash */
2822         --obp;
2823
2824         /* Comments are equivalent to spaces. */
2825         if (! put_out_comments)
2826           *obp++ = ' ';
2827         else {
2828           /* must fake up a comment here */
2829           *obp++ = '/';
2830           *obp++ = '/';
2831         }
2832         {
2833           U_CHAR *before_bp = ibp+2;
2834
2835           while (ibp < limit) {
2836             if (ibp[-1] != '\\' && *ibp == '\n') {
2837               if (put_out_comments) {
2838                 bcopy ((char *) before_bp, (char *) obp, ibp - before_bp);
2839                 obp += ibp - before_bp;
2840               }
2841               break;
2842             } else {
2843               if (*ibp == '\n') {
2844                 ++ip->lineno;
2845                 /* Copy the newline into the output buffer, in order to
2846                    avoid the pain of a #line every time a multiline comment
2847                    is seen.  */
2848                 if (!put_out_comments)
2849                   *obp++ = '\n';
2850                 ++op->lineno;
2851               }
2852               ibp++;
2853             }
2854           }
2855           break;
2856         }
2857       }
2858
2859       /* Ordinary C comment.  Skip it, optionally copying it to output.  */
2860
2861       start_line = ip->lineno;
2862
2863       ++ibp;                    /* Skip the star. */
2864
2865       /* If this cpp is for lint, we peek inside the comments: */
2866       if (for_lint) {
2867         U_CHAR *argbp;
2868         int cmdlen, arglen;
2869         char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen);
2870
2871         if (lintcmd != NULL) {
2872           op->bufp = obp;
2873           check_expand (op, cmdlen + arglen + 14);
2874           obp = op->bufp;
2875           /* I believe it is always safe to emit this newline: */
2876           obp[-1] = '\n';
2877           bcopy ("#pragma lint ", (char *) obp, 13);
2878           obp += 13;
2879           bcopy (lintcmd, (char *) obp, cmdlen);
2880           obp += cmdlen;
2881
2882           if (arglen != 0) {
2883             *(obp++) = ' ';
2884             bcopy (argbp, (char *) obp, arglen);
2885             obp += arglen;
2886           }
2887
2888           /* OK, now bring us back to the state we were in before we entered
2889              this branch.  We need #line because the #pragma's newline always
2890              messes up the line count.  */
2891           op->bufp = obp;
2892           output_line_command (ip, op, 0, same_file);
2893           check_expand (op, limit - ibp + 2);
2894           obp = op->bufp;
2895           *(obp++) = '/';
2896         }
2897       }
2898
2899       /* Comments are equivalent to spaces.
2900          Note that we already output the slash; we might not want it.
2901          For -traditional, a comment is equivalent to nothing.  */
2902       if (! put_out_comments) {
2903         if (traditional)
2904           obp--;
2905         else
2906           obp[-1] = ' ';
2907       }
2908       else
2909         *obp++ = '*';
2910
2911       {
2912         U_CHAR *before_bp = ibp;
2913
2914         while (ibp < limit) {
2915           switch (*ibp++) {
2916           case '/':
2917             if (warn_comments && *ibp == '*')
2918               warning ("`/*' within comment");
2919             break;
2920           case '*':
2921             if (*ibp == '\\' && ibp[1] == '\n')
2922               newline_fix (ibp);
2923             if (ibp >= limit || *ibp == '/')
2924               goto comment_end;
2925             break;
2926           case '\n':
2927             ++ip->lineno;
2928             /* Copy the newline into the output buffer, in order to
2929                avoid the pain of a #line every time a multiline comment
2930                is seen.  */
2931             if (!put_out_comments)
2932               *obp++ = '\n';
2933             ++op->lineno;
2934           }
2935         }
2936       comment_end:
2937
2938         if (ibp >= limit)
2939           error_with_line (line_for_error (start_line),
2940                            "unterminated comment");
2941         else {
2942           ibp++;
2943           if (put_out_comments) {
2944             bcopy ((char *) before_bp, (char *) obp, ibp - before_bp);
2945             obp += ibp - before_bp;
2946           }
2947         }
2948       }
2949       break;
2950
2951     case '$':
2952       if (!dollars_in_ident)
2953         goto randomchar;
2954       goto letter;
2955
2956     case '0': case '1': case '2': case '3': case '4':
2957     case '5': case '6': case '7': case '8': case '9':
2958       /* If digit is not part of identifier, it starts a number,
2959          which means that following letters are not an identifier.
2960          "0x5" does not refer to an identifier "x5".
2961          So copy all alphanumerics that follow without accumulating
2962          as an identifier.  Periods also, for sake of "3.e7".  */
2963
2964       if (ident_length == 0) {
2965         for (;;) {
2966           while (ibp[0] == '\\' && ibp[1] == '\n') {
2967             ++ip->lineno;
2968             ibp += 2;
2969           }
2970           c = *ibp++;
2971           if (!is_idchar[c] && c != '.') {
2972             --ibp;
2973             break;
2974           }
2975           *obp++ = c;
2976           /* A sign can be part of a preprocessing number
2977              if it follows an e.  */
2978           if (c == 'e' || c == 'E') {
2979             while (ibp[0] == '\\' && ibp[1] == '\n') {
2980               ++ip->lineno;
2981               ibp += 2;
2982             }
2983             if (*ibp == '+' || *ibp == '-') {
2984               *obp++ = *ibp++;
2985               /* But traditional C does not let the token go past the sign.  */
2986               if (traditional)
2987                 break;
2988             }
2989           }
2990         }
2991         break;
2992       }
2993       /* fall through */
2994
2995     case '_':
2996     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
2997     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
2998     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
2999     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
3000     case 'y': case 'z':
3001     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
3002     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
3003     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
3004     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
3005     case 'Y': case 'Z':
3006     letter:
3007       ident_length++;
3008       /* Compute step of hash function, to avoid a proc call on every token */
3009       hash = HASHSTEP (hash, c);
3010       break;
3011
3012     case '\n':
3013       if (ip->fname == 0 && *ibp == '-') {
3014         /* Newline - inhibits expansion of preceding token.
3015            If expanding a macro arg, we keep the newline -.
3016            In final output, it is deleted.
3017            We recognize Newline - in macro bodies and macro args.  */
3018         if (! concatenated) {
3019           ident_length = 0;
3020           hash = 0;
3021         }
3022         ibp++;
3023         if (!output_marks) {
3024           obp--;
3025         } else {
3026           /* If expanding a macro arg, keep the newline -.  */
3027           *obp++ = '-';
3028         }
3029         break;
3030       }
3031
3032       /* If reprocessing a macro expansion, newline is a special marker.  */
3033       else if (ip->macro != 0) {
3034         /* Newline White is a "funny space" to separate tokens that are
3035            supposed to be separate but without space between.
3036            Here White means any whitespace character.
3037            Newline - marks a recursive macro use that is not
3038            supposed to be expandable.  */
3039
3040         if (is_space[*ibp]) {
3041           /* Newline Space does not prevent expansion of preceding token
3042              so expand the preceding token and then come back.  */
3043           if (ident_length > 0)
3044             goto specialchar;
3045
3046           /* If generating final output, newline space makes a space.  */
3047           if (!output_marks) {
3048             obp[-1] = *ibp++;
3049             /* And Newline Newline makes a newline, so count it.  */
3050             if (obp[-1] == '\n')
3051               op->lineno++;
3052           } else {
3053             /* If expanding a macro arg, keep the newline space.
3054                If the arg gets stringified, newline space makes nothing.  */
3055             *obp++ = *ibp++;
3056           }
3057         } else abort ();        /* Newline followed by something random?  */
3058         break;
3059       }
3060
3061       /* If there is a pending identifier, handle it and come back here.  */
3062       if (ident_length > 0)
3063         goto specialchar;
3064
3065       beg_of_line = ibp;
3066
3067       /* Update the line counts and output a #line if necessary.  */
3068       ++ip->lineno;
3069       ++op->lineno;
3070       if (ip->lineno != op->lineno) {
3071         op->bufp = obp;
3072         output_line_command (ip, op, 1, same_file);
3073         check_expand (op, limit - ibp);
3074         obp = op->bufp;
3075       }
3076       break;
3077
3078       /* Come here either after (1) a null character that is part of the input
3079          or (2) at the end of the input, because there is a null there.  */
3080     case 0:
3081       if (ibp <= limit)
3082         /* Our input really contains a null character.  */
3083         goto randomchar;
3084
3085       /* At end of a macro-expansion level, pop it and read next level.  */
3086       if (ip->macro != 0) {
3087         obp--;
3088         ibp--;
3089         /* If traditional, and we have an identifier that ends here,
3090            process it now, so we get the right error for recursion.  */
3091         if (traditional && ident_length
3092             && ! is_idchar[*instack[indepth - 1].bufp]) {
3093           redo_char = 1;
3094           goto randomchar;
3095         }
3096         POPMACRO;
3097         RECACHE;
3098         break;
3099       }
3100
3101       /* If we don't have a pending identifier,
3102          return at end of input.  */
3103       if (ident_length == 0) {
3104         obp--;
3105         ibp--;
3106         op->bufp = obp;
3107         ip->bufp = ibp;
3108         goto ending;
3109       }
3110
3111       /* If we do have a pending identifier, just consider this null
3112          a special character and arrange to dispatch on it again.
3113          The second time, IDENT_LENGTH will be zero so we will return.  */
3114
3115       /* Fall through */
3116
3117 specialchar:
3118
3119       /* Handle the case of a character such as /, ', " or null
3120          seen following an identifier.  Back over it so that
3121          after the identifier is processed the special char
3122          will be dispatched on again.  */
3123
3124       ibp--;
3125       obp--;
3126       redo_char = 1;
3127
3128     default:
3129
3130 randomchar:
3131
3132       if (ident_length > 0) {
3133         register HASHNODE *hp;
3134
3135         /* We have just seen an identifier end.  If it's a macro, expand it.
3136
3137            IDENT_LENGTH is the length of the identifier
3138            and HASH is its hash code.
3139
3140            The identifier has already been copied to the output,
3141            so if it is a macro we must remove it.
3142
3143            If REDO_CHAR is 0, the char that terminated the identifier
3144            has been skipped in the output and the input.
3145            OBP-IDENT_LENGTH-1 points to the identifier.
3146            If the identifier is a macro, we must back over the terminator.
3147
3148            If REDO_CHAR is 1, the terminating char has already been
3149            backed over.  OBP-IDENT_LENGTH points to the identifier.  */
3150
3151         if (!pcp_outfile || pcp_inside_if) {
3152 startagain:
3153           for (hp = hashtab[MAKE_POS (hash) % HASHSIZE]; hp != NULL;
3154                hp = hp->next) {
3155             
3156             if (hp->length == ident_length) {
3157               int obufp_before_macroname;
3158               int op_lineno_before_macroname;
3159               register int i = ident_length;
3160               register U_CHAR *p = hp->name;
3161               register U_CHAR *q = obp - i;
3162               int disabled;
3163               
3164               if (! redo_char)
3165                 q--;
3166               
3167               do {              /* All this to avoid a strncmp () */
3168                 if (*p++ != *q++)
3169                   goto hashcollision;
3170               } while (--i);
3171               
3172               /* We found a use of a macro name.
3173                  see if the context shows it is a macro call.  */
3174               
3175               /* Back up over terminating character if not already done.  */
3176               if (! redo_char) {
3177                 ibp--;
3178                 obp--;
3179               }
3180               
3181               /* Save this as a displacement from the beginning of the output
3182                  buffer.  We can not save this as a position in the output
3183                  buffer, because it may get realloc'ed by RECACHE.  */
3184               obufp_before_macroname = (obp - op->buf) - ident_length;
3185               op_lineno_before_macroname = op->lineno;
3186               
3187               if (hp->type == T_PCSTRING) {
3188                 pcstring_used (hp); /* Mark the definition of this key
3189                                        as needed, ensuring that it
3190                                        will be output.  */
3191                 break;          /* Exit loop, since the key cannot have a
3192                                    definition any longer.  */
3193               }
3194
3195               /* Record whether the macro is disabled.  */
3196               disabled = hp->type == T_DISABLED;
3197               
3198               /* This looks like a macro ref, but if the macro was disabled,
3199                  just copy its name and put in a marker if requested.  */
3200               
3201               if (disabled) {
3202 #if 0
3203                 /* This error check caught useful cases such as
3204                    #define foo(x,y) bar (x (y,0), y)
3205                    foo (foo, baz)  */
3206                 if (traditional)
3207                   error ("recursive use of macro `%s'", hp->name);
3208 #endif
3209                 
3210                 if (output_marks) {
3211                   check_expand (op, limit - ibp + 2);
3212                   *obp++ = '\n';
3213                   *obp++ = '-';
3214                 }
3215                 break;
3216               }
3217               
3218               /* If macro wants an arglist, verify that a '(' follows.
3219                  first skip all whitespace, copying it to the output
3220                  after the macro name.  Then, if there is no '(',
3221                  decide this is not a macro call and leave things that way.  */
3222               if ((hp->type == T_MACRO || hp->type == T_DISABLED)
3223                   && hp->value.defn->nargs >= 0)
3224                 {
3225                   U_CHAR *old_ibp = ibp;
3226                   U_CHAR *old_obp = obp;
3227                   int old_iln = ip->lineno;
3228                   int old_oln = op->lineno;
3229                   
3230                   while (1) {
3231                     /* Scan forward over whitespace, copying it to the output.  */
3232                     if (ibp == limit && ip->macro != 0) {
3233                       POPMACRO;
3234                       RECACHE;
3235                       old_ibp = ibp;
3236                       old_obp = obp;
3237                       old_iln = ip->lineno;
3238                       old_oln = op->lineno;
3239                     }
3240                     /* A comment: copy it unchanged or discard it.  */
3241                     else if (*ibp == '/' && ibp[1] == '*') {
3242                       if (put_out_comments) {
3243                         *obp++ = '/';
3244                         *obp++ = '*';
3245                       } else if (! traditional) {
3246                         *obp++ = ' ';
3247                       }
3248                       ibp += 2;
3249                       while (ibp + 1 != limit
3250                              && !(ibp[0] == '*' && ibp[1] == '/')) {
3251                         /* We need not worry about newline-marks,
3252                            since they are never found in comments.  */
3253                         if (*ibp == '\n') {
3254                           /* Newline in a file.  Count it.  */
3255                           ++ip->lineno;
3256                           ++op->lineno;
3257                         }
3258                         if (put_out_comments)
3259                           *obp++ = *ibp++;
3260                         else
3261                           ibp++;
3262                       }
3263                       ibp += 2;
3264                       if (put_out_comments) {
3265                         *obp++ = '*';
3266                         *obp++ = '/';
3267                       }
3268                     }
3269                     else if (is_space[*ibp]) {
3270                       *obp++ = *ibp++;
3271                       if (ibp[-1] == '\n') {
3272                         if (ip->macro == 0) {
3273                           /* Newline in a file.  Count it.  */
3274                           ++ip->lineno;
3275                           ++op->lineno;
3276                         } else if (!output_marks) {
3277                           /* A newline mark, and we don't want marks
3278                              in the output.  If it is newline-hyphen,
3279                              discard it entirely.  Otherwise, it is
3280                              newline-whitechar, so keep the whitechar.  */
3281                           obp--;
3282                           if (*ibp == '-')
3283                             ibp++;
3284                           else {
3285                             if (*ibp == '\n')
3286                               ++op->lineno;
3287                             *obp++ = *ibp++;
3288                           }
3289                         } else {
3290                           /* A newline mark; copy both chars to the output.  */
3291                           *obp++ = *ibp++;
3292                         }
3293                       }
3294                     }
3295                     else break;
3296                   }
3297                   if (*ibp != '(') {
3298                     /* It isn't a macro call.
3299                        Put back the space that we just skipped.  */
3300                     ibp = old_ibp;
3301                     obp = old_obp;
3302                     ip->lineno = old_iln;
3303                     op->lineno = old_oln;
3304                     /* Exit the for loop.  */
3305                     break;
3306                   }
3307                 }
3308               
3309               /* This is now known to be a macro call.
3310                  Discard the macro name from the output,
3311                  along with any following whitespace just copied,
3312                  but preserve newlines if not outputting marks since this
3313                  is more likely to do the right thing with line numbers.  */
3314               obp = op->buf + obufp_before_macroname;
3315               if (output_marks)
3316                 op->lineno = op_lineno_before_macroname;
3317               else {
3318                 int newlines = op->lineno - op_lineno_before_macroname;
3319                 while (0 < newlines--)
3320                   *obp++ = '\n';
3321               }
3322
3323               /* Prevent accidental token-pasting with a character
3324                  before the macro call.  */
3325               if (!traditional && obp != op->buf) {
3326                 switch (obp[-1]) {
3327                 case '%':  case '&':  case '+':  case '-':
3328                 case ':':  case '<':  case '>':  case '|':
3329                   /* If we are expanding a macro arg, make a newline marker
3330                      to separate the tokens.  If we are making real output,
3331                      a plain space will do.  */
3332                   if (output_marks)
3333                     *obp++ = '\n';
3334                   *obp++ = ' ';
3335                 }
3336               }
3337
3338               /* Expand the macro, reading arguments as needed,
3339                  and push the expansion on the input stack.  */
3340               ip->bufp = ibp;
3341               op->bufp = obp;
3342               macroexpand (hp, op);
3343               
3344               /* Reexamine input stack, since macroexpand has pushed
3345                  a new level on it.  */
3346               obp = op->bufp;
3347               RECACHE;
3348               break;
3349             }
3350 hashcollision:
3351             ;
3352           }                     /* End hash-table-search loop */
3353         }
3354         ident_length = hash = 0; /* Stop collecting identifier */
3355         redo_char = 0;
3356         concatenated = 0;
3357       }                         /* End if (ident_length > 0) */
3358     }                           /* End switch */
3359   }                             /* End per-char loop */
3360
3361   /* Come here to return -- but first give an error message
3362      if there was an unterminated successful conditional.  */
3363  ending:
3364   if (if_stack != ip->if_stack)
3365     {
3366       char *str = "unknown";
3367
3368       switch (if_stack->type)
3369         {
3370         case T_IF:
3371           str = "if";
3372           break;
3373         case T_IFDEF:
3374           str = "ifdef";
3375           break;
3376         case T_IFNDEF:
3377           str = "ifndef";
3378           break;
3379         case T_ELSE:
3380           str = "else";
3381           break;
3382         case T_ELIF:
3383           str = "elif";
3384           break;
3385         }
3386
3387       error_with_line (line_for_error (if_stack->lineno),
3388                        "unterminated `#%s' conditional", str);
3389   }
3390   if_stack = ip->if_stack;
3391 }
3392 \f
3393 /*
3394  * Rescan a string into a temporary buffer and return the result
3395  * as a FILE_BUF.  Note this function returns a struct, not a pointer.
3396  *
3397  * OUTPUT_MARKS nonzero means keep Newline markers found in the input
3398  * and insert such markers when appropriate.  See `rescan' for details.
3399  * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
3400  * before substitution; it is 0 for other uses.
3401  */
3402 static FILE_BUF
3403 expand_to_temp_buffer (buf, limit, output_marks, assertions)
3404      U_CHAR *buf, *limit;
3405      int output_marks, assertions;
3406 {
3407   register FILE_BUF *ip;
3408   FILE_BUF obuf;
3409   int length = limit - buf;
3410   U_CHAR *buf1;
3411   int odepth = indepth;
3412   int save_assertions_flag = assertions_flag;
3413
3414   assertions_flag = assertions;
3415
3416   if (length < 0)
3417     abort ();
3418
3419   /* Set up the input on the input stack.  */
3420
3421   buf1 = (U_CHAR *) alloca (length + 1);
3422   {
3423     register U_CHAR *p1 = buf;
3424     register U_CHAR *p2 = buf1;
3425
3426     while (p1 != limit)
3427       *p2++ = *p1++;
3428   }
3429   buf1[length] = 0;
3430
3431   /* Set up to receive the output.  */
3432
3433   obuf.length = length * 2 + 100; /* Usually enough.  Why be stingy?  */
3434   obuf.bufp = obuf.buf = (U_CHAR *) xmalloc (obuf.length);
3435   obuf.fname = 0;
3436   obuf.macro = 0;
3437   obuf.free_ptr = 0;
3438
3439   CHECK_DEPTH ({return obuf;});
3440
3441   ++indepth;
3442
3443   ip = &instack[indepth];
3444   ip->fname = 0;
3445   ip->nominal_fname = 0;
3446   ip->system_header_p = 0;
3447   ip->macro = 0;
3448   ip->free_ptr = 0;
3449   ip->length = length;
3450   ip->buf = ip->bufp = buf1;
3451   ip->if_stack = if_stack;
3452
3453   ip->lineno = obuf.lineno = 1;
3454
3455   /* Scan the input, create the output.  */
3456   rescan (&obuf, output_marks);
3457
3458   /* Pop input stack to original state.  */
3459   --indepth;
3460
3461   if (indepth != odepth)
3462     abort ();
3463
3464   /* Record the output.  */
3465   obuf.length = obuf.bufp - obuf.buf;
3466
3467   assertions_flag = save_assertions_flag;
3468   return obuf;
3469 }
3470 \f
3471 /*
3472  * Process a # directive.  Expects IP->bufp to point after the '#', as in
3473  * `#define foo bar'.  Passes to the command handler
3474  * (do_define, do_include, etc.): the addresses of the 1st and
3475  * last chars of the command (starting immediately after the #
3476  * keyword), plus op and the keyword table pointer.  If the command
3477  * contains comments it is copied into a temporary buffer sans comments
3478  * and the temporary buffer is passed to the command handler instead.
3479  * Likewise for backslash-newlines.
3480  *
3481  * Returns nonzero if this was a known # directive.
3482  * Otherwise, returns zero, without advancing the input pointer.
3483  */
3484
3485 static int
3486 handle_directive (ip, op)
3487      FILE_BUF *ip, *op;
3488 {
3489   register U_CHAR *bp, *cp;
3490   register struct directive *kt;
3491   register int ident_length;
3492   U_CHAR *resume_p;
3493
3494   /* Nonzero means we must copy the entire command
3495      to get rid of comments or backslash-newlines.  */
3496   int copy_command = 0;
3497
3498   U_CHAR *ident, *after_ident;
3499
3500   bp = ip->bufp;
3501
3502   /* Record where the directive started.  do_xifdef needs this.  */
3503   directive_start = bp - 1;
3504
3505   /* Skip whitespace and \-newline.  */
3506   while (1) {
3507     if (is_hor_space[*bp]) {
3508       if (*bp != ' ' && *bp != '\t' && pedantic)
3509         pedwarn ("%s in preprocessing directive", char_name[*bp]);
3510       bp++;
3511     } else if (*bp == '/' && (bp[1] == '*'
3512                               || (cplusplus_comments && bp[1] == '/'))) {
3513       ip->bufp = bp + 2;
3514       skip_to_end_of_comment (ip, &ip->lineno, 0);
3515       bp = ip->bufp;
3516     } else if (*bp == '\\' && bp[1] == '\n') {
3517       bp += 2; ip->lineno++;
3518     } else break;
3519   }
3520
3521   /* Now find end of directive name.
3522      If we encounter a backslash-newline, exchange it with any following
3523      symbol-constituents so that we end up with a contiguous name.  */
3524
3525   cp = bp;
3526   while (1) {
3527     if (is_idchar[*cp])
3528       cp++;
3529     else {
3530       if (*cp == '\\' && cp[1] == '\n')
3531         name_newline_fix (cp);
3532       if (is_idchar[*cp])
3533         cp++;
3534       else break;
3535     }
3536   }
3537   ident_length = cp - bp;
3538   ident = bp;
3539   after_ident = cp;
3540
3541   /* A line of just `#' becomes blank.  */
3542
3543   if (ident_length == 0 && *after_ident == '\n') {
3544     ip->bufp = after_ident;
3545     return 1;
3546   }
3547
3548   if (ident_length == 0 || !is_idstart[*ident]) {
3549     U_CHAR *p = ident;
3550     while (is_idchar[*p]) {
3551       if (*p < '0' || *p > '9')
3552         break;
3553       p++;
3554     }
3555     /* Handle # followed by a line number.  */
3556     if (p != ident && !is_idchar[*p]) {
3557       static struct directive line_directive_table[] = {
3558         {  4, do_line, "line", T_LINE},
3559       };
3560       if (pedantic)
3561         pedwarn ("`#' followed by integer");
3562       after_ident = ident;
3563       kt = line_directive_table;
3564       goto old_linenum;
3565     }
3566
3567     /* Avoid error for `###' and similar cases unless -pedantic.  */
3568     if (p == ident) {
3569       while (*p == '#' || is_hor_space[*p]) p++;
3570       if (*p == '\n') {
3571         if (pedantic && !lang_asm)
3572           warning ("invalid preprocessor directive");
3573         return 0;
3574       }
3575     }
3576
3577     if (!lang_asm)
3578       error ("invalid preprocessor directive name");
3579
3580     return 0;
3581   }
3582
3583   /*
3584    * Decode the keyword and call the appropriate expansion
3585    * routine, after moving the input pointer up to the next line.
3586    */
3587   for (kt = directive_table; kt->length > 0; kt++) {
3588     if (kt->length == ident_length && !strncmp (kt->name, ident, ident_length)) {
3589       register U_CHAR *buf;
3590       register U_CHAR *limit;
3591       int unterminated;
3592       int junk;
3593       int *already_output;
3594
3595       /* Nonzero means do not delete comments within the directive.
3596          #define needs this when -traditional.  */
3597       int keep_comments;
3598
3599     old_linenum:
3600
3601       limit = ip->buf + ip->length;
3602       unterminated = 0;
3603       already_output = 0;
3604       keep_comments = traditional && kt->traditional_comments;
3605       /* #import is defined only in Objective C, or when on the NeXT.  */
3606       if (kt->type == T_IMPORT && !(objc || lookup ("__NeXT__", -1, -1)))
3607         break;
3608
3609       /* Find the end of this command (first newline not backslashed
3610          and not in a string or comment).
3611          Set COPY_COMMAND if the command must be copied
3612          (it contains a backslash-newline or a comment).  */
3613
3614       buf = bp = after_ident;
3615       while (bp < limit) {
3616         register U_CHAR c = *bp++;
3617         switch (c) {
3618         case '\\':
3619           if (bp < limit) {
3620             if (*bp == '\n') {
3621               ip->lineno++;
3622               copy_command = 1;
3623               bp++;
3624             } else if (traditional)
3625               bp++;
3626           }
3627           break;
3628
3629         case '\'':
3630         case '\"':
3631           bp = skip_quoted_string (bp - 1, limit, ip->lineno, &ip->lineno, &copy_command, &unterminated);
3632           /* Don't bother calling the directive if we already got an error
3633              message due to unterminated string.  Skip everything and pretend
3634              we called the directive.  */
3635           if (unterminated) {
3636             if (traditional) {
3637               /* Traditional preprocessing permits unterminated strings.  */
3638               ip->bufp = bp;
3639               goto endloop1;
3640             }
3641             ip->bufp = bp;
3642             return 1;
3643           }
3644           break;
3645
3646           /* <...> is special for #include.  */
3647         case '<':
3648           if (!kt->angle_brackets)
3649             break;
3650           while (bp < limit && *bp != '>' && *bp != '\n') {
3651             if (*bp == '\\' && bp[1] == '\n') {
3652               ip->lineno++;
3653               copy_command = 1;
3654               bp++;
3655             }
3656             bp++;
3657           }
3658           break;
3659
3660         case '/':
3661           if (*bp == '\\' && bp[1] == '\n')
3662             newline_fix (bp);
3663           if (*bp == '*'
3664               || (cplusplus_comments && *bp == '/')) {
3665             U_CHAR *obp = bp - 1;
3666             ip->bufp = bp + 1;
3667             skip_to_end_of_comment (ip, &ip->lineno, 0);
3668             bp = ip->bufp;
3669             /* No need to copy the command because of a comment at the end;
3670                just don't include the comment in the directive.  */
3671             if (bp == limit || *bp == '\n') {
3672               bp = obp;
3673               goto endloop1;
3674             }
3675             /* Don't remove the comments if -traditional.  */
3676             if (! keep_comments)
3677               copy_command++;
3678           }
3679           break;
3680
3681         case '\f':
3682         case '\r':
3683         case '\v':
3684           if (pedantic)
3685             pedwarn ("%s in preprocessing directive", char_name[c]);
3686           break;
3687
3688         case '\n':
3689           --bp;         /* Point to the newline */
3690           ip->bufp = bp;
3691           goto endloop1;
3692         }
3693       }
3694       ip->bufp = bp;
3695
3696     endloop1:
3697       resume_p = ip->bufp;
3698       /* BP is the end of the directive.
3699          RESUME_P is the next interesting data after the directive.
3700          A comment may come between.  */
3701
3702       /* If a directive should be copied through, and -E was given,
3703          pass it through before removing comments.  */
3704       if (!no_output && kt->pass_thru && put_out_comments) {
3705         int len;
3706
3707         /* Output directive name.  */
3708         check_expand (op, kt->length + 2);
3709         /* Make sure # is at the start of a line */
3710         if (op->bufp > op->buf && op->bufp[-1] != '\n') {
3711           op->lineno++;
3712           *op->bufp++ = '\n';
3713         }
3714         *op->bufp++ = '#';
3715         bcopy (kt->name, op->bufp, kt->length);
3716         op->bufp += kt->length;
3717
3718         /* Output arguments.  */
3719         len = (bp - buf);
3720         check_expand (op, len);
3721         bcopy (buf, (char *) op->bufp, len);
3722         op->bufp += len;
3723         /* Take account of any (escaped) newlines just output.  */
3724         while (--len >= 0)
3725           if (buf[len] == '\n')
3726             op->lineno++;
3727
3728         already_output = &junk;
3729       }                         /* Don't we need a newline or #line? */
3730
3731       if (copy_command) {
3732         register U_CHAR *xp = buf;
3733         /* Need to copy entire command into temp buffer before dispatching */
3734
3735         cp = (U_CHAR *) alloca (bp - buf + 5); /* room for cmd plus
3736                                                   some slop */
3737         buf = cp;
3738
3739         /* Copy to the new buffer, deleting comments
3740            and backslash-newlines (and whitespace surrounding the latter).  */
3741
3742         while (xp < bp) {
3743           register U_CHAR c = *xp++;
3744           *cp++ = c;
3745
3746           switch (c) {
3747           case '\n':
3748             abort ();  /* A bare newline should never part of the line.  */
3749             break;
3750
3751             /* <...> is special for #include.  */
3752           case '<':
3753             if (!kt->angle_brackets)
3754               break;
3755             while (xp < bp && c != '>') {
3756               c = *xp++;
3757               if (c == '\\' && xp < bp && *xp == '\n')
3758                 xp++;
3759               else
3760                 *cp++ = c;
3761             }
3762             break;
3763
3764           case '\\':
3765             if (*xp == '\n') {
3766               xp++;
3767               cp--;
3768               if (cp != buf && is_space[cp[-1]]) {
3769                 while (cp != buf && is_space[cp[-1]]) cp--;
3770                 cp++;
3771                 SKIP_WHITE_SPACE (xp);
3772               } else if (is_space[*xp]) {
3773                 *cp++ = *xp++;
3774                 SKIP_WHITE_SPACE (xp);
3775               }
3776             } else if (traditional && xp < bp) {
3777               *cp++ = *xp++;
3778             }
3779             break;
3780
3781           case '\'':
3782           case '\"':
3783             {
3784               register U_CHAR *bp1
3785                 = skip_quoted_string (xp - 1, bp, ip->lineno,
3786                                       NULL_PTR, NULL_PTR, NULL_PTR);
3787               while (xp != bp1)
3788                 if (*xp == '\\') {
3789                   if (*++xp != '\n')
3790                     *cp++ = '\\';
3791                   else
3792                     xp++;
3793                 } else
3794                   *cp++ = *xp++;
3795             }
3796             break;
3797
3798           case '/':
3799             if (*xp == '*'
3800                 || (cplusplus_comments && *xp == '/')) {
3801               ip->bufp = xp + 1;
3802               /* If we already copied the command through,
3803                  already_output != 0 prevents outputting comment now.  */
3804               skip_to_end_of_comment (ip, already_output, 0);
3805               if (keep_comments)
3806                 while (xp != ip->bufp)
3807                   *cp++ = *xp++;
3808               /* Delete or replace the slash.  */
3809               else if (traditional)
3810                 cp--;
3811               else
3812                 cp[-1] = ' ';
3813               xp = ip->bufp;
3814             }
3815           }
3816         }
3817
3818         /* Null-terminate the copy.  */
3819
3820         *cp = 0;
3821       } else
3822         cp = bp;
3823
3824       ip->bufp = resume_p;
3825
3826       /* Some directives should be written out for cc1 to process,
3827          just as if they were not defined.  And sometimes we're copying
3828          definitions through.  */
3829
3830       if (!no_output && already_output == 0
3831           && (kt->pass_thru
3832               || (kt->type == T_DEFINE
3833                   && (dump_macros == dump_names
3834                       || dump_macros == dump_definitions)))) {
3835         int len;
3836
3837         /* Output directive name.  */
3838         check_expand (op, kt->length + 1);
3839         *op->bufp++ = '#';
3840         bcopy (kt->name, (char *) op->bufp, kt->length);
3841         op->bufp += kt->length;
3842
3843         if (kt->pass_thru || dump_macros == dump_definitions) {
3844           /* Output arguments.  */
3845           len = (cp - buf);
3846           check_expand (op, len);
3847           bcopy (buf, (char *) op->bufp, len);
3848           op->bufp += len;
3849         } else if (kt->type == T_DEFINE && dump_macros == dump_names) {
3850           U_CHAR *xp = buf;
3851           U_CHAR *yp;
3852           SKIP_WHITE_SPACE (xp);
3853           yp = xp;
3854           while (is_idchar[*xp]) xp++;
3855           len = (xp - yp);
3856           check_expand (op, len + 1);
3857           *op->bufp++ = ' ';
3858           bcopy (yp, op->bufp, len);
3859           op->bufp += len;
3860         }
3861       }                         /* Don't we need a newline or #line? */
3862
3863       /* Call the appropriate command handler.  buf now points to
3864          either the appropriate place in the input buffer, or to
3865          the temp buffer if it was necessary to make one.  cp
3866          points to the first char after the contents of the (possibly
3867          copied) command, in either case. */
3868       (*kt->func) (buf, cp, op, kt);
3869       check_expand (op, ip->length - (ip->bufp - ip->buf));
3870
3871       return 1;
3872     }
3873   }
3874
3875   /* It is deliberate that we don't warn about undefined directives.
3876      That is the responsibility of cc1.  */
3877   return 0;
3878 }
3879 \f
3880 static struct tm *
3881 timestamp ()
3882 {
3883   static struct tm *timebuf;
3884   if (!timebuf) {
3885     time_t t = time ((time_t *)0);
3886     timebuf = localtime (&t);
3887   }
3888   return timebuf;
3889 }
3890
3891 static char *monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
3892                              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
3893                             };
3894
3895 /*
3896  * expand things like __FILE__.  Place the expansion into the output
3897  * buffer *without* rescanning.
3898  */
3899
3900 static void
3901 special_symbol (hp, op)
3902      HASHNODE *hp;
3903      FILE_BUF *op;
3904 {
3905   char *buf;
3906   int i, len;
3907   int true_indepth;
3908   FILE_BUF *ip = NULL;
3909   struct tm *timebuf;
3910
3911   int paren = 0;                /* For special `defined' keyword */
3912
3913   if (pcp_outfile && pcp_inside_if
3914       && hp->type != T_SPEC_DEFINED && hp->type != T_CONST)
3915     error ("Predefined macro `%s' used inside `#if' during precompilation",
3916            hp->name);
3917     
3918   for (i = indepth; i >= 0; i--)
3919     if (instack[i].fname != NULL) {
3920       ip = &instack[i];
3921       break;
3922     }
3923   if (ip == NULL) {
3924     error ("cccp error: not in any file?!");
3925     return;                     /* the show must go on */
3926   }
3927
3928   switch (hp->type) {
3929   case T_FILE:
3930   case T_BASE_FILE:
3931     {
3932       char *string;
3933       if (hp->type == T_FILE)
3934         string = ip->nominal_fname;
3935       else
3936         string = instack[0].nominal_fname;
3937
3938       if (string)
3939         {
3940           buf = (char *) alloca (3 + 4 * strlen (string));
3941           quote_string (buf, string);
3942         }
3943       else
3944         buf = "\"\"";
3945
3946       break;
3947     }
3948
3949   case T_INCLUDE_LEVEL:
3950     true_indepth = 0;
3951     for (i = indepth; i >= 0; i--)
3952       if (instack[i].fname != NULL)
3953         true_indepth++;
3954
3955     buf = (char *) alloca (8);  /* Eight bytes ought to be more than enough */
3956     sprintf (buf, "%d", true_indepth - 1);
3957     break;
3958
3959   case T_VERSION:
3960     buf = (char *) alloca (3 + strlen (version_string));
3961     sprintf (buf, "\"%s\"", version_string);
3962     break;
3963
3964 #ifndef NO_BUILTIN_SIZE_TYPE
3965   case T_SIZE_TYPE:
3966     buf = SIZE_TYPE;
3967     break;
3968 #endif
3969
3970 #ifndef NO_BUILTIN_PTRDIFF_TYPE
3971   case T_PTRDIFF_TYPE:
3972     buf = PTRDIFF_TYPE;
3973     break;
3974 #endif
3975
3976   case T_WCHAR_TYPE:
3977     buf = wchar_type;
3978     break;
3979
3980   case T_USER_LABEL_PREFIX_TYPE:
3981     buf = USER_LABEL_PREFIX;
3982     break;
3983
3984   case T_REGISTER_PREFIX_TYPE:
3985     buf = REGISTER_PREFIX;
3986     break;
3987
3988   case T_CONST:
3989     buf = hp->value.cpval;
3990     if (pcp_inside_if && pcp_outfile)
3991       /* Output a precondition for this macro use */
3992       fprintf (pcp_outfile, "#define %s %s\n", hp->name, buf);
3993     break;
3994
3995   case T_SPECLINE:
3996     buf = (char *) alloca (10);
3997     sprintf (buf, "%d", ip->lineno);
3998     break;
3999
4000   case T_DATE:
4001   case T_TIME:
4002     buf = (char *) alloca (20);
4003     timebuf = timestamp ();
4004     if (hp->type == T_DATE)
4005       sprintf (buf, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
4006               timebuf->tm_mday, timebuf->tm_year + 1900);
4007     else
4008       sprintf (buf, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
4009               timebuf->tm_sec);
4010     break;
4011
4012   case T_SPEC_DEFINED:
4013     buf = " 0 ";                /* Assume symbol is not defined */
4014     ip = &instack[indepth];
4015     SKIP_WHITE_SPACE (ip->bufp);
4016     if (*ip->bufp == '(') {
4017       paren++;
4018       ip->bufp++;                       /* Skip over the paren */
4019       SKIP_WHITE_SPACE (ip->bufp);
4020     }
4021
4022     if (!is_idstart[*ip->bufp])
4023       goto oops;
4024     if (hp = lookup (ip->bufp, -1, -1)) {
4025       if (pcp_outfile && pcp_inside_if
4026           && (hp->type == T_CONST
4027               || (hp->type == T_MACRO && hp->value.defn->predefined)))
4028         /* Output a precondition for this macro use. */
4029         fprintf (pcp_outfile, "#define %s\n", hp->name);
4030       buf = " 1 ";
4031     }
4032     else
4033       if (pcp_outfile && pcp_inside_if) {
4034         /* Output a precondition for this macro use */
4035         U_CHAR *cp = ip->bufp;
4036         fprintf (pcp_outfile, "#undef ");
4037         while (is_idchar[*cp]) /* Ick! */
4038           fputc (*cp++, pcp_outfile);
4039         putc ('\n', pcp_outfile);
4040       }
4041     while (is_idchar[*ip->bufp])
4042       ++ip->bufp;
4043     SKIP_WHITE_SPACE (ip->bufp);
4044     if (paren) {
4045       if (*ip->bufp != ')')
4046         goto oops;
4047       ++ip->bufp;
4048     }
4049     break;
4050
4051 oops:
4052
4053     error ("`defined' without an identifier");
4054     break;
4055
4056   default:
4057     error ("cccp error: invalid special hash type"); /* time for gdb */
4058     abort ();
4059   }
4060   len = strlen (buf);
4061   check_expand (op, len);
4062   bcopy (buf, (char *) op->bufp, len);
4063   op->bufp += len;
4064
4065   return;
4066 }
4067
4068 \f
4069 /* Routines to handle #directives */
4070
4071 /* Handle #include and #import.
4072    This function expects to see "fname" or <fname> on the input.  */
4073
4074 static int
4075 do_include (buf, limit, op, keyword)
4076      U_CHAR *buf, *limit;
4077      FILE_BUF *op;
4078      struct directive *keyword;
4079 {
4080   int importing = (keyword->type == T_IMPORT);
4081   int skip_dirs = (keyword->type == T_INCLUDE_NEXT);
4082   static int import_warning = 0;
4083   char *fname;          /* Dynamically allocated fname buffer */
4084   char *pcftry;
4085   char *pcfname;
4086   U_CHAR *fbeg, *fend;          /* Beginning and end of fname */
4087
4088   struct file_name_list *search_start = include; /* Chain of dirs to search */
4089   struct file_name_list dsp[1]; /* First in chain, if #include "..." */
4090   struct file_name_list *searchptr = 0;
4091   int flen;
4092
4093   int f;                        /* file number */
4094
4095   int retried = 0;              /* Have already tried macro
4096                                    expanding the include line*/
4097   int angle_brackets = 0;       /* 0 for "...", 1 for <...> */
4098   int pcf = -1;
4099   char *pcfbuf;
4100   int pcfbuflimit;
4101   int pcfnum;
4102   f= -1;                        /* JF we iz paranoid! */
4103
4104   if (importing && warn_import && !inhibit_warnings
4105       && !instack[indepth].system_header_p && !import_warning) {
4106     import_warning = 1;
4107     warning ("using `#import' is not recommended");
4108     fprintf (stderr, "The fact that a certain header file need not be processed more than once\n");
4109     fprintf (stderr, "should be indicated in the header file, not where it is used.\n");
4110     fprintf (stderr, "The best way to do this is with a conditional of this form:\n\n");
4111     fprintf (stderr, "  #ifndef _FOO_H_INCLUDED\n");
4112     fprintf (stderr, "  #define _FOO_H_INCLUDED\n");
4113     fprintf (stderr, "  ... <real contents of file> ...\n");
4114     fprintf (stderr, "  #endif /* Not _FOO_H_INCLUDED */\n\n");
4115     fprintf (stderr, "Then users can use `#include' any number of times.\n");
4116     fprintf (stderr, "GNU C automatically avoids processing the file more than once\n");
4117     fprintf (stderr, "when it is equipped with such a conditional.\n");
4118   }
4119
4120 get_filename:
4121
4122   fbeg = buf;
4123   SKIP_WHITE_SPACE (fbeg);
4124   /* Discard trailing whitespace so we can easily see
4125      if we have parsed all the significant chars we were given.  */
4126   while (limit != fbeg && is_hor_space[limit[-1]]) limit--;
4127
4128   switch (*fbeg++) {
4129   case '\"':
4130     {
4131       FILE_BUF *fp;
4132       /* Copy the operand text, concatenating the strings.  */
4133       {
4134         U_CHAR *fin = fbeg;
4135         fbeg = (U_CHAR *) alloca (limit - fbeg + 1);
4136         fend = fbeg;
4137         while (fin != limit) {
4138           while (fin != limit && *fin != '\"')
4139             *fend++ = *fin++;
4140           fin++;
4141           if (fin == limit)
4142             break;
4143           /* If not at the end, there had better be another string.  */
4144           /* Skip just horiz space, and don't go past limit.  */
4145           while (fin != limit && is_hor_space[*fin]) fin++;
4146           if (fin != limit && *fin == '\"')
4147             fin++;
4148           else
4149             goto fail;
4150         }
4151       }
4152       *fend = 0;
4153
4154       /* We have "filename".  Figure out directory this source
4155          file is coming from and put it on the front of the list. */
4156
4157       /* If -I- was specified, don't search current dir, only spec'd ones. */
4158       if (ignore_srcdir) break;
4159
4160       for (fp = &instack[indepth]; fp >= instack; fp--)
4161         {
4162           int n;
4163           char *ep,*nam;
4164
4165           if ((nam = fp->nominal_fname) != NULL) {
4166             /* Found a named file.  Figure out dir of the file,
4167                and put it in front of the search list.  */
4168             dsp[0].next = search_start;
4169             search_start = dsp;
4170 #ifndef VMS
4171             ep = rindex (nam, '/');
4172 #ifdef DIR_SEPARATOR
4173             if (ep == NULL) ep = rindex (nam, DIR_SEPARATOR);
4174             else {
4175               char *tmp = rindex (nam, DIR_SEPARATOR);
4176               if (tmp != NULL && tmp > ep) ep = tmp;
4177             }
4178 #endif
4179 #else                           /* VMS */
4180             ep = rindex (nam, ']');
4181             if (ep == NULL) ep = rindex (nam, '>');
4182             if (ep == NULL) ep = rindex (nam, ':');
4183             if (ep != NULL) ep++;
4184 #endif                          /* VMS */
4185             if (ep != NULL) {
4186               n = ep - nam;
4187               dsp[0].fname = (char *) alloca (n + 1);
4188               strncpy (dsp[0].fname, nam, n);
4189               dsp[0].fname[n] = '\0';
4190               if (n + INCLUDE_LEN_FUDGE > max_include_len)
4191                 max_include_len = n + INCLUDE_LEN_FUDGE;
4192             } else {
4193               dsp[0].fname = 0; /* Current directory */
4194             }
4195             dsp[0].got_name_map = 0;
4196             break;
4197           }
4198         }
4199       break;
4200     }
4201
4202   case '<':
4203     fend = fbeg;
4204     while (fend != limit && *fend != '>') fend++;
4205     if (*fend == '>' && fend + 1 == limit) {
4206       angle_brackets = 1;
4207       /* If -I-, start with the first -I dir after the -I-.  */
4208       if (first_bracket_include)
4209         search_start = first_bracket_include;
4210       break;
4211     }
4212     goto fail;
4213
4214   default:
4215 #ifdef VMS
4216     /*
4217      * Support '#include xyz' like VAX-C to allow for easy use of all the
4218      * decwindow include files. It defaults to '#include <xyz.h>' (so the
4219      * code from case '<' is repeated here) and generates a warning.
4220      * (Note: macro expansion of `xyz' takes precedence.)
4221      */
4222     if (retried && isalpha(*(--fbeg))) {
4223       fend = fbeg;
4224       while (fend != limit && (!isspace(*fend))) fend++;
4225       warning ("VAX-C-style include specification found, use '#include <filename.h>' !");
4226       if (fend  == limit) {
4227         angle_brackets = 1;
4228         /* If -I-, start with the first -I dir after the -I-.  */
4229         if (first_bracket_include)
4230           search_start = first_bracket_include;
4231         break;
4232       }
4233     }
4234 #endif
4235
4236   fail:
4237     if (retried) {
4238       error ("`#%s' expects \"FILENAME\" or <FILENAME>", keyword->name);
4239       return 0;
4240     } else {
4241       /* Expand buffer and then remove any newline markers.
4242          We can't just tell expand_to_temp_buffer to omit the markers,
4243          since it would put extra spaces in include file names.  */
4244       FILE_BUF trybuf;
4245       U_CHAR *src;
4246       trybuf = expand_to_temp_buffer (buf, limit, 1, 0);
4247       src = trybuf.buf;
4248       buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
4249       limit = buf;
4250       while (src != trybuf.bufp) {
4251         switch ((*limit++ = *src++)) {
4252           case '\n':
4253             limit--;
4254             src++;
4255             break;
4256
4257           case '\'':
4258           case '\"':
4259             {
4260               U_CHAR *src1 = skip_quoted_string (src - 1, trybuf.bufp, 0,
4261                                                  NULL_PTR, NULL_PTR, NULL_PTR);
4262               while (src != src1)
4263                 *limit++ = *src++;
4264             }
4265             break;
4266         }
4267       }
4268       *limit = 0;
4269       free (trybuf.buf);
4270       retried++;
4271       goto get_filename;
4272     }
4273   }
4274
4275   /* For #include_next, skip in the search path
4276      past the dir in which the containing file was found.  */
4277   if (skip_dirs) {
4278     FILE_BUF *fp;
4279     for (fp = &instack[indepth]; fp >= instack; fp--)
4280       if (fp->fname != NULL) {
4281         /* fp->dir is null if the containing file was specified
4282            with an absolute file name.  In that case, don't skip anything.  */
4283         if (fp->dir)
4284           search_start = fp->dir->next;
4285         break;
4286       }
4287   }
4288
4289   flen = fend - fbeg;
4290
4291   if (flen == 0)
4292     {
4293       error ("empty file name in `#%s'", keyword->name);
4294       return 0;
4295     }
4296
4297   /* Allocate this permanently, because it gets stored in the definitions
4298      of macros.  */
4299   fname = (char *) xmalloc (max_include_len + flen + 4);
4300   /* + 2 above for slash and terminating null.  */
4301   /* + 2 added for '.h' on VMS (to support '#include filename') */
4302
4303   /* If specified file name is absolute, just open it.  */
4304
4305   if (*fbeg == '/'
4306 #ifdef DIR_SEPARATOR
4307       || *fbeg == DIR_SEPARATOR
4308 #endif
4309       ) {
4310     strncpy (fname, fbeg, flen);
4311     fname[flen] = 0;
4312     if (redundant_include_p (fname))
4313       return 0;
4314     if (importing)
4315       f = lookup_import (fname, NULL_PTR);
4316     else
4317       f = open_include_file (fname, NULL_PTR);
4318     if (f == -2)
4319       return 0;         /* Already included this file */
4320   } else {
4321     /* Search directory path, trying to open the file.
4322        Copy each filename tried into FNAME.  */
4323
4324     for (searchptr = search_start; searchptr; searchptr = searchptr->next) {
4325       if (searchptr->fname) {
4326         /* The empty string in a search path is ignored.
4327            This makes it possible to turn off entirely
4328            a standard piece of the list.  */
4329         if (searchptr->fname[0] == 0)
4330           continue;
4331         strcpy (fname, searchptr->fname);
4332         strcat (fname, "/");
4333         fname[strlen (fname) + flen] = 0;
4334       } else {
4335         fname[0] = 0;
4336       }
4337       strncat (fname, fbeg, flen);
4338 #ifdef VMS
4339       /* Change this 1/2 Unix 1/2 VMS file specification into a
4340          full VMS file specification */
4341       if (searchptr->fname && (searchptr->fname[0] != 0)) {
4342         /* Fix up the filename */
4343         hack_vms_include_specification (fname);
4344       } else {
4345         /* This is a normal VMS filespec, so use it unchanged.  */
4346         strncpy (fname, fbeg, flen);
4347         fname[flen] = 0;
4348         /* if it's '#include filename', add the missing .h */
4349         if (index(fname,'.')==NULL) {
4350           strcat (fname, ".h");
4351         }
4352       }
4353 #endif /* VMS */
4354       if (importing)
4355         f = lookup_import (fname, searchptr);
4356       else
4357         f = open_include_file (fname, searchptr);
4358       if (f == -2)
4359         return 0;                       /* Already included this file */
4360 #ifdef EACCES
4361       else if (f == -1 && errno == EACCES)
4362         warning ("Header file %s exists, but is not readable", fname);
4363 #endif
4364       if (redundant_include_p (fname)) {
4365         close (f);
4366         return 0;
4367       }
4368       if (f >= 0)
4369         break;
4370     }
4371   }
4372
4373   if (f < 0) {
4374     /* A file that was not found.  */
4375
4376     strncpy (fname, fbeg, flen);
4377     fname[flen] = 0;
4378     /* If generating dependencies and -MG was specified, we assume missing
4379        files are leaf files, living in the same directory as the source file
4380        or other similar place; these missing files may be generated from
4381        other files and may not exist yet (eg: y.tab.h).  */
4382     if (print_deps_missing_files
4383         && print_deps > (angle_brackets || (system_include_depth > 0)))
4384       {
4385         /* If it was requested as a system header file,
4386            then assume it belongs in the first place to look for such.  */
4387         if (angle_brackets)
4388           {
4389             for (searchptr = search_start; searchptr; searchptr = searchptr->next)
4390               {
4391                 if (searchptr->fname)
4392                   {
4393                     char *p;
4394
4395                     if (searchptr->fname[0] == 0)
4396                       continue;
4397                     p = xmalloc (strlen (searchptr->fname)
4398                                  + strlen (fname) + 2);
4399                     strcpy (p, searchptr->fname);
4400                     strcat (p, "/");
4401                     strcat (p, fname);
4402                     deps_output (p, ' ');
4403                     break;
4404                   }
4405               }
4406           }
4407         else
4408           {
4409             /* Otherwise, omit the directory, as if the file existed
4410                in the directory with the source.  */
4411             deps_output (fname, ' ');
4412           }
4413       }
4414     /* If -M was specified, and this header file won't be added to the
4415        dependency list, then don't count this as an error, because we can
4416        still produce correct output.  Otherwise, we can't produce correct
4417        output, because there may be dependencies we need inside the missing
4418        file, and we don't know what directory this missing file exists in.  */
4419     else if (print_deps
4420         && (print_deps <= (angle_brackets || (system_include_depth > 0))))
4421       warning ("No include path in which to find %s", fname);
4422     else if (search_start)
4423       error_from_errno (fname);
4424     else
4425       error ("No include path in which to find %s", fname);
4426   } else {
4427     struct stat stat_f;
4428
4429     /* Check to see if this include file is a once-only include file.
4430        If so, give up.  */
4431
4432     struct file_name_list* ptr;
4433
4434     for (ptr = dont_repeat_files; ptr; ptr = ptr->next) {
4435       if (!strcmp (ptr->fname, fname)) {
4436         close (f);
4437         return 0;                               /* This file was once'd. */
4438       }
4439     }
4440
4441     for (ptr = all_include_files; ptr; ptr = ptr->next) {
4442       if (!strcmp (ptr->fname, fname))
4443         break;                          /* This file was included before. */
4444     }
4445
4446     if (ptr == 0) {
4447       /* This is the first time for this file.  */
4448       /* Add it to list of files included.  */
4449
4450       ptr = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
4451       ptr->control_macro = 0;
4452       ptr->c_system_include_path = 0;
4453       ptr->next = all_include_files;
4454       all_include_files = ptr;
4455       ptr->fname = savestring (fname);
4456       ptr->got_name_map = 0;
4457
4458       /* For -M, add this file to the dependencies.  */
4459       if (print_deps > (angle_brackets || (system_include_depth > 0)))
4460         deps_output (fname, ' ');
4461     }   
4462
4463     /* Handle -H option.  */
4464     if (print_include_names) {
4465       output_dots (stderr, indepth);
4466       fprintf (stderr, "%s\n", fname);
4467     }
4468
4469     if (angle_brackets)
4470       system_include_depth++;
4471
4472     /* Actually process the file.  */
4473     add_import (f, fname);      /* Record file on "seen" list for #import. */
4474
4475     pcftry = (char *) alloca (strlen (fname) + 30);
4476     pcfbuf = 0;
4477     pcfnum = 0;
4478
4479     fstat (f, &stat_f);
4480
4481     if (!no_precomp)
4482       do {
4483         sprintf (pcftry, "%s%d", fname, pcfnum++);
4484         
4485         pcf = open (pcftry, O_RDONLY, 0666);
4486         if (pcf != -1)
4487           {
4488             struct stat s;
4489
4490             fstat (pcf, &s);
4491             if (bcmp ((char *) &stat_f.st_ino, (char *) &s.st_ino,
4492                       sizeof (s.st_ino))
4493                 || stat_f.st_dev != s.st_dev)
4494               {
4495                 pcfbuf = check_precompiled (pcf, fname, &pcfbuflimit);
4496                 /* Don't need it any more.  */
4497                 close (pcf);
4498               }
4499             else
4500               {
4501                 /* Don't need it at all.  */
4502                 close (pcf);
4503                 break;
4504               }
4505           }
4506       } while (pcf != -1 && !pcfbuf);
4507     
4508     /* Actually process the file */
4509     if (pcfbuf) {
4510       pcfname = xmalloc (strlen (pcftry) + 1);
4511       strcpy (pcfname, pcftry);
4512       pcfinclude (pcfbuf, pcfbuflimit, fname, op);
4513     }
4514     else
4515       finclude (f, fname, op, is_system_include (fname), searchptr);
4516
4517     if (angle_brackets)
4518       system_include_depth--;
4519   }
4520   return 0;
4521 }
4522
4523 /* Return nonzero if there is no need to include file NAME
4524    because it has already been included and it contains a conditional
4525    to make a repeated include do nothing.  */
4526
4527 static int
4528 redundant_include_p (name)
4529      char *name;
4530 {
4531   struct file_name_list *l = all_include_files;
4532   for (; l; l = l->next)
4533     if (! strcmp (name, l->fname)
4534         && l->control_macro
4535         && lookup (l->control_macro, -1, -1))
4536       return 1;
4537   return 0;
4538 }
4539
4540 /* Return nonzero if the given FILENAME is an absolute pathname which
4541    designates a file within one of the known "system" include file
4542    directories.  We assume here that if the given FILENAME looks like
4543    it is the name of a file which resides either directly in a "system"
4544    include file directory, or within any subdirectory thereof, then the
4545    given file must be a "system" include file.  This function tells us
4546    if we should suppress pedantic errors/warnings for the given FILENAME.
4547
4548    The value is 2 if the file is a C-language system header file
4549    for which C++ should (on most systems) assume `extern "C"'.  */
4550
4551 static int
4552 is_system_include (filename)
4553     register char *filename;
4554 {
4555   struct file_name_list *searchptr;
4556
4557   for (searchptr = first_system_include; searchptr;
4558        searchptr = searchptr->next)
4559     if (searchptr->fname) {
4560       register char *sys_dir = searchptr->fname;
4561       register unsigned length = strlen (sys_dir);
4562
4563       if (! strncmp (sys_dir, filename, length)
4564           && (filename[length] == '/'
4565 #ifdef DIR_SEPARATOR
4566               || filename[length] == DIR_SEPARATOR
4567 #endif
4568               )) {
4569         if (searchptr->c_system_include_path)
4570           return 2;
4571         else
4572           return 1;
4573       }
4574     }
4575   return 0;
4576 }
4577 \f
4578 /* The file_name_map structure holds a mapping of file names for a
4579    particular directory.  This mapping is read from the file named
4580    FILE_NAME_MAP_FILE in that directory.  Such a file can be used to
4581    map filenames on a file system with severe filename restrictions,
4582    such as DOS.  The format of the file name map file is just a series
4583    of lines with two tokens on each line.  The first token is the name
4584    to map, and the second token is the actual name to use.  */
4585
4586 struct file_name_map
4587 {
4588   struct file_name_map *map_next;
4589   char *map_from;
4590   char *map_to;
4591 };
4592
4593 #define FILE_NAME_MAP_FILE "header.gcc"
4594
4595 /* Read a space delimited string of unlimited length from a stdio
4596    file.  */
4597
4598 static char *
4599 read_filename_string (ch, f)
4600      int ch;
4601      FILE *f;
4602 {
4603   char *alloc, *set;
4604   int len;
4605
4606   len = 20;
4607   set = alloc = xmalloc (len + 1);
4608   if (! is_space[ch])
4609     {
4610       *set++ = ch;
4611       while ((ch = getc (f)) != EOF && ! is_space[ch])
4612         {
4613           if (set - alloc == len)
4614             {
4615               len *= 2;
4616               alloc = xrealloc (alloc, len + 1);
4617               set = alloc + len / 2;
4618             }
4619           *set++ = ch;
4620         }
4621     }
4622   *set = '\0';
4623   ungetc (ch, f);
4624   return alloc;
4625 }
4626
4627 /* Read the file name map file for DIRNAME.  */
4628
4629 static struct file_name_map *
4630 read_name_map (dirname)
4631      char *dirname;
4632 {
4633   /* This structure holds a linked list of file name maps, one per
4634      directory.  */
4635   struct file_name_map_list
4636     {
4637       struct file_name_map_list *map_list_next;
4638       char *map_list_name;
4639       struct file_name_map *map_list_map;
4640     };
4641   static struct file_name_map_list *map_list;
4642   register struct file_name_map_list *map_list_ptr;
4643   char *name;
4644   FILE *f;
4645
4646   for (map_list_ptr = map_list; map_list_ptr;
4647        map_list_ptr = map_list_ptr->map_list_next)
4648     if (! strcmp (map_list_ptr->map_list_name, dirname))
4649       return map_list_ptr->map_list_map;
4650
4651   map_list_ptr = ((struct file_name_map_list *)
4652                   xmalloc (sizeof (struct file_name_map_list)));
4653   map_list_ptr->map_list_name = savestring (dirname);
4654   map_list_ptr->map_list_map = NULL;
4655
4656   name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
4657   strcpy (name, dirname);
4658   if (*dirname)
4659     strcat (name, "/");
4660   strcat (name, FILE_NAME_MAP_FILE);
4661   f = fopen (name, "r");
4662   if (!f)
4663     map_list_ptr->map_list_map = NULL;
4664   else
4665     {
4666       int ch;
4667       int dirlen = strlen (dirname);
4668
4669       while ((ch = getc (f)) != EOF)
4670         {
4671           char *from, *to;
4672           struct file_name_map *ptr;
4673
4674           if (is_space[ch])
4675             continue;
4676           from = read_filename_string (ch, f);
4677           while ((ch = getc (f)) != EOF && is_hor_space[ch])
4678             ;
4679           to = read_filename_string (ch, f);
4680
4681           ptr = ((struct file_name_map *)
4682                  xmalloc (sizeof (struct file_name_map)));
4683           ptr->map_from = from;
4684
4685           /* Make the real filename absolute.  */
4686           if (*to == '/')
4687             ptr->map_to = to;
4688           else
4689             {
4690               ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
4691               strcpy (ptr->map_to, dirname);
4692               ptr->map_to[dirlen] = '/';
4693               strcpy (ptr->map_to + dirlen + 1, to);
4694               free (to);
4695             }         
4696
4697           ptr->map_next = map_list_ptr->map_list_map;
4698           map_list_ptr->map_list_map = ptr;
4699
4700           while ((ch = getc (f)) != '\n')
4701             if (ch == EOF)
4702               break;
4703         }
4704       fclose (f);
4705     }
4706   
4707   map_list_ptr->map_list_next = map_list;
4708   map_list = map_list_ptr;
4709
4710   return map_list_ptr->map_list_map;
4711 }  
4712
4713 /* Try to open include file FILENAME.  SEARCHPTR is the directory
4714    being tried from the include file search path.  This function maps
4715    filenames on file systems based on information read by
4716    read_name_map.  */
4717
4718 static int
4719 open_include_file (filename, searchptr)
4720      char *filename;
4721      struct file_name_list *searchptr;
4722 {
4723   register struct file_name_map *map;
4724   register char *from;
4725   char *p, *dir;
4726
4727   if (searchptr && ! searchptr->got_name_map)
4728     {
4729       searchptr->name_map = read_name_map (searchptr->fname
4730                                            ? searchptr->fname : ".");
4731       searchptr->got_name_map = 1;
4732     }
4733
4734   /* First check the mapping for the directory we are using.  */
4735   if (searchptr && searchptr->name_map)
4736     {
4737       from = filename;
4738       if (searchptr->fname)
4739         from += strlen (searchptr->fname) + 1;
4740       for (map = searchptr->name_map; map; map = map->map_next)
4741         {
4742           if (! strcmp (map->map_from, from))
4743             {
4744               /* Found a match.  */
4745               return open (map->map_to, O_RDONLY, 0666);
4746             }
4747         }
4748     }
4749
4750   /* Try to find a mapping file for the particular directory we are
4751      looking in.  Thus #include <sys/types.h> will look up sys/types.h
4752      in /usr/include/header.gcc and look up types.h in
4753      /usr/include/sys/header.gcc.  */
4754   p = rindex (filename, '/');
4755 #ifdef DIR_SEPARATOR
4756   if (! p) p = rindex (filename, DIR_SEPARATOR);
4757   else {
4758     char *tmp = rindex (filename, DIR_SEPARATOR);
4759     if (tmp != NULL && tmp > p) p = tmp;
4760   }
4761 #endif
4762   if (! p)
4763     p = filename;
4764   if (searchptr
4765       && searchptr->fname
4766       && strlen (searchptr->fname) == p - filename
4767       && ! strncmp (searchptr->fname, filename, p - filename))
4768     {
4769       /* FILENAME is in SEARCHPTR, which we've already checked.  */
4770       return open (filename, O_RDONLY, 0666);
4771     }
4772
4773   if (p == filename)
4774     {
4775       dir = ".";
4776       from = filename;
4777     }
4778   else
4779     {
4780       dir = (char *) alloca (p - filename + 1);
4781       bcopy (filename, dir, p - filename);
4782       dir[p - filename] = '\0';
4783       from = p + 1;
4784     }
4785   for (map = read_name_map (dir); map; map = map->map_next)
4786     if (! strcmp (map->map_from, from))
4787       return open (map->map_to, O_RDONLY, 0666);
4788
4789   return open (filename, O_RDONLY, 0666);
4790 }
4791 \f
4792 /* Process the contents of include file FNAME, already open on descriptor F,
4793    with output to OP.
4794    SYSTEM_HEADER_P is 1 if this file resides in any one of the known
4795    "system" include directories (as decided by the `is_system_include'
4796    function above).
4797    DIRPTR is the link in the dir path through which this file was found,
4798    or 0 if the file name was absolute.  */
4799
4800 static void
4801 finclude (f, fname, op, system_header_p, dirptr)
4802      int f;
4803      char *fname;
4804      FILE_BUF *op;
4805      int system_header_p;
4806      struct file_name_list *dirptr;
4807 {
4808   int st_mode;
4809   long st_size;
4810   long i;
4811   FILE_BUF *fp;                 /* For input stack frame */
4812   int missing_newline = 0;
4813
4814   CHECK_DEPTH (return;);
4815
4816   if (file_size_and_mode (f, &st_mode, &st_size) < 0)
4817     {
4818       perror_with_name (fname);
4819       close (f);
4820       return;
4821     }
4822
4823   fp = &instack[indepth + 1];
4824   bzero ((char *) fp, sizeof (FILE_BUF));
4825   fp->nominal_fname = fp->fname = fname;
4826   fp->length = 0;
4827   fp->lineno = 1;
4828   fp->if_stack = if_stack;
4829   fp->system_header_p = system_header_p;
4830   fp->dir = dirptr;
4831
4832   if (S_ISREG (st_mode)) {
4833     fp->buf = (U_CHAR *) xmalloc (st_size + 2);
4834     fp->bufp = fp->buf;
4835
4836     /* Read the file contents, knowing that st_size is an upper bound
4837        on the number of bytes we can read.  */
4838     fp->length = safe_read (f, fp->buf, st_size);
4839     if (fp->length < 0) goto nope;
4840   }
4841   else if (S_ISDIR (st_mode)) {
4842     error ("directory `%s' specified in #include", fname);
4843     close (f);
4844     return;
4845   } else {
4846     /* Cannot count its file size before reading.
4847        First read the entire file into heap and
4848        copy them into buffer on stack. */
4849
4850     int bsize = 2000;
4851
4852     st_size = 0;
4853     fp->buf = (U_CHAR *) xmalloc (bsize + 2);
4854
4855     for (;;) {
4856       i = safe_read (f, fp->buf + st_size, bsize - st_size);
4857       if (i < 0)
4858         goto nope;      /* error! */
4859       st_size += i;
4860       if (st_size != bsize)
4861         break;  /* End of file */
4862       bsize *= 2;
4863       fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
4864     }
4865     fp->bufp = fp->buf;
4866     fp->length = st_size;
4867   }
4868
4869   if ((fp->length > 0 && fp->buf[fp->length - 1] != '\n')
4870       /* Backslash-newline at end is not good enough.  */
4871       || (fp->length > 1 && fp->buf[fp->length - 2] == '\\')) {
4872     fp->buf[fp->length++] = '\n';
4873     missing_newline = 1;
4874   }
4875   fp->buf[fp->length] = '\0';
4876
4877   /* Close descriptor now, so nesting does not use lots of descriptors.  */
4878   close (f);
4879
4880   /* Must do this before calling trigraph_pcp, so that the correct file name
4881      will be printed in warning messages.  */
4882
4883   indepth++;
4884   input_file_stack_tick++;
4885
4886   if (!no_trigraphs)
4887     trigraph_pcp (fp);
4888
4889   output_line_command (fp, op, 0, enter_file);
4890   rescan (op, 0);
4891
4892   if (missing_newline)
4893     fp->lineno--;
4894
4895   if (pedantic && missing_newline)
4896     pedwarn ("file does not end in newline");
4897
4898   indepth--;
4899   input_file_stack_tick++;
4900   output_line_command (&instack[indepth], op, 0, leave_file);
4901   free (fp->buf);
4902   return;
4903
4904  nope:
4905
4906   perror_with_name (fname);
4907   close (f);
4908   free (fp->buf);
4909 }
4910
4911 /* Record that inclusion of the file named FILE
4912    should be controlled by the macro named MACRO_NAME.
4913    This means that trying to include the file again
4914    will do something if that macro is defined.  */
4915
4916 static void
4917 record_control_macro (file, macro_name)
4918      char *file;
4919      U_CHAR *macro_name;
4920 {
4921   struct file_name_list *new;
4922
4923   for (new = all_include_files; new; new = new->next) {
4924     if (!strcmp (new->fname, file)) {
4925       new->control_macro = macro_name;
4926       return;
4927     }
4928   }
4929
4930   /* If the file is not in all_include_files, something's wrong.  */
4931   abort ();
4932 }
4933 \f
4934 /* Maintain and search list of included files, for #import.  */
4935
4936 #define IMPORT_HASH_SIZE 31
4937
4938 struct import_file {
4939   char *name;
4940   ino_t inode;
4941   dev_t dev;
4942   struct import_file *next;
4943 };
4944
4945 /* Hash table of files already included with #include or #import.  */
4946
4947 static struct import_file *import_hash_table[IMPORT_HASH_SIZE];
4948
4949 /* Hash a file name for import_hash_table.  */
4950
4951 static int 
4952 import_hash (f)
4953      char *f;
4954 {
4955   int val = 0;
4956
4957   while (*f) val += *f++;
4958   return (val%IMPORT_HASH_SIZE);
4959 }
4960
4961 /* Search for file FILENAME in import_hash_table.
4962    Return -2 if found, either a matching name or a matching inode.
4963    Otherwise, open the file and return a file descriptor if successful
4964    or -1 if unsuccessful.  */
4965
4966 static int
4967 lookup_import (filename, searchptr)
4968      char *filename;
4969      struct file_name_list *searchptr;
4970 {
4971   struct import_file *i;
4972   int h;
4973   int hashval;
4974   struct stat sb;
4975   int fd;
4976
4977   hashval = import_hash (filename);
4978
4979   /* Attempt to find file in list of already included files */
4980   i = import_hash_table[hashval];
4981
4982   while (i) {
4983     if (!strcmp (filename, i->name))
4984       return -2;                /* return found */
4985     i = i->next;
4986   }
4987   /* Open it and try a match on inode/dev */
4988   fd = open_include_file (filename, searchptr);
4989   if (fd < 0)
4990     return fd;
4991   fstat (fd, &sb);
4992   for (h = 0; h < IMPORT_HASH_SIZE; h++) {
4993     i = import_hash_table[h];
4994     while (i) {
4995       /* Compare the inode and the device.
4996          Supposedly on some systems the inode is not a scalar.  */
4997       if (!bcmp ((char *) &i->inode, (char *) &sb.st_ino, sizeof (sb.st_ino))
4998           && i->dev == sb.st_dev) {
4999         close (fd);
5000         return -2;              /* return found */
5001       }
5002       i = i->next;
5003     }
5004   }
5005   return fd;                    /* Not found, return open file */
5006 }
5007
5008 /* Add the file FNAME, open on descriptor FD, to import_hash_table.  */
5009
5010 static void
5011 add_import (fd, fname)
5012      int fd;
5013      char *fname;
5014 {
5015   struct import_file *i;
5016   int hashval;
5017   struct stat sb;
5018
5019   hashval = import_hash (fname);
5020   fstat (fd, &sb);
5021   i = (struct import_file *)xmalloc (sizeof (struct import_file));
5022   i->name = (char *)xmalloc (strlen (fname)+1);
5023   strcpy (i->name, fname);
5024   bcopy ((char *) &sb.st_ino, (char *) &i->inode, sizeof (sb.st_ino));
5025   i->dev = sb.st_dev;
5026   i->next = import_hash_table[hashval];
5027   import_hash_table[hashval] = i;
5028 }
5029 \f
5030 /* Load the specified precompiled header into core, and verify its
5031    preconditions.  PCF indicates the file descriptor to read, which must
5032    be a regular file.  FNAME indicates the file name of the original 
5033    header.  *LIMIT will be set to an address one past the end of the file.
5034    If the preconditions of the file are not satisfied, the buffer is 
5035    freed and we return 0.  If the preconditions are satisfied, return
5036    the address of the buffer following the preconditions.  The buffer, in
5037    this case, should never be freed because various pieces of it will
5038    be referred to until all precompiled strings are output at the end of
5039    the run.
5040 */
5041 static char *
5042 check_precompiled (pcf, fname, limit)
5043      int pcf;
5044      char *fname;
5045      char **limit;
5046 {
5047   int st_mode;
5048   long st_size;
5049   int length = 0;
5050   char *buf;
5051   char *cp;
5052
5053   if (pcp_outfile)
5054     return 0;
5055   
5056   if (file_size_and_mode (pcf, &st_mode, &st_size) < 0)
5057     return 0;
5058
5059   if (S_ISREG (st_mode))
5060     {
5061       buf = xmalloc (st_size + 2);
5062       length = safe_read (pcf, buf, st_size);
5063       if (length < 0)
5064         goto nope;
5065     }
5066   else
5067     abort ();
5068     
5069   if (length > 0 && buf[length-1] != '\n')
5070     buf[length++] = '\n';
5071   buf[length] = '\0';
5072   
5073   *limit = buf + length;
5074
5075   /* File is in core.  Check the preconditions. */
5076   if (!check_preconditions (buf))
5077     goto nope;
5078   for (cp = buf; *cp; cp++)
5079     ;
5080 #ifdef DEBUG_PCP
5081   fprintf (stderr, "Using preinclude %s\n", fname);
5082 #endif
5083   return cp + 1;
5084
5085  nope:
5086 #ifdef DEBUG_PCP
5087   fprintf (stderr, "Cannot use preinclude %s\n", fname);
5088 #endif
5089   free (buf);
5090   return 0;
5091 }
5092
5093 /* PREC (null terminated) points to the preconditions of a
5094    precompiled header.  These are a series of #define and #undef
5095    lines which must match the current contents of the hash
5096    table.  */
5097 static int 
5098 check_preconditions (prec)
5099      char *prec;
5100 {
5101   MACRODEF mdef;
5102   char *lineend;
5103   
5104   while (*prec) {
5105     lineend = (char *) index (prec, '\n');
5106     
5107     if (*prec++ != '#') {
5108       error ("Bad format encountered while reading precompiled file");
5109       return 0;
5110     }
5111     if (!strncmp (prec, "define", 6)) {
5112       HASHNODE *hp;
5113       
5114       prec += 6;
5115       mdef = create_definition (prec, lineend, NULL_PTR);
5116
5117       if (mdef.defn == 0)
5118         abort ();
5119       
5120       if ((hp = lookup (mdef.symnam, mdef.symlen, -1)) == NULL
5121           || (hp->type != T_MACRO && hp->type != T_CONST)
5122           || (hp->type == T_MACRO
5123               && !compare_defs (mdef.defn, hp->value.defn)
5124               && (mdef.defn->length != 2
5125                   || mdef.defn->expansion[0] != '\n'
5126                   || mdef.defn->expansion[1] != ' ')))
5127         return 0;
5128     } else if (!strncmp (prec, "undef", 5)) {
5129       char *name;
5130       int len;
5131       
5132       prec += 5;
5133       while (is_hor_space[(U_CHAR) *prec])
5134         prec++;
5135       name = prec;
5136       while (is_idchar[(U_CHAR) *prec])
5137         prec++;
5138       len = prec - name;
5139       
5140       if (lookup (name, len, -1))
5141         return 0;
5142     } else {
5143       error ("Bad format encountered while reading precompiled file");
5144       return 0;
5145     }
5146     prec = lineend + 1;
5147   }
5148   /* They all passed successfully */
5149   return 1;
5150 }
5151
5152 /* Process the main body of a precompiled file.  BUF points to the
5153    string section of the file, following the preconditions.  LIMIT is one
5154    character past the end.  NAME is the name of the file being read
5155    in.  OP is the main output buffer */
5156 static void
5157 pcfinclude (buf, limit, name, op)
5158      U_CHAR *buf, *limit, *name;
5159      FILE_BUF *op;
5160 {
5161   FILE_BUF tmpbuf;
5162   int nstrings;
5163   U_CHAR *cp = buf;
5164
5165   /* First in the file comes 4 bytes indicating the number of strings, */
5166   /* in network byte order. (MSB first).  */
5167   nstrings = *cp++;
5168   nstrings = (nstrings << 8) | *cp++;
5169   nstrings = (nstrings << 8) | *cp++;
5170   nstrings = (nstrings << 8) | *cp++;
5171   
5172   /* Looping over each string... */
5173   while (nstrings--) {
5174     U_CHAR *string_start;
5175     U_CHAR *endofthiskey;
5176     STRINGDEF *str;
5177     int nkeys;
5178     
5179     /* Each string starts with a STRINGDEF structure (str), followed */
5180     /* by the text of the string (string_start) */
5181
5182     /* First skip to a longword boundary */
5183     /* ??? Why a 4-byte boundary?  On all machines? */
5184     /* NOTE: This works correctly even if HOST_WIDE_INT
5185        is narrower than a pointer.
5186        Do not try risky measures here to get another type to use!
5187        Do not include stddef.h--it will fail!  */
5188     if ((HOST_WIDE_INT) cp & 3)
5189       cp += 4 - ((HOST_WIDE_INT) cp & 3);
5190     
5191     /* Now get the string. */
5192     str = (STRINGDEF *) cp;
5193     string_start = cp += sizeof (STRINGDEF);
5194     
5195     for (; *cp; cp++)           /* skip the string */
5196       ;
5197     
5198     /* We need to macro expand the string here to ensure that the
5199        proper definition environment is in place.  If it were only
5200        expanded when we find out it is needed, macros necessary for
5201        its proper expansion might have had their definitions changed. */
5202     tmpbuf = expand_to_temp_buffer (string_start, cp++, 0, 0);
5203     /* Lineno is already set in the precompiled file */
5204     str->contents = tmpbuf.buf;
5205     str->len = tmpbuf.length;
5206     str->writeflag = 0;
5207     str->filename = name;
5208     str->output_mark = outbuf.bufp - outbuf.buf;
5209     
5210     str->chain = 0;
5211     *stringlist_tailp = str;
5212     stringlist_tailp = &str->chain;
5213     
5214     /* Next comes a fourbyte number indicating the number of keys */
5215     /* for this string. */
5216     nkeys = *cp++;
5217     nkeys = (nkeys << 8) | *cp++;
5218     nkeys = (nkeys << 8) | *cp++;
5219     nkeys = (nkeys << 8) | *cp++;
5220
5221     /* If this number is -1, then the string is mandatory. */
5222     if (nkeys == -1)
5223       str->writeflag = 1;
5224     else
5225       /* Otherwise, for each key, */
5226       for (; nkeys--; free (tmpbuf.buf), cp = endofthiskey + 1) {
5227         KEYDEF *kp = (KEYDEF *) cp;
5228         HASHNODE *hp;
5229         
5230         /* It starts with a KEYDEF structure */
5231         cp += sizeof (KEYDEF);
5232         
5233         /* Find the end of the key.  At the end of this for loop we
5234            advance CP to the start of the next key using this variable. */
5235         endofthiskey = cp + strlen (cp);
5236         kp->str = str;
5237         
5238         /* Expand the key, and enter it into the hash table. */
5239         tmpbuf = expand_to_temp_buffer (cp, endofthiskey, 0, 0);
5240         tmpbuf.bufp = tmpbuf.buf;
5241         
5242         while (is_hor_space[*tmpbuf.bufp])
5243           tmpbuf.bufp++;
5244         if (!is_idstart[*tmpbuf.bufp]
5245             || tmpbuf.bufp == tmpbuf.buf + tmpbuf.length) {
5246           str->writeflag = 1;
5247           continue;
5248         }
5249             
5250         hp = lookup (tmpbuf.bufp, -1, -1);
5251         if (hp == NULL) {
5252           kp->chain = 0;
5253           install (tmpbuf.bufp, -1, T_PCSTRING, (char *) kp, -1);
5254         }
5255         else if (hp->type == T_PCSTRING) {
5256           kp->chain = hp->value.keydef;
5257           hp->value.keydef = kp;
5258         }
5259         else
5260           str->writeflag = 1;
5261       }
5262   }
5263   /* This output_line_command serves to switch us back to the current
5264      input file in case some of these strings get output (which will 
5265      result in line commands for the header file being output). */
5266   output_line_command (&instack[indepth], op, 0, enter_file);
5267 }
5268
5269 /* Called from rescan when it hits a key for strings.  Mark them all */
5270  /* used and clean up. */
5271 static void
5272 pcstring_used (hp)
5273      HASHNODE *hp;
5274 {
5275   KEYDEF *kp;
5276   
5277   for (kp = hp->value.keydef; kp; kp = kp->chain)
5278     kp->str->writeflag = 1;
5279   delete_macro (hp);
5280 }
5281
5282 /* Write the output, interspersing precompiled strings in their */
5283  /* appropriate places. */
5284 static void
5285 write_output ()
5286 {
5287   STRINGDEF *next_string;
5288   U_CHAR *cur_buf_loc;
5289   int line_command_len = 80;
5290   char *line_command = xmalloc (line_command_len);
5291   int len;
5292
5293   /* In each run through the loop, either cur_buf_loc == */
5294   /* next_string_loc, in which case we print a series of strings, or */
5295   /* it is less than next_string_loc, in which case we write some of */
5296   /* the buffer. */
5297   cur_buf_loc = outbuf.buf; 
5298   next_string = stringlist;
5299   
5300   while (cur_buf_loc < outbuf.bufp || next_string) {
5301     if (next_string
5302         && cur_buf_loc - outbuf.buf == next_string->output_mark) {
5303       if (next_string->writeflag) {
5304         len = 4 * strlen (next_string->filename) + 32;
5305         while (len > line_command_len)
5306           line_command = xrealloc (line_command, 
5307                                    line_command_len *= 2);
5308         sprintf (line_command, "\n# %d ", next_string->lineno);
5309         strcpy (quote_string (line_command + strlen (line_command),
5310                               next_string->filename),
5311                 "\n");
5312         safe_write (fileno (stdout), line_command, strlen (line_command));
5313         safe_write (fileno (stdout), next_string->contents, next_string->len);
5314       }       
5315       next_string = next_string->chain;
5316     }
5317     else {
5318       len = (next_string
5319              ? (next_string->output_mark 
5320                 - (cur_buf_loc - outbuf.buf))
5321              : outbuf.bufp - cur_buf_loc);
5322       
5323       safe_write (fileno (stdout), cur_buf_loc, len);
5324       cur_buf_loc += len;
5325     }
5326   }
5327   free (line_command);
5328 }
5329
5330 /* Pass a directive through to the output file.
5331    BUF points to the contents of the directive, as a contiguous string.
5332    LIMIT points to the first character past the end of the directive.
5333    KEYWORD is the keyword-table entry for the directive.  */
5334
5335 static void
5336 pass_thru_directive (buf, limit, op, keyword)
5337      U_CHAR *buf, *limit;
5338      FILE_BUF *op;
5339      struct directive *keyword;
5340 {
5341   register unsigned keyword_length = keyword->length;
5342
5343   check_expand (op, 1 + keyword_length + (limit - buf));
5344   *op->bufp++ = '#';
5345   bcopy (keyword->name, (char *) op->bufp, keyword_length);
5346   op->bufp += keyword_length;
5347   if (limit != buf && buf[0] != ' ')
5348     *op->bufp++ = ' ';
5349   bcopy ((char *) buf, (char *) op->bufp, limit - buf);
5350   op->bufp += (limit - buf);
5351 #if 0
5352   *op->bufp++ = '\n';
5353   /* Count the line we have just made in the output,
5354      to get in sync properly.  */
5355   op->lineno++;
5356 #endif
5357 }
5358 \f
5359 /* The arglist structure is built by do_define to tell
5360    collect_definition where the argument names begin.  That
5361    is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
5362    would contain pointers to the strings x, y, and z.
5363    Collect_definition would then build a DEFINITION node,
5364    with reflist nodes pointing to the places x, y, and z had
5365    appeared.  So the arglist is just convenience data passed
5366    between these two routines.  It is not kept around after
5367    the current #define has been processed and entered into the
5368    hash table. */
5369
5370 struct arglist {
5371   struct arglist *next;
5372   U_CHAR *name;
5373   int length;
5374   int argno;
5375   char rest_args;
5376 };
5377
5378 /* Create a DEFINITION node from a #define directive.  Arguments are 
5379    as for do_define. */
5380 static MACRODEF
5381 create_definition (buf, limit, op)
5382      U_CHAR *buf, *limit;
5383      FILE_BUF *op;
5384 {
5385   U_CHAR *bp;                   /* temp ptr into input buffer */
5386   U_CHAR *symname;              /* remember where symbol name starts */
5387   int sym_length;               /* and how long it is */
5388   int line = instack[indepth].lineno;
5389   char *file = instack[indepth].nominal_fname;
5390   int rest_args = 0;
5391
5392   DEFINITION *defn;
5393   int arglengths = 0;           /* Accumulate lengths of arg names
5394                                    plus number of args.  */
5395   MACRODEF mdef;
5396
5397   bp = buf;
5398
5399   while (is_hor_space[*bp])
5400     bp++;
5401
5402   symname = bp;                 /* remember where it starts */
5403   sym_length = check_macro_name (bp, "macro");
5404   bp += sym_length;
5405
5406   /* Lossage will occur if identifiers or control keywords are broken
5407      across lines using backslash.  This is not the right place to take
5408      care of that. */
5409
5410   if (*bp == '(') {
5411     struct arglist *arg_ptrs = NULL;
5412     int argno = 0;
5413
5414     bp++;                       /* skip '(' */
5415     SKIP_WHITE_SPACE (bp);
5416
5417     /* Loop over macro argument names.  */
5418     while (*bp != ')') {
5419       struct arglist *temp;
5420
5421       temp = (struct arglist *) alloca (sizeof (struct arglist));
5422       temp->name = bp;
5423       temp->next = arg_ptrs;
5424       temp->argno = argno++;
5425       temp->rest_args = 0;
5426       arg_ptrs = temp;
5427
5428       if (rest_args)
5429         pedwarn ("another parameter follows `%s'",
5430                  rest_extension);
5431
5432       if (!is_idstart[*bp])
5433         pedwarn ("invalid character in macro parameter name");
5434       
5435       /* Find the end of the arg name.  */
5436       while (is_idchar[*bp]) {
5437         bp++;
5438         /* do we have a "special" rest-args extension here? */
5439         if (limit - bp > REST_EXTENSION_LENGTH &&
5440             strncmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) {
5441           rest_args = 1;
5442           temp->rest_args = 1;
5443           break;
5444         }
5445       }
5446       temp->length = bp - temp->name;
5447       if (rest_args == 1)
5448         bp += REST_EXTENSION_LENGTH;
5449       arglengths += temp->length + 2;
5450       SKIP_WHITE_SPACE (bp);
5451       if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
5452         error ("badly punctuated parameter list in `#define'");
5453         goto nope;
5454       }
5455       if (*bp == ',') {
5456         bp++;
5457         SKIP_WHITE_SPACE (bp);
5458         /* A comma at this point can only be followed by an identifier.  */
5459         if (!is_idstart[*bp]) {
5460           error ("badly punctuated parameter list in `#define'");
5461           goto nope;
5462         }
5463       }
5464       if (bp >= limit) {
5465         error ("unterminated parameter list in `#define'");
5466         goto nope;
5467       }
5468       {
5469         struct arglist *otemp;
5470
5471         for (otemp = temp->next; otemp != NULL; otemp = otemp->next)
5472           if (temp->length == otemp->length &&
5473             strncmp (temp->name, otemp->name, temp->length) == 0) {
5474               U_CHAR *name;
5475
5476               name = (U_CHAR *) alloca (temp->length + 1);
5477               (void) strncpy (name, temp->name, temp->length);
5478               name[temp->length] = '\0';
5479               error ("duplicate argument name `%s' in `#define'", name);
5480               goto nope;
5481           }
5482       }
5483     }
5484
5485     ++bp;                       /* skip paren */
5486     SKIP_WHITE_SPACE (bp);
5487     /* now everything from bp before limit is the definition. */
5488     defn = collect_expansion (bp, limit, argno, arg_ptrs);
5489     defn->rest_args = rest_args;
5490
5491     /* Now set defn->args.argnames to the result of concatenating
5492        the argument names in reverse order
5493        with comma-space between them.  */
5494     defn->args.argnames = (U_CHAR *) xmalloc (arglengths + 1);
5495     {
5496       struct arglist *temp;
5497       int i = 0;
5498       for (temp = arg_ptrs; temp; temp = temp->next) {
5499         bcopy (temp->name, &defn->args.argnames[i], temp->length);
5500         i += temp->length;
5501         if (temp->next != 0) {
5502           defn->args.argnames[i++] = ',';
5503           defn->args.argnames[i++] = ' ';
5504         }
5505       }
5506       defn->args.argnames[i] = 0;
5507     }
5508   } else {
5509     /* Simple expansion or empty definition.  */
5510
5511     if (bp < limit)
5512       {
5513         if (is_hor_space[*bp]) {
5514           bp++;
5515           SKIP_WHITE_SPACE (bp);
5516         } else {
5517           switch (*bp) {
5518             case '!':  case '"':  case '#':  case '%':  case '&':  case '\'':
5519             case ')':  case '*':  case '+':  case ',':  case '-':  case '.':
5520             case '/':  case ':':  case ';':  case '<':  case '=':  case '>':
5521             case '?':  case '[':  case '\\': case ']':  case '^':  case '{':
5522             case '|':  case '}':  case '~':
5523               warning ("missing white space after `#define %.*s'",
5524                        sym_length, symname);
5525               break;
5526
5527             default:
5528               pedwarn ("missing white space after `#define %.*s'",
5529                        sym_length, symname);
5530               break;
5531           }
5532         }
5533       }
5534     /* Now everything from bp before limit is the definition. */
5535     defn = collect_expansion (bp, limit, -1, NULL_PTR);
5536     defn->args.argnames = (U_CHAR *) "";
5537   }
5538
5539   defn->line = line;
5540   defn->file = file;
5541
5542   /* OP is null if this is a predefinition */
5543   defn->predefined = !op;
5544   mdef.defn = defn;
5545   mdef.symnam = symname;
5546   mdef.symlen = sym_length;
5547
5548   return mdef;
5549
5550  nope:
5551   mdef.defn = 0;
5552   return mdef;
5553 }
5554  
5555 /* Process a #define command.
5556 BUF points to the contents of the #define command, as a contiguous string.
5557 LIMIT points to the first character past the end of the definition.
5558 KEYWORD is the keyword-table entry for #define.  */
5559
5560 static int
5561 do_define (buf, limit, op, keyword)
5562      U_CHAR *buf, *limit;
5563      FILE_BUF *op;
5564      struct directive *keyword;
5565 {
5566   int hashcode;
5567   MACRODEF mdef;
5568
5569   /* If this is a precompiler run (with -pcp) pass thru #define commands.  */
5570   if (pcp_outfile && op)
5571     pass_thru_directive (buf, limit, op, keyword);
5572
5573   mdef = create_definition (buf, limit, op);
5574   if (mdef.defn == 0)
5575     goto nope;
5576
5577   hashcode = hashf (mdef.symnam, mdef.symlen, HASHSIZE);
5578
5579   {
5580     HASHNODE *hp;
5581     if ((hp = lookup (mdef.symnam, mdef.symlen, hashcode)) != NULL) {
5582       int ok = 0;
5583       /* Redefining a precompiled key is ok.  */
5584       if (hp->type == T_PCSTRING)
5585         ok = 1;
5586       /* Redefining a macro is ok if the definitions are the same.  */
5587       else if (hp->type == T_MACRO)
5588         ok = ! compare_defs (mdef.defn, hp->value.defn);
5589       /* Redefining a constant is ok with -D.  */
5590       else if (hp->type == T_CONST)
5591         ok = ! done_initializing;
5592       /* Print the warning if it's not ok.  */
5593       if (!ok) {
5594         U_CHAR *msg;            /* what pain... */
5595
5596         /* If we are passing through #define and #undef directives, do
5597            that for this re-definition now.  */
5598         if (debug_output && op)
5599           pass_thru_directive (buf, limit, op, keyword);
5600
5601         msg = (U_CHAR *) alloca (mdef.symlen + 22);
5602         *msg = '`';
5603         bcopy ((char *) mdef.symnam, (char *) (msg + 1), mdef.symlen);
5604         strcpy ((char *) (msg + mdef.symlen + 1), "' redefined");
5605         pedwarn (msg);
5606         if (hp->type == T_MACRO)
5607           pedwarn_with_file_and_line (hp->value.defn->file, hp->value.defn->line,
5608                                       "this is the location of the previous definition");
5609       }
5610       /* Replace the old definition.  */
5611       hp->type = T_MACRO;
5612       hp->value.defn = mdef.defn;
5613     } else {
5614       /* If we are passing through #define and #undef directives, do
5615          that for this new definition now.  */
5616       if (debug_output && op)
5617         pass_thru_directive (buf, limit, op, keyword);
5618       install (mdef.symnam, mdef.symlen, T_MACRO,
5619                (char *) mdef.defn, hashcode);
5620     }
5621   }
5622
5623   return 0;
5624
5625 nope:
5626
5627   return 1;
5628 }
5629 \f
5630 /* Check a purported macro name SYMNAME, and yield its length.
5631    USAGE is the kind of name this is intended for.  */
5632
5633 static int
5634 check_macro_name (symname, usage)
5635      U_CHAR *symname;
5636      char *usage;
5637 {
5638   U_CHAR *p;
5639   int sym_length;
5640
5641   for (p = symname; is_idchar[*p]; p++)
5642     ;
5643   sym_length = p - symname;
5644   if (sym_length == 0)
5645     error ("invalid %s name", usage);
5646   else if (!is_idstart[*symname]) {
5647     U_CHAR *msg;                        /* what pain... */
5648     msg = (U_CHAR *) alloca (sym_length + 1);
5649     bcopy ((char *) symname, (char *) msg, sym_length);
5650     msg[sym_length] = 0;
5651     error ("invalid %s name `%s'", usage, msg);
5652   } else {
5653     if (! strncmp (symname, "defined", 7) && sym_length == 7)
5654       error ("invalid %s name `defined'", usage);
5655   }
5656   return sym_length;
5657 }
5658
5659 /*
5660  * return zero if two DEFINITIONs are isomorphic
5661  */
5662 static int
5663 compare_defs (d1, d2)
5664      DEFINITION *d1, *d2;
5665 {
5666   register struct reflist *a1, *a2;
5667   register U_CHAR *p1 = d1->expansion;
5668   register U_CHAR *p2 = d2->expansion;
5669   int first = 1;
5670
5671   if (d1->nargs != d2->nargs)
5672     return 1;
5673   if (strcmp ((char *)d1->args.argnames, (char *)d2->args.argnames))
5674     return 1;
5675   for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
5676        a1 = a1->next, a2 = a2->next) {
5677     if (!((a1->nchars == a2->nchars && ! strncmp (p1, p2, a1->nchars))
5678           || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
5679         || a1->argno != a2->argno
5680         || a1->stringify != a2->stringify
5681         || a1->raw_before != a2->raw_before
5682         || a1->raw_after != a2->raw_after)
5683       return 1;
5684     first = 0;
5685     p1 += a1->nchars;
5686     p2 += a2->nchars;
5687   }
5688   if (a1 != a2)
5689     return 1;
5690   if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
5691                      p2, d2->length - (p2 - d2->expansion), 1))
5692     return 1;
5693   return 0;
5694 }
5695
5696 /* Return 1 if two parts of two macro definitions are effectively different.
5697    One of the parts starts at BEG1 and has LEN1 chars;
5698    the other has LEN2 chars at BEG2.
5699    Any sequence of whitespace matches any other sequence of whitespace.
5700    FIRST means these parts are the first of a macro definition;
5701     so ignore leading whitespace entirely.
5702    LAST means these parts are the last of a macro definition;
5703     so ignore trailing whitespace entirely.  */
5704
5705 static int
5706 comp_def_part (first, beg1, len1, beg2, len2, last)
5707      int first;
5708      U_CHAR *beg1, *beg2;
5709      int len1, len2;
5710      int last;
5711 {
5712   register U_CHAR *end1 = beg1 + len1;
5713   register U_CHAR *end2 = beg2 + len2;
5714   if (first) {
5715     while (beg1 != end1 && is_space[*beg1]) beg1++;
5716     while (beg2 != end2 && is_space[*beg2]) beg2++;
5717   }
5718   if (last) {
5719     while (beg1 != end1 && is_space[end1[-1]]) end1--;
5720     while (beg2 != end2 && is_space[end2[-1]]) end2--;
5721   }
5722   while (beg1 != end1 && beg2 != end2) {
5723     if (is_space[*beg1] && is_space[*beg2]) {
5724       while (beg1 != end1 && is_space[*beg1]) beg1++;
5725       while (beg2 != end2 && is_space[*beg2]) beg2++;
5726     } else if (*beg1 == *beg2) {
5727       beg1++; beg2++;
5728     } else break;
5729   }
5730   return (beg1 != end1) || (beg2 != end2);
5731 }
5732 \f
5733 /* Read a replacement list for a macro with parameters.
5734    Build the DEFINITION structure.
5735    Reads characters of text starting at BUF until END.
5736    ARGLIST specifies the formal parameters to look for
5737    in the text of the definition; NARGS is the number of args
5738    in that list, or -1 for a macro name that wants no argument list.
5739    MACRONAME is the macro name itself (so we can avoid recursive expansion)
5740    and NAMELEN is its length in characters.
5741    
5742 Note that comments and backslash-newlines have already been deleted
5743 from the argument.  */
5744
5745 /* Leading and trailing Space, Tab, etc. are converted to markers
5746    Newline Space, Newline Tab, etc.
5747    Newline Space makes a space in the final output
5748    but is discarded if stringified.  (Newline Tab is similar but
5749    makes a Tab instead.)
5750
5751    If there is no trailing whitespace, a Newline Space is added at the end
5752    to prevent concatenation that would be contrary to the standard.  */
5753
5754 static DEFINITION *
5755 collect_expansion (buf, end, nargs, arglist)
5756      U_CHAR *buf, *end;
5757      int nargs;
5758      struct arglist *arglist;
5759 {
5760   DEFINITION *defn;
5761   register U_CHAR *p, *limit, *lastp, *exp_p;
5762   struct reflist *endpat = NULL;
5763   /* Pointer to first nonspace after last ## seen.  */
5764   U_CHAR *concat = 0;
5765   /* Pointer to first nonspace after last single-# seen.  */
5766   U_CHAR *stringify = 0;
5767   /* How those tokens were spelled.  */
5768   enum sharp_token_type concat_sharp_token_type = NO_SHARP_TOKEN;
5769   enum sharp_token_type stringify_sharp_token_type = NO_SHARP_TOKEN;
5770   int maxsize;
5771   int expected_delimiter = '\0';
5772
5773   /* Scan thru the replacement list, ignoring comments and quoted
5774      strings, picking up on the macro calls.  It does a linear search
5775      thru the arg list on every potential symbol.  Profiling might say
5776      that something smarter should happen. */
5777
5778   if (end < buf)
5779     abort ();
5780
5781   /* Find the beginning of the trailing whitespace.  */
5782   /* Find end of leading whitespace.  */
5783   limit = end;
5784   p = buf;
5785   while (p < limit && is_space[limit[-1]]) limit--;
5786   while (p < limit && is_space[*p]) p++;
5787
5788   /* Allocate space for the text in the macro definition.
5789      Leading and trailing whitespace chars need 2 bytes each.
5790      Each other input char may or may not need 1 byte,
5791      so this is an upper bound.
5792      The extra 2 are for invented trailing newline-marker and final null.  */
5793   maxsize = (sizeof (DEFINITION)
5794              + 2 * (end - limit) + 2 * (p - buf)
5795              + (limit - p) + 3);
5796   defn = (DEFINITION *) xcalloc (1, maxsize);
5797
5798   defn->nargs = nargs;
5799   exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
5800   lastp = exp_p;
5801
5802   p = buf;
5803
5804   /* Convert leading whitespace to Newline-markers.  */
5805   while (p < limit && is_space[*p]) {
5806     *exp_p++ = '\n';
5807     *exp_p++ = *p++;
5808   }
5809
5810   if (p[0] == '#'
5811       ? p[1] == '#'
5812       : p[0] == '%' && p[1] == ':' && p[2] == '%' && p[3] == ':') {
5813     error ("`##' at start of macro definition");
5814     p += p[0] == '#' ? 2 : 4;
5815   }
5816
5817   /* Process the main body of the definition.  */
5818   while (p < limit) {
5819     int skipped_arg = 0;
5820     register U_CHAR c = *p++;
5821
5822     *exp_p++ = c;
5823
5824     if (!traditional) {
5825       switch (c) {
5826       case '\'':
5827       case '\"':
5828         if (expected_delimiter != '\0') {
5829           if (c == expected_delimiter)
5830             expected_delimiter = '\0';
5831         } else
5832           expected_delimiter = c;
5833         break;
5834
5835       case '\\':
5836         if (p < limit && expected_delimiter) {
5837           /* In a string, backslash goes through
5838              and makes next char ordinary.  */
5839           *exp_p++ = *p++;
5840         }
5841         break;
5842
5843       case '%':
5844         if (!expected_delimiter && *p == ':') {
5845           /* %: is not a digraph if preceded by an odd number of '<'s.  */
5846           U_CHAR *p0 = p - 1;
5847           while (buf < p0 && p0[-1] == '<')
5848             p0--;
5849           if ((p - p0) & 1) {
5850             /* Treat %:%: as ## and %: as #.  */
5851             if (p[1] == '%' && p[2] == ':') {
5852               p += 2;
5853               goto sharp_sharp_token;
5854             }
5855             if (nargs >= 0) {
5856               p++;
5857               goto sharp_token;
5858             }
5859           }
5860         }
5861         break;
5862
5863       case '#':
5864         /* # is ordinary inside a string.  */
5865         if (expected_delimiter)
5866           break;
5867         if (*p == '#') {
5868         sharp_sharp_token:
5869           /* ##: concatenate preceding and following tokens.  */
5870           /* Take out the first #, discard preceding whitespace.  */
5871           exp_p--;
5872           while (exp_p > lastp && is_hor_space[exp_p[-1]])
5873             --exp_p;
5874           /* Skip the second #.  */
5875           p++;
5876           concat_sharp_token_type = c;
5877           if (is_hor_space[*p]) {
5878             concat_sharp_token_type++;
5879             p++;
5880             SKIP_WHITE_SPACE (p);
5881           }
5882           concat = p;
5883           if (p == limit)
5884             error ("`##' at end of macro definition");
5885         } else if (nargs >= 0) {
5886           /* Single #: stringify following argument ref.
5887              Don't leave the # in the expansion.  */
5888         sharp_token:
5889           exp_p--;
5890           stringify_sharp_token_type = c;
5891           if (is_hor_space[*p]) {
5892             stringify_sharp_token_type++;
5893             p++;
5894             SKIP_WHITE_SPACE (p);
5895           }
5896           if (! is_idstart[*p] || nargs == 0)
5897             error ("`#' operator is not followed by a macro argument name");
5898           else
5899             stringify = p;
5900         }
5901         break;
5902       }
5903     } else {
5904       /* In -traditional mode, recognize arguments inside strings and
5905          and character constants, and ignore special properties of #.
5906          Arguments inside strings are considered "stringified", but no
5907          extra quote marks are supplied.  */
5908       switch (c) {
5909       case '\'':
5910       case '\"':
5911         if (expected_delimiter != '\0') {
5912           if (c == expected_delimiter)
5913             expected_delimiter = '\0';
5914         } else
5915           expected_delimiter = c;
5916         break;
5917
5918       case '\\':
5919         /* Backslash quotes delimiters and itself, but not macro args.  */
5920         if (expected_delimiter != 0 && p < limit
5921             && (*p == expected_delimiter || *p == '\\')) {
5922           *exp_p++ = *p++;
5923           continue;
5924         }
5925         break;
5926
5927       case '/':
5928         if (expected_delimiter != '\0') /* No comments inside strings.  */
5929           break;
5930         if (*p == '*') {
5931           /* If we find a comment that wasn't removed by handle_directive,
5932              this must be -traditional.  So replace the comment with
5933              nothing at all.  */
5934           exp_p--;
5935           p += 1;
5936           while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
5937             p++;
5938 #if 0
5939           /* Mark this as a concatenation-point, as if it had been ##.  */
5940           concat = p;
5941 #endif
5942         }
5943         break;
5944       }
5945     }
5946
5947     /* Handle the start of a symbol.  */
5948     if (is_idchar[c] && nargs > 0) {
5949       U_CHAR *id_beg = p - 1;
5950       int id_len;
5951
5952       --exp_p;
5953       while (p != limit && is_idchar[*p]) p++;
5954       id_len = p - id_beg;
5955
5956       if (is_idstart[c]) {
5957         register struct arglist *arg;
5958
5959         for (arg = arglist; arg != NULL; arg = arg->next) {
5960           struct reflist *tpat;
5961
5962           if (arg->name[0] == c
5963               && arg->length == id_len
5964               && strncmp (arg->name, id_beg, id_len) == 0) {
5965             if (expected_delimiter && warn_stringify) {
5966               if (traditional) {
5967                 warning ("macro argument `%.*s' is stringified.",
5968                          id_len, arg->name);
5969               } else {
5970                 warning ("macro arg `%.*s' would be stringified with -traditional.",
5971                          id_len, arg->name);
5972               }
5973             }
5974             /* If ANSI, don't actually substitute inside a string.  */
5975             if (!traditional && expected_delimiter)
5976               break;
5977             /* make a pat node for this arg and append it to the end of
5978                the pat list */
5979             tpat = (struct reflist *) xmalloc (sizeof (struct reflist));
5980             tpat->next = NULL;
5981             tpat->raw_before
5982               = concat == id_beg ? concat_sharp_token_type : NO_SHARP_TOKEN;
5983             tpat->raw_after = NO_SHARP_TOKEN;
5984             tpat->rest_args = arg->rest_args;
5985             tpat->stringify
5986               = ((traditional ? expected_delimiter : stringify == id_beg)
5987                  ? stringify_sharp_token_type : NO_SHARP_TOKEN);
5988
5989             if (endpat == NULL)
5990               defn->pattern = tpat;
5991             else
5992               endpat->next = tpat;
5993             endpat = tpat;
5994
5995             tpat->argno = arg->argno;
5996             tpat->nchars = exp_p - lastp;
5997             {
5998               register U_CHAR *p1 = p;
5999               SKIP_WHITE_SPACE (p1);
6000               if (p1[0]=='#'
6001                   ? p1[1]=='#'
6002                   : p1[0]=='%' && p1[1]==':' && p1[2]=='%' && p1[3]==':')
6003                 tpat->raw_after = p1[0] + (p != p1);
6004             }
6005             lastp = exp_p;      /* place to start copying from next time */
6006             skipped_arg = 1;
6007             break;
6008           }
6009         }
6010       }
6011
6012       /* If this was not a macro arg, copy it into the expansion.  */
6013       if (! skipped_arg) {
6014         register U_CHAR *lim1 = p;
6015         p = id_beg;
6016         while (p != lim1)
6017           *exp_p++ = *p++;
6018         if (stringify == id_beg)
6019           error ("`#' operator should be followed by a macro argument name");
6020       }
6021     }
6022   }
6023
6024   if (!traditional && expected_delimiter == 0) {
6025     /* There is no trailing whitespace, so invent some in ANSI mode.
6026        But not if "inside a string" (which in ANSI mode
6027        happens only for -D option).  */
6028     *exp_p++ = '\n';
6029     *exp_p++ = ' ';
6030   }
6031
6032   *exp_p = '\0';
6033
6034   defn->length = exp_p - defn->expansion;
6035
6036   /* Crash now if we overrun the allocated size.  */
6037   if (defn->length + 1 > maxsize)
6038     abort ();
6039
6040 #if 0
6041 /* This isn't worth the time it takes.  */
6042   /* give back excess storage */
6043   defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
6044 #endif
6045
6046   return defn;
6047 }
6048 \f
6049 static int
6050 do_assert (buf, limit, op, keyword)
6051      U_CHAR *buf, *limit;
6052      FILE_BUF *op;
6053      struct directive *keyword;
6054 {
6055   U_CHAR *bp;                   /* temp ptr into input buffer */
6056   U_CHAR *symname;              /* remember where symbol name starts */
6057   int sym_length;               /* and how long it is */
6058   struct arglist *tokens = NULL;
6059
6060   if (pedantic && done_initializing && !instack[indepth].system_header_p)
6061     pedwarn ("ANSI C does not allow `#assert'");
6062
6063   bp = buf;
6064
6065   while (is_hor_space[*bp])
6066     bp++;
6067
6068   symname = bp;                 /* remember where it starts */
6069   sym_length = check_macro_name (bp, "assertion");
6070   bp += sym_length;
6071   /* #define doesn't do this, but we should.  */
6072   SKIP_WHITE_SPACE (bp);
6073
6074   /* Lossage will occur if identifiers or control tokens are broken
6075      across lines using backslash.  This is not the right place to take
6076      care of that. */
6077
6078   if (*bp != '(') {
6079     error ("missing token-sequence in `#assert'");
6080     return 1;
6081   }
6082
6083   {
6084     int error_flag = 0;
6085
6086     bp++;                       /* skip '(' */
6087     SKIP_WHITE_SPACE (bp);
6088
6089     tokens = read_token_list (&bp, limit, &error_flag);
6090     if (error_flag)
6091       return 1;
6092     if (tokens == 0) {
6093       error ("empty token-sequence in `#assert'");
6094       return 1;
6095     }
6096
6097     ++bp;                       /* skip paren */
6098     SKIP_WHITE_SPACE (bp);
6099   }
6100
6101   /* If this name isn't already an assertion name, make it one.
6102      Error if it was already in use in some other way.  */
6103
6104   {
6105     ASSERTION_HASHNODE *hp;
6106     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
6107     struct tokenlist_list *value
6108       = (struct tokenlist_list *) xmalloc (sizeof (struct tokenlist_list));
6109
6110     hp = assertion_lookup (symname, sym_length, hashcode);
6111     if (hp == NULL) {
6112       if (sym_length == 7 && ! strncmp (symname, "defined", sym_length))
6113         error ("`defined' redefined as assertion");
6114       hp = assertion_install (symname, sym_length, hashcode);
6115     }
6116
6117     /* Add the spec'd token-sequence to the list of such.  */
6118     value->tokens = tokens;
6119     value->next = hp->value;
6120     hp->value = value;
6121   }
6122
6123   return 0;
6124 }
6125 \f
6126 static int
6127 do_unassert (buf, limit, op, keyword)
6128      U_CHAR *buf, *limit;
6129      FILE_BUF *op;
6130      struct directive *keyword;
6131 {
6132   U_CHAR *bp;                   /* temp ptr into input buffer */
6133   U_CHAR *symname;              /* remember where symbol name starts */
6134   int sym_length;               /* and how long it is */
6135
6136   struct arglist *tokens = NULL;
6137   int tokens_specified = 0;
6138
6139   if (pedantic && done_initializing && !instack[indepth].system_header_p)
6140     pedwarn ("ANSI C does not allow `#unassert'");
6141
6142   bp = buf;
6143
6144   while (is_hor_space[*bp])
6145     bp++;
6146
6147   symname = bp;                 /* remember where it starts */
6148   sym_length = check_macro_name (bp, "assertion");
6149   bp += sym_length;
6150   /* #define doesn't do this, but we should.  */
6151   SKIP_WHITE_SPACE (bp);
6152
6153   /* Lossage will occur if identifiers or control tokens are broken
6154      across lines using backslash.  This is not the right place to take
6155      care of that. */
6156
6157   if (*bp == '(') {
6158     int error_flag = 0;
6159
6160     bp++;                       /* skip '(' */
6161     SKIP_WHITE_SPACE (bp);
6162
6163     tokens = read_token_list (&bp, limit, &error_flag);
6164     if (error_flag)
6165       return 1;
6166     if (tokens == 0) {
6167       error ("empty token list in `#unassert'");
6168       return 1;
6169     }
6170
6171     tokens_specified = 1;
6172
6173     ++bp;                       /* skip paren */
6174     SKIP_WHITE_SPACE (bp);
6175   }
6176
6177   {
6178     ASSERTION_HASHNODE *hp;
6179     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
6180     struct tokenlist_list *tail, *prev;
6181
6182     hp = assertion_lookup (symname, sym_length, hashcode);
6183     if (hp == NULL)
6184       return 1;
6185
6186     /* If no token list was specified, then eliminate this assertion
6187        entirely.  */
6188     if (! tokens_specified) {
6189       struct tokenlist_list *next;
6190       for (tail = hp->value; tail; tail = next) {
6191         next = tail->next;
6192         free_token_list (tail->tokens);
6193         free (tail);
6194       }
6195       delete_assertion (hp);
6196     } else {
6197       /* If a list of tokens was given, then delete any matching list.  */
6198
6199       tail = hp->value;
6200       prev = 0;
6201       while (tail) {
6202         struct tokenlist_list *next = tail->next;
6203         if (compare_token_lists (tail->tokens, tokens)) {
6204           if (prev)
6205             prev->next = next;
6206           else
6207             hp->value = tail->next;
6208           free_token_list (tail->tokens);
6209           free (tail);
6210         } else {
6211           prev = tail;
6212         }
6213         tail = next;
6214       }
6215     }
6216   }
6217
6218   return 0;
6219 }
6220 \f
6221 /* Test whether there is an assertion named NAME
6222    and optionally whether it has an asserted token list TOKENS.
6223    NAME is not null terminated; its length is SYM_LENGTH.
6224    If TOKENS_SPECIFIED is 0, then don't check for any token list.  */
6225
6226 int
6227 check_assertion (name, sym_length, tokens_specified, tokens)
6228      U_CHAR *name;
6229      int sym_length;
6230      int tokens_specified;
6231      struct arglist *tokens;
6232 {
6233   ASSERTION_HASHNODE *hp;
6234   int hashcode = hashf (name, sym_length, ASSERTION_HASHSIZE);
6235
6236   if (pedantic && !instack[indepth].system_header_p)
6237     pedwarn ("ANSI C does not allow testing assertions");
6238
6239   hp = assertion_lookup (name, sym_length, hashcode);
6240   if (hp == NULL)
6241     /* It is not an assertion; just return false.  */
6242     return 0;
6243
6244   /* If no token list was specified, then value is 1.  */
6245   if (! tokens_specified)
6246     return 1;
6247
6248   {
6249     struct tokenlist_list *tail;
6250
6251     tail = hp->value;
6252
6253     /* If a list of tokens was given,
6254        then succeed if the assertion records a matching list.  */
6255
6256     while (tail) {
6257       if (compare_token_lists (tail->tokens, tokens))
6258         return 1;
6259       tail = tail->next;
6260     }
6261
6262     /* Fail if the assertion has no matching list.  */
6263     return 0;
6264   }
6265 }
6266
6267 /* Compare two lists of tokens for equality including order of tokens.  */
6268
6269 static int
6270 compare_token_lists (l1, l2)
6271      struct arglist *l1, *l2;
6272 {
6273   while (l1 && l2) {
6274     if (l1->length != l2->length)
6275       return 0;
6276     if (strncmp (l1->name, l2->name, l1->length))
6277       return 0;
6278     l1 = l1->next;
6279     l2 = l2->next;
6280   }
6281
6282   /* Succeed if both lists end at the same time.  */
6283   return l1 == l2;
6284 }
6285 \f
6286 /* Read a space-separated list of tokens ending in a close parenthesis.
6287    Return a list of strings, in the order they were written.
6288    (In case of error, return 0 and store -1 in *ERROR_FLAG.)
6289    Parse the text starting at *BPP, and update *BPP.
6290    Don't parse beyond LIMIT.  */
6291
6292 static struct arglist *
6293 read_token_list (bpp, limit, error_flag)
6294      U_CHAR **bpp;
6295      U_CHAR *limit;
6296      int *error_flag;
6297 {
6298   struct arglist *token_ptrs = 0;
6299   U_CHAR *bp = *bpp;
6300   int depth = 1;
6301
6302   *error_flag = 0;
6303
6304   /* Loop over the assertion value tokens.  */
6305   while (depth > 0) {
6306     struct arglist *temp;
6307     int eofp = 0;
6308     U_CHAR *beg = bp;
6309
6310     /* Find the end of the token.  */
6311     if (*bp == '(') {
6312       bp++;
6313       depth++;
6314     } else if (*bp == ')') {
6315       depth--;
6316       if (depth == 0)
6317         break;
6318       bp++;
6319     } else if (*bp == '"' || *bp == '\'')
6320       bp = skip_quoted_string (bp, limit, 0, NULL_PTR, NULL_PTR, &eofp);
6321     else
6322       while (! is_hor_space[*bp] && *bp != '(' && *bp != ')'
6323              && *bp != '"' && *bp != '\'' && bp != limit)
6324         bp++;
6325
6326     temp = (struct arglist *) xmalloc (sizeof (struct arglist));
6327     temp->name = (U_CHAR *) xmalloc (bp - beg + 1);
6328     bcopy ((char *) beg, (char *) temp->name, bp - beg);
6329     temp->name[bp - beg] = 0;
6330     temp->next = token_ptrs;
6331     token_ptrs = temp;
6332     temp->length = bp - beg;
6333
6334     SKIP_WHITE_SPACE (bp);
6335
6336     if (bp >= limit) {
6337       error ("unterminated token sequence in `#assert' or `#unassert'");
6338       *error_flag = -1;
6339       return 0;
6340     }
6341   }
6342   *bpp = bp;
6343
6344   /* We accumulated the names in reverse order.
6345      Now reverse them to get the proper order.  */
6346   {
6347     register struct arglist *prev = 0, *this, *next;
6348     for (this = token_ptrs; this; this = next) {
6349       next = this->next;
6350       this->next = prev;
6351       prev = this;
6352     }
6353     return prev;
6354   }
6355 }
6356
6357 static void
6358 free_token_list (tokens)
6359      struct arglist *tokens;
6360 {
6361   while (tokens) {
6362     struct arglist *next = tokens->next;
6363     free (tokens->name);
6364     free (tokens);
6365     tokens = next;
6366   }
6367 }
6368 \f
6369 /*
6370  * Install a name in the assertion hash table.
6371  *
6372  * If LEN is >= 0, it is the length of the name.
6373  * Otherwise, compute the length by scanning the entire name.
6374  *
6375  * If HASH is >= 0, it is the precomputed hash code.
6376  * Otherwise, compute the hash code.
6377  */
6378 static ASSERTION_HASHNODE *
6379 assertion_install (name, len, hash)
6380      U_CHAR *name;
6381      int len;
6382      int hash;
6383 {
6384   register ASSERTION_HASHNODE *hp;
6385   register int i, bucket;
6386   register U_CHAR *p, *q;
6387
6388   i = sizeof (ASSERTION_HASHNODE) + len + 1;
6389   hp = (ASSERTION_HASHNODE *) xmalloc (i);
6390   bucket = hash;
6391   hp->bucket_hdr = &assertion_hashtab[bucket];
6392   hp->next = assertion_hashtab[bucket];
6393   assertion_hashtab[bucket] = hp;
6394   hp->prev = NULL;
6395   if (hp->next != NULL)
6396     hp->next->prev = hp;
6397   hp->length = len;
6398   hp->value = 0;
6399   hp->name = ((U_CHAR *) hp) + sizeof (ASSERTION_HASHNODE);
6400   p = hp->name;
6401   q = name;
6402   for (i = 0; i < len; i++)
6403     *p++ = *q++;
6404   hp->name[len] = 0;
6405   return hp;
6406 }
6407
6408 /*
6409  * find the most recent hash node for name name (ending with first
6410  * non-identifier char) installed by install
6411  *
6412  * If LEN is >= 0, it is the length of the name.
6413  * Otherwise, compute the length by scanning the entire name.
6414  *
6415  * If HASH is >= 0, it is the precomputed hash code.
6416  * Otherwise, compute the hash code.
6417  */
6418 static ASSERTION_HASHNODE *
6419 assertion_lookup (name, len, hash)
6420      U_CHAR *name;
6421      int len;
6422      int hash;
6423 {
6424   register ASSERTION_HASHNODE *bucket;
6425
6426   bucket = assertion_hashtab[hash];
6427   while (bucket) {
6428     if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
6429       return bucket;
6430     bucket = bucket->next;
6431   }
6432   return NULL;
6433 }
6434
6435 static void
6436 delete_assertion (hp)
6437      ASSERTION_HASHNODE *hp;
6438 {
6439
6440   if (hp->prev != NULL)
6441     hp->prev->next = hp->next;
6442   if (hp->next != NULL)
6443     hp->next->prev = hp->prev;
6444
6445   /* make sure that the bucket chain header that
6446      the deleted guy was on points to the right thing afterwards. */
6447   if (hp == *hp->bucket_hdr)
6448     *hp->bucket_hdr = hp->next;
6449
6450   free (hp);
6451 }
6452 \f
6453 /*
6454  * interpret #line command.  Remembers previously seen fnames
6455  * in its very own hash table.
6456  */
6457 #define FNAME_HASHSIZE 37
6458
6459 static int
6460 do_line (buf, limit, op, keyword)
6461      U_CHAR *buf, *limit;
6462      FILE_BUF *op;
6463      struct directive *keyword;
6464 {
6465   register U_CHAR *bp;
6466   FILE_BUF *ip = &instack[indepth];
6467   FILE_BUF tem;
6468   int new_lineno;
6469   enum file_change_code file_change = same_file;
6470
6471   /* Expand any macros.  */
6472   tem = expand_to_temp_buffer (buf, limit, 0, 0);
6473
6474   /* Point to macroexpanded line, which is null-terminated now.  */
6475   bp = tem.buf;
6476   SKIP_WHITE_SPACE (bp);
6477
6478   if (!isdigit (*bp)) {
6479     error ("invalid format `#line' command");
6480     return 0;
6481   }
6482
6483   /* The Newline at the end of this line remains to be processed.
6484      To put the next line at the specified line number,
6485      we must store a line number now that is one less.  */
6486   new_lineno = atoi (bp) - 1;
6487
6488   /* NEW_LINENO is one less than the actual line number here.  */
6489   if (pedantic && new_lineno < 0)
6490     pedwarn ("line number out of range in `#line' command");
6491
6492   /* skip over the line number.  */
6493   while (isdigit (*bp))
6494     bp++;
6495
6496 #if 0 /* #line 10"foo.c" is supposed to be allowed.  */
6497   if (*bp && !is_space[*bp]) {
6498     error ("invalid format `#line' command");
6499     return;
6500   }
6501 #endif
6502
6503   SKIP_WHITE_SPACE (bp);
6504
6505   if (*bp == '\"') {
6506     static HASHNODE *fname_table[FNAME_HASHSIZE];
6507     HASHNODE *hp, **hash_bucket;
6508     U_CHAR *fname, *p;
6509     int fname_length;
6510
6511     fname = ++bp;
6512
6513     /* Turn the file name, which is a character string literal,
6514        into a null-terminated string.  Do this in place.  */
6515     p = bp;
6516     for (;;)
6517       switch ((*p++ = *bp++)) {
6518       case '\0':
6519         error ("invalid format `#line' command");
6520         return 0;
6521
6522       case '\\':
6523         {
6524           char *bpc = (char *) bp;
6525           int c = parse_escape (&bpc);
6526           bp = (U_CHAR *) bpc;
6527           if (c < 0)
6528             p--;
6529           else
6530             p[-1] = c;
6531         }
6532         break;
6533
6534       case '\"':
6535         p[-1] = 0;
6536         goto fname_done;
6537       }
6538   fname_done:
6539     fname_length = p - fname;
6540
6541     SKIP_WHITE_SPACE (bp);
6542     if (*bp) {
6543       if (pedantic)
6544         pedwarn ("garbage at end of `#line' command");
6545       if (*bp == '1')
6546         file_change = enter_file;
6547       else if (*bp == '2')
6548         file_change = leave_file;
6549       else if (*bp == '3')
6550         ip->system_header_p = 1;
6551       else if (*bp == '4')
6552         ip->system_header_p = 2;
6553       else {
6554         error ("invalid format `#line' command");
6555         return 0;
6556       }
6557
6558       bp++;
6559       SKIP_WHITE_SPACE (bp);
6560       if (*bp == '3') {
6561         ip->system_header_p = 1;
6562         bp++;
6563         SKIP_WHITE_SPACE (bp);
6564       }
6565       if (*bp == '4') {
6566         ip->system_header_p = 2;
6567         bp++;
6568         SKIP_WHITE_SPACE (bp);
6569       }
6570       if (*bp) {
6571         error ("invalid format `#line' command");
6572         return 0;
6573       }
6574     }
6575
6576     hash_bucket =
6577       &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)];
6578     for (hp = *hash_bucket; hp != NULL; hp = hp->next)
6579       if (hp->length == fname_length &&
6580           strncmp (hp->value.cpval, fname, fname_length) == 0) {
6581         ip->nominal_fname = hp->value.cpval;
6582         break;
6583       }
6584     if (hp == 0) {
6585       /* Didn't find it; cons up a new one.  */
6586       hp = (HASHNODE *) xcalloc (1, sizeof (HASHNODE) + fname_length + 1);
6587       hp->next = *hash_bucket;
6588       *hash_bucket = hp;
6589
6590       hp->length = fname_length;
6591       ip->nominal_fname = hp->value.cpval = ((char *) hp) + sizeof (HASHNODE);
6592       bcopy (fname, hp->value.cpval, fname_length);
6593     }
6594   } else if (*bp) {
6595     error ("invalid format `#line' command");
6596     return 0;
6597   }
6598
6599   ip->lineno = new_lineno;
6600   output_line_command (ip, op, 0, file_change);
6601   check_expand (op, ip->length - (ip->bufp - ip->buf));
6602   return 0;
6603 }
6604
6605 /*
6606  * remove the definition of a symbol from the symbol table.
6607  * according to un*x /lib/cpp, it is not an error to undef
6608  * something that has no definitions, so it isn't one here either.
6609  */
6610
6611 static int
6612 do_undef (buf, limit, op, keyword)
6613      U_CHAR *buf, *limit;
6614      FILE_BUF *op;
6615      struct directive *keyword;
6616 {
6617   int sym_length;
6618   HASHNODE *hp;
6619   U_CHAR *orig_buf = buf;
6620
6621   /* If this is a precompiler run (with -pcp) pass thru #undef commands.  */
6622   if (pcp_outfile && op)
6623     pass_thru_directive (buf, limit, op, keyword);
6624
6625   SKIP_WHITE_SPACE (buf);
6626   sym_length = check_macro_name (buf, "macro");
6627
6628   while ((hp = lookup (buf, sym_length, -1)) != NULL) {
6629     /* If we are generating additional info for debugging (with -g) we
6630        need to pass through all effective #undef commands.  */
6631     if (debug_output && op)
6632       pass_thru_directive (orig_buf, limit, op, keyword);
6633     if (hp->type != T_MACRO)
6634       warning ("undefining `%s'", hp->name);
6635     delete_macro (hp);
6636   }
6637
6638   if (pedantic) {
6639     buf += sym_length;
6640     SKIP_WHITE_SPACE (buf);
6641     if (buf != limit)
6642       pedwarn ("garbage after `#undef' directive");
6643   }
6644   return 0;
6645 }
6646 \f
6647 /*
6648  * Report an error detected by the program we are processing.
6649  * Use the text of the line in the error message.
6650  * (We use error because it prints the filename & line#.)
6651  */
6652
6653 static int
6654 do_error (buf, limit, op, keyword)
6655      U_CHAR *buf, *limit;
6656      FILE_BUF *op;
6657      struct directive *keyword;
6658 {
6659   int length = limit - buf;
6660   U_CHAR *copy = (U_CHAR *) xmalloc (length + 1);
6661   bcopy ((char *) buf, (char *) copy, length);
6662   copy[length] = 0;
6663   SKIP_WHITE_SPACE (copy);
6664   error ("#error %s", copy);
6665   return 0;
6666 }
6667
6668 /*
6669  * Report a warning detected by the program we are processing.
6670  * Use the text of the line in the warning message, then continue.
6671  * (We use error because it prints the filename & line#.)
6672  */
6673
6674 static int
6675 do_warning (buf, limit, op, keyword)
6676      U_CHAR *buf, *limit;
6677      FILE_BUF *op;
6678      struct directive *keyword;
6679 {
6680   int length = limit - buf;
6681   U_CHAR *copy = (U_CHAR *) xmalloc (length + 1);
6682   bcopy ((char *) buf, (char *) copy, length);
6683   copy[length] = 0;
6684   SKIP_WHITE_SPACE (copy);
6685   warning ("#warning %s", copy);
6686   return 0;
6687 }
6688
6689 /* Remember the name of the current file being read from so that we can
6690    avoid ever including it again.  */
6691
6692 static int
6693 do_once ()
6694 {
6695   int i;
6696   FILE_BUF *ip = NULL;
6697
6698   for (i = indepth; i >= 0; i--)
6699     if (instack[i].fname != NULL) {
6700       ip = &instack[i];
6701       break;
6702     }
6703
6704   if (ip != NULL) {
6705     struct file_name_list *new;
6706     
6707     new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
6708     new->next = dont_repeat_files;
6709     dont_repeat_files = new;
6710     new->fname = savestring (ip->fname);
6711     new->control_macro = 0;
6712     new->got_name_map = 0;
6713     new->c_system_include_path = 0;
6714   }
6715   return 0;
6716 }
6717
6718 /* #ident has already been copied to the output file, so just ignore it.  */
6719
6720 static int
6721 do_ident (buf, limit)
6722      U_CHAR *buf, *limit;
6723 {
6724   FILE_BUF trybuf;
6725   int len;
6726   FILE_BUF *op = &outbuf;
6727
6728   /* Allow #ident in system headers, since that's not user's fault.  */
6729   if (pedantic && !instack[indepth].system_header_p)
6730     pedwarn ("ANSI C does not allow `#ident'");
6731
6732   trybuf = expand_to_temp_buffer (buf, limit, 0, 0);
6733   buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
6734   bcopy ((char *) trybuf.buf, (char *) buf, trybuf.bufp - trybuf.buf);
6735   limit = buf + (trybuf.bufp - trybuf.buf);
6736   len = (limit - buf);
6737   free (trybuf.buf);
6738
6739   /* Output directive name.  */
6740   check_expand (op, 7);
6741   bcopy ("#ident ", (char *) op->bufp, 7);
6742   op->bufp += 7;
6743
6744   /* Output the expanded argument line.  */
6745   check_expand (op, len);
6746   bcopy ((char *) buf, (char *) op->bufp, len);
6747   op->bufp += len;
6748
6749   return 0;
6750 }
6751
6752 /* #pragma and its argument line have already been copied to the output file.
6753    Just check for some recognized pragmas that need validation here.  */
6754
6755 static int
6756 do_pragma (buf, limit)
6757      U_CHAR *buf, *limit;
6758 {
6759   SKIP_WHITE_SPACE (buf);
6760   if (!strncmp (buf, "once", 4)) {
6761     /* Allow #pragma once in system headers, since that's not the user's
6762        fault.  */
6763     if (!instack[indepth].system_header_p)
6764       warning ("`#pragma once' is obsolete");
6765     do_once ();
6766   }
6767
6768   if (!strncmp (buf, "implementation", 14)) {
6769     /* Be quiet about `#pragma implementation' for a file only if it hasn't
6770        been included yet.  */
6771     struct file_name_list *ptr;
6772     U_CHAR *p = buf + 14, *fname, *inc_fname;
6773     SKIP_WHITE_SPACE (p);
6774     if (*p == '\n' || *p != '\"')
6775       return 0;
6776
6777     fname = p + 1;
6778     if (p = (U_CHAR *) index (fname, '\"'))
6779       *p = '\0';
6780     
6781     for (ptr = all_include_files; ptr; ptr = ptr->next) {
6782       inc_fname = (U_CHAR *) rindex (ptr->fname, '/');
6783       inc_fname = inc_fname ? inc_fname + 1 : (U_CHAR *) ptr->fname;
6784       if (inc_fname && !strcmp (inc_fname, fname))
6785         warning ("`#pragma implementation' for `%s' appears after file is included",
6786                  fname);
6787     }
6788   }
6789
6790   return 0;
6791 }
6792
6793 #if 0
6794 /* This was a fun hack, but #pragma seems to start to be useful.
6795    By failing to recognize it, we pass it through unchanged to cc1.  */
6796
6797 /*
6798  * the behavior of the #pragma directive is implementation defined.
6799  * this implementation defines it as follows.
6800  */
6801
6802 static int
6803 do_pragma ()
6804 {
6805   close (0);
6806   if (open ("/dev/tty", O_RDONLY, 0666) != 0)
6807     goto nope;
6808   close (1);
6809   if (open ("/dev/tty", O_WRONLY, 0666) != 1)
6810     goto nope;
6811   execl ("/usr/games/hack", "#pragma", 0);
6812   execl ("/usr/games/rogue", "#pragma", 0);
6813   execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
6814   execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
6815 nope:
6816   fatal ("You are in a maze of twisty compiler features, all different");
6817 }
6818 #endif
6819
6820 /* Just ignore #sccs, on systems where we define it at all.  */
6821
6822 static int
6823 do_sccs ()
6824 {
6825   if (pedantic)
6826     pedwarn ("ANSI C does not allow `#sccs'");
6827   return 0;
6828 }
6829 \f
6830 /*
6831  * handle #if command by
6832  *   1) inserting special `defined' keyword into the hash table
6833  *      that gets turned into 0 or 1 by special_symbol (thus,
6834  *      if the luser has a symbol called `defined' already, it won't
6835  *      work inside the #if command)
6836  *   2) rescan the input into a temporary output buffer
6837  *   3) pass the output buffer to the yacc parser and collect a value
6838  *   4) clean up the mess left from steps 1 and 2.
6839  *   5) call conditional_skip to skip til the next #endif (etc.),
6840  *      or not, depending on the value from step 3.
6841  */
6842
6843 static int
6844 do_if (buf, limit, op, keyword)
6845      U_CHAR *buf, *limit;
6846      FILE_BUF *op;
6847      struct directive *keyword;
6848 {
6849   HOST_WIDE_INT value;
6850   FILE_BUF *ip = &instack[indepth];
6851
6852   value = eval_if_expression (buf, limit - buf);
6853   conditional_skip (ip, value == 0, T_IF, NULL_PTR, op);
6854   return 0;
6855 }
6856
6857 /*
6858  * handle a #elif directive by not changing  if_stack  either.
6859  * see the comment above do_else.
6860  */
6861
6862 static int
6863 do_elif (buf, limit, op, keyword)
6864      U_CHAR *buf, *limit;
6865      FILE_BUF *op;
6866      struct directive *keyword;
6867 {
6868   HOST_WIDE_INT value;
6869   FILE_BUF *ip = &instack[indepth];
6870
6871   if (if_stack == instack[indepth].if_stack) {
6872     error ("`#elif' not within a conditional");
6873     return 0;
6874   } else {
6875     if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
6876       error ("`#elif' after `#else'");
6877       fprintf (stderr, " (matches line %d", if_stack->lineno);
6878       if (if_stack->fname != NULL && ip->fname != NULL &&
6879           strcmp (if_stack->fname, ip->nominal_fname) != 0)
6880         fprintf (stderr, ", file %s", if_stack->fname);
6881       fprintf (stderr, ")\n");
6882     }
6883     if_stack->type = T_ELIF;
6884   }
6885
6886   if (if_stack->if_succeeded)
6887     skip_if_group (ip, 0, op);
6888   else {
6889     value = eval_if_expression (buf, limit - buf);
6890     if (value == 0)
6891       skip_if_group (ip, 0, op);
6892     else {
6893       ++if_stack->if_succeeded; /* continue processing input */
6894       output_line_command (ip, op, 1, same_file);
6895     }
6896   }
6897   return 0;
6898 }
6899
6900 /*
6901  * evaluate a #if expression in BUF, of length LENGTH,
6902  * then parse the result as a C expression and return the value as an int.
6903  */
6904 static HOST_WIDE_INT
6905 eval_if_expression (buf, length)
6906      U_CHAR *buf;
6907      int length;
6908 {
6909   FILE_BUF temp_obuf;
6910   HASHNODE *save_defined;
6911   HOST_WIDE_INT value;
6912
6913   save_defined = install ("defined", -1, T_SPEC_DEFINED, NULL_PTR, -1);
6914   pcp_inside_if = 1;
6915   temp_obuf = expand_to_temp_buffer (buf, buf + length, 0, 1);
6916   pcp_inside_if = 0;
6917   delete_macro (save_defined);  /* clean up special symbol */
6918
6919   value = parse_c_expression (temp_obuf.buf);
6920
6921   free (temp_obuf.buf);
6922
6923   return value;
6924 }
6925
6926 /*
6927  * routine to handle ifdef/ifndef.  Try to look up the symbol,
6928  * then do or don't skip to the #endif/#else/#elif depending
6929  * on what directive is actually being processed.
6930  */
6931
6932 static int
6933 do_xifdef (buf, limit, op, keyword)
6934      U_CHAR *buf, *limit;
6935      FILE_BUF *op;
6936      struct directive *keyword;
6937 {
6938   int skip;
6939   FILE_BUF *ip = &instack[indepth];
6940   U_CHAR *end; 
6941   int start_of_file = 0;
6942   U_CHAR *control_macro = 0;
6943
6944   /* Detect a #ifndef at start of file (not counting comments).  */
6945   if (ip->fname != 0 && keyword->type == T_IFNDEF) {
6946     U_CHAR *p = ip->buf;
6947     while (p != directive_start) {
6948       U_CHAR c = *p++;
6949       if (is_space[c])
6950         ;
6951       else if (c == '/' && p != ip->bufp && *p == '*') {
6952         /* Skip this comment.  */
6953         int junk = 0;
6954         U_CHAR *save_bufp = ip->bufp;
6955         ip->bufp = p + 1;
6956         p = skip_to_end_of_comment (ip, &junk, 1);
6957         ip->bufp = save_bufp;
6958       } else {
6959         goto fail;
6960       }
6961     }
6962     /* If we get here, this conditional is the beginning of the file.  */
6963     start_of_file = 1;
6964   fail: ;
6965   }
6966
6967   /* Discard leading and trailing whitespace.  */
6968   SKIP_WHITE_SPACE (buf);
6969   while (limit != buf && is_hor_space[limit[-1]]) limit--;
6970
6971   /* Find the end of the identifier at the beginning.  */
6972   for (end = buf; is_idchar[*end]; end++);
6973
6974   if (end == buf) {
6975     skip = (keyword->type == T_IFDEF);
6976     if (! traditional)
6977       pedwarn (end == limit ? "`#%s' with no argument"
6978                : "`#%s' argument starts with punctuation",
6979                keyword->name);
6980   } else {
6981     HASHNODE *hp;
6982
6983     if (pedantic && buf[0] >= '0' && buf[0] <= '9')
6984       pedwarn ("`#%s' argument starts with a digit", keyword->name);
6985     else if (end != limit && !traditional)
6986       pedwarn ("garbage at end of `#%s' argument", keyword->name);
6987
6988     hp = lookup (buf, end-buf, -1);
6989
6990     if (pcp_outfile) {
6991       /* Output a precondition for this macro.  */
6992       if (hp &&
6993           (hp->type == T_CONST
6994            || (hp->type == T_MACRO && hp->value.defn->predefined)))
6995         fprintf (pcp_outfile, "#define %s\n", hp->name);
6996       else {
6997         U_CHAR *cp = buf;
6998         fprintf (pcp_outfile, "#undef ");
6999         while (is_idchar[*cp]) /* Ick! */
7000           fputc (*cp++, pcp_outfile);
7001         putc ('\n', pcp_outfile);
7002       }
7003     }
7004
7005     skip = (hp == NULL) ^ (keyword->type == T_IFNDEF);
7006     if (start_of_file && !skip) {
7007       control_macro = (U_CHAR *) xmalloc (end - buf + 1);
7008       bcopy ((char *) buf, (char *) control_macro, end - buf);
7009       control_macro[end - buf] = 0;
7010     }
7011   }
7012   
7013   conditional_skip (ip, skip, T_IF, control_macro, op);
7014   return 0;
7015 }
7016
7017 /* Push TYPE on stack; then, if SKIP is nonzero, skip ahead.
7018    If this is a #ifndef starting at the beginning of a file,
7019    CONTROL_MACRO is the macro name tested by the #ifndef.
7020    Otherwise, CONTROL_MACRO is 0.  */
7021
7022 static void
7023 conditional_skip (ip, skip, type, control_macro, op)
7024      FILE_BUF *ip;
7025      int skip;
7026      enum node_type type;
7027      U_CHAR *control_macro;
7028      FILE_BUF *op;
7029 {
7030   IF_STACK_FRAME *temp;
7031
7032   temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
7033   temp->fname = ip->nominal_fname;
7034   temp->lineno = ip->lineno;
7035   temp->next = if_stack;
7036   temp->control_macro = control_macro;
7037   if_stack = temp;
7038
7039   if_stack->type = type;
7040
7041   if (skip != 0) {
7042     skip_if_group (ip, 0, op);
7043     return;
7044   } else {
7045     ++if_stack->if_succeeded;
7046     output_line_command (ip, &outbuf, 1, same_file);
7047   }
7048 }
7049
7050 /*
7051  * skip to #endif, #else, or #elif.  adjust line numbers, etc.
7052  * leaves input ptr at the sharp sign found.
7053  * If ANY is nonzero, return at next directive of any sort.
7054  */
7055 static void
7056 skip_if_group (ip, any, op)
7057      FILE_BUF *ip;
7058      int any;
7059      FILE_BUF *op;
7060 {
7061   register U_CHAR *bp = ip->bufp, *cp;
7062   register U_CHAR *endb = ip->buf + ip->length;
7063   struct directive *kt;
7064   IF_STACK_FRAME *save_if_stack = if_stack; /* don't pop past here */
7065   U_CHAR *beg_of_line = bp;
7066   register int ident_length;
7067   U_CHAR *ident, *after_ident;
7068   /* Save info about where the group starts.  */
7069   U_CHAR *beg_of_group = bp;
7070   int beg_lineno = ip->lineno;
7071
7072   if (output_conditionals && op != 0) {
7073     char *ptr = "#failed\n";
7074     int len = strlen (ptr);
7075
7076     if (op->bufp > op->buf && op->bufp[-1] != '\n')
7077       {
7078         *op->bufp++ = '\n';
7079         op->lineno++;
7080       }
7081     check_expand (op, len);
7082     bcopy (ptr, (char *) op->bufp, len);
7083     op->bufp += len;
7084     op->lineno++;
7085     output_line_command (ip, op, 1, 0);
7086   }
7087
7088   while (bp < endb) {
7089     switch (*bp++) {
7090     case '/':                   /* possible comment */
7091       if (*bp == '\\' && bp[1] == '\n')
7092         newline_fix (bp);
7093       if (*bp == '*'
7094           || (cplusplus_comments && *bp == '/')) {
7095         ip->bufp = ++bp;
7096         bp = skip_to_end_of_comment (ip, &ip->lineno, 0);
7097       }
7098       break;
7099     case '\"':
7100     case '\'':
7101       bp = skip_quoted_string (bp - 1, endb, ip->lineno, &ip->lineno,
7102                                NULL_PTR, NULL_PTR);
7103       break;
7104     case '\\':
7105       /* Char after backslash loses its special meaning.  */
7106       if (bp < endb) {
7107         if (*bp == '\n')
7108           ++ip->lineno;         /* But do update the line-count.  */
7109         bp++;
7110       }
7111       break;
7112     case '\n':
7113       ++ip->lineno;
7114       beg_of_line = bp;
7115       break;
7116     case '%':
7117       if (beg_of_line == 0 || traditional)
7118         break;
7119       ip->bufp = bp - 1;
7120       while (bp[0] == '\\' && bp[1] == '\n')
7121         bp += 2;
7122       if (*bp == ':')
7123         goto sharp_token;
7124       break;
7125     case '#':
7126       /* # keyword: a # must be first nonblank char on the line */
7127       if (beg_of_line == 0)
7128         break;
7129       ip->bufp = bp - 1;
7130     sharp_token:
7131       /* Scan from start of line, skipping whitespace, comments
7132          and backslash-newlines, and see if we reach this #.
7133          If not, this # is not special.  */
7134       bp = beg_of_line;
7135       /* If -traditional, require # to be at beginning of line.  */
7136       if (!traditional) {
7137         while (1) {
7138           if (is_hor_space[*bp])
7139             bp++;
7140           else if (*bp == '\\' && bp[1] == '\n')
7141             bp += 2;
7142           else if (*bp == '/' && bp[1] == '*') {
7143             bp += 2;
7144             while (!(*bp == '*' && bp[1] == '/'))
7145               bp++;
7146             bp += 2;
7147           }
7148           /* There is no point in trying to deal with C++ // comments here,
7149              because if there is one, then this # must be part of the
7150              comment and we would never reach here.  */
7151           else break;
7152         }
7153       }
7154       if (bp != ip->bufp) {
7155         bp = ip->bufp + 1;      /* Reset bp to after the #.  */
7156         break;
7157       }
7158
7159       bp = ip->bufp + 1;        /* Point after the '#' */
7160       if (ip->bufp[0] == '%') {
7161         /* Skip past the ':' again.  */
7162         while (*bp == '\\') {
7163           ip->lineno++;
7164           bp += 2;
7165         }
7166         bp++;
7167       }
7168
7169       /* Skip whitespace and \-newline.  */
7170       while (1) {
7171         if (is_hor_space[*bp])
7172           bp++;
7173         else if (*bp == '\\' && bp[1] == '\n')
7174           bp += 2;
7175         else if (*bp == '/' && bp[1] == '*') {
7176           bp += 2;
7177           while (!(*bp == '*' && bp[1] == '/')) {
7178             if (*bp == '\n')
7179               ip->lineno++;
7180             bp++;
7181           }
7182           bp += 2;
7183         } else if (cplusplus_comments && *bp == '/' && bp[1] == '/') {
7184           bp += 2;
7185           while (bp[-1] == '\\' || *bp != '\n') {
7186             if (*bp == '\n')
7187               ip->lineno++;
7188             bp++;
7189           }
7190         }
7191         else break;
7192       }
7193
7194       cp = bp;
7195
7196       /* Now find end of directive name.
7197          If we encounter a backslash-newline, exchange it with any following
7198          symbol-constituents so that we end up with a contiguous name.  */
7199
7200       while (1) {
7201         if (is_idchar[*bp])
7202           bp++;
7203         else {
7204           if (*bp == '\\' && bp[1] == '\n')
7205             name_newline_fix (bp);
7206           if (is_idchar[*bp])
7207             bp++;
7208           else break;
7209         }
7210       }
7211       ident_length = bp - cp;
7212       ident = cp;
7213       after_ident = bp;
7214
7215       /* A line of just `#' becomes blank.  */
7216
7217       if (ident_length == 0 && *after_ident == '\n') {
7218         continue;
7219       }
7220
7221       if (ident_length == 0 || !is_idstart[*ident]) {
7222         U_CHAR *p = ident;
7223         while (is_idchar[*p]) {
7224           if (*p < '0' || *p > '9')
7225             break;
7226           p++;
7227         }
7228         /* Handle # followed by a line number.  */
7229         if (p != ident && !is_idchar[*p]) {
7230           if (pedantic)
7231             pedwarn ("`#' followed by integer");
7232           continue;
7233         }
7234
7235         /* Avoid error for `###' and similar cases unless -pedantic.  */
7236         if (p == ident) {
7237           while (*p == '#' || is_hor_space[*p]) p++;
7238           if (*p == '\n') {
7239             if (pedantic && !lang_asm)
7240               pedwarn ("invalid preprocessor directive");
7241             continue;
7242           }
7243         }
7244
7245         if (!lang_asm && pedantic)
7246           pedwarn ("invalid preprocessor directive name");
7247         continue;
7248       }
7249
7250       for (kt = directive_table; kt->length >= 0; kt++) {
7251         IF_STACK_FRAME *temp;
7252         if (ident_length == kt->length
7253             && strncmp (cp, kt->name, kt->length) == 0) {
7254           /* If we are asked to return on next directive, do so now.  */
7255           if (any)
7256             goto done;
7257
7258           switch (kt->type) {
7259           case T_IF:
7260           case T_IFDEF:
7261           case T_IFNDEF:
7262             temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
7263             temp->next = if_stack;
7264             if_stack = temp;
7265             temp->lineno = ip->lineno;
7266             temp->fname = ip->nominal_fname;
7267             temp->type = kt->type;
7268             break;
7269           case T_ELSE:
7270           case T_ENDIF:
7271             if (pedantic && if_stack != save_if_stack)
7272               validate_else (bp);
7273           case T_ELIF:
7274             if (if_stack == instack[indepth].if_stack) {
7275               error ("`#%s' not within a conditional", kt->name);
7276               break;
7277             }
7278             else if (if_stack == save_if_stack)
7279               goto done;                /* found what we came for */
7280
7281             if (kt->type != T_ENDIF) {
7282               if (if_stack->type == T_ELSE)
7283                 error ("`#else' or `#elif' after `#else'");
7284               if_stack->type = kt->type;
7285               break;
7286             }
7287
7288             temp = if_stack;
7289             if_stack = if_stack->next;
7290             free (temp);
7291             break;
7292           }
7293           break;
7294         }
7295       }
7296       /* Don't let erroneous code go by.  */
7297       if (kt->length < 0 && !lang_asm && pedantic)
7298         pedwarn ("invalid preprocessor directive name");
7299     }
7300   }
7301
7302   ip->bufp = bp;
7303   /* after this returns, rescan will exit because ip->bufp
7304      now points to the end of the buffer.
7305      rescan is responsible for the error message also.  */
7306
7307  done:
7308   if (output_conditionals && op != 0) {
7309     char *ptr = "#endfailed\n";
7310     int len = strlen (ptr);
7311
7312     if (op->bufp > op->buf && op->bufp[-1] != '\n')
7313       {
7314         *op->bufp++ = '\n';
7315         op->lineno++;
7316       }
7317     check_expand (op, beg_of_line - beg_of_group);
7318     bcopy ((char *) beg_of_group, (char *) op->bufp,
7319            beg_of_line - beg_of_group);
7320     op->bufp += beg_of_line - beg_of_group;
7321     op->lineno += ip->lineno - beg_lineno;
7322     check_expand (op, len);
7323     bcopy (ptr, (char *) op->bufp, len);
7324     op->bufp += len;
7325     op->lineno++;
7326   }
7327 }
7328
7329 /*
7330  * handle a #else directive.  Do this by just continuing processing
7331  * without changing  if_stack ;  this is so that the error message
7332  * for missing #endif's etc. will point to the original #if.  It
7333  * is possible that something different would be better.
7334  */
7335
7336 static int
7337 do_else (buf, limit, op, keyword)
7338      U_CHAR *buf, *limit;
7339      FILE_BUF *op;
7340      struct directive *keyword;
7341 {
7342   FILE_BUF *ip = &instack[indepth];
7343
7344   if (pedantic) {
7345     SKIP_WHITE_SPACE (buf);
7346     if (buf != limit)
7347       pedwarn ("text following `#else' violates ANSI standard");
7348   }
7349
7350   if (if_stack == instack[indepth].if_stack) {
7351     error ("`#else' not within a conditional");
7352     return 0;
7353   } else {
7354     /* #ifndef can't have its special treatment for containing the whole file
7355        if it has a #else clause.  */
7356     if_stack->control_macro = 0;
7357
7358     if (if_stack->type != T_IF && if_stack->type != T_ELIF) {
7359       error ("`#else' after `#else'");
7360       fprintf (stderr, " (matches line %d", if_stack->lineno);
7361       if (strcmp (if_stack->fname, ip->nominal_fname) != 0)
7362         fprintf (stderr, ", file %s", if_stack->fname);
7363       fprintf (stderr, ")\n");
7364     }
7365     if_stack->type = T_ELSE;
7366   }
7367
7368   if (if_stack->if_succeeded)
7369     skip_if_group (ip, 0, op);
7370   else {
7371     ++if_stack->if_succeeded;   /* continue processing input */
7372     output_line_command (ip, op, 1, same_file);
7373   }
7374   return 0;
7375 }
7376
7377 /*
7378  * unstack after #endif command
7379  */
7380
7381 static int
7382 do_endif (buf, limit, op, keyword)
7383      U_CHAR *buf, *limit;
7384      FILE_BUF *op;
7385      struct directive *keyword;
7386 {
7387   if (pedantic) {
7388     SKIP_WHITE_SPACE (buf);
7389     if (buf != limit)
7390       pedwarn ("text following `#endif' violates ANSI standard");
7391   }
7392
7393   if (if_stack == instack[indepth].if_stack)
7394     error ("unbalanced `#endif'");
7395   else {
7396     IF_STACK_FRAME *temp = if_stack;
7397     if_stack = if_stack->next;
7398     if (temp->control_macro != 0) {
7399       /* This #endif matched a #ifndef at the start of the file.
7400          See if it is at the end of the file.  */
7401       FILE_BUF *ip = &instack[indepth];
7402       U_CHAR *p = ip->bufp;
7403       U_CHAR *ep = ip->buf + ip->length;
7404
7405       while (p != ep) {
7406         U_CHAR c = *p++;
7407         if (!is_space[c]) {
7408           if (c == '/' && p != ep && *p == '*') {
7409             /* Skip this comment.  */
7410             int junk = 0;
7411             U_CHAR *save_bufp = ip->bufp;
7412             ip->bufp = p + 1;
7413             p = skip_to_end_of_comment (ip, &junk, 1);
7414             ip->bufp = save_bufp;
7415           } else
7416             goto fail;
7417         }
7418       }
7419       /* If we get here, this #endif ends a #ifndef
7420          that contains all of the file (aside from whitespace).
7421          Arrange not to include the file again
7422          if the macro that was tested is defined.
7423
7424          Do not do this for the top-level file in a -include or any
7425          file in a -imacros.  */
7426       if (indepth != 0
7427           && ! (indepth == 1 && no_record_file)
7428           && ! (no_record_file && no_output))
7429         record_control_macro (ip->fname, temp->control_macro);
7430     fail: ;
7431     }
7432     free (temp);
7433     output_line_command (&instack[indepth], op, 1, same_file);
7434   }
7435   return 0;
7436 }
7437
7438 /* When an #else or #endif is found while skipping failed conditional,
7439    if -pedantic was specified, this is called to warn about text after
7440    the command name.  P points to the first char after the command name.  */
7441
7442 static void
7443 validate_else (p)
7444      register U_CHAR *p;
7445 {
7446   /* Advance P over whitespace and comments.  */
7447   while (1) {
7448     if (*p == '\\' && p[1] == '\n')
7449       p += 2;
7450     if (is_hor_space[*p])
7451       p++;
7452     else if (*p == '/') {
7453       if (p[1] == '\\' && p[2] == '\n')
7454         newline_fix (p + 1);
7455       if (p[1] == '*') {
7456         p += 2;
7457         /* Don't bother warning about unterminated comments
7458            since that will happen later.  Just be sure to exit.  */
7459         while (*p) {
7460           if (p[1] == '\\' && p[2] == '\n')
7461             newline_fix (p + 1);
7462           if (*p == '*' && p[1] == '/') {
7463             p += 2;
7464             break;
7465           }
7466           p++;
7467         }
7468       }
7469       else if (cplusplus_comments && p[1] == '/') {
7470         p += 2;
7471         while (*p && (*p != '\n' || p[-1] == '\\'))
7472           p++;
7473       }
7474     } else break;
7475   }
7476   if (*p && *p != '\n')
7477     pedwarn ("text following `#else' or `#endif' violates ANSI standard");
7478 }
7479 \f
7480 /* Skip a comment, assuming the input ptr immediately follows the
7481    initial slash-star.  Bump *LINE_COUNTER for each newline.
7482    (The canonical line counter is &ip->lineno.)
7483    Don't use this routine (or the next one) if bumping the line
7484    counter is not sufficient to deal with newlines in the string.
7485
7486    If NOWARN is nonzero, don't warn about slash-star inside a comment.
7487    This feature is useful when processing a comment that is going to be
7488    processed or was processed at another point in the preprocessor,
7489    to avoid a duplicate warning.  Likewise for unterminated comment errors.  */
7490
7491 static U_CHAR *
7492 skip_to_end_of_comment (ip, line_counter, nowarn)
7493      register FILE_BUF *ip;
7494      int *line_counter;         /* place to remember newlines, or NULL */
7495      int nowarn;
7496 {
7497   register U_CHAR *limit = ip->buf + ip->length;
7498   register U_CHAR *bp = ip->bufp;
7499   FILE_BUF *op = &outbuf;       /* JF */
7500   int output = put_out_comments && !line_counter;
7501   int start_line = line_counter ? *line_counter : 0;
7502
7503         /* JF this line_counter stuff is a crock to make sure the
7504            comment is only put out once, no matter how many times
7505            the comment is skipped.  It almost works */
7506   if (output) {
7507     *op->bufp++ = '/';
7508     *op->bufp++ = '*';
7509   }
7510   if (cplusplus_comments && bp[-1] == '/') {
7511     if (output) {
7512       while (bp < limit) {
7513         *op->bufp++ = *bp;
7514         if (*bp == '\n' && bp[-1] != '\\')
7515           break;
7516         if (*bp == '\n') {
7517           ++*line_counter;
7518           ++op->lineno;
7519         }
7520         bp++;
7521       }
7522       op->bufp[-1] = '*';
7523       *op->bufp++ = '/';
7524       *op->bufp++ = '\n';
7525     } else {
7526       while (bp < limit) {
7527         if (bp[-1] != '\\' && *bp == '\n') {
7528           break;
7529         } else {
7530           if (*bp == '\n' && line_counter)
7531             ++*line_counter;
7532           bp++;
7533         }
7534       }
7535     }
7536     ip->bufp = bp;
7537     return bp;
7538   }
7539   while (bp < limit) {
7540     if (output)
7541       *op->bufp++ = *bp;
7542     switch (*bp++) {
7543     case '/':
7544       if (warn_comments && !nowarn && bp < limit && *bp == '*')
7545         warning ("`/*' within comment");
7546       break;
7547     case '\n':
7548       /* If this is the end of the file, we have an unterminated comment.
7549          Don't swallow the newline.  We are guaranteed that there will be a
7550          trailing newline and various pieces assume it's there.  */
7551       if (bp == limit)
7552         {
7553           --bp;
7554           --limit;
7555           break;
7556         }
7557       if (line_counter != NULL)
7558         ++*line_counter;
7559       if (output)
7560         ++op->lineno;
7561       break;
7562     case '*':
7563       if (*bp == '\\' && bp[1] == '\n')
7564         newline_fix (bp);
7565       if (*bp == '/') {
7566         if (output)
7567           *op->bufp++ = '/';
7568         ip->bufp = ++bp;
7569         return bp;
7570       }
7571       break;
7572     }
7573   }
7574
7575   if (!nowarn)
7576     error_with_line (line_for_error (start_line), "unterminated comment");
7577   ip->bufp = bp;
7578   return bp;
7579 }
7580
7581 /*
7582  * Skip over a quoted string.  BP points to the opening quote.
7583  * Returns a pointer after the closing quote.  Don't go past LIMIT.
7584  * START_LINE is the line number of the starting point (but it need
7585  * not be valid if the starting point is inside a macro expansion).
7586  *
7587  * The input stack state is not changed.
7588  *
7589  * If COUNT_NEWLINES is nonzero, it points to an int to increment
7590  * for each newline passed.
7591  *
7592  * If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
7593  * if we pass a backslash-newline.
7594  *
7595  * If EOFP is nonzero, set *EOFP to 1 if the string is unterminated.
7596  */
7597 static U_CHAR *
7598 skip_quoted_string (bp, limit, start_line, count_newlines, backslash_newlines_p, eofp)
7599      register U_CHAR *bp;
7600      register U_CHAR *limit;
7601      int start_line;
7602      int *count_newlines;
7603      int *backslash_newlines_p;
7604      int *eofp;
7605 {
7606   register U_CHAR c, match;
7607
7608   match = *bp++;
7609   while (1) {
7610     if (bp >= limit) {
7611       error_with_line (line_for_error (start_line),
7612                        "unterminated string or character constant");
7613       error_with_line (multiline_string_line,
7614                        "possible real start of unterminated constant");
7615       multiline_string_line = 0;
7616       if (eofp)
7617         *eofp = 1;
7618       break;
7619     }
7620     c = *bp++;
7621     if (c == '\\') {
7622       while (*bp == '\\' && bp[1] == '\n') {
7623         if (backslash_newlines_p)
7624           *backslash_newlines_p = 1;
7625         if (count_newlines)
7626           ++*count_newlines;
7627         bp += 2;
7628       }
7629       if (*bp == '\n' && count_newlines) {
7630         if (backslash_newlines_p)
7631           *backslash_newlines_p = 1;
7632         ++*count_newlines;
7633       }
7634       bp++;
7635     } else if (c == '\n') {
7636       if (traditional) {
7637         /* Unterminated strings and character constants are 'valid'.  */
7638         bp--;   /* Don't consume the newline. */
7639         if (eofp)
7640           *eofp = 1;
7641         break;
7642       }
7643       if (pedantic || match == '\'') {
7644         error_with_line (line_for_error (start_line),
7645                          "unterminated string or character constant");
7646         bp--;
7647         if (eofp)
7648           *eofp = 1;
7649         break;
7650       }
7651       /* If not traditional, then allow newlines inside strings.  */
7652       if (count_newlines)
7653         ++*count_newlines;
7654       if (multiline_string_line == 0)
7655         multiline_string_line = start_line;
7656     } else if (c == match)
7657       break;
7658   }
7659   return bp;
7660 }
7661
7662 /* Place into DST a quoted string representing the string SRC.
7663    Return the address of DST's terminating null.  */
7664 static char *
7665 quote_string (dst, src)
7666      char *dst, *src;
7667 {
7668   U_CHAR c;
7669
7670   *dst++ = '\"';
7671   for (;;)
7672     switch ((c = *src++))
7673       {
7674       default:
7675         if (isprint (c))
7676           *dst++ = c;
7677         else
7678           {
7679             sprintf (dst, "\\%03o", c);
7680             dst += 4;
7681           }
7682         break;
7683
7684       case '\"':
7685       case '\\':
7686         *dst++ = '\\';
7687         *dst++ = c;
7688         break;
7689       
7690       case '\0':
7691         *dst++ = '\"';
7692         *dst = '\0';
7693         return dst;
7694       }
7695 }
7696
7697 /* Skip across a group of balanced parens, starting from IP->bufp.
7698    IP->bufp is updated.  Use this with IP->bufp pointing at an open-paren.
7699
7700    This does not handle newlines, because it's used for the arg of #if,
7701    where there aren't any newlines.  Also, backslash-newline can't appear.  */
7702
7703 static U_CHAR *
7704 skip_paren_group (ip)
7705      register FILE_BUF *ip;
7706 {
7707   U_CHAR *limit = ip->buf + ip->length;
7708   U_CHAR *p = ip->bufp;
7709   int depth = 0;
7710   int lines_dummy = 0;
7711
7712   while (p != limit) {
7713     int c = *p++;
7714     switch (c) {
7715     case '(':
7716       depth++;
7717       break;
7718
7719     case ')':
7720       depth--;
7721       if (depth == 0)
7722         return ip->bufp = p;
7723       break;
7724
7725     case '/':
7726       if (*p == '*') {
7727         ip->bufp = p;
7728         p = skip_to_end_of_comment (ip, &lines_dummy, 0);
7729         p = ip->bufp;
7730       }
7731
7732     case '"':
7733     case '\'':
7734       {
7735         int eofp = 0;
7736         p = skip_quoted_string (p - 1, limit, 0, NULL_PTR, NULL_PTR, &eofp);
7737         if (eofp)
7738           return ip->bufp = p;
7739       }
7740       break;
7741     }
7742   }
7743
7744   ip->bufp = p;
7745   return p;
7746 }
7747 \f
7748 /*
7749  * write out a #line command, for instance, after an #include file.
7750  * If CONDITIONAL is nonzero, we can omit the #line if it would
7751  * appear to be a no-op, and we can output a few newlines instead
7752  * if we want to increase the line number by a small amount.
7753  * FILE_CHANGE says whether we are entering a file, leaving, or neither.
7754  */
7755
7756 static void
7757 output_line_command (ip, op, conditional, file_change)
7758      FILE_BUF *ip, *op;
7759      int conditional;
7760      enum file_change_code file_change;
7761 {
7762   int len;
7763   char *line_cmd_buf, *line_end;
7764
7765   if (no_line_commands
7766       || ip->fname == NULL
7767       || no_output) {
7768     op->lineno = ip->lineno;
7769     return;
7770   }
7771
7772   if (conditional) {
7773     if (ip->lineno == op->lineno)
7774       return;
7775
7776     /* If the inherited line number is a little too small,
7777        output some newlines instead of a #line command.  */
7778     if (ip->lineno > op->lineno && ip->lineno < op->lineno + 8) {
7779       check_expand (op, 10);
7780       while (ip->lineno > op->lineno) {
7781         *op->bufp++ = '\n';
7782         op->lineno++;
7783       }
7784       return;
7785     }
7786   }
7787
7788   /* Don't output a line number of 0 if we can help it.  */
7789   if (ip->lineno == 0 && ip->bufp - ip->buf < ip->length
7790       && *ip->bufp == '\n') {
7791     ip->lineno++;
7792     ip->bufp++;
7793   }
7794
7795   line_cmd_buf = (char *) alloca (4 * strlen (ip->nominal_fname) + 100);
7796 #ifdef OUTPUT_LINE_COMMANDS
7797   sprintf (line_cmd_buf, "#line %d ", ip->lineno);
7798 #else
7799   sprintf (line_cmd_buf, "# %d ", ip->lineno);
7800 #endif
7801   line_end = quote_string (line_cmd_buf + strlen (line_cmd_buf),
7802                            ip->nominal_fname);
7803   if (file_change != same_file) {
7804     *line_end++ = ' ';
7805     *line_end++ = file_change == enter_file ? '1' : '2';
7806   }
7807   /* Tell cc1 if following text comes from a system header file.  */
7808   if (ip->system_header_p) {
7809     *line_end++ = ' ';
7810     *line_end++ = '3';
7811   }
7812 #ifndef NO_IMPLICIT_EXTERN_C
7813   /* Tell cc1plus if following text should be treated as C.  */
7814   if (ip->system_header_p == 2 && cplusplus) {
7815     *line_end++ = ' ';
7816     *line_end++ = '4';
7817   }
7818 #endif
7819   *line_end++ = '\n';
7820   len = line_end - line_cmd_buf;
7821   check_expand (op, len + 1);
7822   if (op->bufp > op->buf && op->bufp[-1] != '\n')
7823     *op->bufp++ = '\n';
7824   bcopy ((char *) line_cmd_buf, (char *) op->bufp, len);
7825   op->bufp += len;
7826   op->lineno = ip->lineno;
7827 }
7828 \f
7829 /* This structure represents one parsed argument in a macro call.
7830    `raw' points to the argument text as written (`raw_length' is its length).
7831    `expanded' points to the argument's macro-expansion
7832    (its length is `expand_length').
7833    `stringified_length' is the length the argument would have
7834    if stringified.
7835    `use_count' is the number of times this macro arg is substituted
7836    into the macro.  If the actual use count exceeds 10, 
7837    the value stored is 10.
7838    `free1' and `free2', if nonzero, point to blocks to be freed
7839    when the macro argument data is no longer needed.  */
7840
7841 struct argdata {
7842   U_CHAR *raw, *expanded;
7843   int raw_length, expand_length;
7844   int stringified_length;
7845   U_CHAR *free1, *free2;
7846   char newlines;
7847   char comments;
7848   char use_count;
7849 };
7850
7851 /* Expand a macro call.
7852    HP points to the symbol that is the macro being called.
7853    Put the result of expansion onto the input stack
7854    so that subsequent input by our caller will use it.
7855
7856    If macro wants arguments, caller has already verified that
7857    an argument list follows; arguments come from the input stack.  */
7858
7859 static void
7860 macroexpand (hp, op)
7861      HASHNODE *hp;
7862      FILE_BUF *op;
7863 {
7864   int nargs;
7865   DEFINITION *defn = hp->value.defn;
7866   register U_CHAR *xbuf;
7867   int xbuf_len;
7868   int start_line = instack[indepth].lineno;
7869   int rest_args, rest_zero;
7870
7871   CHECK_DEPTH (return;);
7872
7873   /* it might not actually be a macro.  */
7874   if (hp->type != T_MACRO) {
7875     special_symbol (hp, op);
7876     return;
7877   }
7878
7879   /* This macro is being used inside a #if, which means it must be */
7880   /* recorded as a precondition.  */
7881   if (pcp_inside_if && pcp_outfile && defn->predefined)
7882     dump_single_macro (hp, pcp_outfile);
7883   
7884   nargs = defn->nargs;
7885
7886   if (nargs >= 0) {
7887     register int i;
7888     struct argdata *args;
7889     char *parse_error = 0;
7890
7891     args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
7892
7893     for (i = 0; i < nargs; i++) {
7894       args[i].raw = (U_CHAR *) "";
7895       args[i].expanded = 0;
7896       args[i].raw_length = args[i].expand_length
7897         = args[i].stringified_length = 0;
7898       args[i].free1 = args[i].free2 = 0;
7899       args[i].use_count = 0;
7900     }
7901
7902     /* Parse all the macro args that are supplied.  I counts them.
7903        The first NARGS args are stored in ARGS.
7904        The rest are discarded.
7905        If rest_args is set then we assume macarg absorbed the rest of the args.
7906        */
7907     i = 0;
7908     rest_args = 0;
7909     do {
7910       /* Discard the open-parenthesis or comma before the next arg.  */
7911       ++instack[indepth].bufp;
7912       if (rest_args)
7913         continue;
7914       if (i < nargs || (nargs == 0 && i == 0)) {
7915         /* if we are working on last arg which absorbs rest of args... */
7916         if (i == nargs - 1 && defn->rest_args)
7917           rest_args = 1;
7918         parse_error = macarg (&args[i], rest_args);
7919       }
7920       else
7921         parse_error = macarg (NULL_PTR, 0);
7922       if (parse_error) {
7923         error_with_line (line_for_error (start_line), parse_error);
7924         break;
7925       }
7926       i++;
7927     } while (*instack[indepth].bufp != ')');
7928
7929     /* If we got one arg but it was just whitespace, call that 0 args.  */
7930     if (i == 1) {
7931       register U_CHAR *bp = args[0].raw;
7932       register U_CHAR *lim = bp + args[0].raw_length;
7933       /* cpp.texi says for foo ( ) we provide one argument.
7934          However, if foo wants just 0 arguments, treat this as 0.  */
7935       if (nargs == 0)
7936         while (bp != lim && is_space[*bp]) bp++;
7937       if (bp == lim)
7938         i = 0;
7939     }
7940
7941     /* Don't output an error message if we have already output one for
7942        a parse error above.  */
7943     rest_zero = 0;
7944     if (nargs == 0 && i > 0) {
7945       if (! parse_error)
7946         error ("arguments given to macro `%s'", hp->name);
7947     } else if (i < nargs) {
7948       /* traditional C allows foo() if foo wants one argument.  */
7949       if (nargs == 1 && i == 0 && traditional)
7950         ;
7951       /* the rest args token is allowed to absorb 0 tokens */
7952       else if (i == nargs - 1 && defn->rest_args)
7953         rest_zero = 1;
7954       else if (parse_error)
7955         ;
7956       else if (i == 0)
7957         error ("macro `%s' used without args", hp->name);
7958       else if (i == 1)
7959         error ("macro `%s' used with just one arg", hp->name);
7960       else
7961         error ("macro `%s' used with only %d args", hp->name, i);
7962     } else if (i > nargs) {
7963       if (! parse_error)
7964         error ("macro `%s' used with too many (%d) args", hp->name, i);
7965     }
7966
7967     /* Swallow the closeparen.  */
7968     ++instack[indepth].bufp;
7969
7970     /* If macro wants zero args, we parsed the arglist for checking only.
7971        Read directly from the macro definition.  */
7972     if (nargs == 0) {
7973       xbuf = defn->expansion;
7974       xbuf_len = defn->length;
7975     } else {
7976       register U_CHAR *exp = defn->expansion;
7977       register int offset;      /* offset in expansion,
7978                                    copied a piece at a time */
7979       register int totlen;      /* total amount of exp buffer filled so far */
7980
7981       register struct reflist *ap, *last_ap;
7982
7983       /* Macro really takes args.  Compute the expansion of this call.  */
7984
7985       /* Compute length in characters of the macro's expansion.
7986          Also count number of times each arg is used.  */
7987       xbuf_len = defn->length;
7988       for (ap = defn->pattern; ap != NULL; ap = ap->next) {
7989         if (ap->stringify)
7990           xbuf_len += args[ap->argno].stringified_length;
7991         else if (ap->raw_before || ap->raw_after || traditional)
7992           /* Add 4 for two newline-space markers to prevent
7993              token concatenation.  */
7994           xbuf_len += args[ap->argno].raw_length + 4;
7995         else {
7996           /* We have an ordinary (expanded) occurrence of the arg.
7997              So compute its expansion, if we have not already.  */
7998           if (args[ap->argno].expanded == 0) {
7999             FILE_BUF obuf;
8000             obuf = expand_to_temp_buffer (args[ap->argno].raw,
8001                                           args[ap->argno].raw + args[ap->argno].raw_length,
8002                                           1, 0);
8003
8004             args[ap->argno].expanded = obuf.buf;
8005             args[ap->argno].expand_length = obuf.length;
8006             args[ap->argno].free2 = obuf.buf;
8007           }
8008
8009           /* Add 4 for two newline-space markers to prevent
8010              token concatenation.  */
8011           xbuf_len += args[ap->argno].expand_length + 4;
8012         }
8013         if (args[ap->argno].use_count < 10)
8014           args[ap->argno].use_count++;
8015       }
8016
8017       xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
8018
8019       /* Generate in XBUF the complete expansion
8020          with arguments substituted in.
8021          TOTLEN is the total size generated so far.
8022          OFFSET is the index in the definition
8023          of where we are copying from.  */
8024       offset = totlen = 0;
8025       for (last_ap = NULL, ap = defn->pattern; ap != NULL;
8026            last_ap = ap, ap = ap->next) {
8027         register struct argdata *arg = &args[ap->argno];
8028         int count_before = totlen;
8029
8030         /* Add chars to XBUF.  */
8031         for (i = 0; i < ap->nchars; i++, offset++)
8032           xbuf[totlen++] = exp[offset];
8033
8034         /* If followed by an empty rest arg with concatenation,
8035            delete the last run of nonwhite chars.  */
8036         if (rest_zero && totlen > count_before
8037             && ((ap->rest_args && ap->raw_before)
8038                 || (last_ap != NULL && last_ap->rest_args
8039                     && last_ap->raw_after))) {
8040           /* Delete final whitespace.  */
8041           while (totlen > count_before && is_space[xbuf[totlen - 1]]) {
8042             totlen--;
8043           }
8044
8045           /* Delete the nonwhites before them.  */
8046           while (totlen > count_before && ! is_space[xbuf[totlen - 1]]) {
8047             totlen--;
8048           }
8049         }
8050
8051         if (ap->stringify != 0) {
8052           int arglen = arg->raw_length;
8053           int escaped = 0;
8054           int in_string = 0;
8055           int c;
8056           i = 0;
8057           while (i < arglen
8058                  && (c = arg->raw[i], is_space[c]))
8059             i++;
8060           while (i < arglen
8061                  && (c = arg->raw[arglen - 1], is_space[c]))
8062             arglen--;
8063           if (!traditional)
8064             xbuf[totlen++] = '\"'; /* insert beginning quote */
8065           for (; i < arglen; i++) {
8066             c = arg->raw[i];
8067
8068             /* Special markers Newline Space
8069                generate nothing for a stringified argument.  */
8070             if (c == '\n' && arg->raw[i+1] != '\n') {
8071               i++;
8072               continue;
8073             }
8074
8075             /* Internal sequences of whitespace are replaced by one space
8076                except within an string or char token.  */
8077             if (! in_string
8078                 && (c == '\n' ? arg->raw[i+1] == '\n' : is_space[c])) {
8079               while (1) {
8080                 /* Note that Newline Space does occur within whitespace
8081                    sequences; consider it part of the sequence.  */
8082                 if (c == '\n' && is_space[arg->raw[i+1]])
8083                   i += 2;
8084                 else if (c != '\n' && is_space[c])
8085                   i++;
8086                 else break;
8087                 c = arg->raw[i];
8088               }
8089               i--;
8090               c = ' ';
8091             }
8092
8093             if (escaped)
8094               escaped = 0;
8095             else {
8096               if (c == '\\')
8097                 escaped = 1;
8098               if (in_string) {
8099                 if (c == in_string)
8100                   in_string = 0;
8101               } else if (c == '\"' || c == '\'')
8102                 in_string = c;
8103             }
8104
8105             /* Escape these chars */
8106             if (c == '\"' || (in_string && c == '\\'))
8107               xbuf[totlen++] = '\\';
8108             if (isprint (c))
8109               xbuf[totlen++] = c;
8110             else {
8111               sprintf ((char *) &xbuf[totlen], "\\%03o", (unsigned int) c);
8112               totlen += 4;
8113             }
8114           }
8115           if (!traditional)
8116             xbuf[totlen++] = '\"'; /* insert ending quote */
8117         } else if (ap->raw_before || ap->raw_after || traditional) {
8118           U_CHAR *p1 = arg->raw;
8119           U_CHAR *l1 = p1 + arg->raw_length;
8120           if (ap->raw_before) {
8121             while (p1 != l1 && is_space[*p1]) p1++;
8122             while (p1 != l1 && is_idchar[*p1])
8123               xbuf[totlen++] = *p1++;
8124             /* Delete any no-reexpansion marker that follows
8125                an identifier at the beginning of the argument
8126                if the argument is concatenated with what precedes it.  */
8127             if (p1[0] == '\n' && p1[1] == '-')
8128               p1 += 2;
8129           } else if (!traditional) {
8130           /* Ordinary expanded use of the argument.
8131              Put in newline-space markers to prevent token pasting.  */
8132             xbuf[totlen++] = '\n';
8133             xbuf[totlen++] = ' ';
8134           }
8135           if (ap->raw_after) {
8136             /* Arg is concatenated after: delete trailing whitespace,
8137                whitespace markers, and no-reexpansion markers.  */
8138             while (p1 != l1) {
8139               if (is_space[l1[-1]]) l1--;
8140               else if (l1[-1] == '-') {
8141                 U_CHAR *p2 = l1 - 1;
8142                 /* If a `-' is preceded by an odd number of newlines then it
8143                    and the last newline are a no-reexpansion marker.  */
8144                 while (p2 != p1 && p2[-1] == '\n') p2--;
8145                 if ((l1 - 1 - p2) & 1) {
8146                   l1 -= 2;
8147                 }
8148                 else break;
8149               }
8150               else break;
8151             }
8152           }
8153
8154           bcopy ((char *) p1, (char *) (xbuf + totlen), l1 - p1);
8155           totlen += l1 - p1;
8156           if (!traditional && !ap->raw_after) {
8157             /* Ordinary expanded use of the argument.
8158                Put in newline-space markers to prevent token pasting.  */
8159             xbuf[totlen++] = '\n';
8160             xbuf[totlen++] = ' ';
8161           }
8162         } else {
8163           /* Ordinary expanded use of the argument.
8164              Put in newline-space markers to prevent token pasting.  */
8165           if (!traditional) {
8166             xbuf[totlen++] = '\n';
8167             xbuf[totlen++] = ' ';
8168           }
8169           bcopy ((char *) arg->expanded, (char *) (xbuf + totlen),
8170                  arg->expand_length);
8171           totlen += arg->expand_length;
8172           if (!traditional) {
8173             xbuf[totlen++] = '\n';
8174             xbuf[totlen++] = ' ';
8175           }
8176           /* If a macro argument with newlines is used multiple times,
8177              then only expand the newlines once.  This avoids creating output
8178              lines which don't correspond to any input line, which confuses
8179              gdb and gcov.  */
8180           if (arg->use_count > 1 && arg->newlines > 0) {
8181             /* Don't bother doing change_newlines for subsequent
8182                uses of arg.  */
8183             arg->use_count = 1;
8184             arg->expand_length
8185               = change_newlines (arg->expanded, arg->expand_length);
8186           }
8187         }
8188
8189         if (totlen > xbuf_len)
8190           abort ();
8191       }
8192
8193       /* if there is anything left of the definition
8194          after handling the arg list, copy that in too. */
8195
8196       for (i = offset; i < defn->length; i++) {
8197         /* if we've reached the end of the macro */
8198         if (exp[i] == ')')
8199           rest_zero = 0;
8200         if (! (rest_zero && last_ap != NULL && last_ap->rest_args
8201                && last_ap->raw_after))
8202           xbuf[totlen++] = exp[i];
8203       }
8204
8205       xbuf[totlen] = 0;
8206       xbuf_len = totlen;
8207
8208       for (i = 0; i < nargs; i++) {
8209         if (args[i].free1 != 0)
8210           free (args[i].free1);
8211         if (args[i].free2 != 0)
8212           free (args[i].free2);
8213       }
8214     }
8215   } else {
8216     xbuf = defn->expansion;
8217     xbuf_len = defn->length;
8218   }
8219
8220   /* Now put the expansion on the input stack
8221      so our caller will commence reading from it.  */
8222   {
8223     register FILE_BUF *ip2;
8224
8225     ip2 = &instack[++indepth];
8226
8227     ip2->fname = 0;
8228     ip2->nominal_fname = 0;
8229     /* This may not be exactly correct, but will give much better error
8230        messages for nested macro calls than using a line number of zero.  */
8231     ip2->lineno = start_line;
8232     ip2->buf = xbuf;
8233     ip2->length = xbuf_len;
8234     ip2->bufp = xbuf;
8235     ip2->free_ptr = (nargs > 0) ? xbuf : 0;
8236     ip2->macro = hp;
8237     ip2->if_stack = if_stack;
8238     ip2->system_header_p = 0;
8239
8240     /* Recursive macro use sometimes works traditionally.
8241        #define foo(x,y) bar (x (y,0), y)
8242        foo (foo, baz)  */
8243
8244     if (!traditional)
8245       hp->type = T_DISABLED;
8246   }
8247 }
8248 \f
8249 /*
8250  * Parse a macro argument and store the info on it into *ARGPTR.
8251  * REST_ARGS is passed to macarg1 to make it absorb the rest of the args.
8252  * Return nonzero to indicate a syntax error.
8253  */
8254
8255 static char *
8256 macarg (argptr, rest_args)
8257      register struct argdata *argptr;
8258      int rest_args;
8259 {
8260   FILE_BUF *ip = &instack[indepth];
8261   int paren = 0;
8262   int newlines = 0;
8263   int comments = 0;
8264
8265   /* Try to parse as much of the argument as exists at this
8266      input stack level.  */
8267   U_CHAR *bp = macarg1 (ip->bufp, ip->buf + ip->length,
8268                         &paren, &newlines, &comments, rest_args);
8269
8270   /* If we find the end of the argument at this level,
8271      set up *ARGPTR to point at it in the input stack.  */
8272   if (!(ip->fname != 0 && (newlines != 0 || comments != 0))
8273       && bp != ip->buf + ip->length) {
8274     if (argptr != 0) {
8275       argptr->raw = ip->bufp;
8276       argptr->raw_length = bp - ip->bufp;
8277       argptr->newlines = newlines;
8278     }
8279     ip->bufp = bp;
8280   } else {
8281     /* This input stack level ends before the macro argument does.
8282        We must pop levels and keep parsing.
8283        Therefore, we must allocate a temporary buffer and copy
8284        the macro argument into it.  */
8285     int bufsize = bp - ip->bufp;
8286     int extra = newlines;
8287     U_CHAR *buffer = (U_CHAR *) xmalloc (bufsize + extra + 1);
8288     int final_start = 0;
8289
8290     bcopy ((char *) ip->bufp, (char *) buffer, bufsize);
8291     ip->bufp = bp;
8292     ip->lineno += newlines;
8293
8294     while (bp == ip->buf + ip->length) {
8295       if (instack[indepth].macro == 0) {
8296         free (buffer);
8297         return "unterminated macro call";
8298       }
8299       ip->macro->type = T_MACRO;
8300       if (ip->free_ptr)
8301         free (ip->free_ptr);
8302       ip = &instack[--indepth];
8303       newlines = 0;
8304       comments = 0;
8305       bp = macarg1 (ip->bufp, ip->buf + ip->length, &paren,
8306                     &newlines, &comments, rest_args);
8307       final_start = bufsize;
8308       bufsize += bp - ip->bufp;
8309       extra += newlines;
8310       buffer = (U_CHAR *) xrealloc (buffer, bufsize + extra + 1);
8311       bcopy ((char *) ip->bufp, (char *) (buffer + bufsize - (bp - ip->bufp)),
8312              bp - ip->bufp);
8313       ip->bufp = bp;
8314       ip->lineno += newlines;
8315     }
8316
8317     /* Now, if arg is actually wanted, record its raw form,
8318        discarding comments and duplicating newlines in whatever
8319        part of it did not come from a macro expansion.
8320        EXTRA space has been preallocated for duplicating the newlines.
8321        FINAL_START is the index of the start of that part.  */
8322     if (argptr != 0) {
8323       argptr->raw = buffer;
8324       argptr->raw_length = bufsize;
8325       argptr->free1 = buffer;
8326       argptr->newlines = newlines;
8327       argptr->comments = comments;
8328       if ((newlines || comments) && ip->fname != 0)
8329         argptr->raw_length
8330           = final_start +
8331             discard_comments (argptr->raw + final_start,
8332                               argptr->raw_length - final_start,
8333                               newlines);
8334       argptr->raw[argptr->raw_length] = 0;
8335       if (argptr->raw_length > bufsize + extra)
8336         abort ();
8337     }
8338   }
8339
8340   /* If we are not discarding this argument,
8341      macroexpand it and compute its length as stringified.
8342      All this info goes into *ARGPTR.  */
8343
8344   if (argptr != 0) {
8345     register U_CHAR *buf, *lim;
8346     register int totlen;
8347
8348     buf = argptr->raw;
8349     lim = buf + argptr->raw_length;
8350
8351     while (buf != lim && is_space[*buf])
8352       buf++;
8353     while (buf != lim && is_space[lim[-1]])
8354       lim--;
8355     totlen = traditional ? 0 : 2;       /* Count opening and closing quote.  */
8356     while (buf != lim) {
8357       register U_CHAR c = *buf++;
8358       totlen++;
8359       /* Internal sequences of whitespace are replaced by one space
8360          in most cases, but not always.  So count all the whitespace
8361          in case we need to keep it all.  */
8362 #if 0
8363       if (is_space[c])
8364         SKIP_ALL_WHITE_SPACE (buf);
8365       else
8366 #endif
8367       if (c == '\"' || c == '\\') /* escape these chars */
8368         totlen++;
8369       else if (!isprint (c))
8370         totlen += 3;
8371     }
8372     argptr->stringified_length = totlen;
8373   }
8374   return 0;
8375 }
8376 \f
8377 /* Scan text from START (inclusive) up to LIMIT (exclusive),
8378    counting parens in *DEPTHPTR,
8379    and return if reach LIMIT
8380    or before a `)' that would make *DEPTHPTR negative
8381    or before a comma when *DEPTHPTR is zero.
8382    Single and double quotes are matched and termination
8383    is inhibited within them.  Comments also inhibit it.
8384    Value returned is pointer to stopping place.
8385
8386    Increment *NEWLINES each time a newline is passed.
8387    REST_ARGS notifies macarg1 that it should absorb the rest of the args.
8388    Set *COMMENTS to 1 if a comment is seen.  */
8389
8390 static U_CHAR *
8391 macarg1 (start, limit, depthptr, newlines, comments, rest_args)
8392      U_CHAR *start;
8393      register U_CHAR *limit;
8394      int *depthptr, *newlines, *comments;
8395      int rest_args;
8396 {
8397   register U_CHAR *bp = start;
8398
8399   while (bp < limit) {
8400     switch (*bp) {
8401     case '(':
8402       (*depthptr)++;
8403       break;
8404     case ')':
8405       if (--(*depthptr) < 0)
8406         return bp;
8407       break;
8408     case '\\':
8409       /* Traditionally, backslash makes following char not special.  */
8410       if (bp + 1 < limit && traditional)
8411         {
8412           bp++;
8413           /* But count source lines anyway.  */
8414           if (*bp == '\n')
8415             ++*newlines;
8416         }
8417       break;
8418     case '\n':
8419       ++*newlines;
8420       break;
8421     case '/':
8422       if (bp[1] == '\\' && bp[2] == '\n')
8423         newline_fix (bp + 1);
8424       if (cplusplus_comments && bp[1] == '/') {
8425         *comments = 1;
8426         bp += 2;
8427         while (bp < limit && (*bp != '\n' || bp[-1] == '\\')) {
8428           if (*bp == '\n') ++*newlines;
8429           bp++;
8430         }
8431         /* Now count the newline that we are about to skip.  */
8432         ++*newlines;
8433         break;
8434       }
8435       if (bp[1] != '*' || bp + 1 >= limit)
8436         break;
8437       *comments = 1;
8438       bp += 2;
8439       while (bp + 1 < limit) {
8440         if (bp[0] == '*'
8441             && bp[1] == '\\' && bp[2] == '\n')
8442           newline_fix (bp + 1);
8443         if (bp[0] == '*' && bp[1] == '/')
8444           break;
8445         if (*bp == '\n') ++*newlines;
8446         bp++;
8447       }
8448       break;
8449     case '\'':
8450     case '\"':
8451       {
8452         int quotec;
8453         for (quotec = *bp++; bp + 1 < limit && *bp != quotec; bp++) {
8454           if (*bp == '\\') {
8455             bp++;
8456             if (*bp == '\n')
8457               ++*newlines;
8458             while (*bp == '\\' && bp[1] == '\n') {
8459               bp += 2;
8460             }
8461           } else if (*bp == '\n') {
8462             ++*newlines;
8463             if (quotec == '\'')
8464               break;
8465           }
8466         }
8467       }
8468       break;
8469     case ',':
8470       /* if we've returned to lowest level and we aren't absorbing all args */
8471       if ((*depthptr) == 0 && rest_args == 0)
8472         return bp;
8473       break;
8474     }
8475     bp++;
8476   }
8477
8478   return bp;
8479 }
8480 \f
8481 /* Discard comments and duplicate newlines
8482    in the string of length LENGTH at START,
8483    except inside of string constants.
8484    The string is copied into itself with its beginning staying fixed.  
8485
8486    NEWLINES is the number of newlines that must be duplicated.
8487    We assume that that much extra space is available past the end
8488    of the string.  */
8489
8490 static int
8491 discard_comments (start, length, newlines)
8492      U_CHAR *start;
8493      int length;
8494      int newlines;
8495 {
8496   register U_CHAR *ibp;
8497   register U_CHAR *obp;
8498   register U_CHAR *limit;
8499   register int c;
8500
8501   /* If we have newlines to duplicate, copy everything
8502      that many characters up.  Then, in the second part,
8503      we will have room to insert the newlines
8504      while copying down.
8505      NEWLINES may actually be too large, because it counts
8506      newlines in string constants, and we don't duplicate those.
8507      But that does no harm.  */
8508   if (newlines > 0) {
8509     ibp = start + length;
8510     obp = ibp + newlines;
8511     limit = start;
8512     while (limit != ibp)
8513       *--obp = *--ibp;
8514   }
8515
8516   ibp = start + newlines;
8517   limit = start + length + newlines;
8518   obp = start;
8519
8520   while (ibp < limit) {
8521     *obp++ = c = *ibp++;
8522     switch (c) {
8523     case '\n':
8524       /* Duplicate the newline.  */
8525       *obp++ = '\n';
8526       break;
8527
8528     case '\\':
8529       if (*ibp == '\n') {
8530         obp--;
8531         ibp++;
8532       }
8533       break;
8534
8535     case '/':
8536       if (*ibp == '\\' && ibp[1] == '\n')
8537         newline_fix (ibp);
8538       /* Delete any comment.  */
8539       if (cplusplus_comments && ibp[0] == '/') {
8540         /* Comments are equivalent to spaces.  */
8541         obp[-1] = ' ';
8542         ibp++;
8543         while (ibp < limit && (*ibp != '\n' || ibp[-1] == '\\'))
8544           ibp++;
8545         break;
8546       }
8547       if (ibp[0] != '*' || ibp + 1 >= limit)
8548         break;
8549       /* Comments are equivalent to spaces.
8550          For -traditional, a comment is equivalent to nothing.  */
8551       if (traditional)
8552         obp--;
8553       else
8554         obp[-1] = ' ';
8555       ibp++;
8556       while (ibp + 1 < limit) {
8557         if (ibp[0] == '*'
8558             && ibp[1] == '\\' && ibp[2] == '\n')
8559           newline_fix (ibp + 1);
8560         if (ibp[0] == '*' && ibp[1] == '/')
8561           break;
8562         ibp++;
8563       }
8564       ibp += 2;
8565       break;
8566
8567     case '\'':
8568     case '\"':
8569       /* Notice and skip strings, so that we don't
8570          think that comments start inside them,
8571          and so we don't duplicate newlines in them.  */
8572       {
8573         int quotec = c;
8574         while (ibp < limit) {
8575           *obp++ = c = *ibp++;
8576           if (c == quotec)
8577             break;
8578           if (c == '\n' && quotec == '\'')
8579             break;
8580           if (c == '\\' && ibp < limit) {
8581             while (*ibp == '\\' && ibp[1] == '\n')
8582               ibp += 2;
8583             *obp++ = *ibp++;
8584           }
8585         }
8586       }
8587       break;
8588     }
8589   }
8590
8591   return obp - start;
8592 }
8593 \f
8594 /* Turn newlines to spaces in the string of length LENGTH at START,
8595    except inside of string constants.
8596    The string is copied into itself with its beginning staying fixed.  */
8597
8598 static int
8599 change_newlines (start, length)
8600      U_CHAR *start;
8601      int length;
8602 {
8603   register U_CHAR *ibp;
8604   register U_CHAR *obp;
8605   register U_CHAR *limit;
8606   register int c;
8607
8608   ibp = start;
8609   limit = start + length;
8610   obp = start;
8611
8612   while (ibp < limit) {
8613     *obp++ = c = *ibp++;
8614     switch (c) {
8615     case '\n':
8616       /* If this is a NEWLINE NEWLINE, then this is a real newline in the
8617          string.  Skip past the newline and its duplicate.
8618          Put a space in the output.  */
8619       if (*ibp == '\n')
8620         {
8621           ibp++;
8622           obp--;
8623           *obp++ = ' ';
8624         }
8625       break;
8626
8627     case '\'':
8628     case '\"':
8629       /* Notice and skip strings, so that we don't delete newlines in them.  */
8630       {
8631         int quotec = c;
8632         while (ibp < limit) {
8633           *obp++ = c = *ibp++;
8634           if (c == quotec)
8635             break;
8636           if (c == '\n' && quotec == '\'')
8637             break;
8638         }
8639       }
8640       break;
8641     }
8642   }
8643
8644   return obp - start;
8645 }
8646 \f
8647 /*
8648  * my_strerror - return the descriptive text associated with an `errno' code.
8649  */
8650
8651 char *
8652 my_strerror (errnum)
8653      int errnum;
8654 {
8655   char *result;
8656
8657 #ifndef VMS
8658 #ifndef HAVE_STRERROR
8659   result = (char *) ((errnum < sys_nerr) ? sys_errlist[errnum] : 0);
8660 #else
8661   result = strerror (errnum);
8662 #endif
8663 #else   /* VMS */
8664   /* VAXCRTL's strerror() takes an optional second argument, which only
8665      matters when the first argument is EVMSERR.  However, it's simplest
8666      just to pass it unconditionally.  `vaxc$errno' is declared in
8667      <errno.h>, and maintained by the library in parallel with `errno'.
8668      We assume that caller's `errnum' either matches the last setting of
8669      `errno' by the library or else does not have the value `EVMSERR'.  */
8670
8671   result = strerror (errnum, vaxc$errno);
8672 #endif
8673
8674   if (!result)
8675     result = "undocumented I/O error";
8676
8677   return result;
8678 }
8679
8680 /*
8681  * error - print error message and increment count of errors.
8682  */
8683
8684 void
8685 error (msg, arg1, arg2, arg3)
8686      char *msg;
8687      char *arg1, *arg2, *arg3;
8688 {
8689   int i;
8690   FILE_BUF *ip = NULL;
8691
8692   print_containing_files ();
8693
8694   for (i = indepth; i >= 0; i--)
8695     if (instack[i].fname != NULL) {
8696       ip = &instack[i];
8697       break;
8698     }
8699
8700   if (ip != NULL)
8701     fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno);
8702   fprintf (stderr, msg, arg1, arg2, arg3);
8703   fprintf (stderr, "\n");
8704   errors++;
8705 }
8706
8707 /* Error including a message from `errno'.  */
8708
8709 static void
8710 error_from_errno (name)
8711      char *name;
8712 {
8713   int i;
8714   FILE_BUF *ip = NULL;
8715
8716   print_containing_files ();
8717
8718   for (i = indepth; i >= 0; i--)
8719     if (instack[i].fname != NULL) {
8720       ip = &instack[i];
8721       break;
8722     }
8723
8724   if (ip != NULL)
8725     fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno);
8726
8727   fprintf (stderr, "%s: %s\n", name, my_strerror (errno));
8728
8729   errors++;
8730 }
8731
8732 /* Print error message but don't count it.  */
8733
8734 void
8735 warning (msg, arg1, arg2, arg3)
8736      char *msg;
8737      char *arg1, *arg2, *arg3;
8738 {
8739   int i;
8740   FILE_BUF *ip = NULL;
8741
8742   if (inhibit_warnings)
8743     return;
8744
8745   if (warnings_are_errors)
8746     errors++;
8747
8748   print_containing_files ();
8749
8750   for (i = indepth; i >= 0; i--)
8751     if (instack[i].fname != NULL) {
8752       ip = &instack[i];
8753       break;
8754     }
8755
8756   if (ip != NULL)
8757     fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno);
8758   fprintf (stderr, "warning: ");
8759   fprintf (stderr, msg, arg1, arg2, arg3);
8760   fprintf (stderr, "\n");
8761 }
8762
8763 static void
8764 error_with_line (line, msg, arg1, arg2, arg3)
8765      int line;
8766      char *msg;
8767      char *arg1, *arg2, *arg3;
8768 {
8769   int i;
8770   FILE_BUF *ip = NULL;
8771
8772   print_containing_files ();
8773
8774   for (i = indepth; i >= 0; i--)
8775     if (instack[i].fname != NULL) {
8776       ip = &instack[i];
8777       break;
8778     }
8779
8780   if (ip != NULL)
8781     fprintf (stderr, "%s:%d: ", ip->nominal_fname, line);
8782   fprintf (stderr, msg, arg1, arg2, arg3);
8783   fprintf (stderr, "\n");
8784   errors++;
8785 }
8786
8787 static void
8788 warning_with_line (line, msg, arg1, arg2, arg3)
8789      int line;
8790      char *msg;
8791      char *arg1, *arg2, *arg3;
8792 {
8793   int i;
8794   FILE_BUF *ip = NULL;
8795
8796   if (inhibit_warnings)
8797     return;
8798
8799   if (warnings_are_errors)
8800     errors++;
8801
8802   print_containing_files ();
8803
8804   for (i = indepth; i >= 0; i--)
8805     if (instack[i].fname != NULL) {
8806       ip = &instack[i];
8807       break;
8808     }
8809
8810   if (ip != NULL)
8811     fprintf (stderr, "%s:%d: ", ip->nominal_fname, line);
8812   fprintf (stderr, "warning: ");
8813   fprintf (stderr, msg, arg1, arg2, arg3);
8814   fprintf (stderr, "\n");
8815 }
8816
8817 /* print an error message and maybe count it.  */
8818
8819 void
8820 pedwarn (msg, arg1, arg2, arg3)
8821      char *msg;
8822      char *arg1, *arg2, *arg3;
8823 {
8824   if (pedantic_errors)
8825     error (msg, arg1, arg2, arg3);
8826   else
8827     warning (msg, arg1, arg2, arg3);
8828 }
8829
8830 void
8831 pedwarn_with_line (line, msg, arg1, arg2, arg3)
8832      int line;
8833      char *msg;
8834      char *arg1, *arg2, *arg3;
8835 {
8836   if (pedantic_errors)
8837     error_with_line (line, msg, arg1, arg2, arg3);
8838   else
8839     warning_with_line (line, msg, arg1, arg2, arg3);
8840 }
8841
8842 /* Report a warning (or an error if pedantic_errors)
8843    giving specified file name and line number, not current.  */
8844
8845 static void
8846 pedwarn_with_file_and_line (file, line, msg, arg1, arg2, arg3)
8847      char *file;
8848      int line;
8849      char *msg;
8850      char *arg1, *arg2, *arg3;
8851 {
8852   if (!pedantic_errors && inhibit_warnings)
8853     return;
8854   if (file != NULL)
8855     fprintf (stderr, "%s:%d: ", file, line);
8856   if (pedantic_errors)
8857     errors++;
8858   if (!pedantic_errors)
8859     fprintf (stderr, "warning: ");
8860   fprintf (stderr, msg, arg1, arg2, arg3);
8861   fprintf (stderr, "\n");
8862 }
8863 \f
8864 /* Print the file names and line numbers of the #include
8865    commands which led to the current file.  */
8866
8867 static void
8868 print_containing_files ()
8869 {
8870   FILE_BUF *ip = NULL;
8871   int i;
8872   int first = 1;
8873
8874   /* If stack of files hasn't changed since we last printed
8875      this info, don't repeat it.  */
8876   if (last_error_tick == input_file_stack_tick)
8877     return;
8878
8879   for (i = indepth; i >= 0; i--)
8880     if (instack[i].fname != NULL) {
8881       ip = &instack[i];
8882       break;
8883     }
8884
8885   /* Give up if we don't find a source file.  */
8886   if (ip == NULL)
8887     return;
8888
8889   /* Find the other, outer source files.  */
8890   for (i--; i >= 0; i--)
8891     if (instack[i].fname != NULL) {
8892       ip = &instack[i];
8893       if (first) {
8894         first = 0;
8895         fprintf (stderr, "In file included");
8896       } else {
8897         fprintf (stderr, ",\n                ");
8898       }
8899
8900       fprintf (stderr, " from %s:%d", ip->nominal_fname, ip->lineno);
8901     }
8902   if (! first)
8903     fprintf (stderr, ":\n");
8904
8905   /* Record we have printed the status as of this time.  */
8906   last_error_tick = input_file_stack_tick;
8907 }
8908 \f
8909 /* Return the line at which an error occurred.
8910    The error is not necessarily associated with the current spot
8911    in the input stack, so LINE says where.  LINE will have been
8912    copied from ip->lineno for the current input level.
8913    If the current level is for a file, we return LINE.
8914    But if the current level is not for a file, LINE is meaningless.
8915    In that case, we return the lineno of the innermost file.  */
8916
8917 static int
8918 line_for_error (line)
8919      int line;
8920 {
8921   int i;
8922   int line1 = line;
8923
8924   for (i = indepth; i >= 0; ) {
8925     if (instack[i].fname != 0)
8926       return line1;
8927     i--;
8928     if (i < 0)
8929       return 0;
8930     line1 = instack[i].lineno;
8931   }
8932   abort ();
8933   /*NOTREACHED*/
8934   return 0;
8935 }
8936
8937 /*
8938  * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
8939  *
8940  * As things stand, nothing is ever placed in the output buffer to be
8941  * removed again except when it's KNOWN to be part of an identifier,
8942  * so flushing and moving down everything left, instead of expanding,
8943  * should work ok.
8944  */
8945
8946 /* You might think void was cleaner for the return type,
8947    but that would get type mismatch in check_expand in strict ANSI.  */
8948 static int
8949 grow_outbuf (obuf, needed)
8950      register FILE_BUF *obuf;
8951      register int needed;
8952 {
8953   register U_CHAR *p;
8954   int minsize;
8955
8956   if (obuf->length - (obuf->bufp - obuf->buf) > needed)
8957     return 0;
8958
8959   /* Make it at least twice as big as it is now.  */
8960   obuf->length *= 2;
8961   /* Make it have at least 150% of the free space we will need.  */
8962   minsize = (3 * needed) / 2 + (obuf->bufp - obuf->buf);
8963   if (minsize > obuf->length)
8964     obuf->length = minsize;
8965
8966   if ((p = (U_CHAR *) xrealloc (obuf->buf, obuf->length)) == NULL)
8967     memory_full ();
8968
8969   obuf->bufp = p + (obuf->bufp - obuf->buf);
8970   obuf->buf = p;
8971
8972   return 0;
8973 }
8974 \f
8975 /* Symbol table for macro names and special symbols */
8976
8977 /*
8978  * install a name in the main hash table, even if it is already there.
8979  *   name stops with first non alphanumeric, except leading '#'.
8980  * caller must check against redefinition if that is desired.
8981  * delete_macro () removes things installed by install () in fifo order.
8982  * this is important because of the `defined' special symbol used
8983  * in #if, and also if pushdef/popdef directives are ever implemented.
8984  *
8985  * If LEN is >= 0, it is the length of the name.
8986  * Otherwise, compute the length by scanning the entire name.
8987  *
8988  * If HASH is >= 0, it is the precomputed hash code.
8989  * Otherwise, compute the hash code.
8990  */
8991 static HASHNODE *
8992 install (name, len, type, value, hash)
8993      U_CHAR *name;
8994      int len;
8995      enum node_type type;
8996      char *value;
8997      int hash;
8998 {
8999   register HASHNODE *hp;
9000   register int i, bucket;
9001   register U_CHAR *p, *q;
9002
9003   if (len < 0) {
9004     p = name;
9005     while (is_idchar[*p])
9006       p++;
9007     len = p - name;
9008   }
9009
9010   if (hash < 0)
9011     hash = hashf (name, len, HASHSIZE);
9012
9013   i = sizeof (HASHNODE) + len + 1;
9014   hp = (HASHNODE *) xmalloc (i);
9015   bucket = hash;
9016   hp->bucket_hdr = &hashtab[bucket];
9017   hp->next = hashtab[bucket];
9018   hashtab[bucket] = hp;
9019   hp->prev = NULL;
9020   if (hp->next != NULL)
9021     hp->next->prev = hp;
9022   hp->type = type;
9023   hp->length = len;
9024   hp->value.cpval = value;
9025   hp->name = ((U_CHAR *) hp) + sizeof (HASHNODE);
9026   p = hp->name;
9027   q = name;
9028   for (i = 0; i < len; i++)
9029     *p++ = *q++;
9030   hp->name[len] = 0;
9031   return hp;
9032 }
9033
9034 /*
9035  * find the most recent hash node for name name (ending with first
9036  * non-identifier char) installed by install
9037  *
9038  * If LEN is >= 0, it is the length of the name.
9039  * Otherwise, compute the length by scanning the entire name.
9040  *
9041  * If HASH is >= 0, it is the precomputed hash code.
9042  * Otherwise, compute the hash code.
9043  */
9044 HASHNODE *
9045 lookup (name, len, hash)
9046      U_CHAR *name;
9047      int len;
9048      int hash;
9049 {
9050   register U_CHAR *bp;
9051   register HASHNODE *bucket;
9052
9053   if (len < 0) {
9054     for (bp = name; is_idchar[*bp]; bp++) ;
9055     len = bp - name;
9056   }
9057
9058   if (hash < 0)
9059     hash = hashf (name, len, HASHSIZE);
9060
9061   bucket = hashtab[hash];
9062   while (bucket) {
9063     if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
9064       return bucket;
9065     bucket = bucket->next;
9066   }
9067   return NULL;
9068 }
9069
9070 /*
9071  * Delete a hash node.  Some weirdness to free junk from macros.
9072  * More such weirdness will have to be added if you define more hash
9073  * types that need it.
9074  */
9075
9076 /* Note that the DEFINITION of a macro is removed from the hash table
9077    but its storage is not freed.  This would be a storage leak
9078    except that it is not reasonable to keep undefining and redefining
9079    large numbers of macros many times.
9080    In any case, this is necessary, because a macro can be #undef'd
9081    in the middle of reading the arguments to a call to it.
9082    If #undef freed the DEFINITION, that would crash.  */
9083
9084 static void
9085 delete_macro (hp)
9086      HASHNODE *hp;
9087 {
9088
9089   if (hp->prev != NULL)
9090     hp->prev->next = hp->next;
9091   if (hp->next != NULL)
9092     hp->next->prev = hp->prev;
9093
9094   /* make sure that the bucket chain header that
9095      the deleted guy was on points to the right thing afterwards. */
9096   if (hp == *hp->bucket_hdr)
9097     *hp->bucket_hdr = hp->next;
9098
9099 #if 0
9100   if (hp->type == T_MACRO) {
9101     DEFINITION *d = hp->value.defn;
9102     struct reflist *ap, *nextap;
9103
9104     for (ap = d->pattern; ap != NULL; ap = nextap) {
9105       nextap = ap->next;
9106       free (ap);
9107     }
9108     free (d);
9109   }
9110 #endif
9111   free (hp);
9112 }
9113
9114 /*
9115  * return hash function on name.  must be compatible with the one
9116  * computed a step at a time, elsewhere
9117  */
9118 static int
9119 hashf (name, len, hashsize)
9120      register U_CHAR *name;
9121      register int len;
9122      int hashsize;
9123 {
9124   register int r = 0;
9125
9126   while (len--)
9127     r = HASHSTEP (r, *name++);
9128
9129   return MAKE_POS (r) % hashsize;
9130 }
9131 \f
9132
9133 /* Dump the definition of a single macro HP to OF.  */
9134 static void
9135 dump_single_macro (hp, of)
9136      register HASHNODE *hp;
9137      FILE *of;
9138 {
9139   register DEFINITION *defn = hp->value.defn;
9140   struct reflist *ap;
9141   int offset;
9142   int concat;
9143
9144
9145   /* Print the definition of the macro HP.  */
9146
9147   fprintf (of, "#define %s", hp->name);
9148
9149   if (defn->nargs >= 0) {
9150     int i;
9151
9152     fprintf (of, "(");
9153     for (i = 0; i < defn->nargs; i++) {
9154       dump_arg_n (defn, i, of);
9155       if (i + 1 < defn->nargs)
9156         fprintf (of, ", ");
9157     }
9158     fprintf (of, ")");
9159   }
9160
9161   fprintf (of, " ");
9162
9163   offset = 0;
9164   concat = 0;
9165   for (ap = defn->pattern; ap != NULL; ap = ap->next) {
9166     dump_defn_1 (defn->expansion, offset, ap->nchars, of);
9167     offset += ap->nchars;
9168     if (!traditional) {
9169       if (ap->nchars != 0)
9170         concat = 0;
9171       if (ap->stringify) {
9172         switch (ap->stringify) {
9173          case SHARP_TOKEN: fprintf (of, "#"); break;
9174          case WHITE_SHARP_TOKEN: fprintf (of, "# "); break;
9175          case PERCENT_COLON_TOKEN: fprintf (of, "%:"); break;
9176          case WHITE_PERCENT_COLON_TOKEN: fprintf (of, "%: "); break;
9177         }
9178       }
9179       if (ap->raw_before) {
9180         if (concat) {
9181           switch (ap->raw_before) {
9182            case WHITE_SHARP_TOKEN:
9183            case WHITE_PERCENT_COLON_TOKEN:
9184             fprintf (of, " ");
9185             break;
9186           }
9187         } else {
9188           switch (ap->raw_before) {
9189            case SHARP_TOKEN: fprintf (of, "##"); break;
9190            case WHITE_SHARP_TOKEN: fprintf (of, "## "); break;
9191            case PERCENT_COLON_TOKEN: fprintf (of, "%:%:"); break;
9192            case WHITE_PERCENT_COLON_TOKEN: fprintf (of, "%:%: "); break;
9193           }
9194         }
9195       }
9196       concat = 0;
9197     }
9198     dump_arg_n (defn, ap->argno, of);
9199     if (!traditional && ap->raw_after) {
9200       switch (ap->raw_after) {
9201        case SHARP_TOKEN: fprintf (of, "##"); break;
9202        case WHITE_SHARP_TOKEN: fprintf (of, " ##"); break;
9203        case PERCENT_COLON_TOKEN: fprintf (of, "%:%:"); break;
9204        case WHITE_PERCENT_COLON_TOKEN: fprintf (of, " %:%:"); break;
9205       }
9206       concat = 1;
9207     }
9208   }
9209   dump_defn_1 (defn->expansion, offset, defn->length - offset, of);
9210   fprintf (of, "\n");
9211 }
9212
9213 /* Dump all macro definitions as #defines to stdout.  */
9214
9215 static void
9216 dump_all_macros ()
9217 {
9218   int bucket;
9219
9220   for (bucket = 0; bucket < HASHSIZE; bucket++) {
9221     register HASHNODE *hp;
9222
9223     for (hp = hashtab[bucket]; hp; hp= hp->next) {
9224       if (hp->type == T_MACRO)
9225         dump_single_macro (hp, stdout);
9226     }
9227   }
9228 }
9229
9230 /* Output to OF a substring of a macro definition.
9231    BASE is the beginning of the definition.
9232    Output characters START thru LENGTH.
9233    Unless traditional, discard newlines outside of strings, thus
9234    converting funny-space markers to ordinary spaces.  */
9235
9236 static void
9237 dump_defn_1 (base, start, length, of)
9238      U_CHAR *base;
9239      int start;
9240      int length;
9241      FILE *of;
9242 {
9243   U_CHAR *p = base + start;
9244   U_CHAR *limit = base + start + length;
9245
9246   if (traditional)
9247     fwrite (p, sizeof (*p), length, of);
9248   else {
9249     while (p < limit) {
9250       if (*p == '\"' || *p =='\'') {
9251         U_CHAR *p1 = skip_quoted_string (p, limit, 0, NULL_PTR,
9252                                          NULL_PTR, NULL_PTR);
9253         fwrite (p, sizeof (*p), p1 - p, of);
9254         p = p1;
9255       } else {
9256         if (*p != '\n')
9257           putc (*p, of);
9258         p++;
9259       }
9260     }
9261   }
9262 }
9263
9264 /* Print the name of argument number ARGNUM of macro definition DEFN
9265    to OF.
9266    Recall that DEFN->args.argnames contains all the arg names
9267    concatenated in reverse order with comma-space in between.  */
9268
9269 static void
9270 dump_arg_n (defn, argnum, of)
9271      DEFINITION *defn;
9272      int argnum;
9273      FILE *of;
9274 {
9275   register U_CHAR *p = defn->args.argnames;
9276   while (argnum + 1 < defn->nargs) {
9277     p = (U_CHAR *) index (p, ' ') + 1;
9278     argnum++;
9279   }
9280
9281   while (*p && *p != ',') {
9282     putc (*p, of);
9283     p++;
9284   }
9285 }
9286 \f
9287 /* Initialize syntactic classifications of characters.  */
9288
9289 static void
9290 initialize_char_syntax ()
9291 {
9292   register int i;
9293
9294   /*
9295    * Set up is_idchar and is_idstart tables.  These should be
9296    * faster than saying (is_alpha (c) || c == '_'), etc.
9297    * Set up these things before calling any routines tthat
9298    * refer to them.
9299    */
9300   for (i = 'a'; i <= 'z'; i++) {
9301     is_idchar[i - 'a' + 'A'] = 1;
9302     is_idchar[i] = 1;
9303     is_idstart[i - 'a' + 'A'] = 1;
9304     is_idstart[i] = 1;
9305   }
9306   for (i = '0'; i <= '9'; i++)
9307     is_idchar[i] = 1;
9308   is_idchar['_'] = 1;
9309   is_idstart['_'] = 1;
9310   is_idchar['$'] = dollars_in_ident;
9311   is_idstart['$'] = dollars_in_ident;
9312
9313   /* horizontal space table */
9314   is_hor_space[' '] = 1;
9315   is_hor_space['\t'] = 1;
9316   is_hor_space['\v'] = 1;
9317   is_hor_space['\f'] = 1;
9318   is_hor_space['\r'] = 1;
9319
9320   is_space[' '] = 1;
9321   is_space['\t'] = 1;
9322   is_space['\v'] = 1;
9323   is_space['\f'] = 1;
9324   is_space['\n'] = 1;
9325   is_space['\r'] = 1;
9326
9327   char_name['\v'] = "vertical tab";
9328   char_name['\f'] = "formfeed";
9329   char_name['\r'] = "carriage return";
9330 }
9331
9332 /* Initialize the built-in macros.  */
9333
9334 static void
9335 initialize_builtins (inp, outp)
9336      FILE_BUF *inp;
9337      FILE_BUF *outp;
9338 {
9339   install ("__LINE__", -1, T_SPECLINE, NULL_PTR, -1);
9340   install ("__DATE__", -1, T_DATE, NULL_PTR, -1);
9341   install ("__FILE__", -1, T_FILE, NULL_PTR, -1);
9342   install ("__BASE_FILE__", -1, T_BASE_FILE, NULL_PTR, -1);
9343   install ("__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, NULL_PTR, -1);
9344   install ("__VERSION__", -1, T_VERSION, NULL_PTR, -1);
9345 #ifndef NO_BUILTIN_SIZE_TYPE
9346   install ("__SIZE_TYPE__", -1, T_SIZE_TYPE, NULL_PTR, -1);
9347 #endif
9348 #ifndef NO_BUILTIN_PTRDIFF_TYPE
9349   install ("__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, NULL_PTR, -1);
9350 #endif
9351   install ("__WCHAR_TYPE__", -1, T_WCHAR_TYPE, NULL_PTR, -1);
9352   install ("__USER_LABEL_PREFIX__",-1,T_USER_LABEL_PREFIX_TYPE, NULL_PTR, -1);
9353   install ("__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, NULL_PTR, -1);
9354   install ("__TIME__", -1, T_TIME, NULL_PTR, -1);
9355   if (!traditional) {
9356     install ("__STDC__", -1, T_CONST, "1", -1);
9357     install ("__STDC_VERSION__", -1, T_CONST, "199409L", -1);
9358   }
9359   if (objc)
9360     install ("__OBJC__", -1, T_CONST, "1", -1);
9361 /*  This is supplied using a -D by the compiler driver
9362     so that it is present only when truly compiling with GNU C.  */
9363 /*  install ("__GNUC__", -1, T_CONST, "2", -1);  */
9364
9365   if (debug_output)
9366     {
9367       char directive[2048];
9368       register struct directive *dp = &directive_table[0];
9369       struct tm *timebuf = timestamp ();
9370
9371       sprintf (directive, " __BASE_FILE__ \"%s\"\n",
9372                instack[0].nominal_fname);
9373       output_line_command (inp, outp, 0, same_file);
9374       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
9375
9376       sprintf (directive, " __VERSION__ \"%s\"\n", version_string);
9377       output_line_command (inp, outp, 0, same_file);
9378       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
9379
9380 #ifndef NO_BUILTIN_SIZE_TYPE
9381       sprintf (directive, " __SIZE_TYPE__ %s\n", SIZE_TYPE);
9382       output_line_command (inp, outp, 0, same_file);
9383       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
9384 #endif
9385
9386 #ifndef NO_BUILTIN_PTRDIFF_TYPE
9387       sprintf (directive, " __PTRDIFF_TYPE__ %s\n", PTRDIFF_TYPE);
9388       output_line_command (inp, outp, 0, same_file);
9389       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
9390 #endif
9391
9392       sprintf (directive, " __WCHAR_TYPE__ %s\n", wchar_type);
9393       output_line_command (inp, outp, 0, same_file);
9394       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
9395
9396       sprintf (directive, " __DATE__ \"%s %2d %4d\"\n",
9397                monthnames[timebuf->tm_mon],
9398                timebuf->tm_mday, timebuf->tm_year + 1900);
9399       output_line_command (inp, outp, 0, same_file);
9400       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
9401
9402       sprintf (directive, " __TIME__ \"%02d:%02d:%02d\"\n",
9403                timebuf->tm_hour, timebuf->tm_min, timebuf->tm_sec);
9404       output_line_command (inp, outp, 0, same_file);
9405       pass_thru_directive (directive, &directive[strlen (directive)], outp, dp);
9406
9407       if (!traditional)
9408         {
9409           sprintf (directive, " __STDC__ 1");
9410           output_line_command (inp, outp, 0, same_file);
9411           pass_thru_directive (directive, &directive[strlen (directive)],
9412                                outp, dp);
9413         }
9414       if (objc)
9415         {
9416           sprintf (directive, " __OBJC__ 1");
9417           output_line_command (inp, outp, 0, same_file);
9418           pass_thru_directive (directive, &directive[strlen (directive)],
9419                                outp, dp);
9420         }
9421     }
9422 }
9423 \f
9424 /*
9425  * process a given definition string, for initialization
9426  * If STR is just an identifier, define it with value 1.
9427  * If STR has anything after the identifier, then it should
9428  * be identifier=definition.
9429  */
9430
9431 static void
9432 make_definition (str, op)
9433      U_CHAR *str;
9434      FILE_BUF *op;
9435 {
9436   FILE_BUF *ip;
9437   struct directive *kt;
9438   U_CHAR *buf, *p;
9439
9440   buf = str;
9441   p = str;
9442   if (!is_idstart[*p]) {
9443     error ("malformed option `-D %s'", str);
9444     return;
9445   }
9446   while (is_idchar[*++p])
9447     ;
9448   if (*p == '(') {
9449     while (is_idchar[*++p] || *p == ',' || is_hor_space[*p])
9450       ;
9451     if (*p++ != ')')
9452       p = str;                  /* Error */
9453   }
9454   if (*p == 0) {
9455     buf = (U_CHAR *) alloca (p - buf + 4);
9456     strcpy ((char *)buf, str);
9457     strcat ((char *)buf, " 1");
9458   } else if (*p != '=') {
9459     error ("malformed option `-D %s'", str);
9460     return;
9461   } else {
9462     U_CHAR *q;
9463     /* Copy the entire option so we can modify it.  */
9464     buf = (U_CHAR *) alloca (2 * strlen (str) + 1);
9465     strncpy (buf, str, p - str);
9466     /* Change the = to a space.  */
9467     buf[p - str] = ' ';
9468     /* Scan for any backslash-newline and remove it.  */
9469     p++;
9470     q = &buf[p - str];
9471     while (*p) {
9472       if (*p == '\"' || *p == '\'') {
9473         int unterminated = 0;
9474         U_CHAR *p1 = skip_quoted_string (p, p + strlen (p), 0,
9475                                          NULL_PTR, NULL_PTR, &unterminated);
9476         if (unterminated)
9477           return;
9478         while (p != p1)
9479           if (*p == '\\' && p[1] == '\n')
9480             p += 2;
9481           else
9482             *q++ = *p++;
9483       } else if (*p == '\\' && p[1] == '\n')
9484         p += 2;
9485       /* Change newline chars into newline-markers.  */
9486       else if (*p == '\n')
9487         {
9488           *q++ = '\n';
9489           *q++ = '\n';
9490           p++;
9491         }
9492       else
9493         *q++ = *p++;
9494     }
9495     *q = 0;
9496   }
9497   
9498   ip = &instack[++indepth];
9499   ip->nominal_fname = ip->fname = "*Initialization*";
9500
9501   ip->buf = ip->bufp = buf;
9502   ip->length = strlen (buf);
9503   ip->lineno = 1;
9504   ip->macro = 0;
9505   ip->free_ptr = 0;
9506   ip->if_stack = if_stack;
9507   ip->system_header_p = 0;
9508
9509   for (kt = directive_table; kt->type != T_DEFINE; kt++)
9510     ;
9511
9512   /* Pass NULL instead of OP, since this is a "predefined" macro.  */
9513   do_define (buf, buf + strlen (buf), NULL_PTR, kt);
9514   --indepth;
9515 }
9516
9517 /* JF, this does the work for the -U option */
9518
9519 static void
9520 make_undef (str, op)
9521      U_CHAR *str;
9522      FILE_BUF *op;
9523 {
9524   FILE_BUF *ip;
9525   struct directive *kt;
9526
9527   ip = &instack[++indepth];
9528   ip->nominal_fname = ip->fname = "*undef*";
9529
9530   ip->buf = ip->bufp = str;
9531   ip->length = strlen (str);
9532   ip->lineno = 1;
9533   ip->macro = 0;
9534   ip->free_ptr = 0;
9535   ip->if_stack = if_stack;
9536   ip->system_header_p = 0;
9537
9538   for (kt = directive_table; kt->type != T_UNDEF; kt++)
9539     ;
9540
9541   do_undef (str, str + strlen (str), op, kt);
9542   --indepth;
9543 }
9544 \f
9545 /* Process the string STR as if it appeared as the body of a #assert.
9546    OPTION is the option name for which STR was the argument.  */
9547
9548 static void
9549 make_assertion (option, str)
9550      char *option;
9551      U_CHAR *str;
9552 {
9553   FILE_BUF *ip;
9554   struct directive *kt;
9555   U_CHAR *buf, *p, *q;
9556
9557   /* Copy the entire option so we can modify it.  */
9558   buf = (U_CHAR *) alloca (strlen (str) + 1);
9559   strcpy ((char *) buf, str);
9560   /* Scan for any backslash-newline and remove it.  */
9561   p = q = buf;
9562   while (*p) {
9563     if (*p == '\\' && p[1] == '\n')
9564       p += 2;
9565     else
9566       *q++ = *p++;
9567   }
9568   *q = 0;
9569
9570   p = buf;
9571   if (!is_idstart[*p]) {
9572     error ("malformed option `%s %s'", option, str);
9573     return;
9574   }
9575   while (is_idchar[*++p])
9576     ;
9577   SKIP_WHITE_SPACE (p);
9578   if (! (*p == 0 || *p == '(')) {
9579     error ("malformed option `%s %s'", option, str);
9580     return;
9581   }
9582   
9583   ip = &instack[++indepth];
9584   ip->nominal_fname = ip->fname = "*Initialization*";
9585
9586   ip->buf = ip->bufp = buf;
9587   ip->length = strlen (buf);
9588   ip->lineno = 1;
9589   ip->macro = 0;
9590   ip->free_ptr = 0;
9591   ip->if_stack = if_stack;
9592   ip->system_header_p = 0;
9593
9594   for (kt = directive_table; kt->type != T_ASSERT; kt++)
9595     ;
9596
9597   /* pass NULL as output ptr to do_define since we KNOW it never
9598      does any output.... */
9599   do_assert (buf, buf + strlen (buf) , NULL_PTR, kt);
9600   --indepth;
9601 }
9602 \f
9603 /* Append a chain of `struct file_name_list's
9604    to the end of the main include chain.
9605    FIRST is the beginning of the chain to append, and LAST is the end.  */
9606
9607 static void
9608 append_include_chain (first, last)
9609      struct file_name_list *first, *last;
9610 {
9611   struct file_name_list *dir;
9612
9613   if (!first || !last)
9614     return;
9615
9616   if (include == 0)
9617     include = first;
9618   else
9619     last_include->next = first;
9620
9621   if (first_bracket_include == 0)
9622     first_bracket_include = first;
9623
9624   for (dir = first; ; dir = dir->next) {
9625     int len = strlen (dir->fname) + INCLUDE_LEN_FUDGE;
9626     if (len > max_include_len)
9627       max_include_len = len;
9628     if (dir == last)
9629       break;
9630   }
9631
9632   last->next = NULL;
9633   last_include = last;
9634 }
9635 \f
9636 /* Add output to `deps_buffer' for the -M switch.
9637    STRING points to the text to be output.
9638    SPACER is ':' for targets, ' ' for dependencies, zero for text
9639    to be inserted literally.  */
9640
9641 static void
9642 deps_output (string, spacer)
9643      char *string;
9644      int spacer;
9645 {
9646   int size = strlen (string);
9647
9648   if (size == 0)
9649     return;
9650
9651 #ifndef MAX_OUTPUT_COLUMNS
9652 #define MAX_OUTPUT_COLUMNS 72
9653 #endif
9654   if (spacer
9655       && deps_column > 0
9656       && (deps_column + size) > MAX_OUTPUT_COLUMNS)
9657   {
9658     deps_output (" \\\n  ", 0);
9659     deps_column = 0;
9660   }
9661
9662   if (deps_size + size + 8 > deps_allocated_size) {
9663     deps_allocated_size = (deps_size + size + 50) * 2;
9664     deps_buffer = (char *) xrealloc (deps_buffer, deps_allocated_size);
9665   }
9666   if (spacer == ' ' && deps_column > 0)
9667     deps_buffer[deps_size++] = ' ';
9668   bcopy (string, &deps_buffer[deps_size], size);
9669   deps_size += size;
9670   deps_column += size;
9671   if (spacer == ':')
9672     deps_buffer[deps_size++] = ':';
9673   deps_buffer[deps_size] = 0;
9674 }
9675 \f
9676 #if defined(USG) || defined(VMS)
9677 #ifndef BSTRING
9678
9679 void
9680 bzero (b, length)
9681      register char *b;
9682      register unsigned length;
9683 {
9684   while (length-- > 0)
9685     *b++ = 0;
9686 }
9687
9688 void
9689 bcopy (b1, b2, length)
9690      register char *b1;
9691      register char *b2;
9692      register unsigned length;
9693 {
9694   while (length-- > 0)
9695     *b2++ = *b1++;
9696 }
9697
9698 int
9699 bcmp (b1, b2, length)   /* This could be a macro! */
9700      register char *b1;
9701      register char *b2;
9702      register unsigned length;
9703 {
9704    while (length-- > 0)
9705      if (*b1++ != *b2++)
9706        return 1;
9707
9708    return 0;
9709 }
9710 #endif /* not BSTRING */
9711 #endif /* USG or VMS */
9712
9713 \f
9714 static void
9715 fatal (str, arg)
9716      char *str, *arg;
9717 {
9718   fprintf (stderr, "%s: ", progname);
9719   fprintf (stderr, str, arg);
9720   fprintf (stderr, "\n");
9721   exit (FAILURE_EXIT_CODE);
9722 }
9723
9724 /* More 'friendly' abort that prints the line and file.
9725    config.h can #define abort fancy_abort if you like that sort of thing.  */
9726
9727 void
9728 fancy_abort ()
9729 {
9730   fatal ("Internal gcc abort.");
9731 }
9732
9733 static void
9734 perror_with_name (name)
9735      char *name;
9736 {
9737   fprintf (stderr, "%s: ", progname);
9738   fprintf (stderr, "%s: %s\n", name, my_strerror (errno));
9739   errors++;
9740 }
9741
9742 static void
9743 pfatal_with_name (name)
9744      char *name;
9745 {
9746   perror_with_name (name);
9747 #ifdef VMS
9748   exit (vaxc$errno);
9749 #else
9750   exit (FAILURE_EXIT_CODE);
9751 #endif
9752 }
9753
9754 /* Handler for SIGPIPE.  */
9755
9756 static void
9757 pipe_closed (signo)
9758      /* If this is missing, some compilers complain.  */
9759      int signo;
9760 {
9761   fatal ("output pipe has been closed");
9762 }
9763 \f
9764 static void
9765 memory_full ()
9766 {
9767   fatal ("Memory exhausted.");
9768 }
9769
9770
9771 char *
9772 xmalloc (size)
9773      unsigned size;
9774 {
9775   register char *ptr = (char *) malloc (size);
9776   if (ptr != 0) return (ptr);
9777   memory_full ();
9778   /*NOTREACHED*/
9779   return 0;
9780 }
9781
9782 static char *
9783 xrealloc (old, size)
9784      char *old;
9785      unsigned size;
9786 {
9787   register char *ptr = (char *) realloc (old, size);
9788   if (ptr != 0) return (ptr);
9789   memory_full ();
9790   /*NOTREACHED*/
9791   return 0;
9792 }
9793
9794 static char *
9795 xcalloc (number, size)
9796      unsigned number, size;
9797 {
9798   register unsigned total = number * size;
9799   register char *ptr = (char *) malloc (total);
9800   if (ptr != 0) {
9801     if (total > 100)
9802       bzero (ptr, total);
9803     else {
9804       /* It's not too long, so loop, zeroing by longs.
9805          It must be safe because malloc values are always well aligned.  */
9806       register long *zp = (long *) ptr;
9807       register long *zl = (long *) (ptr + total - 4);
9808       register int i = total - 4;
9809       while (zp < zl)
9810         *zp++ = 0;
9811       if (i < 0)
9812         i = 0;
9813       while (i < total)
9814         ptr[i++] = 0;
9815     }
9816     return ptr;
9817   }
9818   memory_full ();
9819   /*NOTREACHED*/
9820   return 0;
9821 }
9822
9823 static char *
9824 savestring (input)
9825      char *input;
9826 {
9827   unsigned size = strlen (input);
9828   char *output = xmalloc (size + 1);
9829   strcpy (output, input);
9830   return output;
9831 }
9832 \f
9833 /* Get the file-mode and data size of the file open on FD
9834    and store them in *MODE_POINTER and *SIZE_POINTER.  */
9835
9836 static int
9837 file_size_and_mode (fd, mode_pointer, size_pointer)
9838      int fd;
9839      int *mode_pointer;
9840      long int *size_pointer;
9841 {
9842   struct stat sbuf;
9843
9844   if (fstat (fd, &sbuf) < 0) return (-1);
9845   if (mode_pointer) *mode_pointer = sbuf.st_mode;
9846   if (size_pointer) *size_pointer = sbuf.st_size;
9847   return 0;
9848 }
9849
9850 static void
9851 output_dots (fd, depth)
9852      FILE* fd;
9853      int depth;
9854 {
9855   while (depth > 0) {
9856     putc ('.', fd);
9857     depth--;
9858   }
9859 }
9860   
9861 \f
9862 #ifdef VMS
9863
9864 /* Under VMS we need to fix up the "include" specification
9865    filename so that everything following the 1st slash is
9866    changed into its correct VMS file specification. */
9867
9868 static void
9869 hack_vms_include_specification (fname)
9870      char *fname;
9871 {
9872   register char *cp, *cp1, *cp2;
9873   int f, check_filename_before_returning, no_prefix_seen;
9874   char Local[512];
9875
9876   check_filename_before_returning = 0;
9877   no_prefix_seen = 0;
9878
9879   /* Ignore leading "./"s */
9880   while (fname[0] == '.' && fname[1] == '/') {
9881     strcpy (fname, fname+2);
9882     no_prefix_seen = 1;         /* mark this for later */
9883   }
9884   /* Look for the boundary between the VMS and UNIX filespecs */
9885   cp = rindex (fname, ']');     /* Look for end of dirspec. */
9886   if (cp == 0) cp = rindex (fname, '>'); /* ... Ditto               */
9887   if (cp == 0) cp = rindex (fname, ':'); /* Look for end of devspec. */
9888   if (cp) {
9889     cp++;
9890   } else {
9891     cp = index (fname, '/');    /* Look for the "/" */
9892   }
9893
9894   /*
9895    * Check if we have a vax-c style '#include filename'
9896    * and add the missing .h
9897    */
9898   if (cp == 0) {
9899     if (index(fname,'.') == 0)
9900       strcat(fname, ".h");
9901   } else {
9902     if (index(cp,'.') == 0)
9903       strcat(cp, ".h");
9904   }
9905
9906   cp2 = Local;                  /* initialize */
9907
9908   /* We are trying to do a number of things here.  First of all, we are
9909      trying to hammer the filenames into a standard format, such that later
9910      processing can handle them.
9911      
9912      If the file name contains something like [dir.], then it recognizes this
9913      as a root, and strips the ".]".  Later processing will add whatever is
9914      needed to get things working properly.
9915      
9916      If no device is specified, then the first directory name is taken to be
9917      a device name (or a rooted logical). */
9918
9919   /* See if we found that 1st slash */
9920   if (cp == 0) return;          /* Nothing to do!!! */
9921   if (*cp != '/') return;       /* Nothing to do!!! */
9922   /* Point to the UNIX filename part (which needs to be fixed!) */
9923   cp1 = cp+1;
9924   /* If the directory spec is not rooted, we can just copy
9925      the UNIX filename part and we are done */
9926   if (((cp - fname) > 1) && ((cp[-1] == ']') || (cp[-1] == '>'))) {
9927     if (cp[-2] != '.') {
9928       /*
9929        * The VMS part ends in a `]', and the preceding character is not a `.'.
9930        * We strip the `]', and then splice the two parts of the name in the
9931        * usual way.  Given the default locations for include files in cccp.c,
9932        * we will only use this code if the user specifies alternate locations
9933        * with the /include (-I) switch on the command line.  */
9934       cp -= 1;                  /* Strip "]" */
9935       cp1--;                    /* backspace */
9936     } else {
9937       /*
9938        * The VMS part has a ".]" at the end, and this will not do.  Later
9939        * processing will add a second directory spec, and this would be a syntax
9940        * error.  Thus we strip the ".]", and thus merge the directory specs.
9941        * We also backspace cp1, so that it points to a '/'.  This inhibits the
9942        * generation of the 000000 root directory spec (which does not belong here
9943        * in this case).
9944        */
9945       cp -= 2;                  /* Strip ".]" */
9946       cp1--; };                 /* backspace */
9947   } else {
9948
9949     /* We drop in here if there is no VMS style directory specification yet.
9950      * If there is no device specification either, we make the first dir a
9951      * device and try that.  If we do not do this, then we will be essentially
9952      * searching the users default directory (as if they did a #include "asdf.h").
9953      *
9954      * Then all we need to do is to push a '[' into the output string. Later
9955      * processing will fill this in, and close the bracket.
9956      */
9957     if (cp[-1] != ':') *cp2++ = ':'; /* dev not in spec.  take first dir */
9958     *cp2++ = '[';               /* Open the directory specification */
9959   }
9960
9961   /* at this point we assume that we have the device spec, and (at least
9962      the opening "[" for a directory specification.  We may have directories
9963      specified already */
9964
9965   /* If there are no other slashes then the filename will be
9966      in the "root" directory.  Otherwise, we need to add
9967      directory specifications. */
9968   if (index (cp1, '/') == 0) {
9969     /* Just add "000000]" as the directory string */
9970     strcpy (cp2, "000000]");
9971     cp2 += strlen (cp2);
9972     check_filename_before_returning = 1; /* we might need to fool with this later */
9973   } else {
9974     /* As long as there are still subdirectories to add, do them. */
9975     while (index (cp1, '/') != 0) {
9976       /* If this token is "." we can ignore it */
9977       if ((cp1[0] == '.') && (cp1[1] == '/')) {
9978         cp1 += 2;
9979         continue;
9980       }
9981       /* Add a subdirectory spec. Do not duplicate "." */
9982       if (cp2[-1] != '.' && cp2[-1] != '[' && cp2[-1] != '<')
9983         *cp2++ = '.';
9984       /* If this is ".." then the spec becomes "-" */
9985       if ((cp1[0] == '.') && (cp1[1] == '.') && (cp[2] == '/')) {
9986         /* Add "-" and skip the ".." */
9987         *cp2++ = '-';
9988         cp1 += 3;
9989         continue;
9990       }
9991       /* Copy the subdirectory */
9992       while (*cp1 != '/') *cp2++= *cp1++;
9993       cp1++;                    /* Skip the "/" */
9994     }
9995     /* Close the directory specification */
9996     if (cp2[-1] == '.')         /* no trailing periods */
9997       cp2--;
9998     *cp2++ = ']';
9999   }
10000   /* Now add the filename */
10001   while (*cp1) *cp2++ = *cp1++;
10002   *cp2 = 0;
10003   /* Now append it to the original VMS spec. */
10004   strcpy (cp, Local);
10005
10006   /* If we put a [000000] in the filename, try to open it first. If this fails,
10007      remove the [000000], and return that name.  This provides flexibility
10008      to the user in that they can use both rooted and non-rooted logical names
10009      to point to the location of the file.  */
10010
10011   if (check_filename_before_returning && no_prefix_seen) {
10012     f = open (fname, O_RDONLY, 0666);
10013     if (f >= 0) {
10014       /* The file name is OK as it is, so return it as is.  */
10015       close (f);
10016       return;
10017     }
10018     /* The filename did not work.  Try to remove the [000000] from the name,
10019        and return it.  */
10020     cp = index (fname, '[');
10021     cp2 = index (fname, ']') + 1;
10022     strcpy (cp, cp2);           /* this gets rid of it */
10023   }
10024   return;
10025 }
10026 #endif  /* VMS */
10027 \f
10028 #ifdef  VMS
10029
10030 /* These are the read/write replacement routines for
10031    VAX-11 "C".  They make read/write behave enough
10032    like their UNIX counterparts that CCCP will work */
10033
10034 static int
10035 read (fd, buf, size)
10036      int fd;
10037      char *buf;
10038      int size;
10039 {
10040 #undef  read    /* Get back the REAL read routine */
10041   register int i;
10042   register int total = 0;
10043
10044   /* Read until the buffer is exhausted */
10045   while (size > 0) {
10046     /* Limit each read to 32KB */
10047     i = (size > (32*1024)) ? (32*1024) : size;
10048     i = read (fd, buf, i);
10049     if (i <= 0) {
10050       if (i == 0) return (total);
10051       return (i);
10052     }
10053     /* Account for this read */
10054     total += i;
10055     buf += i;
10056     size -= i;
10057   }
10058   return (total);
10059 }
10060
10061 static int
10062 write (fd, buf, size)
10063      int fd;
10064      char *buf;
10065      int size;
10066 {
10067 #undef  write   /* Get back the REAL write routine */
10068   int i;
10069   int j;
10070
10071   /* Limit individual writes to 32Kb */
10072   i = size;
10073   while (i > 0) {
10074     j = (i > (32*1024)) ? (32*1024) : i;
10075     if (write (fd, buf, j) < 0) return (-1);
10076     /* Account for the data written */
10077     buf += j;
10078     i -= j;
10079   }
10080   return (size);
10081 }
10082
10083 /* The following wrapper functions supply additional arguments to the VMS
10084    I/O routines to optimize performance with file handling.  The arguments
10085    are:
10086      "mbc=16" - Set multi-block count to 16 (use a 8192 byte buffer).
10087      "deq=64" - When extending the file, extend it in chunks of 32Kbytes.
10088      "fop=tef"- Truncate unused portions of file when closing file.
10089      "shr=nil"- Disallow file sharing while file is open.
10090  */
10091
10092 static FILE *
10093 freopen (fname, type, oldfile)
10094      char *fname;
10095      char *type;
10096      FILE *oldfile;
10097 {
10098 #undef  freopen /* Get back the REAL fopen routine */
10099   if (strcmp (type, "w") == 0)
10100     return freopen (fname, type, oldfile, "mbc=16", "deq=64", "fop=tef", "shr=nil");
10101   return freopen (fname, type, oldfile, "mbc=16");
10102 }
10103
10104 static FILE *
10105 fopen (fname, type)
10106      char *fname;
10107      char *type;
10108 {
10109 #undef fopen    /* Get back the REAL fopen routine */
10110   /* The gcc-vms-1.42 distribution's header files prototype fopen with two
10111      fixed arguments, which matches ANSI's specification but not VAXCRTL's
10112      pre-ANSI implmentation.  This hack circumvents the mismatch problem.  */
10113   FILE *(*vmslib_fopen)() = (FILE *(*)()) fopen;
10114
10115   if (*type == 'w')
10116     return (*vmslib_fopen) (fname, type, "mbc=32",
10117                             "deq=64", "fop=tef", "shr=nil");
10118   else
10119     return (*vmslib_fopen) (fname, type, "mbc=32");
10120 }
10121
10122 static int 
10123 open (fname, flags, prot)
10124      char *fname;
10125      int flags;
10126      int prot;
10127 {
10128 #undef open     /* Get back the REAL open routine */
10129   return open (fname, flags, prot, "mbc=16", "deq=64", "fop=tef");
10130 }
10131
10132 /* Avoid run-time library bug, where copying M out of N+M characters with
10133    N >= 65535 results in VAXCRTL's strncat falling into an infinite loop.
10134    gcc-cpp exercises this particular bug.  */
10135
10136 static char *
10137 strncat (dst, src, cnt)
10138      char *dst;
10139      const char *src;
10140      unsigned cnt;
10141 {
10142   register char *d = dst, *s = (char *) src;
10143   register int n = cnt; /* convert to _signed_ type */
10144
10145   while (*d) d++;       /* advance to end */
10146   while (--n >= 0)
10147     if (!(*d++ = *s++)) break;
10148   if (n < 0) *d = '\0';
10149   return dst;
10150 }
10151 #endif /* VMS */