OSDN Git Service

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