OSDN Git Service

(DUCR.M,DUC.M): Defined.
[pf3gnuchains/gcc-fork.git] / gcc / cpplib.c
1 /* CPP Library.
2    Copyright (C) 1986, 87, 89, 92-6, 1997 Free Software Foundation, Inc.
3    Contributed by Per Bothner, 1994-95.
4    Based on CCCP program 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, Boston, MA 02111-1307, USA.
20
21  In other words, you are welcome to use, share and improve this program.
22  You are forbidden to forbid anyone else to use, share and improve
23  what you give them.   Help stamp out software-hoarding!  */
24
25 #ifdef EMACS
26 #define NO_SHORTNAMES
27 #include "../src/config.h"
28 #ifdef open
29 #undef open
30 #undef read
31 #undef write
32 #endif /* open */
33 #endif /* EMACS */
34
35 /* The macro EMACS is defined when cpp is distributed as part of Emacs,
36    for the sake of machines with limited C compilers.  */
37 #ifndef EMACS
38 #include "config.h"
39 #endif /* not EMACS */
40
41 #ifndef STANDARD_INCLUDE_DIR
42 #define STANDARD_INCLUDE_DIR "/usr/include"
43 #endif
44
45 #if 0 /* We can't get ptrdiff_t, so I arranged not to need PTR_INT_TYPE.  */
46 #ifdef __STDC__
47 #define PTR_INT_TYPE ptrdiff_t
48 #else
49 #define PTR_INT_TYPE long
50 #endif
51 #endif /* 0 */
52
53 #include "cpplib.h"
54 #include "cpphash.h"
55
56 #ifndef STDC_VALUE
57 #define STDC_VALUE 1
58 #endif
59
60 /* By default, colon separates directories in a path.  */
61 #ifndef PATH_SEPARATOR
62 #define PATH_SEPARATOR ':'
63 #endif
64
65 #include <ctype.h>
66 #include <stdio.h>
67 #include <signal.h>
68 #ifdef __STDC__
69 #include <stdlib.h>
70 #endif
71
72 #ifndef VMS
73 #ifndef USG
74 #include <sys/time.h>           /* for __DATE__ and __TIME__ */
75 #include <sys/resource.h>
76 #else
77 #include <sys/times.h>
78 #include <time.h>
79 #include <fcntl.h>
80 #endif /* USG */
81 #endif /* not VMS */
82
83 /* This defines "errno" properly for VMS, and gives us EACCES.  */
84 #include <errno.h>
85
86 extern char *index ();
87 extern char *rindex ();
88
89 #ifndef O_RDONLY
90 #define O_RDONLY 0
91 #endif
92
93 #undef MIN
94 #undef MAX
95 #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
96 #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
97
98 /* Find the largest host integer type and set its size and type.  */
99
100 #ifndef HOST_BITS_PER_WIDE_INT
101
102 #if HOST_BITS_PER_LONG > HOST_BITS_PER_INT
103 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
104 #define HOST_WIDE_INT long
105 #else
106 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT
107 #define HOST_WIDE_INT int
108 #endif
109
110 #endif
111
112 #ifndef S_ISREG
113 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
114 #endif
115
116 #ifndef S_ISDIR
117 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
118 #endif
119
120 /* Define a generic NULL if one hasn't already been defined.  */
121
122 #ifndef NULL
123 #define NULL 0
124 #endif
125
126 #ifndef GENERIC_PTR
127 #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
128 #define GENERIC_PTR void *
129 #else
130 #define GENERIC_PTR char *
131 #endif
132 #endif
133
134 #ifndef NULL_PTR
135 #define NULL_PTR ((GENERIC_PTR) 0)
136 #endif
137
138 #ifndef INCLUDE_LEN_FUDGE
139 #define INCLUDE_LEN_FUDGE 0
140 #endif
141
142 /* Symbols to predefine.  */
143
144 #ifdef CPP_PREDEFINES
145 static char *predefs = CPP_PREDEFINES;
146 #else
147 static char *predefs = "";
148 #endif
149 \f
150 /* We let tm.h override the types used here, to handle trivial differences
151    such as the choice of unsigned int or long unsigned int for size_t.
152    When machines start needing nontrivial differences in the size type,
153    it would be best to do something here to figure out automatically
154    from other information what type to use.  */
155
156 /* The string value for __SIZE_TYPE__.  */
157
158 #ifndef SIZE_TYPE
159 #define SIZE_TYPE "long unsigned int"
160 #endif
161
162 /* The string value for __PTRDIFF_TYPE__.  */
163
164 #ifndef PTRDIFF_TYPE
165 #define PTRDIFF_TYPE "long int"
166 #endif
167
168 /* The string value for __WCHAR_TYPE__.  */
169
170 #ifndef WCHAR_TYPE
171 #define WCHAR_TYPE "int"
172 #endif
173 #define CPP_WCHAR_TYPE(PFILE) \
174         (CPP_OPTIONS (PFILE)->cplusplus ? "__wchar_t" : WCHAR_TYPE)
175
176 /* The string value for __USER_LABEL_PREFIX__ */
177
178 #ifndef USER_LABEL_PREFIX
179 #define USER_LABEL_PREFIX ""
180 #endif
181
182 /* The string value for __REGISTER_PREFIX__ */
183
184 #ifndef REGISTER_PREFIX
185 #define REGISTER_PREFIX ""
186 #endif
187 \f
188 /* In the definition of a #assert name, this structure forms
189    a list of the individual values asserted.
190    Each value is itself a list of "tokens".
191    These are strings that are compared by name.  */
192
193 struct tokenlist_list {
194   struct tokenlist_list *next;
195   struct arglist *tokens;
196 };
197
198 struct assertion_hashnode {
199   struct assertion_hashnode *next;      /* double links for easy deletion */
200   struct assertion_hashnode *prev;
201   /* also, a back pointer to this node's hash
202      chain is kept, in case the node is the head
203      of the chain and gets deleted.  */
204   struct assertion_hashnode **bucket_hdr;
205   int length;                   /* length of token, for quick comparison */
206   U_CHAR *name;                 /* the actual name */
207   /* List of token-sequences.  */
208   struct tokenlist_list *value;
209 };
210 \f
211 #define SKIP_WHITE_SPACE(p) do { while (is_hor_space[*p]) p++; } while (0)
212 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space[*p]) p++; } while (0)
213
214 #define PEEKN(N) (CPP_BUFFER (pfile)->rlimit - CPP_BUFFER (pfile)->cur >= (N) ? CPP_BUFFER (pfile)->cur[N] : EOF)
215 #define FORWARD(N) CPP_FORWARD (CPP_BUFFER (pfile), (N))
216 #define GETC() CPP_BUF_GET (CPP_BUFFER (pfile))
217 #define PEEKC() CPP_BUF_PEEK (CPP_BUFFER (pfile))
218 /* CPP_IS_MACRO_BUFFER is true if the buffer contains macro expansion.
219    (Note that it is false while we're expanding marco *arguments*.) */
220 #define CPP_IS_MACRO_BUFFER(PBUF) ((PBUF)->cleanup == macro_cleanup)
221
222 /* Move all backslash-newline pairs out of embarrassing places.
223    Exchange all such pairs following BP
224    with any potentially-embarrassing characters that follow them.
225    Potentially-embarrassing characters are / and *
226    (because a backslash-newline inside a comment delimiter
227    would cause it not to be recognized).  */
228
229 #define NEWLINE_FIX \
230   do {while (PEEKC() == '\\' && PEEKN(1) == '\n') FORWARD(2); } while(0)
231
232 /* Same, but assume we've already read the potential '\\' into C.  */
233 #define NEWLINE_FIX1(C) do { \
234     while ((C) == '\\' && PEEKC() == '\n') { FORWARD(1); (C) = GETC(); }\
235   } while(0)
236
237 struct cpp_pending {
238   struct cpp_pending *next;
239   char *cmd;
240   char *arg;
241 };
242
243 /* Forward declarations.  */
244
245 extern char *xmalloc ();
246
247 static void add_import ();
248 static void append_include_chain ();
249 static void make_undef ();
250 static void make_assertion ();
251 static void path_include ();
252 static void initialize_builtins ();
253 static void initialize_char_syntax ();
254 static void dump_arg_n ();
255 static void dump_defn_1 ();
256 extern void delete_macro ();
257 static void trigraph_pcp ();
258 static int finclude ();
259 static void validate_else ();
260 static int comp_def_part ();
261 #ifdef abort
262 extern void fancy_abort ();
263 #endif
264 static void pipe_closed ();
265 static void print_containing_files ();
266 static int lookup_import ();
267 static int redundant_include_p ();
268 static is_system_include ();
269 static struct file_name_map *read_name_map ();
270 static char *read_filename_string ();
271 static int open_include_file ();
272 static int check_preconditions ();
273 static void pcfinclude ();
274 static void pcstring_used ();
275 static int check_macro_name ();
276 static int compare_defs ();
277 static int compare_token_lists ();
278 static HOST_WIDE_INT eval_if_expression ();
279 static int change_newlines ();
280 extern int hashf ();
281 static int file_size_and_mode ();
282 static struct arglist *read_token_list ();
283 static void free_token_list ();
284 static int safe_read ();
285 static void push_macro_expansion PARAMS ((cpp_reader *,
286                                           U_CHAR *, int, HASHNODE *));
287 static struct cpp_pending *nreverse_pending PARAMS ((struct cpp_pending *));
288 extern char *xrealloc ();
289 static char *xcalloc ();
290 static char *savestring ();
291
292 static void conditional_skip ();
293 static void skip_if_group ();
294
295 /* Last arg to output_line_command.  */
296 enum file_change_code {same_file, enter_file, leave_file};
297
298 /* External declarations.  */
299
300 extern HOST_WIDE_INT cpp_parse_expr PARAMS ((cpp_reader *));
301
302 extern char *getenv ();
303 extern FILE *fdopen ();
304 extern char *version_string;
305 extern struct tm *localtime ();
306
307 /* These functions are declared to return int instead of void since they
308    are going to be placed in a table and some old compilers have trouble with
309    pointers to functions returning void.  */
310
311 static int do_define ();
312 static int do_line ();
313 static int do_include ();
314 static int do_undef ();
315 static int do_error ();
316 static int do_pragma ();
317 static int do_ident ();
318 static int do_if ();
319 static int do_xifdef ();
320 static int do_else ();
321 static int do_elif ();
322 static int do_endif ();
323 static int do_sccs ();
324 static int do_once ();
325 static int do_assert ();
326 static int do_unassert ();
327 static int do_warning ();
328 \f
329 struct file_name_list
330   {
331     struct file_name_list *next;
332     char *fname;
333     /* If the following is nonzero, it is a macro name.
334        Don't include the file again if that macro is defined.  */
335     U_CHAR *control_macro;
336     /* If the following is nonzero, it is a C-language system include
337        directory.  */
338     int c_system_include_path;
339     /* Mapping of file names for this directory.  */
340     struct file_name_map *name_map;
341     /* Non-zero if name_map is valid.  */
342     int got_name_map;
343   };
344
345 /* If a buffer's dir field is SELF_DIR_DUMMY, it means the file was found
346    via the same directory as the file that #included it.  */
347 #define SELF_DIR_DUMMY ((struct file_name_list *) (~0))
348
349 /* #include "file" looks in source file dir, then stack.  */
350 /* #include <file> just looks in the stack.  */
351 /* -I directories are added to the end, then the defaults are added.  */
352 /* The */
353 static struct default_include {
354   char *fname;                  /* The name of the directory.  */
355   int cplusplus;                /* Only look here if we're compiling C++.  */
356   int cxx_aware;                /* Includes in this directory don't need to
357                                    be wrapped in extern "C" when compiling
358                                    C++.  */
359 } include_defaults_array[]
360 #ifdef INCLUDE_DEFAULTS
361   = INCLUDE_DEFAULTS;
362 #else
363   = {
364     /* Pick up GNU C++ specific include files.  */
365     { GPLUSPLUS_INCLUDE_DIR, 1, 1 },
366     { OLD_GPLUSPLUS_INCLUDE_DIR, 1, 1 },
367 #ifdef CROSS_COMPILE
368     /* This is the dir for fixincludes.  Put it just before
369        the files that we fix.  */
370     { GCC_INCLUDE_DIR, 0, 0 },
371     /* For cross-compilation, this dir name is generated
372        automatically in Makefile.in.  */
373     { CROSS_INCLUDE_DIR, 0, 0 },
374 #ifdef TOOL_INCLUDE_DIR
375     /* This is another place that the target system's headers might be.  */
376     { TOOL_INCLUDE_DIR, 0, 1 },
377 #endif
378 #else /* not CROSS_COMPILE */
379 #ifdef LOCAL_INCLUDE_DIR
380     /* This should be /usr/local/include and should come before
381        the fixincludes-fixed header files.  */
382     { LOCAL_INCLUDE_DIR, 0, 1 },
383 #endif
384 #ifdef TOOL_INCLUDE_DIR
385     /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
386        Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h.  */
387     { TOOL_INCLUDE_DIR, 0, 1 },
388 #endif
389     /* This is the dir for fixincludes.  Put it just before
390        the files that we fix.  */
391     { GCC_INCLUDE_DIR, 0, 0 },
392     /* Some systems have an extra dir of include files.  */
393 #ifdef SYSTEM_INCLUDE_DIR
394     { SYSTEM_INCLUDE_DIR, 0, 0 },
395 #endif
396     { STANDARD_INCLUDE_DIR, 0, 0 },
397 #endif /* not CROSS_COMPILE */
398     { 0, 0, 0 }
399     };
400 #endif /* no INCLUDE_DEFAULTS */
401
402 /* `struct directive' defines one #-directive, including how to handle it.  */
403
404 struct directive {
405   int length;                   /* Length of name */
406   int (*func)();                /* Function to handle directive */
407   char *name;                   /* Name of directive */
408   enum node_type type;          /* Code which describes which directive.  */
409   char command_reads_line;      /* One if rest of line is read by func.  */
410   char traditional_comments;    /* Nonzero: keep comments if -traditional.  */
411   char pass_thru;               /* Copy preprocessed directive to output file.*/
412 };
413
414 /* Here is the actual list of #-directives, most-often-used first.
415    The initialize_builtins function assumes #define is the very first.  */
416
417 static struct directive directive_table[] = {
418   {  6, do_define, "define", T_DEFINE, 0, 1},
419   {  5, do_xifdef, "ifdef", T_IFDEF, 1},
420   {  6, do_xifdef, "ifndef", T_IFNDEF, 1},
421   {  7, do_include, "include", T_INCLUDE, 1},
422   { 12, do_include, "include_next", T_INCLUDE_NEXT, 1},
423   {  6, do_include, "import", T_IMPORT, 1},
424   {  5, do_endif, "endif", T_ENDIF, 1},
425   {  4, do_else, "else", T_ELSE, 1},
426   {  2, do_if, "if", T_IF, 1},
427   {  4, do_elif, "elif", T_ELIF, 1},
428   {  5, do_undef, "undef", T_UNDEF},
429   {  5, do_error, "error", T_ERROR},
430   {  7, do_warning, "warning", T_WARNING},
431   {  6, do_pragma, "pragma", T_PRAGMA, 0, 0, 1},
432   {  4, do_line, "line", T_LINE, 1},
433   {  5, do_ident, "ident", T_IDENT, 1, 0, 1},
434 #ifdef SCCS_DIRECTIVE
435   {  4, do_sccs, "sccs", T_SCCS},
436 #endif
437   {  6, do_assert, "assert", T_ASSERT, 1},
438   {  8, do_unassert, "unassert", T_UNASSERT, 1},
439   {  -1, 0, "", T_UNUSED},
440 };
441 \f
442 /* table to tell if char can be part of a C identifier.  */
443 U_CHAR is_idchar[256];
444 /* table to tell if char can be first char of a c identifier.  */
445 U_CHAR is_idstart[256];
446 /* table to tell if c is horizontal space.  */
447 U_CHAR is_hor_space[256];
448 /* table to tell if c is horizontal or vertical space.  */
449 static U_CHAR is_space[256];
450
451 /* Initialize syntactic classifications of characters.  */
452
453 static void
454 initialize_char_syntax (opts)
455      struct cpp_options *opts;
456 {
457   register int i;
458
459   /*
460    * Set up is_idchar and is_idstart tables.  These should be
461    * faster than saying (is_alpha (c) || c == '_'), etc.
462    * Set up these things before calling any routines tthat
463    * refer to them.
464    */
465   for (i = 'a'; i <= 'z'; i++) {
466     is_idchar[i - 'a' + 'A'] = 1;
467     is_idchar[i] = 1;
468     is_idstart[i - 'a' + 'A'] = 1;
469     is_idstart[i] = 1;
470   }
471   for (i = '0'; i <= '9'; i++)
472     is_idchar[i] = 1;
473   is_idchar['_'] = 1;
474   is_idstart['_'] = 1;
475   is_idchar['$'] = opts->dollars_in_ident;
476   is_idstart['$'] = opts->dollars_in_ident;
477
478   /* horizontal space table */
479   is_hor_space[' '] = 1;
480   is_hor_space['\t'] = 1;
481   is_hor_space['\v'] = 1;
482   is_hor_space['\f'] = 1;
483   is_hor_space['\r'] = 1;
484
485   is_space[' '] = 1;
486   is_space['\t'] = 1;
487   is_space['\v'] = 1;
488   is_space['\f'] = 1;
489   is_space['\n'] = 1;
490   is_space['\r'] = 1;
491 }
492
493
494 /* Place into PFILE a quoted string representing the string SRC.
495    Caller must reserve enough space in pfile->token_buffer.  */
496
497 static void
498 quote_string (pfile, src)
499      cpp_reader *pfile;
500      char *src;
501 {
502   U_CHAR c;
503
504   CPP_PUTC_Q (pfile, '\"');
505   for (;;)
506     switch ((c = *src++))
507       {
508       default:
509         if (isprint (c))
510           CPP_PUTC_Q (pfile, c);
511         else
512           {
513             sprintf (CPP_PWRITTEN (pfile), "\\%03o", c);
514             CPP_ADJUST_WRITTEN (pfile, 4);
515           }
516         break;
517
518       case '\"':
519       case '\\':
520         CPP_PUTC_Q (pfile, '\\');
521         CPP_PUTC_Q (pfile, c);
522         break;
523       
524       case '\0':
525         CPP_PUTC_Q (pfile, '\"');
526         CPP_NUL_TERMINATE_Q (pfile);
527         return;
528       }
529 }
530
531 /* Re-allocates PFILE->token_buffer so it will hold at least N more chars.  */
532
533 void
534 cpp_grow_buffer (pfile, n)
535      cpp_reader *pfile;
536      long n;
537 {
538   long old_written = CPP_WRITTEN (pfile);
539   pfile->token_buffer_size = n + 2 * pfile->token_buffer_size;
540   pfile->token_buffer = (U_CHAR *)
541     xrealloc(pfile->token_buffer, pfile->token_buffer_size);
542   CPP_SET_WRITTEN (pfile, old_written);
543 }
544
545 \f
546 /*
547  * process a given definition string, for initialization
548  * If STR is just an identifier, define it with value 1.
549  * If STR has anything after the identifier, then it should
550  * be identifier=definition.
551  */
552
553 void
554 cpp_define (pfile, str)
555      cpp_reader *pfile;
556      U_CHAR *str;
557 {
558   U_CHAR *buf, *p;
559
560   buf = str;
561   p = str;
562   if (!is_idstart[*p])
563     {
564       cpp_error (pfile, "malformed option `-D %s'", str);
565       return;
566     }
567   while (is_idchar[*++p])
568     ;
569   if (*p == 0)
570     {
571       buf = (U_CHAR *) alloca (p - buf + 4);
572       strcpy ((char *)buf, str);
573       strcat ((char *)buf, " 1");
574     }
575   else if (*p != '=')
576     {
577       cpp_error (pfile, "malformed option `-D %s'", str);
578       return;
579     }
580   else
581     {
582       U_CHAR *q;
583       /* Copy the entire option so we can modify it.  */
584       buf = (U_CHAR *) alloca (2 * strlen (str) + 1);
585       strncpy (buf, str, p - str);
586       /* Change the = to a space.  */
587       buf[p - str] = ' ';
588       /* Scan for any backslash-newline and remove it.  */
589       p++;
590       q = &buf[p - str];
591       while (*p)
592         {
593       if (*p == '\\' && p[1] == '\n')
594         p += 2;
595       else
596         *q++ = *p++;
597     }
598     *q = 0;
599   }
600   
601   do_define (pfile, NULL, buf, buf + strlen (buf));
602 }
603 \f
604 /* Process the string STR as if it appeared as the body of a #assert.
605    OPTION is the option name for which STR was the argument.  */
606
607 static void
608 make_assertion (pfile, option, str)
609      cpp_reader *pfile;
610      char *option;
611      U_CHAR *str;
612 {
613   struct directive *kt;
614   U_CHAR *buf, *p, *q;
615
616   /* Copy the entire option so we can modify it.  */
617   buf = (U_CHAR *) alloca (strlen (str) + 1);
618   strcpy ((char *) buf, str);
619   /* Scan for any backslash-newline and remove it.  */
620   p = q = buf;
621   while (*p) {
622 #if 0
623     if (*p == '\\' && p[1] == '\n')
624       p += 2;
625     else
626 #endif
627       *q++ = *p++;
628   }
629   *q = 0;
630
631   p = buf;
632   if (!is_idstart[*p]) {
633     cpp_error (pfile, "malformed option `%s %s'", option, str);
634     return;
635   }
636   while (is_idchar[*++p])
637     ;
638   while (*p == ' ' || *p == '\t') p++;
639   if (! (*p == 0 || *p == '(')) {
640     cpp_error (pfile, "malformed option `%s %s'", option, str);
641     return;
642   }
643   
644   if (cpp_push_buffer (pfile, buf, strlen (buf)) != NULL)
645     {
646       do_assert (pfile, NULL, NULL, NULL);
647       cpp_pop_buffer (pfile);
648     }
649 }
650 \f
651 /* Append a chain of `struct file_name_list's
652    to the end of the main include chain.
653    FIRST is the beginning of the chain to append, and LAST is the end.  */
654
655 static void
656 append_include_chain (pfile, first, last)
657      cpp_reader *pfile;
658      struct file_name_list *first, *last;
659 {
660   struct cpp_options *opts = CPP_OPTIONS (pfile);
661   struct file_name_list *dir;
662
663   if (!first || !last)
664     return;
665
666   if (opts->include == 0)
667     opts->include = first;
668   else
669     opts->last_include->next = first;
670
671   if (opts->first_bracket_include == 0)
672     opts->first_bracket_include = first;
673
674   for (dir = first; ; dir = dir->next) {
675     int len = strlen (dir->fname) + INCLUDE_LEN_FUDGE;
676     if (len > pfile->max_include_len)
677       pfile->max_include_len = len;
678     if (dir == last)
679       break;
680   }
681
682   last->next = NULL;
683   opts->last_include = last;
684 }
685 \f
686 /* Add output to `deps_buffer' for the -M switch.
687    STRING points to the text to be output.
688    SPACER is ':' for targets, ' ' for dependencies, zero for text
689    to be inserted literally.  */
690
691 static void
692 deps_output (pfile, string, spacer)
693      cpp_reader *pfile;
694      char *string;
695      int spacer;
696 {
697   int size = strlen (string);
698
699   if (size == 0)
700     return;
701
702 #ifndef MAX_OUTPUT_COLUMNS
703 #define MAX_OUTPUT_COLUMNS 72
704 #endif
705   if (spacer
706       && pfile->deps_column > 0
707       && (pfile->deps_column + size) > MAX_OUTPUT_COLUMNS)
708     {
709       deps_output (pfile, " \\\n  ", 0);
710       pfile->deps_column = 0;
711     }
712
713   if (pfile->deps_size + size + 8 > pfile->deps_allocated_size)
714     {
715       pfile->deps_allocated_size = (pfile->deps_size + size + 50) * 2;
716       pfile->deps_buffer = (char *) xrealloc (pfile->deps_buffer,
717                                               pfile->deps_allocated_size);
718     }
719   if (spacer == ' ' && pfile->deps_column > 0)
720     pfile->deps_buffer[pfile->deps_size++] = ' ';
721   bcopy (string, &pfile->deps_buffer[pfile->deps_size], size);
722   pfile->deps_size += size;
723   pfile->deps_column += size;
724   if (spacer == ':')
725     pfile->deps_buffer[pfile->deps_size++] = ':';
726   pfile->deps_buffer[pfile->deps_size] = 0;
727 }
728 \f
729 /* Given a colon-separated list of file names PATH,
730    add all the names to the search path for include files.  */
731
732 static void
733 path_include (pfile, path)
734      cpp_reader *pfile;
735      char *path;
736 {
737   char *p;
738
739   p = path;
740
741   if (*p)
742     while (1) {
743       char *q = p;
744       char *name;
745       struct file_name_list *dirtmp;
746
747       /* Find the end of this name.  */
748       while (*q != 0 && *q != PATH_SEPARATOR) q++;
749       if (p == q) {
750         /* An empty name in the path stands for the current directory.  */
751         name = (char *) xmalloc (2);
752         name[0] = '.';
753         name[1] = 0;
754       } else {
755         /* Otherwise use the directory that is named.  */
756         name = (char *) xmalloc (q - p + 1);
757         bcopy (p, name, q - p);
758         name[q - p] = 0;
759       }
760
761       dirtmp = (struct file_name_list *)
762         xmalloc (sizeof (struct file_name_list));
763       dirtmp->next = 0;         /* New one goes on the end */
764       dirtmp->control_macro = 0;
765       dirtmp->c_system_include_path = 0;
766       dirtmp->fname = name;
767       dirtmp->got_name_map = 0;
768       append_include_chain (pfile, dirtmp, dirtmp);
769
770       /* Advance past this name.  */
771       p = q;
772       if (*p == 0)
773         break;
774       /* Skip the colon.  */
775       p++;
776     }
777 }
778 \f
779 void
780 cpp_options_init (opts)
781      cpp_options *opts;
782 {
783   bzero ((char *) opts, sizeof *opts);
784   opts->in_fname = NULL;
785   opts->out_fname = NULL;
786
787   /* Initialize is_idchar to allow $.  */
788   opts->dollars_in_ident = 1;
789   initialize_char_syntax (opts);
790
791   opts->no_line_commands = 0;
792   opts->no_trigraphs = 1;
793   opts->put_out_comments = 0;
794   opts->print_include_names = 0;
795   opts->dump_macros = dump_none;
796   opts->no_output = 0;
797   opts->cplusplus = 0;
798   opts->cplusplus_comments = 0;
799
800   opts->verbose = 0;
801   opts->objc = 0;
802   opts->lang_asm = 0;
803   opts->for_lint = 0;
804   opts->chill = 0;
805   opts->pedantic_errors = 0;
806   opts->inhibit_warnings = 0;
807   opts->warn_comments = 0;
808   opts->warn_import = 1;
809   opts->warnings_are_errors = 0;
810 }
811
812 enum cpp_token
813 null_underflow (pfile)
814      cpp_reader *pfile;
815 {
816   return CPP_EOF;
817 }
818
819 int
820 null_cleanup (pbuf, pfile)
821      cpp_buffer *pbuf;
822      cpp_reader *pfile;
823 {
824   return 0;
825 }
826
827 int
828 macro_cleanup (pbuf, pfile)
829      cpp_buffer *pbuf;
830      cpp_reader *pfile;
831 {
832   HASHNODE *macro = (HASHNODE *) pbuf->data;
833   if (macro->type == T_DISABLED)
834     macro->type = T_MACRO;
835   if (macro->type != T_MACRO || pbuf->buf != macro->value.defn->expansion)
836     free (pbuf->buf);
837   return 0;
838 }
839
840 int
841 file_cleanup (pbuf, pfile)
842      cpp_buffer *pbuf;
843      cpp_reader *pfile;
844 {
845   if (pbuf->buf)
846     {
847       free (pbuf->buf);
848       pbuf->buf = 0;
849     }
850   return 0;
851 }
852
853 /* Assuming we have read '/'.
854    If this is the start of a comment (followed by '*' or '/'),
855    skip to the end of the comment, and return ' '.
856    Return EOF if we reached the end of file before the end of the comment.
857    If not the start of a comment, return '/'.  */
858
859 static int
860 skip_comment (pfile, linep)
861      cpp_reader *pfile;
862      long *linep;
863 {
864   int c = 0;
865   while (PEEKC() == '\\' && PEEKN(1) == '\n')
866     {
867       if (linep)
868         (*linep)++;
869       FORWARD(2);
870     }
871   if (PEEKC() == '*')
872     {
873       FORWARD(1);
874       for (;;)
875         {
876           int prev_c = c;
877           c = GETC ();
878           if (c == EOF)
879             return EOF;
880           while (c == '\\' && PEEKC() == '\n')
881             {
882               if (linep)
883                 (*linep)++;
884               FORWARD(1), c = GETC();
885             }
886           if (prev_c == '*' && c == '/')
887             return ' ';
888           if (c == '\n' && linep)
889             (*linep)++;
890         }
891     }
892   else if (PEEKC() == '/' && CPP_OPTIONS (pfile)->cplusplus_comments)
893     {
894       FORWARD(1);
895       for (;;)
896         {
897           c = GETC ();
898           if (c == EOF)
899             return ' '; /* Allow // to be terminated by EOF.  */
900           while (c == '\\' && PEEKC() == '\n')
901             {
902               FORWARD(1);
903               c = GETC();
904               if (linep)
905                 (*linep)++;
906             }
907           if (c == '\n')
908             {
909               /* Don't consider final '\n' to be part of comment.  */
910               FORWARD(-1);
911               return ' ';
912             }
913         }
914     }
915   else
916     return '/';
917 }     
918
919 /* Skip whitespace \-newline and comments.  Does not macro-expand.  */
920
921 void
922 cpp_skip_hspace (pfile)
923      cpp_reader *pfile;
924 {
925   while (1)
926     {
927       int c = PEEKC();
928       if (c == EOF)
929         return; /* FIXME */
930       if (is_hor_space[c])
931         {
932           if ((c == '\f' || c == '\v') && CPP_PEDANTIC (pfile))
933             cpp_pedwarn (pfile, "%s in preprocessing directive",
934                          c == '\f' ? "formfeed" : "vertical tab");
935           FORWARD(1);
936         }
937       else if (c == '/')
938         {
939           FORWARD (1);
940           c = skip_comment (pfile, NULL);
941           if (c == '/')
942             FORWARD(-1);
943           if (c == EOF || c == '/')
944             return;
945         }
946       else if (c == '\\' && PEEKN(1) == '\n') {
947         FORWARD(2);
948       }
949       else if (c == '@' && CPP_BUFFER (pfile)->has_escapes
950                && is_hor_space[PEEKN(1)])
951         FORWARD(2);
952       else return;
953     }
954 }
955
956 /* Read the rest of the current line.
957    The line is appended to PFILE's output buffer.  */
958
959 static void
960 copy_rest_of_line (pfile)
961      cpp_reader *pfile;
962 {
963   struct cpp_options *opts = CPP_OPTIONS (pfile);
964   for (;;)
965     {
966       int c = GETC();
967       int nextc;
968       switch (c)
969         {
970         case EOF:
971           goto end_directive;
972         case '\\':
973           if (PEEKC() == '\n')
974             {
975               FORWARD (1);
976               continue;
977             }
978         case '\'':
979         case '\"':
980           goto scan_directive_token;
981           break;
982         case '/':
983           nextc = PEEKC();
984           if (nextc == '*' || (opts->cplusplus_comments && nextc == '*'))
985             goto scan_directive_token;
986           break;
987         case '\f':
988         case '\v':
989           if (CPP_PEDANTIC (pfile))
990             cpp_pedwarn (pfile, "%s in preprocessing directive",
991                          c == '\f' ? "formfeed" : "vertical tab");
992           break;
993
994         case '\n':
995           FORWARD(-1);
996           goto end_directive;
997         scan_directive_token:
998           FORWARD(-1);
999           cpp_get_token (pfile);
1000           continue;
1001         }
1002       CPP_PUTC (pfile, c);
1003     }
1004  end_directive: ;
1005   CPP_NUL_TERMINATE (pfile);
1006 }
1007
1008 void
1009 skip_rest_of_line (pfile)
1010      cpp_reader *pfile;
1011 {
1012   long old = CPP_WRITTEN (pfile);
1013   copy_rest_of_line (pfile);
1014   CPP_SET_WRITTEN (pfile, old);
1015 }
1016
1017 /* Handle a possible # directive.
1018    '#' has already been read.  */
1019
1020 int
1021 handle_directive (pfile)
1022      cpp_reader *pfile;
1023 { int c;
1024   register struct directive *kt;
1025   int ident_length;
1026   long after_ident;
1027   U_CHAR *ident, *line_end;
1028   long old_written = CPP_WRITTEN (pfile);
1029
1030   cpp_skip_hspace (pfile);
1031
1032   c = PEEKC ();
1033   if (c >= '0' && c <= '9')
1034     {
1035       /* Handle # followed by a line number.  */
1036       if (CPP_PEDANTIC (pfile))
1037         cpp_pedwarn (pfile, "`#' followed by integer");
1038       do_line (pfile, NULL);
1039       goto done_a_directive;
1040     }
1041
1042   /* Now find the directive name.  */
1043   CPP_PUTC (pfile, '#');
1044   parse_name (pfile, GETC());
1045   ident = pfile->token_buffer + old_written + 1;
1046   ident_length = CPP_PWRITTEN (pfile) - ident;
1047   if (ident_length == 0 && PEEKC() == '\n')
1048     {
1049       /* A line of just `#' becomes blank.  */
1050       goto done_a_directive;
1051     }
1052
1053 #if 0
1054   if (ident_length == 0 || !is_idstart[*ident]) {
1055     U_CHAR *p = ident;
1056     while (is_idchar[*p]) {
1057       if (*p < '0' || *p > '9')
1058         break;
1059       p++;
1060     }
1061     /* Avoid error for `###' and similar cases unless -pedantic.  */
1062     if (p == ident) {
1063       while (*p == '#' || is_hor_space[*p]) p++;
1064       if (*p == '\n') {
1065         if (pedantic && !lang_asm)
1066           cpp_warning (pfile, "invalid preprocessor directive");
1067         return 0;
1068       }
1069     }
1070
1071     if (!lang_asm)
1072       cpp_error (pfile, "invalid preprocessor directive name");
1073
1074     return 0;
1075   }
1076 #endif
1077   /*
1078    * Decode the keyword and call the appropriate expansion
1079    * routine, after moving the input pointer up to the next line.
1080    */
1081   for (kt = directive_table; ; kt++) {
1082     if (kt->length <= 0)
1083       goto not_a_directive;
1084     if (kt->length == ident_length && !strncmp (kt->name, ident, ident_length)) 
1085       break;
1086   }
1087
1088   if (kt->command_reads_line)
1089     after_ident = 0;
1090   else
1091     {
1092       /* Nonzero means do not delete comments within the directive.
1093          #define needs this when -traditional.  */
1094         int comments = CPP_TRADITIONAL (pfile) && kt->traditional_comments; 
1095         int save_put_out_comments = CPP_OPTIONS (pfile)->put_out_comments;
1096         CPP_OPTIONS (pfile)->put_out_comments = comments;
1097         after_ident = CPP_WRITTEN (pfile);
1098         copy_rest_of_line (pfile);
1099         CPP_OPTIONS (pfile)->put_out_comments = save_put_out_comments;
1100     }
1101
1102   /* For #pragma and #define, we may want to pass through the directive.
1103      Other directives may create output, but we don't want the directive
1104      itself out, so we pop it now.  For example #include may write a #line
1105      command (see comment in do_include), and conditionals may emit
1106      #failed ... #endfailed stuff.  But note that popping the buffer
1107      means the parameters to kt->func may point after pfile->limit
1108      so these parameters are invalid as soon as something gets appended
1109      to the token_buffer.  */
1110
1111   line_end = CPP_PWRITTEN (pfile);
1112   if (!kt->pass_thru && kt->type != T_DEFINE)
1113     CPP_SET_WRITTEN (pfile, old_written);
1114
1115   (*kt->func) (pfile, kt, pfile->token_buffer + after_ident, line_end);
1116   if (kt->pass_thru
1117       || (kt->type == T_DEFINE
1118           && CPP_OPTIONS (pfile)->dump_macros == dump_definitions))
1119     {
1120       /* Just leave the entire #define in the output stack.  */
1121     }
1122   else if (kt->type == T_DEFINE
1123            && CPP_OPTIONS (pfile)->dump_macros == dump_names)
1124     {
1125       U_CHAR *p = pfile->token_buffer + old_written + 7;  /* Skip "#define". */
1126       SKIP_WHITE_SPACE (p);
1127       while (is_idchar[*p]) p++;
1128       pfile->limit = p;
1129       CPP_PUTC (pfile, '\n');
1130     }
1131   else if (kt->type == T_DEFINE)
1132     CPP_SET_WRITTEN (pfile, old_written);
1133  done_a_directive:
1134   return 1;
1135
1136  not_a_directive:
1137   return 0;
1138 }
1139
1140 /* Pass a directive through to the output file.
1141    BUF points to the contents of the directive, as a contiguous string.
1142    LIMIT points to the first character past the end of the directive.
1143    KEYWORD is the keyword-table entry for the directive.  */
1144
1145 static void
1146 pass_thru_directive (buf, limit, pfile, keyword)
1147      U_CHAR *buf, *limit;
1148      cpp_reader *pfile;
1149      struct directive *keyword;
1150 {
1151   register unsigned keyword_length = keyword->length;
1152
1153   CPP_RESERVE (pfile, 1 + keyword_length + (limit - buf));
1154   CPP_PUTC_Q (pfile, '#');
1155   CPP_PUTS_Q (pfile, keyword->name, keyword_length);
1156   if (limit != buf && buf[0] != ' ')
1157     CPP_PUTC_Q (pfile, ' ');
1158   CPP_PUTS_Q (pfile, buf, limit - buf);
1159 #if 0
1160   CPP_PUTS_Q (pfile, '\n');
1161   /* Count the line we have just made in the output,
1162      to get in sync properly.  */
1163   pfile->lineno++;
1164 #endif
1165 }
1166 \f
1167 /* The arglist structure is built by do_define to tell
1168    collect_definition where the argument names begin.  That
1169    is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
1170    would contain pointers to the strings x, y, and z.
1171    Collect_definition would then build a DEFINITION node,
1172    with reflist nodes pointing to the places x, y, and z had
1173    appeared.  So the arglist is just convenience data passed
1174    between these two routines.  It is not kept around after
1175    the current #define has been processed and entered into the
1176    hash table.  */
1177
1178 struct arglist {
1179   struct arglist *next;
1180   U_CHAR *name;
1181   int length;
1182   int argno;
1183   char rest_args;
1184 };
1185
1186 /* Read a replacement list for a macro with parameters.
1187    Build the DEFINITION structure.
1188    Reads characters of text starting at BUF until END.
1189    ARGLIST specifies the formal parameters to look for
1190    in the text of the definition; NARGS is the number of args
1191    in that list, or -1 for a macro name that wants no argument list.
1192    MACRONAME is the macro name itself (so we can avoid recursive expansion)
1193    and NAMELEN is its length in characters.
1194    
1195    Note that comments, backslash-newlines, and leading white space
1196    have already been deleted from the argument.  */
1197
1198 static DEFINITION *
1199 collect_expansion (pfile, buf, limit, nargs, arglist)
1200      cpp_reader *pfile;
1201      U_CHAR *buf, *limit;
1202      int nargs;
1203      struct arglist *arglist;
1204 {
1205   DEFINITION *defn;
1206   register U_CHAR *p, *lastp, *exp_p;
1207   struct reflist *endpat = NULL;
1208   /* Pointer to first nonspace after last ## seen.  */
1209   U_CHAR *concat = 0;
1210   /* Pointer to first nonspace after last single-# seen.  */
1211   U_CHAR *stringify = 0;
1212   int maxsize;
1213   int expected_delimiter = '\0';
1214
1215   /* Scan thru the replacement list, ignoring comments and quoted
1216      strings, picking up on the macro calls.  It does a linear search
1217      thru the arg list on every potential symbol.  Profiling might say
1218      that something smarter should happen.  */
1219
1220   if (limit < buf)
1221     abort ();
1222
1223   /* Find the beginning of the trailing whitespace.  */
1224   p = buf;
1225   while (p < limit && is_space[limit[-1]]) limit--;
1226
1227   /* Allocate space for the text in the macro definition.
1228      Leading and trailing whitespace chars need 2 bytes each.
1229      Each other input char may or may not need 1 byte,
1230      so this is an upper bound.  The extra 5 are for invented
1231      leading and trailing newline-marker and final null.  */
1232   maxsize = (sizeof (DEFINITION)
1233              + (limit - p) + 5);
1234   /* Occurrences of '@' get doubled, so allocate extra space for them.  */
1235   while (p < limit)
1236     if (*p++ == '@')
1237       maxsize++;
1238   defn = (DEFINITION *) xcalloc (1, maxsize);
1239
1240   defn->nargs = nargs;
1241   exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
1242   lastp = exp_p;
1243
1244   p = buf;
1245
1246   /* Add one initial space escape-marker to prevent accidental
1247      token-pasting (often removed by macroexpand).  */
1248   *exp_p++ = '@';
1249   *exp_p++ = ' ';
1250
1251   if (limit - p >= 2 && p[0] == '#' && p[1] == '#') {
1252     cpp_error (pfile, "`##' at start of macro definition");
1253     p += 2;
1254   }
1255
1256   /* Process the main body of the definition.  */
1257   while (p < limit) {
1258     int skipped_arg = 0;
1259     register U_CHAR c = *p++;
1260
1261     *exp_p++ = c;
1262
1263     if (!CPP_TRADITIONAL (pfile)) {
1264       switch (c) {
1265       case '\'':
1266       case '\"':
1267         if (expected_delimiter != '\0') {
1268           if (c == expected_delimiter)
1269             expected_delimiter = '\0';
1270         } else
1271           expected_delimiter = c;
1272         break;
1273
1274       case '\\':
1275         if (p < limit && expected_delimiter) {
1276           /* In a string, backslash goes through
1277              and makes next char ordinary.  */
1278           *exp_p++ = *p++;
1279         }
1280         break;
1281
1282       case '@':
1283         /* An '@' in a string or character constant stands for itself,
1284            and does not need to be escaped.  */
1285         if (!expected_delimiter)
1286           *exp_p++ = c;
1287         break;
1288
1289       case '#':
1290         /* # is ordinary inside a string.  */
1291         if (expected_delimiter)
1292           break;
1293         if (p < limit && *p == '#') {
1294           /* ##: concatenate preceding and following tokens.  */
1295           /* Take out the first #, discard preceding whitespace.  */
1296           exp_p--;
1297           while (exp_p > lastp && is_hor_space[exp_p[-1]])
1298             --exp_p;
1299           /* Skip the second #.  */
1300           p++;
1301           /* Discard following whitespace.  */
1302           SKIP_WHITE_SPACE (p);
1303           concat = p;
1304           if (p == limit)
1305             cpp_error (pfile, "`##' at end of macro definition");
1306         } else if (nargs >= 0) {
1307           /* Single #: stringify following argument ref.
1308              Don't leave the # in the expansion.  */
1309           exp_p--;
1310           SKIP_WHITE_SPACE (p);
1311           if (p == limit || ! is_idstart[*p]
1312               || (*p == 'L' && p + 1 < limit && (p[1] == '\'' || p[1] == '"')))
1313             cpp_error (pfile,
1314                      "`#' operator is not followed by a macro argument name");
1315           else
1316             stringify = p;
1317         }
1318         break;
1319       }
1320     } else {
1321       /* In -traditional mode, recognize arguments inside strings and
1322          and character constants, and ignore special properties of #.
1323          Arguments inside strings are considered "stringified", but no
1324          extra quote marks are supplied.  */
1325       switch (c) {
1326       case '\'':
1327       case '\"':
1328         if (expected_delimiter != '\0') {
1329           if (c == expected_delimiter)
1330             expected_delimiter = '\0';
1331         } else
1332           expected_delimiter = c;
1333         break;
1334
1335       case '\\':
1336         /* Backslash quotes delimiters and itself, but not macro args.  */
1337         if (expected_delimiter != 0 && p < limit
1338             && (*p == expected_delimiter || *p == '\\')) {
1339           *exp_p++ = *p++;
1340           continue;
1341         }
1342         break;
1343
1344       case '/':
1345         if (expected_delimiter != '\0') /* No comments inside strings.  */
1346           break;
1347         if (*p == '*') {
1348           /* If we find a comment that wasn't removed by handle_directive,
1349              this must be -traditional.  So replace the comment with
1350              nothing at all.  */
1351           exp_p--;
1352           p += 1;
1353           while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
1354             p++;
1355 #if 0
1356           /* Mark this as a concatenation-point, as if it had been ##.  */
1357           concat = p;
1358 #endif
1359         }
1360         break;
1361       }
1362     }
1363
1364     /* Handle the start of a symbol.  */
1365     if (is_idchar[c] && nargs > 0) {
1366       U_CHAR *id_beg = p - 1;
1367       int id_len;
1368
1369       --exp_p;
1370       while (p != limit && is_idchar[*p]) p++;
1371       id_len = p - id_beg;
1372
1373       if (is_idstart[c]
1374           && ! (id_len == 1 && c == 'L' && (*p == '\'' || *p == '"'))) {
1375         register struct arglist *arg;
1376
1377         for (arg = arglist; arg != NULL; arg = arg->next) {
1378           struct reflist *tpat;
1379
1380           if (arg->name[0] == c
1381               && arg->length == id_len
1382               && strncmp (arg->name, id_beg, id_len) == 0) {
1383             if (expected_delimiter && CPP_OPTIONS (pfile)->warn_stringify) {
1384               if (CPP_TRADITIONAL (pfile)) {
1385                 cpp_warning (pfile, "macro argument `%.*s' is stringified.",
1386                              id_len, arg->name);
1387               } else {
1388                 cpp_warning (pfile,
1389                     "macro arg `%.*s' would be stringified with -traditional.",
1390                              id_len, arg->name);
1391               }
1392             }
1393             /* If ANSI, don't actually substitute inside a string.  */
1394             if (!CPP_TRADITIONAL (pfile) && expected_delimiter)
1395               break;
1396             /* make a pat node for this arg and append it to the end of
1397                the pat list */
1398             tpat = (struct reflist *) xmalloc (sizeof (struct reflist));
1399             tpat->next = NULL;
1400             tpat->raw_before = concat == id_beg;
1401             tpat->raw_after = 0;
1402             tpat->rest_args = arg->rest_args;
1403             tpat->stringify = (CPP_TRADITIONAL (pfile)
1404                                ? expected_delimiter != '\0'
1405                                : stringify == id_beg);
1406
1407             if (endpat == NULL)
1408               defn->pattern = tpat;
1409             else
1410               endpat->next = tpat;
1411             endpat = tpat;
1412
1413             tpat->argno = arg->argno;
1414             tpat->nchars = exp_p - lastp;
1415             {
1416               register U_CHAR *p1 = p;
1417               SKIP_WHITE_SPACE (p1);
1418               if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
1419                 tpat->raw_after = 1;
1420             }
1421             lastp = exp_p;      /* place to start copying from next time */
1422             skipped_arg = 1;
1423             break;
1424           }
1425         }
1426       }
1427
1428       /* If this was not a macro arg, copy it into the expansion.  */
1429       if (! skipped_arg) {
1430         register U_CHAR *lim1 = p;
1431         p = id_beg;
1432         while (p != lim1)
1433           *exp_p++ = *p++;
1434         if (stringify == id_beg)
1435           cpp_error (pfile,
1436                    "`#' operator should be followed by a macro argument name");
1437       }
1438     }
1439   }
1440
1441   if (!CPP_TRADITIONAL (pfile) && expected_delimiter == 0)
1442     {
1443       /* If ANSI, put in a "@ " marker to prevent token pasting.
1444          But not if "inside a string" (which in ANSI mode
1445          happens only for -D option).  */
1446       *exp_p++ = '@';
1447       *exp_p++ = ' ';
1448     }
1449
1450   *exp_p = '\0';
1451
1452   defn->length = exp_p - defn->expansion;
1453
1454   /* Crash now if we overrun the allocated size.  */
1455   if (defn->length + 1 > maxsize)
1456     abort ();
1457
1458 #if 0
1459 /* This isn't worth the time it takes.  */
1460   /* give back excess storage */
1461   defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
1462 #endif
1463
1464   return defn;
1465 }
1466
1467 /*
1468  * special extension string that can be added to the last macro argument to 
1469  * allow it to absorb the "rest" of the arguments when expanded.  Ex:
1470  *              #define wow(a, b...)            process (b, a, b)
1471  *              { wow (1, 2, 3); }      ->      { process (2, 3, 1, 2, 3); }
1472  *              { wow (one, two); }     ->      { process (two, one, two); }
1473  * if this "rest_arg" is used with the concat token '##' and if it is not
1474  * supplied then the token attached to with ## will not be outputted.  Ex:
1475  *              #define wow (a, b...)           process (b ## , a, ## b)
1476  *              { wow (1, 2); }         ->      { process (2, 1, 2); }
1477  *              { wow (one); }          ->      { process (one); {
1478  */
1479 static char rest_extension[] = "...";
1480 #define REST_EXTENSION_LENGTH   (sizeof (rest_extension) - 1)
1481
1482 /* Create a DEFINITION node from a #define directive.  Arguments are 
1483    as for do_define.  */
1484
1485 static MACRODEF
1486 create_definition (buf, limit, pfile, predefinition)
1487      U_CHAR *buf, *limit;
1488      cpp_reader *pfile;
1489      int predefinition;
1490 {
1491   U_CHAR *bp;                   /* temp ptr into input buffer */
1492   U_CHAR *symname;              /* remember where symbol name starts */
1493   int sym_length;               /* and how long it is */
1494   int rest_args = 0;
1495   long line, col;
1496   char *file = CPP_BUFFER (pfile) ? CPP_BUFFER (pfile)->nominal_fname : "";
1497   DEFINITION *defn;
1498   int arglengths = 0;           /* Accumulate lengths of arg names
1499                                    plus number of args.  */
1500   MACRODEF mdef;
1501   cpp_buf_line_and_col (CPP_BUFFER (pfile), &line, &col);
1502
1503   bp = buf;
1504
1505   while (is_hor_space[*bp])
1506     bp++;
1507
1508   symname = bp;                 /* remember where it starts */
1509
1510   sym_length = check_macro_name (pfile, bp, "macro");
1511   bp += sym_length;
1512
1513   /* Lossage will occur if identifiers or control keywords are broken
1514      across lines using backslash.  This is not the right place to take
1515      care of that.  */
1516
1517   if (*bp == '(') {
1518     struct arglist *arg_ptrs = NULL;
1519     int argno = 0;
1520
1521     bp++;                       /* skip '(' */
1522     SKIP_WHITE_SPACE (bp);
1523
1524     /* Loop over macro argument names.  */
1525     while (*bp != ')') {
1526       struct arglist *temp;
1527
1528       temp = (struct arglist *) alloca (sizeof (struct arglist));
1529       temp->name = bp;
1530       temp->next = arg_ptrs;
1531       temp->argno = argno++;
1532       temp->rest_args = 0;
1533       arg_ptrs = temp;
1534
1535       if (rest_args)
1536         cpp_pedwarn (pfile, "another parameter follows `%s'", rest_extension);
1537
1538       if (!is_idstart[*bp])
1539         cpp_pedwarn (pfile, "invalid character in macro parameter name");
1540       
1541       /* Find the end of the arg name.  */
1542       while (is_idchar[*bp]) {
1543         bp++;
1544         /* do we have a "special" rest-args extension here? */
1545         if (limit - bp > REST_EXTENSION_LENGTH &&
1546             strncmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) {
1547           rest_args = 1;
1548           temp->rest_args = 1;
1549           break;
1550         }
1551       }
1552       temp->length = bp - temp->name;
1553       if (rest_args == 1)
1554         bp += REST_EXTENSION_LENGTH;
1555       arglengths += temp->length + 2;
1556       SKIP_WHITE_SPACE (bp);
1557       if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
1558         cpp_error (pfile, "badly punctuated parameter list in `#define'");
1559         goto nope;
1560       }
1561       if (*bp == ',') {
1562         bp++;
1563         SKIP_WHITE_SPACE (bp);
1564       }
1565       if (bp >= limit) {
1566         cpp_error (pfile, "unterminated parameter list in `#define'");
1567         goto nope;
1568       }
1569       {
1570         struct arglist *otemp;
1571
1572         for (otemp = temp->next; otemp != NULL; otemp = otemp->next)
1573           if (temp->length == otemp->length &&
1574             strncmp (temp->name, otemp->name, temp->length) == 0) {
1575               U_CHAR *name;
1576
1577               name = (U_CHAR *) alloca (temp->length + 1);
1578               (void) strncpy (name, temp->name, temp->length);
1579               name[temp->length] = '\0';
1580               cpp_error (pfile,
1581                          "duplicate argument name `%s' in `#define'", name);
1582               goto nope;
1583           }
1584       }
1585     }
1586
1587     ++bp;                       /* skip paren */
1588     SKIP_WHITE_SPACE (bp);
1589     /* now everything from bp before limit is the definition.  */
1590     defn = collect_expansion (pfile, bp, limit, argno, arg_ptrs);
1591     defn->rest_args = rest_args;
1592
1593     /* Now set defn->args.argnames to the result of concatenating
1594        the argument names in reverse order
1595        with comma-space between them.  */
1596     defn->args.argnames = (U_CHAR *) xmalloc (arglengths + 1);
1597     {
1598       struct arglist *temp;
1599       int i = 0;
1600       for (temp = arg_ptrs; temp; temp = temp->next) {
1601         bcopy (temp->name, &defn->args.argnames[i], temp->length);
1602         i += temp->length;
1603         if (temp->next != 0) {
1604           defn->args.argnames[i++] = ',';
1605           defn->args.argnames[i++] = ' ';
1606         }
1607       }
1608       defn->args.argnames[i] = 0;
1609     }
1610   } else {
1611     /* Simple expansion or empty definition.  */
1612
1613     if (bp < limit)
1614       {
1615         if (is_hor_space[*bp]) {
1616           bp++;
1617           SKIP_WHITE_SPACE (bp);
1618         } else {
1619           switch (*bp) {
1620             case '!':  case '"':  case '#':  case '%':  case '&':  case '\'':
1621             case ')':  case '*':  case '+':  case ',':  case '-':  case '.':
1622             case '/':  case ':':  case ';':  case '<':  case '=':  case '>':
1623             case '?':  case '[':  case '\\': case ']':  case '^':  case '{':
1624             case '|':  case '}':  case '~':
1625               cpp_warning (pfile, "missing white space after `#define %.*s'",
1626                            sym_length, symname);
1627               break;
1628
1629             default:
1630               cpp_pedwarn (pfile, "missing white space after `#define %.*s'",
1631                            sym_length, symname);
1632               break;
1633           }
1634         }
1635       }
1636     /* now everything from bp before limit is the definition.  */
1637     defn = collect_expansion (pfile, bp, limit, -1, NULL_PTR);
1638     defn->args.argnames = (U_CHAR *) "";
1639   }
1640
1641   defn->line = line;
1642   defn->file = file;
1643
1644   /* OP is null if this is a predefinition */
1645   defn->predefined = predefinition;
1646   mdef.defn = defn;
1647   mdef.symnam = symname;
1648   mdef.symlen = sym_length;
1649
1650   return mdef;
1651
1652  nope:
1653   mdef.defn = 0;
1654   return mdef;
1655 }
1656
1657 /* Check a purported macro name SYMNAME, and yield its length.
1658    USAGE is the kind of name this is intended for.  */
1659
1660 static int
1661 check_macro_name (pfile, symname, usage)
1662      cpp_reader *pfile;
1663      U_CHAR *symname;
1664      char *usage;
1665 {
1666   U_CHAR *p;
1667   int sym_length;
1668
1669   for (p = symname; is_idchar[*p]; p++)
1670     ;
1671   sym_length = p - symname;
1672   if (sym_length == 0
1673       || (sym_length == 1 && *symname == 'L' && (*p == '\'' || *p == '"')))
1674     cpp_error (pfile, "invalid %s name", usage);
1675   else if (!is_idstart[*symname]) {
1676     U_CHAR *msg;                        /* what pain...  */
1677     msg = (U_CHAR *) alloca (sym_length + 1);
1678     bcopy (symname, msg, sym_length);
1679     msg[sym_length] = 0;
1680     cpp_error (pfile, "invalid %s name `%s'", usage, msg);
1681   } else {
1682     if (! strncmp (symname, "defined", 7) && sym_length == 7)
1683       cpp_error (pfile, "invalid %s name `defined'", usage);
1684   }
1685   return sym_length;
1686 }
1687
1688 /* Return zero if two DEFINITIONs are isomorphic.  */
1689
1690 static int
1691 compare_defs (d1, d2)
1692      DEFINITION *d1, *d2;
1693 {
1694   register struct reflist *a1, *a2;
1695   register U_CHAR *p1 = d1->expansion;
1696   register U_CHAR *p2 = d2->expansion;
1697   int first = 1;
1698
1699   if (d1->nargs != d2->nargs)
1700     return 1;
1701   if (strcmp ((char *)d1->args.argnames, (char *)d2->args.argnames))
1702     return 1;
1703   for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
1704        a1 = a1->next, a2 = a2->next) {
1705     if (!((a1->nchars == a2->nchars && ! strncmp (p1, p2, a1->nchars))
1706           || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
1707         || a1->argno != a2->argno
1708         || a1->stringify != a2->stringify
1709         || a1->raw_before != a2->raw_before
1710         || a1->raw_after != a2->raw_after)
1711       return 1;
1712     first = 0;
1713     p1 += a1->nchars;
1714     p2 += a2->nchars;
1715   }
1716   if (a1 != a2)
1717     return 1;
1718   if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
1719                      p2, d2->length - (p2 - d2->expansion), 1))
1720     return 1;
1721   return 0;
1722 }
1723
1724 /* Return 1 if two parts of two macro definitions are effectively different.
1725    One of the parts starts at BEG1 and has LEN1 chars;
1726    the other has LEN2 chars at BEG2.
1727    Any sequence of whitespace matches any other sequence of whitespace.
1728    FIRST means these parts are the first of a macro definition;
1729     so ignore leading whitespace entirely.
1730    LAST means these parts are the last of a macro definition;
1731     so ignore trailing whitespace entirely.  */
1732
1733 static int
1734 comp_def_part (first, beg1, len1, beg2, len2, last)
1735      int first;
1736      U_CHAR *beg1, *beg2;
1737      int len1, len2;
1738      int last;
1739 {
1740   register U_CHAR *end1 = beg1 + len1;
1741   register U_CHAR *end2 = beg2 + len2;
1742   if (first) {
1743     while (beg1 != end1 && is_space[*beg1]) beg1++;
1744     while (beg2 != end2 && is_space[*beg2]) beg2++;
1745   }
1746   if (last) {
1747     while (beg1 != end1 && is_space[end1[-1]]) end1--;
1748     while (beg2 != end2 && is_space[end2[-1]]) end2--;
1749   }
1750   while (beg1 != end1 && beg2 != end2) {
1751     if (is_space[*beg1] && is_space[*beg2]) {
1752       while (beg1 != end1 && is_space[*beg1]) beg1++;
1753       while (beg2 != end2 && is_space[*beg2]) beg2++;
1754     } else if (*beg1 == *beg2) {
1755       beg1++; beg2++;
1756     } else break;
1757   }
1758   return (beg1 != end1) || (beg2 != end2);
1759 }
1760
1761 /* Process a #define command.
1762 BUF points to the contents of the #define command, as a contiguous string.
1763 LIMIT points to the first character past the end of the definition.
1764 KEYWORD is the keyword-table entry for #define,
1765 or NULL for a "predefined" macro.  */
1766
1767 static int
1768 do_define (pfile, keyword, buf, limit)
1769      cpp_reader *pfile;
1770      struct directive *keyword;
1771      U_CHAR *buf, *limit;
1772 {
1773   int hashcode;
1774   MACRODEF mdef;
1775   HASHNODE *hp;
1776
1777 #if 0
1778   /* If this is a precompiler run (with -pcp) pass thru #define commands.  */
1779   if (pcp_outfile && keyword)
1780     pass_thru_directive (buf, limit, pfile, keyword);
1781 #endif
1782
1783   mdef = create_definition (buf, limit, pfile, keyword == NULL);
1784   if (mdef.defn == 0)
1785     goto nope;
1786
1787   hashcode = hashf (mdef.symnam, mdef.symlen, HASHSIZE);
1788
1789   if ((hp = cpp_lookup (pfile, mdef.symnam, mdef.symlen, hashcode)) != NULL)
1790     {
1791       int ok = 0;
1792       /* Redefining a precompiled key is ok.  */
1793       if (hp->type == T_PCSTRING)
1794         ok = 1;
1795       /* Redefining a macro is ok if the definitions are the same.  */
1796       else if (hp->type == T_MACRO)
1797         ok = ! compare_defs (mdef.defn, hp->value.defn);
1798       /* Redefining a constant is ok with -D.  */
1799       else if (hp->type == T_CONST)
1800         ok = ! CPP_OPTIONS (pfile)->done_initializing;
1801       /* Print the warning if it's not ok.  */
1802       if (!ok)
1803         {
1804           U_CHAR *msg;          /* what pain...  */
1805
1806           /* If we are passing through #define and #undef directives, do
1807              that for this re-definition now.  */
1808           if (CPP_OPTIONS (pfile)->debug_output && keyword)
1809             pass_thru_directive (buf, limit, pfile, keyword);
1810
1811           msg = (U_CHAR *) alloca (mdef.symlen + 22);
1812           *msg = '`';
1813           bcopy (mdef.symnam, msg + 1, mdef.symlen);
1814           strcpy ((char *) (msg + mdef.symlen + 1), "' redefined");
1815           cpp_pedwarn (pfile, msg);
1816           if (hp->type == T_MACRO)
1817             cpp_pedwarn_with_file_and_line (pfile, hp->value.defn->file, hp->value.defn->line,
1818                                       "this is the location of the previous definition");
1819         }
1820       /* Replace the old definition.  */
1821       hp->type = T_MACRO;
1822       hp->value.defn = mdef.defn;
1823     }
1824   else
1825     {
1826       /* If we are passing through #define and #undef directives, do
1827          that for this new definition now.  */
1828       if (CPP_OPTIONS (pfile)->debug_output && keyword)
1829         pass_thru_directive (buf, limit, pfile, keyword);
1830       install (mdef.symnam, mdef.symlen, T_MACRO, 0,
1831                (char *) mdef.defn, hashcode);
1832     }
1833
1834   return 0;
1835
1836 nope:
1837
1838   return 1;
1839 }
1840
1841 /* This structure represents one parsed argument in a macro call.
1842    `raw' points to the argument text as written (`raw_length' is its length).
1843    `expanded' points to the argument's macro-expansion
1844    (its length is `expand_length').
1845    `stringified_length' is the length the argument would have
1846    if stringified.
1847    `use_count' is the number of times this macro arg is substituted
1848    into the macro.  If the actual use count exceeds 10, 
1849    the value stored is 10.  */
1850
1851 /* raw and expanded are relative to ARG_BASE */
1852 #define ARG_BASE ((pfile)->token_buffer)
1853
1854 struct argdata {
1855   /* Strings relative to pfile->token_buffer */
1856   long raw, expanded, stringified;
1857   int raw_length, expand_length;
1858   int stringified_length;
1859   char newlines;
1860   char use_count;
1861 };
1862
1863 /* Allocate a new cpp_buffer for PFILE, and push it on the input buffer stack.
1864    If BUFFER != NULL, then use the LENGTH characters in BUFFER
1865    as the new input buffer.
1866    Return the new buffer, or NULL on failure.  */
1867
1868 cpp_buffer *
1869 cpp_push_buffer (pfile, buffer, length)
1870      cpp_reader *pfile;
1871      U_CHAR *buffer;
1872      long length;
1873 {
1874   register cpp_buffer *buf = CPP_BUFFER (pfile);
1875   if (buf == pfile->buffer_stack)
1876     {
1877       cpp_fatal (pfile, "%s: macro or `#include' recursion too deep",
1878                  buf->fname);
1879       return NULL;
1880     }
1881   buf--;
1882   bzero ((char *) buf, sizeof (cpp_buffer));
1883   CPP_BUFFER (pfile) = buf;
1884   buf->if_stack = pfile->if_stack;
1885   buf->cleanup = null_cleanup;
1886   buf->underflow = null_underflow;
1887   buf->buf = buf->cur = buffer;
1888   buf->alimit = buf->rlimit = buffer + length;
1889   
1890   return buf;
1891 }
1892
1893 cpp_buffer *
1894 cpp_pop_buffer (pfile)
1895      cpp_reader *pfile;
1896 {
1897   cpp_buffer *buf = CPP_BUFFER (pfile);
1898   (*buf->cleanup) (buf, pfile);
1899   return ++CPP_BUFFER (pfile);
1900 }
1901
1902 /* Scan until CPP_BUFFER (PFILE) is exhausted into PFILE->token_buffer.
1903    Pop the buffer when done.  */
1904
1905 void
1906 cpp_scan_buffer (pfile)
1907      cpp_reader *pfile;
1908 {
1909   cpp_buffer *buffer = CPP_BUFFER (pfile);
1910   for (;;)
1911     {
1912       enum cpp_token token = cpp_get_token (pfile);
1913       if (token == CPP_EOF) /* Should not happen ...  */
1914         break;
1915       if (token == CPP_POP && CPP_BUFFER (pfile) == buffer)
1916         {
1917           cpp_pop_buffer (pfile);
1918           break;
1919         }
1920     }
1921 }
1922
1923 /*
1924  * Rescan a string (which may have escape marks) into pfile's buffer.
1925  * Place the result in pfile->token_buffer.
1926  *
1927  * The input is copied before it is scanned, so it is safe to pass
1928  * it something from the token_buffer that will get overwritten
1929  * (because it follows CPP_WRITTEN).  This is used by do_include.
1930  */
1931
1932 static void
1933 cpp_expand_to_buffer (pfile, buf, length)
1934      cpp_reader *pfile;
1935      U_CHAR *buf;
1936      int length;
1937 {
1938   register cpp_buffer *ip;
1939   cpp_buffer obuf;
1940   U_CHAR *limit = buf + length;
1941   U_CHAR *buf1;
1942 #if 0
1943   int odepth = indepth;
1944 #endif
1945
1946   if (length < 0)
1947     abort ();
1948
1949   /* Set up the input on the input stack.  */
1950
1951   buf1 = (U_CHAR *) alloca (length + 1);
1952   {
1953     register U_CHAR *p1 = buf;
1954     register U_CHAR *p2 = buf1;
1955
1956     while (p1 != limit)
1957       *p2++ = *p1++;
1958   }
1959   buf1[length] = 0;
1960
1961   ip = cpp_push_buffer (pfile, buf1, length);
1962   if (ip == NULL)
1963     return;
1964   ip->has_escapes = 1;
1965 #if 0
1966   ip->lineno = obuf.lineno = 1;
1967 #endif
1968
1969   /* Scan the input, create the output.  */
1970   cpp_scan_buffer (pfile);
1971
1972 #if 0
1973   if (indepth != odepth)
1974     abort ();
1975 #endif
1976
1977   CPP_NUL_TERMINATE (pfile);
1978 }
1979
1980 \f
1981 static void
1982 adjust_position (buf, limit, linep, colp)
1983      U_CHAR *buf;
1984      U_CHAR *limit;
1985      long *linep;
1986      long *colp;
1987 {
1988   while (buf < limit)
1989     {
1990       U_CHAR ch = *buf++;
1991       if (ch == '\n')
1992         (*linep)++, (*colp) = 1;
1993       else
1994         (*colp)++;
1995     }
1996 }
1997
1998 /* Move line_base forward, updating lineno and colno.  */
1999
2000 static void
2001 update_position (pbuf)
2002      register cpp_buffer *pbuf;
2003 {
2004   unsigned char *old_pos = pbuf->buf + pbuf->line_base;
2005   unsigned char *new_pos = pbuf->cur;
2006   register struct parse_marker *mark;
2007   for (mark = pbuf->marks;  mark != NULL; mark = mark->next)
2008     {
2009       if (pbuf->buf + mark->position < new_pos)
2010         new_pos = pbuf->buf + mark->position;
2011     }
2012   pbuf->line_base += new_pos - old_pos;
2013   adjust_position (old_pos, new_pos, &pbuf->lineno, &pbuf->colno);
2014 }
2015
2016 void
2017 cpp_buf_line_and_col (pbuf, linep, colp)
2018      register cpp_buffer *pbuf;
2019      long *linep, *colp;
2020 {
2021   long dummy;
2022   if (colp == NULL)
2023     colp = &dummy;
2024   if (pbuf)
2025     {
2026       *linep = pbuf->lineno;
2027       *colp = pbuf->colno;
2028       adjust_position (pbuf->buf + pbuf->line_base, pbuf->cur, linep, colp);
2029     }
2030   else
2031     {
2032       *linep = 0;
2033       *colp = 0;
2034     }
2035 }
2036
2037 /* Return the cpp_buffer that corresponds to a file (not a macro).  */
2038
2039 cpp_buffer *
2040 cpp_file_buffer (pfile)
2041      cpp_reader *pfile;
2042 {
2043   cpp_buffer *ip = CPP_BUFFER (pfile);
2044
2045   for ( ; ip != CPP_NULL_BUFFER (pfile); ip = CPP_PREV_BUFFER (ip))
2046     if (ip->fname != NULL)
2047       return ip;
2048   return NULL;
2049 }
2050
2051 static long
2052 count_newlines (buf, limit)
2053      register U_CHAR *buf;
2054      register U_CHAR *limit;
2055 {
2056   register long count = 0;
2057   while (buf < limit)
2058     {
2059       U_CHAR ch = *buf++;
2060       if (ch == '\n')
2061         count++;
2062     }
2063   return count;
2064 }
2065
2066 /*
2067  * write out a #line command, for instance, after an #include file.
2068  * If CONDITIONAL is nonzero, we can omit the #line if it would
2069  * appear to be a no-op, and we can output a few newlines instead
2070  * if we want to increase the line number by a small amount.
2071  * FILE_CHANGE says whether we are entering a file, leaving, or neither.
2072  */
2073
2074 static void
2075 output_line_command (pfile, conditional, file_change)
2076      cpp_reader *pfile;
2077      int conditional;
2078      enum file_change_code file_change;
2079 {
2080   int len;
2081   char *line_cmd_buf, *line_end;
2082   long line, col;
2083   cpp_buffer *ip = CPP_BUFFER (pfile);
2084
2085   if (ip->fname == NULL)
2086     return;
2087
2088   update_position (ip);
2089
2090   if (CPP_OPTIONS (pfile)->no_line_commands
2091       || CPP_OPTIONS (pfile)->no_output)
2092     return;
2093
2094   line = CPP_BUFFER (pfile)->lineno;
2095   col = CPP_BUFFER (pfile)->colno;
2096   adjust_position (CPP_LINE_BASE (ip), ip->cur, &line, &col);
2097
2098   if (CPP_OPTIONS (pfile)->no_line_commands)
2099     return;
2100
2101   if (conditional) {
2102     if (line == pfile->lineno)
2103       return;
2104
2105     /* If the inherited line number is a little too small,
2106        output some newlines instead of a #line command.  */
2107     if (line > pfile->lineno && line < pfile->lineno + 8) {
2108       CPP_RESERVE (pfile, 20);
2109       while (line > pfile->lineno) {
2110         CPP_PUTC_Q (pfile, '\n');
2111         pfile->lineno++;
2112       }
2113       return;
2114     }
2115   }
2116
2117 #if 0
2118   /* Don't output a line number of 0 if we can help it.  */
2119   if (ip->lineno == 0 && ip->bufp - ip->buf < ip->length
2120       && *ip->bufp == '\n') {
2121     ip->lineno++;
2122     ip->bufp++;
2123   }
2124 #endif
2125
2126   CPP_RESERVE (pfile, 4 * strlen (ip->nominal_fname) + 50);
2127   {
2128 #ifdef OUTPUT_LINE_COMMANDS
2129     static char sharp_line[] = "#line ";
2130 #else
2131     static char sharp_line[] = "# ";
2132 #endif
2133     CPP_PUTS_Q (pfile, sharp_line, sizeof(sharp_line)-1);
2134   }
2135
2136   sprintf (CPP_PWRITTEN (pfile), "%d ", line);
2137   CPP_ADJUST_WRITTEN (pfile, strlen (CPP_PWRITTEN (pfile)));
2138
2139   quote_string (pfile, ip->nominal_fname); 
2140   if (file_change != same_file) {
2141     CPP_PUTC_Q (pfile, ' ');
2142     CPP_PUTC_Q (pfile, file_change == enter_file ? '1' : '2');
2143   }
2144   /* Tell cc1 if following text comes from a system header file.  */
2145   if (ip->system_header_p) {
2146     CPP_PUTC_Q (pfile, ' ');
2147     CPP_PUTC_Q (pfile, '3');
2148   }
2149 #ifndef NO_IMPLICIT_EXTERN_C
2150   /* Tell cc1plus if following text should be treated as C.  */
2151   if (ip->system_header_p == 2 && CPP_OPTIONS (pfile)->cplusplus) {
2152     CPP_PUTC_Q (pfile, ' ');
2153     CPP_PUTC_Q (pfile, '4');
2154   }
2155 #endif
2156   CPP_PUTC_Q (pfile, '\n');
2157   pfile->lineno = line;
2158 }
2159 \f
2160 /*
2161  * Parse a macro argument and append the info on PFILE's token_buffer.
2162  * REST_ARGS means to absorb the rest of the args.
2163  * Return nonzero to indicate a syntax error.
2164  */
2165
2166 static enum cpp_token
2167 macarg (pfile, rest_args)
2168      cpp_reader *pfile;
2169      int rest_args;
2170 {
2171   int paren = 0;
2172   enum cpp_token token;
2173   long arg_start = CPP_WRITTEN (pfile);
2174   char save_put_out_comments = CPP_OPTIONS (pfile)->put_out_comments;
2175   CPP_OPTIONS (pfile)->put_out_comments = 0;
2176
2177   /* Try to parse as much of the argument as exists at this
2178      input stack level.  */
2179   pfile->no_macro_expand++;
2180   for (;;)
2181     {
2182       token = cpp_get_token (pfile);
2183       switch (token)
2184         {
2185         case CPP_EOF:
2186           goto done;
2187         case CPP_POP:
2188           /* If we've hit end of file, it's an error (reported by caller).
2189              Ditto if it's the end of cpp_expand_to_buffer text.
2190              If we've hit end of macro, just continue.  */
2191           if (! CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
2192             goto done;
2193           break;
2194         case CPP_LPAREN:
2195           paren++;
2196           break;
2197         case CPP_RPAREN:
2198           if (--paren < 0)
2199             goto found;
2200           break;
2201         case CPP_COMMA:
2202           /* if we've returned to lowest level and
2203              we aren't absorbing all args */
2204           if (paren == 0 && rest_args == 0)
2205             goto found;
2206           break;
2207         found:
2208           /* Remove ',' or ')' from argument buffer.  */
2209           CPP_ADJUST_WRITTEN (pfile, -1);
2210           goto done;
2211       default: ;
2212         }
2213     }
2214
2215  done:
2216   CPP_OPTIONS (pfile)->put_out_comments = save_put_out_comments;
2217   pfile->no_macro_expand--;
2218
2219   return token;
2220 }
2221 \f
2222 /* Turn newlines to spaces in the string of length LENGTH at START,
2223    except inside of string constants.
2224    The string is copied into itself with its beginning staying fixed.  */
2225
2226 static int
2227 change_newlines (start, length)
2228      U_CHAR *start;
2229      int length;
2230 {
2231   register U_CHAR *ibp;
2232   register U_CHAR *obp;
2233   register U_CHAR *limit;
2234   register int c;
2235
2236   ibp = start;
2237   limit = start + length;
2238   obp = start;
2239
2240   while (ibp < limit) {
2241     *obp++ = c = *ibp++;
2242     switch (c) {
2243
2244     case '\'':
2245     case '\"':
2246       /* Notice and skip strings, so that we don't delete newlines in them.  */
2247       {
2248         int quotec = c;
2249         while (ibp < limit) {
2250           *obp++ = c = *ibp++;
2251           if (c == quotec)
2252             break;
2253           if (c == '\n' && quotec == '\'')
2254             break;
2255         }
2256       }
2257       break;
2258     }
2259   }
2260
2261   return obp - start;
2262 }
2263
2264 \f
2265 static struct tm *
2266 timestamp (pfile)
2267      cpp_reader *pfile;
2268 {
2269   if (!pfile->timebuf) {
2270     time_t t = time ((time_t *) 0);
2271     pfile->timebuf = localtime (&t);
2272   }
2273   return pfile->timebuf;
2274 }
2275
2276 static char *monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
2277                              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
2278                             };
2279
2280 /*
2281  * expand things like __FILE__.  Place the expansion into the output
2282  * buffer *without* rescanning.
2283  */
2284
2285 static void
2286 special_symbol (hp, pfile)
2287      HASHNODE *hp;
2288      cpp_reader *pfile;
2289 {
2290   char *buf;
2291   int i, len;
2292   int true_indepth;
2293   cpp_buffer *ip = NULL;
2294   struct tm *timebuf;
2295
2296   int paren = 0;                /* For special `defined' keyword */
2297
2298 #if 0
2299   if (pcp_outfile && pcp_inside_if
2300       && hp->type != T_SPEC_DEFINED && hp->type != T_CONST)
2301     cpp_error (pfile,
2302                "Predefined macro `%s' used inside `#if' during precompilation",
2303                hp->name);
2304 #endif
2305     
2306   for (ip = CPP_BUFFER (pfile); ; ip = CPP_PREV_BUFFER (ip))
2307     {
2308       if (ip == CPP_NULL_BUFFER (pfile))
2309         {
2310           cpp_error (pfile, "cccp error: not in any file?!");
2311           return;                       /* the show must go on */
2312         }
2313       if (ip->fname != NULL)
2314         break;
2315     }
2316
2317   switch (hp->type)
2318     {
2319     case T_FILE:
2320     case T_BASE_FILE:
2321       {
2322         char *string;
2323         if (hp->type == T_BASE_FILE)
2324           {
2325             while (CPP_PREV_BUFFER (ip) != CPP_NULL_BUFFER (pfile))
2326               ip = CPP_PREV_BUFFER (ip);
2327           }
2328         string = ip->nominal_fname;
2329
2330         if (!string)
2331           string = "";
2332         CPP_RESERVE (pfile, 3 + 4 * strlen (string));
2333         quote_string (pfile, string);
2334         return;
2335       }
2336
2337     case T_INCLUDE_LEVEL:
2338       true_indepth = 0;
2339       ip = CPP_BUFFER (pfile);
2340       for (;  ip != CPP_NULL_BUFFER (pfile); ip = CPP_PREV_BUFFER (ip))
2341         if (ip->fname != NULL)
2342           true_indepth++;
2343
2344       buf = (char *) alloca (8); /* Eight bytes ought to be more than enough */
2345       sprintf (buf, "%d", true_indepth - 1);
2346       break;
2347
2348   case T_VERSION:
2349       buf = (char *) alloca (3 + strlen (version_string));
2350       sprintf (buf, "\"%s\"", version_string);
2351       break;
2352
2353 #ifndef NO_BUILTIN_SIZE_TYPE
2354     case T_SIZE_TYPE:
2355       buf = SIZE_TYPE;
2356       break;
2357 #endif
2358
2359 #ifndef NO_BUILTIN_PTRDIFF_TYPE
2360     case T_PTRDIFF_TYPE:
2361       buf = PTRDIFF_TYPE;
2362       break;
2363 #endif
2364
2365     case T_WCHAR_TYPE:
2366       buf = CPP_WCHAR_TYPE (pfile);
2367     break;
2368
2369     case T_USER_LABEL_PREFIX_TYPE:
2370       buf = USER_LABEL_PREFIX;
2371       break;
2372
2373     case T_REGISTER_PREFIX_TYPE:
2374       buf = REGISTER_PREFIX;
2375       break;
2376
2377   case T_CONST:
2378       buf = (char *) alloca (4 * sizeof (int));
2379       sprintf (buf, "%d", hp->value.ival);
2380 #if 0
2381       if (pcp_inside_if && pcp_outfile)
2382         /* Output a precondition for this macro use */
2383         fprintf (pcp_outfile, "#define %s %d\n", hp->name, hp->value.ival);
2384 #endif
2385       break;
2386
2387     case T_SPECLINE:
2388       {
2389         long line = ip->lineno;
2390         long col = ip->colno;
2391         adjust_position (CPP_LINE_BASE (ip), ip->cur, &line, &col);
2392
2393         buf = (char *) alloca (10);
2394         sprintf (buf, "%d", line);
2395       }
2396       break;
2397
2398     case T_DATE:
2399     case T_TIME:
2400       buf = (char *) alloca (20);
2401       timebuf = timestamp (pfile);
2402       if (hp->type == T_DATE)
2403         sprintf (buf, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
2404                  timebuf->tm_mday, timebuf->tm_year + 1900);
2405       else
2406         sprintf (buf, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
2407                  timebuf->tm_sec);
2408       break;
2409
2410     case T_SPEC_DEFINED:
2411       buf = " 0 ";              /* Assume symbol is not defined */
2412       ip = CPP_BUFFER (pfile);
2413       SKIP_WHITE_SPACE (ip->cur);
2414       if (*ip->cur == '(')
2415         {
2416           paren++;
2417           ip->cur++;                    /* Skip over the paren */
2418           SKIP_WHITE_SPACE (ip->cur);
2419         }
2420
2421       if (!is_idstart[*ip->cur])
2422         goto oops;
2423       if (ip->cur[0] == 'L' && (ip->cur[1] == '\'' || ip->cur[1] == '"'))
2424         goto oops;
2425       if (hp = cpp_lookup (pfile, ip->cur, -1, -1))
2426         {
2427 #if 0
2428           if (pcp_outfile && pcp_inside_if
2429               && (hp->type == T_CONST
2430                   || (hp->type == T_MACRO && hp->value.defn->predefined)))
2431             /* Output a precondition for this macro use.  */
2432             fprintf (pcp_outfile, "#define %s\n", hp->name);
2433 #endif
2434           buf = " 1 ";
2435         }
2436 #if 0
2437       else
2438         if (pcp_outfile && pcp_inside_if)
2439           {
2440             /* Output a precondition for this macro use */
2441             U_CHAR *cp = ip->bufp;
2442             fprintf (pcp_outfile, "#undef ");
2443             while (is_idchar[*cp]) /* Ick! */
2444               fputc (*cp++, pcp_outfile);
2445             putc ('\n', pcp_outfile);
2446           }
2447 #endif
2448       while (is_idchar[*ip->cur])
2449         ++ip->cur;
2450       SKIP_WHITE_SPACE (ip->cur);
2451       if (paren)
2452         {
2453           if (*ip->cur != ')')
2454             goto oops;
2455           ++ip->cur;
2456         }
2457       break;
2458
2459     oops:
2460
2461       cpp_error (pfile, "`defined' without an identifier");
2462       break;
2463
2464     default:
2465       cpp_error (pfile, "cccp error: invalid special hash type"); /* time for gdb */
2466       abort ();
2467     }
2468   len = strlen (buf);
2469   CPP_RESERVE (pfile, len + 1);
2470   CPP_PUTS_Q (pfile, buf, len);
2471   CPP_NUL_TERMINATE_Q (pfile);
2472
2473   return;
2474 }
2475
2476 /* Write out a #define command for the special named MACRO_NAME
2477    to PFILE's token_buffer.  */
2478
2479 static void
2480 dump_special_to_buffer (pfile, macro_name)
2481      cpp_reader *pfile;
2482      char *macro_name;
2483 {
2484   static char define_directive[] = "#define ";
2485   int macro_name_length = strlen (macro_name);
2486   output_line_command (pfile, 0, same_file);
2487   CPP_RESERVE (pfile, sizeof(define_directive) + macro_name_length);
2488   CPP_PUTS_Q (pfile, define_directive, sizeof(define_directive)-1);
2489   CPP_PUTS_Q (pfile, macro_name, macro_name_length);
2490   CPP_PUTC_Q (pfile, ' ');
2491   cpp_expand_to_buffer (pfile, macro_name, macro_name_length);
2492   CPP_PUTC (pfile, '\n');
2493 }
2494
2495 /* Initialize the built-in macros.  */
2496
2497 static void
2498 initialize_builtins (pfile)
2499      cpp_reader *pfile;
2500 {
2501   install ("__LINE__", -1, T_SPECLINE, 0, 0, -1);
2502   install ("__DATE__", -1, T_DATE, 0, 0, -1);
2503   install ("__FILE__", -1, T_FILE, 0, 0, -1);
2504   install ("__BASE_FILE__", -1, T_BASE_FILE, 0, 0, -1);
2505   install ("__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, 0, 0, -1);
2506   install ("__VERSION__", -1, T_VERSION, 0, 0, -1);
2507 #ifndef NO_BUILTIN_SIZE_TYPE
2508   install ("__SIZE_TYPE__", -1, T_SIZE_TYPE, 0, 0, -1);
2509 #endif
2510 #ifndef NO_BUILTIN_PTRDIFF_TYPE
2511   install ("__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, 0, 0, -1);
2512 #endif
2513   install ("__WCHAR_TYPE__", -1, T_WCHAR_TYPE, 0, 0, -1);
2514   install ("__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE, 0, 0, -1);
2515   install ("__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, 0, 0, -1);
2516   install ("__TIME__", -1, T_TIME, 0, 0, -1);
2517   if (!CPP_TRADITIONAL (pfile))
2518     install ("__STDC__", -1, T_CONST, STDC_VALUE, 0, -1);
2519   if (CPP_OPTIONS (pfile)->objc)
2520     install ("__OBJC__", -1, T_CONST, 1, 0, -1);
2521 /*  This is supplied using a -D by the compiler driver
2522     so that it is present only when truly compiling with GNU C.  */
2523 /*  install ("__GNUC__", -1, T_CONST, 2, 0, -1);  */
2524
2525   if (CPP_OPTIONS (pfile)->debug_output)
2526     {
2527       dump_special_to_buffer (pfile, "__BASE_FILE__");
2528       dump_special_to_buffer (pfile, "__VERSION__");
2529 #ifndef NO_BUILTIN_SIZE_TYPE
2530       dump_special_to_buffer (pfile, "__SIZE_TYPE__");
2531 #endif
2532 #ifndef NO_BUILTIN_PTRDIFF_TYPE
2533       dump_special_to_buffer (pfile, "__PTRDIFF_TYPE__");
2534 #endif
2535       dump_special_to_buffer (pfile, "__WCHAR_TYPE__");
2536       dump_special_to_buffer (pfile, "__DATE__");
2537       dump_special_to_buffer (pfile, "__TIME__");
2538       if (!CPP_TRADITIONAL (pfile))
2539         dump_special_to_buffer (pfile, "__STDC__");
2540       if (CPP_OPTIONS (pfile)->objc)
2541         dump_special_to_buffer (pfile, "__OBJC__");
2542     }
2543 }
2544 \f
2545 /* Return 1 iff a token ending in C1 followed directly by a token C2
2546    could cause mis-tokenization.  */
2547
2548 static int
2549 unsafe_chars (c1, c2)
2550      int c1, c2;
2551 {
2552   switch (c1)
2553     {
2554     case '+': case '-':
2555       if (c2 == c1 || c2 == '=')
2556         return 1;
2557       goto letter;
2558     case '.':
2559     case '0': case '1': case '2': case '3': case '4':
2560     case '5': case '6': case '7': case '8': case '9':
2561     case 'e': case 'E': case 'p': case 'P':
2562       if (c2 == '-' || c2 == '+')
2563         return 1; /* could extend a pre-processing number */
2564       goto letter;
2565     case 'L':
2566       if (c2 == '\'' || c2 == '\"')
2567         return 1;   /* Could turn into L"xxx" or L'xxx'.  */
2568       goto letter;
2569     letter:
2570     case '_':
2571     case 'a': case 'b': case 'c': case 'd':           case 'f':
2572     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
2573     case 'm': case 'n': case 'o':           case 'q': case 'r':
2574     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
2575     case 'y': case 'z':
2576     case 'A': case 'B': case 'C': case 'D':           case 'F':
2577     case 'G': case 'H': case 'I': case 'J': case 'K':
2578     case 'M': case 'N': case 'O':           case 'Q': case 'R':
2579     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
2580     case 'Y': case 'Z':
2581       /* We're in the middle of either a name or a pre-processing number.  */
2582       return (is_idchar[c2] || c2 == '.');
2583     case '<': case '>': case '!': case '%': case '#': case ':':
2584     case '^': case '&': case '|': case '*': case '/': case '=':
2585       return (c2 == c1 || c2 == '=');
2586     }
2587   return 0;
2588 }
2589
2590 /* Expand a macro call.
2591    HP points to the symbol that is the macro being called.
2592    Put the result of expansion onto the input stack
2593    so that subsequent input by our caller will use it.
2594
2595    If macro wants arguments, caller has already verified that
2596    an argument list follows; arguments come from the input stack.  */
2597
2598 static void
2599 macroexpand (pfile, hp)
2600      cpp_reader *pfile;
2601      HASHNODE *hp;
2602 {
2603   int nargs;
2604   DEFINITION *defn = hp->value.defn;
2605   register U_CHAR *xbuf;
2606   long start_line, start_column;
2607   int xbuf_len;
2608   struct argdata *args;
2609   long old_written = CPP_WRITTEN (pfile);
2610 #if 0
2611   int start_line = instack[indepth].lineno;
2612 #endif
2613   int rest_args, rest_zero;
2614       register int i;
2615
2616 #if 0
2617   CHECK_DEPTH (return;);
2618 #endif
2619
2620 #if 0
2621   /* This macro is being used inside a #if, which means it must be */
2622   /* recorded as a precondition.  */
2623   if (pcp_inside_if && pcp_outfile && defn->predefined)
2624     dump_single_macro (hp, pcp_outfile);
2625 #endif
2626
2627   pfile->output_escapes++;
2628   cpp_buf_line_and_col (cpp_file_buffer (pfile), &start_line, &start_column);
2629
2630   nargs = defn->nargs;
2631
2632   if (nargs >= 0)
2633     {
2634       enum cpp_token token;
2635
2636       args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
2637
2638       for (i = 0; i < nargs; i++)
2639         {
2640           args[i].raw = args[i].expanded = 0;
2641           args[i].raw_length = 0; 
2642           args[i].expand_length = args[i].stringified_length = -1;
2643           args[i].use_count = 0;
2644         }
2645
2646       /* Parse all the macro args that are supplied.  I counts them.
2647          The first NARGS args are stored in ARGS.
2648          The rest are discarded.  If rest_args is set then we assume
2649          macarg absorbed the rest of the args.  */
2650       i = 0;
2651       rest_args = 0;
2652       rest_args = 0;
2653       FORWARD(1); /* Discard the open-parenthesis before the first arg.  */
2654       do
2655         {
2656           if (rest_args)
2657             continue;
2658           if (i < nargs || (nargs == 0 && i == 0))
2659             {
2660               /* if we are working on last arg which absorbs rest of args... */
2661               if (i == nargs - 1 && defn->rest_args)
2662                 rest_args = 1;
2663               args[i].raw = CPP_WRITTEN (pfile);
2664               token = macarg (pfile, rest_args);
2665               args[i].raw_length = CPP_WRITTEN (pfile) - args[i].raw;
2666               args[i].newlines = 0; /* FIXME */
2667             }
2668           else
2669             token = macarg (pfile, 0);
2670           if (token == CPP_EOF || token == CPP_POP)
2671             {
2672               cpp_error_with_line (pfile, start_line, start_column,
2673                                    "unterminated macro call");
2674               return;
2675             }
2676           i++;
2677         } while (token == CPP_COMMA);
2678
2679       /* If we got one arg but it was just whitespace, call that 0 args.  */
2680       if (i == 1)
2681         {
2682           register U_CHAR *bp = ARG_BASE + args[0].raw;
2683           register U_CHAR *lim = bp + args[0].raw_length;
2684           /* cpp.texi says for foo ( ) we provide one argument.
2685              However, if foo wants just 0 arguments, treat this as 0.  */
2686           if (nargs == 0)
2687             while (bp != lim && is_space[*bp]) bp++;
2688           if (bp == lim)
2689             i = 0;
2690         }
2691
2692       /* Don't output an error message if we have already output one for
2693          a parse error above.  */
2694       rest_zero = 0;
2695       if (nargs == 0 && i > 0)
2696         {
2697           cpp_error (pfile, "arguments given to macro `%s'", hp->name);
2698         }
2699       else if (i < nargs)
2700         {
2701           /* traditional C allows foo() if foo wants one argument.  */
2702           if (nargs == 1 && i == 0 && CPP_TRADITIONAL (pfile))
2703             ;
2704           /* the rest args token is allowed to absorb 0 tokens */
2705           else if (i == nargs - 1 && defn->rest_args)
2706             rest_zero = 1;
2707           else if (i == 0)
2708             cpp_error (pfile, "macro `%s' used without args", hp->name);
2709           else if (i == 1)
2710             cpp_error (pfile, "macro `%s' used with just one arg", hp->name);
2711           else
2712             cpp_error (pfile, "macro `%s' used with only %d args",
2713                        hp->name, i);
2714       }
2715       else if (i > nargs)
2716         {
2717           cpp_error (pfile,
2718                      "macro `%s' used with too many (%d) args", hp->name, i);
2719         }
2720     }
2721
2722   /* If macro wants zero args, we parsed the arglist for checking only.
2723      Read directly from the macro definition.  */
2724   if (nargs <= 0)
2725     {
2726       xbuf = defn->expansion;
2727       xbuf_len = defn->length;
2728     }
2729   else
2730     {
2731       register U_CHAR *exp = defn->expansion;
2732       register int offset;      /* offset in expansion,
2733                                    copied a piece at a time */
2734       register int totlen;      /* total amount of exp buffer filled so far */
2735
2736       register struct reflist *ap, *last_ap;
2737
2738       /* Macro really takes args.  Compute the expansion of this call.  */
2739
2740       /* Compute length in characters of the macro's expansion.
2741          Also count number of times each arg is used.  */
2742       xbuf_len = defn->length;
2743       for (ap = defn->pattern; ap != NULL; ap = ap->next)
2744         {
2745           if (ap->stringify)
2746             {
2747               register struct argdata *arg = &args[ap->argno];
2748               /* Stringify it it hasn't already been */
2749               if (arg->stringified_length < 0)
2750                 {
2751                   int arglen = arg->raw_length;
2752                   int escaped = 0;
2753                   int in_string = 0;
2754                   int c;
2755                   /* Initially need_space is -1.  Otherwise, 1 means the
2756                      previous character was a space, but we suppressed it;
2757                      0 means the previous character was a non-space.  */
2758                   int need_space = -1;
2759                   i = 0;
2760                   arg->stringified = CPP_WRITTEN (pfile);
2761                   if (!CPP_TRADITIONAL (pfile))
2762                     CPP_PUTC (pfile, '\"'); /* insert beginning quote */
2763                   for (; i < arglen; i++)
2764                     {
2765                       c = (ARG_BASE + arg->raw)[i];
2766
2767                       if (! in_string)
2768                         {
2769                           /* Internal sequences of whitespace are replaced by
2770                              one space except within an string or char token.*/
2771                           if (is_space[c])
2772                             {
2773                               if (CPP_WRITTEN (pfile) > arg->stringified
2774                                   && (CPP_PWRITTEN (pfile))[-1] == '@')
2775                                 {
2776                                   /* "@ " escape markers are removed */
2777                                   CPP_ADJUST_WRITTEN (pfile, -1);
2778                                   continue;
2779                                 }
2780                               if (need_space == 0)
2781                                 need_space = 1;
2782                               continue;
2783                             }
2784                           else if (need_space > 0)
2785                             CPP_PUTC (pfile, ' ');
2786                           need_space = 0;
2787                         }
2788
2789                       if (escaped)
2790                         escaped = 0;
2791                       else
2792                         {
2793                           if (c == '\\')
2794                             escaped = 1;
2795                           if (in_string)
2796                             {
2797                               if (c == in_string)
2798                                 in_string = 0;
2799                             }
2800                           else if (c == '\"' || c == '\'')
2801                             in_string = c;
2802                         }
2803
2804                       /* Escape these chars */
2805                       if (c == '\"' || (in_string && c == '\\'))
2806                         CPP_PUTC (pfile, '\\');
2807                       if (isprint (c))
2808                         CPP_PUTC (pfile, c);
2809                       else
2810                         {
2811                           CPP_RESERVE (pfile, 4);
2812                           sprintf (CPP_PWRITTEN (pfile), "\\%03o",
2813                                    (unsigned int) c);
2814                           CPP_ADJUST_WRITTEN (pfile, 4);
2815                         }
2816                     }
2817                   if (!CPP_TRADITIONAL (pfile))
2818                     CPP_PUTC (pfile, '\"'); /* insert ending quote */
2819                   arg->stringified_length
2820                     = CPP_WRITTEN (pfile) - arg->stringified;
2821                 }
2822               xbuf_len += args[ap->argno].stringified_length;
2823             }
2824           else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL (pfile))
2825             /* Add 4 for two newline-space markers to prevent
2826                token concatenation.  */
2827             xbuf_len += args[ap->argno].raw_length + 4;
2828           else
2829             {
2830               /* We have an ordinary (expanded) occurrence of the arg.
2831                  So compute its expansion, if we have not already.  */
2832               if (args[ap->argno].expand_length < 0)
2833                 {
2834                   args[ap->argno].expanded = CPP_WRITTEN (pfile);
2835                   cpp_expand_to_buffer (pfile,
2836                                         ARG_BASE + args[ap->argno].raw,
2837                                         args[ap->argno].raw_length);
2838
2839                   args[ap->argno].expand_length
2840                     = CPP_WRITTEN (pfile) - args[ap->argno].expanded;
2841                 }
2842
2843               /* Add 4 for two newline-space markers to prevent
2844                  token concatenation.  */
2845               xbuf_len += args[ap->argno].expand_length + 4;
2846             }
2847           if (args[ap->argno].use_count < 10)
2848             args[ap->argno].use_count++;
2849         }
2850
2851       xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
2852
2853       /* Generate in XBUF the complete expansion
2854          with arguments substituted in.
2855          TOTLEN is the total size generated so far.
2856          OFFSET is the index in the definition
2857          of where we are copying from.  */
2858       offset = totlen = 0;
2859       for (last_ap = NULL, ap = defn->pattern; ap != NULL;
2860            last_ap = ap, ap = ap->next)
2861         {
2862           register struct argdata *arg = &args[ap->argno];
2863           int count_before = totlen;
2864
2865           /* Add chars to XBUF.  */
2866           for (i = 0; i < ap->nchars; i++, offset++)
2867             xbuf[totlen++] = exp[offset];
2868
2869           /* If followed by an empty rest arg with concatenation,
2870              delete the last run of nonwhite chars.  */
2871           if (rest_zero && totlen > count_before
2872               && ((ap->rest_args && ap->raw_before)
2873                   || (last_ap != NULL && last_ap->rest_args
2874                       && last_ap->raw_after)))
2875             {
2876               /* Delete final whitespace.  */
2877               while (totlen > count_before && is_space[xbuf[totlen - 1]])
2878                 totlen--;
2879
2880               /* Delete the nonwhites before them.  */
2881               while (totlen > count_before && ! is_space[xbuf[totlen - 1]])
2882                 totlen--;
2883             }
2884
2885           if (ap->stringify != 0)
2886             {
2887               bcopy (ARG_BASE + arg->stringified,
2888                      xbuf + totlen, arg->stringified_length);
2889               totlen += arg->stringified_length;
2890             }
2891           else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL (pfile))
2892             {
2893               U_CHAR *p1 = ARG_BASE + arg->raw;
2894               U_CHAR *l1 = p1 + arg->raw_length;
2895               if (ap->raw_before)
2896                 {
2897                   while (p1 != l1 && is_space[*p1]) p1++;
2898                   while (p1 != l1 && is_idchar[*p1])
2899                     xbuf[totlen++] = *p1++;
2900                   /* Delete any no-reexpansion marker that follows
2901                      an identifier at the beginning of the argument
2902                      if the argument is concatenated with what precedes it.  */
2903                   if (p1[0] == '@' && p1[1] == '-')
2904                     p1 += 2;
2905                 }
2906               if (ap->raw_after)
2907                 {
2908                   /* Arg is concatenated after: delete trailing whitespace,
2909                      whitespace markers, and no-reexpansion markers.  */
2910                   while (p1 != l1)
2911                     {
2912                       if (is_space[l1[-1]]) l1--;
2913                       else if (l1[-1] == '-')
2914                         {
2915                           U_CHAR *p2 = l1 - 1;
2916                           /* If a `-' is preceded by an odd number of newlines then it
2917                              and the last newline are a no-reexpansion marker.  */
2918                           while (p2 != p1 && p2[-1] == '\n') p2--;
2919                           if ((l1 - 1 - p2) & 1) {
2920                             l1 -= 2;
2921                           }
2922                           else break;
2923                         }
2924                       else break;
2925                     }
2926                 }
2927
2928               bcopy (p1, xbuf + totlen, l1 - p1);
2929               totlen += l1 - p1;
2930             }
2931           else
2932             {
2933               U_CHAR *expanded = ARG_BASE + arg->expanded;
2934               if (!ap->raw_before && totlen > 0 && arg->expand_length
2935                   && !CPP_TRADITIONAL(pfile)
2936                   && unsafe_chars (xbuf[totlen-1], expanded[0]))
2937                 {
2938                   xbuf[totlen++] = '@';
2939                   xbuf[totlen++] = ' ';
2940                 }
2941
2942               bcopy (expanded, xbuf + totlen, arg->expand_length);
2943               totlen += arg->expand_length;
2944
2945               if (!ap->raw_after && totlen > 0 && offset < defn->length
2946                   && !CPP_TRADITIONAL(pfile)
2947                   && unsafe_chars (xbuf[totlen-1], exp[offset]))
2948                 {
2949                   xbuf[totlen++] = '@';
2950                   xbuf[totlen++] = ' ';
2951                 }
2952
2953               /* If a macro argument with newlines is used multiple times,
2954                  then only expand the newlines once.  This avoids creating
2955                  output lines which don't correspond to any input line,
2956                  which confuses gdb and gcov.  */
2957               if (arg->use_count > 1 && arg->newlines > 0)
2958                 {
2959                   /* Don't bother doing change_newlines for subsequent
2960                      uses of arg.  */
2961                   arg->use_count = 1;
2962                   arg->expand_length
2963                     = change_newlines (expanded, arg->expand_length);
2964                 }
2965             }
2966
2967           if (totlen > xbuf_len)
2968             abort ();
2969       }
2970
2971       /* if there is anything left of the definition
2972          after handling the arg list, copy that in too.  */
2973
2974       for (i = offset; i < defn->length; i++)
2975         {
2976           /* if we've reached the end of the macro */
2977           if (exp[i] == ')')
2978             rest_zero = 0;
2979           if (! (rest_zero && last_ap != NULL && last_ap->rest_args
2980                  && last_ap->raw_after))
2981             xbuf[totlen++] = exp[i];
2982         }
2983
2984       xbuf[totlen] = 0;
2985       xbuf_len = totlen;
2986
2987     }
2988
2989   pfile->output_escapes--;
2990
2991   /* Now put the expansion on the input stack
2992      so our caller will commence reading from it.  */
2993   push_macro_expansion (pfile, xbuf, xbuf_len, hp);
2994   CPP_BUFFER (pfile)->has_escapes = 1;
2995
2996   /* Pop the space we've used in the token_buffer for argument expansion.  */
2997   CPP_SET_WRITTEN (pfile, old_written);
2998     
2999   /* Recursive macro use sometimes works traditionally.
3000      #define foo(x,y) bar (x (y,0), y)
3001      foo (foo, baz)  */
3002   
3003   if (!CPP_TRADITIONAL (pfile))
3004     hp->type = T_DISABLED;
3005 }
3006
3007 static void
3008 push_macro_expansion (pfile, xbuf, xbuf_len, hp)
3009      cpp_reader *pfile;
3010      register U_CHAR *xbuf;
3011      int xbuf_len;
3012      HASHNODE *hp;
3013 {
3014   register cpp_buffer *mbuf = cpp_push_buffer (pfile, xbuf, xbuf_len);
3015   if (mbuf == NULL)
3016     return;
3017   mbuf->cleanup = macro_cleanup;
3018   mbuf->data = hp;
3019
3020   /* The first chars of the expansion should be a "@ " added by
3021      collect_expansion.  This is to prevent accidental token-pasting
3022      between the text preceding the macro invocation, and the macro
3023      expansion text.
3024
3025      We would like to avoid adding unneeded spaces (for the sake of
3026      tools that use cpp, such as imake).  In some common cases we can
3027      tell that it is safe to omit the space.
3028
3029      The character before the macro invocation cannot have been an
3030      idchar (or else it would have been pasted with the idchars of
3031      the macro name).  Therefore, if the first non-space character
3032      of the expansion is an idchar, we do not need the extra space
3033      to prevent token pasting.
3034
3035      Also, we don't need the extra space if the first char is '(',
3036      or some other (less common) characters.  */
3037
3038   if (xbuf[0] == '@' && xbuf[1] == ' '
3039       && (is_idchar[xbuf[2]] || xbuf[2] == '(' || xbuf[2] == '\''
3040           || xbuf[2] == '\"'))
3041     mbuf->cur += 2;
3042 }
3043 \f
3044 /* Like cpp_get_token, except that it does not read past end-of-line.
3045    Also, horizontal space is skipped, and macros are popped.  */
3046
3047 static enum cpp_token
3048 get_directive_token (pfile)
3049      cpp_reader *pfile;
3050 {
3051   for (;;)
3052     {
3053       long old_written = CPP_WRITTEN (pfile);
3054       enum cpp_token token;
3055       cpp_skip_hspace (pfile);
3056       if (PEEKC () == '\n')
3057           return CPP_VSPACE;
3058       token = cpp_get_token (pfile);
3059       switch (token)
3060       {
3061       case CPP_POP:
3062           if (! CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
3063               return token;
3064           /* ... else fall though ...  */
3065       case CPP_HSPACE:  case CPP_COMMENT:
3066           CPP_SET_WRITTEN (pfile, old_written);
3067           break;
3068       default:
3069           return token;
3070       }
3071     }
3072 }
3073 \f
3074 /* Handle #include and #import.
3075    This function expects to see "fname" or <fname> on the input.
3076
3077    The input is normally in part of the output_buffer following
3078    CPP_WRITTEN, and will get overwritten by output_line_command.
3079    I.e. in input file specification has been popped by handle_directive.
3080    This is safe.  */
3081
3082 static int
3083 do_include (pfile, keyword, unused1, unused2)
3084      cpp_reader *pfile;
3085      struct directive *keyword;
3086      U_CHAR *unused1, *unused2;
3087 {
3088   int importing = (keyword->type == T_IMPORT);
3089   int skip_dirs = (keyword->type == T_INCLUDE_NEXT);
3090   char *fname;          /* Dynamically allocated fname buffer */
3091   char *pcftry;
3092   char *pcfname;
3093   U_CHAR *fbeg, *fend;          /* Beginning and end of fname */
3094   enum cpp_token token;
3095
3096   /* Chain of dirs to search */
3097   struct file_name_list *search_start = CPP_OPTIONS (pfile)->include;
3098   struct file_name_list dsp[1]; /* First in chain, if #include "..." */
3099   struct file_name_list *searchptr = 0;
3100   long old_written = CPP_WRITTEN (pfile);
3101
3102   int flen;
3103
3104   int f;                        /* file number */
3105
3106   int retried = 0;              /* Have already tried macro
3107                                    expanding the include line */
3108   int angle_brackets = 0;       /* 0 for "...", 1 for <...> */
3109   int pcf = -1;
3110   char *pcfbuf;
3111   char *pcfbuflimit;
3112   int pcfnum;
3113   f= -1;                        /* JF we iz paranoid! */
3114
3115   if (CPP_PEDANTIC (pfile) && !CPP_BUFFER (pfile)->system_header_p)
3116     {
3117       if (importing)
3118         cpp_pedwarn (pfile, "ANSI C does not allow `#import'");
3119       if (skip_dirs)
3120         cpp_pedwarn (pfile, "ANSI C does not allow `#include_next'");
3121     }
3122
3123   if (importing && CPP_OPTIONS (pfile)->warn_import
3124       && !CPP_OPTIONS (pfile)->inhibit_warnings
3125       && !CPP_BUFFER (pfile)->system_header_p && !pfile->import_warning)
3126     {
3127       pfile->import_warning = 1;
3128       cpp_warning (pfile, "using `#import' is not recommended");
3129       fprintf (stderr, "The fact that a certain header file need not be processed more than once\n");
3130       fprintf (stderr, "should be indicated in the header file, not where it is used.\n");
3131       fprintf (stderr, "The best way to do this is with a conditional of this form:\n\n");
3132       fprintf (stderr, "  #ifndef _FOO_H_INCLUDED\n");
3133       fprintf (stderr, "  #define _FOO_H_INCLUDED\n");
3134       fprintf (stderr, "  ... <real contents of file> ...\n");
3135       fprintf (stderr, "  #endif /* Not _FOO_H_INCLUDED */\n\n");
3136       fprintf (stderr, "Then users can use `#include' any number of times.\n");
3137       fprintf (stderr, "GNU C automatically avoids processing the file more than once\n");
3138       fprintf (stderr, "when it is equipped with such a conditional.\n");
3139     }
3140
3141   pfile->parsing_include_directive++;
3142   token = get_directive_token (pfile);
3143   pfile->parsing_include_directive--;
3144
3145   if (token == CPP_STRING)
3146     {
3147       /* FIXME - check no trailing garbage */
3148       fbeg = pfile->token_buffer + old_written + 1;
3149       fend = CPP_PWRITTEN (pfile) - 1;
3150       if (fbeg[-1] == '<')
3151         {
3152           angle_brackets = 1;
3153           /* If -I-, start with the first -I dir after the -I-.  */
3154           if (CPP_OPTIONS (pfile)->first_bracket_include)
3155             search_start = CPP_OPTIONS (pfile)->first_bracket_include;
3156         }
3157       /* If -I- was specified, don't search current dir, only spec'd ones.  */
3158       else if (! CPP_OPTIONS (pfile)->ignore_srcdir)
3159         {
3160           cpp_buffer *fp = CPP_BUFFER (pfile);
3161           /* We have "filename".  Figure out directory this source
3162              file is coming from and put it on the front of the list.  */
3163
3164           for ( ; fp != CPP_NULL_BUFFER (pfile); fp = CPP_PREV_BUFFER (fp))
3165             {
3166               int n;
3167               char *ep,*nam;
3168
3169               if ((nam = fp->nominal_fname) != NULL)
3170                 {
3171                   /* Found a named file.  Figure out dir of the file,
3172                      and put it in front of the search list.  */
3173                   dsp[0].next = search_start;
3174                   search_start = dsp;
3175 #ifndef VMS
3176                   ep = rindex (nam, '/');
3177 #else                           /* VMS */
3178                   ep = rindex (nam, ']');
3179                   if (ep == NULL) ep = rindex (nam, '>');
3180                   if (ep == NULL) ep = rindex (nam, ':');
3181                   if (ep != NULL) ep++;
3182 #endif                          /* VMS */
3183                   if (ep != NULL)
3184                     {
3185                       n = ep - nam;
3186                       dsp[0].fname = (char *) alloca (n + 1);
3187                       strncpy (dsp[0].fname, nam, n);
3188                       dsp[0].fname[n] = '\0';
3189                       if (n + INCLUDE_LEN_FUDGE > pfile->max_include_len)
3190                         pfile->max_include_len = n + INCLUDE_LEN_FUDGE;
3191                     }
3192                   else
3193                     {
3194                       dsp[0].fname = 0; /* Current directory */
3195                     }
3196                   dsp[0].got_name_map = 0;
3197                   break;
3198                 }
3199             }
3200         }
3201     }
3202 #ifdef VMS
3203   else if (token == CPP_NAME)
3204     {
3205       /*
3206        * Support '#include xyz' like VAX-C to allow for easy use of all the
3207        * decwindow include files. It defaults to '#include <xyz.h>' (so the
3208        * code from case '<' is repeated here) and generates a warning.
3209        */
3210       cpp_warning (pfile,
3211                    "VAX-C-style include specification found, use '#include <filename.h>' !");
3212       angle_brackets = 1;
3213       /* If -I-, start with the first -I dir after the -I-.  */
3214       if (CPP_OPTIONS (pfile)->first_bracket_include)
3215         search_start = CPP_OPTIONS (pfile)->first_bracket_include;
3216       fbeg = pfile->token_buffer + old_written;
3217       fend = CPP_PWRITTEN (pfile);
3218     }
3219 #endif
3220   else
3221     {
3222       cpp_error (pfile,
3223                  "`#%s' expects \"FILENAME\" or <FILENAME>", keyword->name);
3224       CPP_SET_WRITTEN (pfile, old_written);
3225       skip_rest_of_line (pfile);
3226       return 0;
3227     }
3228
3229   *fend = 0;
3230
3231   token = get_directive_token (pfile);
3232   if (token != CPP_VSPACE)
3233     {
3234       cpp_error (pfile, "junk at end of `#include'");
3235       while (token != CPP_VSPACE && token != CPP_EOF && token != CPP_POP)
3236         token = get_directive_token (pfile);
3237     }
3238
3239   /* For #include_next, skip in the search path
3240      past the dir in which the containing file was found.  */
3241   if (skip_dirs)
3242     {
3243       cpp_buffer *fp = CPP_BUFFER (pfile);
3244       for (; fp != CPP_NULL_BUFFER (pfile); fp = CPP_PREV_BUFFER (fp))
3245         if (fp->fname != NULL)
3246           {
3247             /* fp->dir is null if the containing file was specified with
3248                an absolute file name.  In that case, don't skip anything.  */
3249             if (fp->dir == SELF_DIR_DUMMY)
3250               search_start = CPP_OPTIONS (pfile)->include;
3251             else if (fp->dir)
3252               search_start = fp->dir->next;
3253             break;
3254           }
3255     }
3256
3257   CPP_SET_WRITTEN (pfile, old_written);
3258
3259   flen = fend - fbeg;
3260
3261   if (flen == 0)
3262     {
3263       cpp_error (pfile, "empty file name in `#%s'", keyword->name);
3264       return 0;
3265     }
3266
3267   /* Allocate this permanently, because it gets stored in the definitions
3268      of macros.  */
3269   fname = (char *) xmalloc (pfile->max_include_len + flen + 4);
3270   /* + 2 above for slash and terminating null.  */
3271   /* + 2 added for '.h' on VMS (to support '#include filename') */
3272
3273   /* If specified file name is absolute, just open it.  */
3274
3275   if (*fbeg == '/') {
3276     strncpy (fname, fbeg, flen);
3277     fname[flen] = 0;
3278     if (redundant_include_p (pfile, fname))
3279       return 0;
3280     if (importing)
3281       f = lookup_import (pfile, fname, NULL_PTR);
3282     else
3283       f = open_include_file (pfile, fname, NULL_PTR);
3284     if (f == -2)
3285       return 0;         /* Already included this file */
3286   } else {
3287     /* Search directory path, trying to open the file.
3288        Copy each filename tried into FNAME.  */
3289
3290     for (searchptr = search_start; searchptr; searchptr = searchptr->next) {
3291       if (searchptr->fname) {
3292         /* The empty string in a search path is ignored.
3293            This makes it possible to turn off entirely
3294            a standard piece of the list.  */
3295         if (searchptr->fname[0] == 0)
3296           continue;
3297         strcpy (fname, searchptr->fname);
3298         strcat (fname, "/");
3299         fname[strlen (fname) + flen] = 0;
3300       } else {
3301         fname[0] = 0;
3302       }
3303       strncat (fname, fbeg, flen);
3304 #ifdef VMS
3305       /* Change this 1/2 Unix 1/2 VMS file specification into a
3306          full VMS file specification */
3307       if (searchptr->fname && (searchptr->fname[0] != 0)) {
3308         /* Fix up the filename */
3309         hack_vms_include_specification (fname);
3310       } else {
3311         /* This is a normal VMS filespec, so use it unchanged.  */
3312         strncpy (fname, fbeg, flen);
3313         fname[flen] = 0;
3314         /* if it's '#include filename', add the missing .h */
3315         if (index(fname,'.')==NULL) {
3316           strcat (fname, ".h");
3317         }
3318       }
3319 #endif /* VMS */
3320       /* ??? There are currently 3 separate mechanisms for avoiding processing
3321          of redundant include files: #import, #pragma once, and
3322          redundant_include_p.  It would be nice if they were unified.  */
3323       if (redundant_include_p (pfile, fname))
3324         return 0;
3325       if (importing)
3326         f = lookup_import (pfile, fname, searchptr);
3327       else
3328         f = open_include_file (pfile, fname, searchptr);
3329       if (f == -2)
3330         return 0;                       /* Already included this file */
3331 #ifdef EACCES
3332       else if (f == -1 && errno == EACCES)
3333         cpp_warning (pfile, "Header file %s exists, but is not readable",
3334                      fname);
3335 #endif
3336       if (f >= 0)
3337         break;
3338     }
3339   }
3340
3341   if (f < 0)
3342     {
3343       /* A file that was not found.  */
3344       strncpy (fname, fbeg, flen);
3345       fname[flen] = 0;
3346       /* If generating dependencies and -MG was specified, we assume missing
3347          files are leaf files, living in the same directory as the source file
3348          or other similar place; these missing files may be generated from
3349          other files and may not exist yet (eg: y.tab.h).  */
3350
3351       if (CPP_OPTIONS(pfile)->print_deps_missing_files
3352           && CPP_PRINT_DEPS (pfile)
3353           > (angle_brackets || (pfile->system_include_depth > 0)))
3354         {
3355           /* If it was requested as a system header file,
3356              then assume it belongs in the first place to look for such.  */
3357           if (angle_brackets)
3358             {
3359               for (searchptr = search_start; searchptr;
3360                    searchptr = searchptr->next)
3361                 {
3362                   if (searchptr->fname)
3363                     {
3364                       char *p;
3365
3366                       if (searchptr->fname[0] == 0)
3367                         continue;
3368                       p = (char *) alloca (strlen (searchptr->fname)
3369                                            + strlen (fname) + 2);
3370                       strcpy (p, searchptr->fname);
3371                       strcat (p, "/");
3372                       strcat (p, fname);
3373                       deps_output (pfile, p, ' ');
3374                       break;
3375                     }
3376                 }
3377             }
3378           else
3379             {
3380               /* Otherwise, omit the directory, as if the file existed
3381                  in the directory with the source.  */
3382               deps_output (pfile, fname, ' ');
3383             }
3384         }
3385       /* If -M was specified, and this header file won't be added to the
3386          dependency list, then don't count this as an error, because we can
3387          still produce correct output.  Otherwise, we can't produce correct
3388          output, because there may be dependencies we need inside the missing
3389          file, and we don't know what directory this missing file exists in.*/
3390       else if (CPP_PRINT_DEPS (pfile)
3391                && (CPP_PRINT_DEPS (pfile)
3392                    <= (angle_brackets || (pfile->system_include_depth > 0))))
3393         cpp_warning (pfile, "No include path in which to find %s", fname);
3394       else if (search_start)
3395         cpp_error_from_errno (pfile, fname);
3396       else
3397         cpp_error (pfile, "No include path in which to find %s", fname);
3398     }
3399   else {
3400     /* Check to see if this include file is a once-only include file.
3401        If so, give up.  */
3402
3403     struct file_name_list *ptr;
3404
3405     for (ptr = pfile->dont_repeat_files; ptr; ptr = ptr->next) {
3406       if (!strcmp (ptr->fname, fname)) {
3407         close (f);
3408         return 0;                               /* This file was once'd.  */
3409       }
3410     }
3411
3412     for (ptr = pfile->all_include_files; ptr; ptr = ptr->next) {
3413       if (!strcmp (ptr->fname, fname))
3414         break;                          /* This file was included before.  */
3415     }
3416
3417     if (ptr == 0) {
3418       /* This is the first time for this file.  */
3419       /* Add it to list of files included.  */
3420
3421       ptr = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
3422       ptr->control_macro = 0;
3423       ptr->c_system_include_path = 0;
3424       ptr->next = pfile->all_include_files;
3425       pfile->all_include_files = ptr;
3426       ptr->fname = savestring (fname);
3427       ptr->got_name_map = 0;
3428
3429       /* For -M, add this file to the dependencies.  */
3430       if (CPP_PRINT_DEPS (pfile)
3431           > (angle_brackets || (pfile->system_include_depth > 0)))
3432         deps_output (pfile, fname, ' ');
3433     }   
3434
3435     /* Handle -H option.  */
3436     if (CPP_OPTIONS(pfile)->print_include_names)
3437       {
3438         cpp_buffer *buf = CPP_BUFFER (pfile);
3439         while ((buf = CPP_PREV_BUFFER (buf)) != CPP_NULL_BUFFER (pfile))
3440           putc ('.', stderr);
3441         fprintf (stderr, "%s\n", fname);
3442       }
3443
3444     if (angle_brackets)
3445       pfile->system_include_depth++;
3446
3447     /* Actually process the file.  */
3448
3449     /* Record file on "seen" list for #import.  */
3450     add_import (pfile, f, fname);
3451
3452     pcftry = (char *) alloca (strlen (fname) + 30);
3453     pcfbuf = 0;
3454     pcfnum = 0;
3455
3456 #if 0
3457     if (!no_precomp)
3458       {
3459         struct stat stat_f;
3460
3461         fstat (f, &stat_f);
3462
3463         do {
3464           sprintf (pcftry, "%s%d", fname, pcfnum++);
3465
3466           pcf = open (pcftry, O_RDONLY, 0666);
3467           if (pcf != -1)
3468             {
3469               struct stat s;
3470
3471               fstat (pcf, &s);
3472               if (bcmp ((char *) &stat_f.st_ino, (char *) &s.st_ino,
3473                         sizeof (s.st_ino))
3474                   || stat_f.st_dev != s.st_dev)
3475                 {
3476                   pcfbuf = check_precompiled (pcf, fname, &pcfbuflimit);
3477                   /* Don't need it any more.  */
3478                   close (pcf);
3479                 }
3480               else
3481                 {
3482                   /* Don't need it at all.  */
3483                   close (pcf);
3484                   break;
3485                 }
3486             }
3487         } while (pcf != -1 && !pcfbuf);
3488       }
3489 #endif
3490     
3491     /* Actually process the file */
3492     if (cpp_push_buffer (pfile, NULL, 0) == NULL)
3493       return 0;
3494     if (finclude (pfile, f, fname, is_system_include (pfile, fname),
3495                   searchptr != dsp ? searchptr : SELF_DIR_DUMMY))
3496       {
3497         output_line_command (pfile, 0, enter_file);
3498         pfile->only_seen_white = 2;
3499       }
3500
3501     if (angle_brackets)
3502       pfile->system_include_depth--;
3503   }
3504   return 0;
3505 }
3506
3507 /* Return nonzero if there is no need to include file NAME
3508    because it has already been included and it contains a conditional
3509    to make a repeated include do nothing.  */
3510
3511 static int
3512 redundant_include_p (pfile, name)
3513      cpp_reader *pfile;
3514      char *name;
3515 {
3516   struct file_name_list *l = pfile->all_include_files;
3517   for (; l; l = l->next)
3518     if (! strcmp (name, l->fname)
3519         && l->control_macro
3520         && cpp_lookup (pfile, l->control_macro, -1, -1))
3521       return 1;
3522   return 0;
3523 }
3524
3525 /* Return nonzero if the given FILENAME is an absolute pathname which
3526    designates a file within one of the known "system" include file
3527    directories.  We assume here that if the given FILENAME looks like
3528    it is the name of a file which resides either directly in a "system"
3529    include file directory, or within any subdirectory thereof, then the
3530    given file must be a "system" include file.  This function tells us
3531    if we should suppress pedantic errors/warnings for the given FILENAME.
3532
3533    The value is 2 if the file is a C-language system header file
3534    for which C++ should (on most systems) assume `extern "C"'.  */
3535
3536 static int
3537 is_system_include (pfile, filename)
3538      cpp_reader *pfile;
3539      register char *filename;
3540 {
3541   struct file_name_list *searchptr;
3542
3543   for (searchptr = CPP_OPTIONS (pfile)->first_system_include; searchptr;
3544        searchptr = searchptr->next)
3545     if (searchptr->fname) {
3546       register char *sys_dir = searchptr->fname;
3547       register unsigned length = strlen (sys_dir);
3548
3549       if (! strncmp (sys_dir, filename, length) && filename[length] == '/')
3550         {
3551           if (searchptr->c_system_include_path)
3552             return 2;
3553           else
3554             return 1;
3555         }
3556     }
3557   return 0;
3558 }
3559
3560 \f
3561 /*
3562  * Install a name in the assertion hash table.
3563  *
3564  * If LEN is >= 0, it is the length of the name.
3565  * Otherwise, compute the length by scanning the entire name.
3566  *
3567  * If HASH is >= 0, it is the precomputed hash code.
3568  * Otherwise, compute the hash code.
3569  */
3570
3571 static ASSERTION_HASHNODE *
3572 assertion_install (pfile, name, len, hash)
3573      cpp_reader *pfile;
3574      U_CHAR *name;
3575      int len;
3576      int hash;
3577 {
3578   register ASSERTION_HASHNODE *hp;
3579   register int i, bucket;
3580   register U_CHAR *p, *q;
3581
3582   i = sizeof (ASSERTION_HASHNODE) + len + 1;
3583   hp = (ASSERTION_HASHNODE *) xmalloc (i);
3584   bucket = hash;
3585   hp->bucket_hdr = &pfile->assertion_hashtab[bucket];
3586   hp->next = pfile->assertion_hashtab[bucket];
3587   pfile->assertion_hashtab[bucket] = hp;
3588   hp->prev = NULL;
3589   if (hp->next != NULL)
3590     hp->next->prev = hp;
3591   hp->length = len;
3592   hp->value = 0;
3593   hp->name = ((U_CHAR *) hp) + sizeof (ASSERTION_HASHNODE);
3594   p = hp->name;
3595   q = name;
3596   for (i = 0; i < len; i++)
3597     *p++ = *q++;
3598   hp->name[len] = 0;
3599   return hp;
3600 }
3601 /*
3602  * find the most recent hash node for name name (ending with first
3603  * non-identifier char) installed by install
3604  *
3605  * If LEN is >= 0, it is the length of the name.
3606  * Otherwise, compute the length by scanning the entire name.
3607  *
3608  * If HASH is >= 0, it is the precomputed hash code.
3609  * Otherwise, compute the hash code.
3610  */
3611
3612 static ASSERTION_HASHNODE *
3613 assertion_lookup (pfile, name, len, hash)
3614      cpp_reader *pfile;
3615      U_CHAR *name;
3616      int len;
3617      int hash;
3618 {
3619   register ASSERTION_HASHNODE *bucket;
3620
3621   bucket = pfile->assertion_hashtab[hash];
3622   while (bucket) {
3623     if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
3624       return bucket;
3625     bucket = bucket->next;
3626   }
3627   return NULL;
3628 }
3629
3630 static void
3631 delete_assertion (hp)
3632      ASSERTION_HASHNODE *hp;
3633 {
3634   struct tokenlist_list *tail;
3635   if (hp->prev != NULL)
3636     hp->prev->next = hp->next;
3637   if (hp->next != NULL)
3638     hp->next->prev = hp->prev;
3639
3640   for (tail = hp->value; tail; )
3641     {
3642       struct tokenlist_list *next = tail->next;
3643       free_token_list (tail->tokens);
3644       free (tail);
3645       tail = next;
3646     }
3647
3648   /* Make sure that the bucket chain header that
3649      the deleted guy was on points to the right thing afterwards.  */
3650   if (hp == *hp->bucket_hdr)
3651     *hp->bucket_hdr = hp->next;
3652
3653   free (hp);
3654 }
3655 \f
3656 /* Convert a character string literal into a nul-terminated string.
3657    The input string is [IN ... LIMIT).
3658    The result is placed in RESULT.  RESULT can be the same as IN.
3659    The value returned in the end of the string written to RESULT,
3660    or NULL on error.  */
3661
3662 static U_CHAR *
3663 convert_string (pfile, result, in, limit, handle_escapes)
3664      cpp_reader *pfile;
3665      register U_CHAR *result, *in, *limit;
3666      int handle_escapes;
3667 {
3668   U_CHAR c;
3669   c = *in++;
3670   if (c != '\"')
3671     return NULL;
3672   while (in < limit)
3673     {
3674       U_CHAR c = *in++;
3675       switch (c)
3676         {
3677         case '\0':
3678           return NULL;
3679         case '\"':
3680           limit = in;
3681           break;
3682         case '\\':
3683           if (handle_escapes)
3684             {
3685               char *bpc = (char *) in;
3686               int i = (U_CHAR) cpp_parse_escape (pfile, &bpc);
3687               in = (U_CHAR *) bpc;
3688               if (i >= 0)
3689                 *result++ = (U_CHAR)c;
3690               break;
3691             }
3692           /* else fall through */
3693         default:
3694           *result++ = c;
3695         }
3696     }
3697   *result = 0;
3698   return result;
3699 }
3700
3701 /*
3702  * interpret #line command.  Remembers previously seen fnames
3703  * in its very own hash table.
3704  */
3705 #define FNAME_HASHSIZE 37
3706
3707 static int
3708 do_line (pfile, keyword)
3709      cpp_reader *pfile;
3710      struct directive *keyword;
3711 {
3712   cpp_buffer *ip = CPP_BUFFER (pfile);
3713   int new_lineno;
3714   long old_written = CPP_WRITTEN (pfile);
3715   enum file_change_code file_change = same_file;
3716   enum cpp_token token;
3717   int i;
3718
3719   token = get_directive_token (pfile);
3720
3721   if (token != CPP_NUMBER
3722       || !isdigit(pfile->token_buffer[old_written]))
3723     {
3724       cpp_error (pfile, "invalid format `#line' command");
3725       goto bad_line_directive;
3726     }
3727
3728   /* The Newline at the end of this line remains to be processed.
3729      To put the next line at the specified line number,
3730      we must store a line number now that is one less.  */
3731   new_lineno = atoi (pfile->token_buffer + old_written) - 1;
3732   CPP_SET_WRITTEN (pfile, old_written);
3733
3734   /* NEW_LINENO is one less than the actual line number here.  */
3735   if (CPP_PEDANTIC (pfile) && new_lineno < 0)
3736     cpp_pedwarn (pfile, "line number out of range in `#line' command");
3737
3738 #if 0 /* #line 10"foo.c" is supposed to be allowed.  */
3739   if (PEEKC() && !is_space[PEEKC()]) {
3740     cpp_error (pfile, "invalid format `#line' command");
3741     goto bad_line_directive;
3742   }
3743 #endif
3744
3745   token = get_directive_token (pfile);
3746
3747   if (token == CPP_STRING) {
3748     U_CHAR *fname = pfile->token_buffer + old_written;
3749     U_CHAR *end_name;
3750     static HASHNODE *fname_table[FNAME_HASHSIZE];
3751     HASHNODE *hp, **hash_bucket;
3752     U_CHAR *p;
3753     long num_start;
3754     int fname_length;
3755
3756     /* Turn the file name, which is a character string literal,
3757        into a null-terminated string.  Do this in place.  */
3758     end_name = convert_string (pfile, fname, fname, CPP_PWRITTEN (pfile), 1);
3759     if (end_name == NULL)
3760     {
3761         cpp_error (pfile, "invalid format `#line' command");
3762         goto bad_line_directive;
3763     }
3764
3765     fname_length = end_name - fname;
3766
3767     num_start = CPP_WRITTEN (pfile);
3768     token = get_directive_token (pfile);
3769     if (token != CPP_VSPACE && token != CPP_EOF && token != CPP_POP) {
3770       p = pfile->token_buffer + num_start;
3771       if (CPP_PEDANTIC (pfile))
3772         cpp_pedwarn (pfile, "garbage at end of `#line' command");
3773
3774       if (token != CPP_NUMBER || *p < '0' || *p > '4' || p[1] != '\0')
3775       {
3776         cpp_error (pfile, "invalid format `#line' command");
3777         goto bad_line_directive;
3778       }
3779       if (*p == '1')
3780         file_change = enter_file;
3781       else if (*p == 2)
3782         file_change = leave_file;
3783       else if (*p == 3)
3784         ip->system_header_p = 1;
3785       else /* if (*p == 4) */
3786         ip->system_header_p = 2;
3787
3788       CPP_SET_WRITTEN (pfile, num_start);
3789       token = get_directive_token (pfile);
3790       p = pfile->token_buffer + num_start;
3791       if (token == CPP_NUMBER && p[1] == '\0' && (*p == '3' || *p== '4')) {
3792         ip->system_header_p = *p == 3 ? 1 : 2;
3793         token = get_directive_token (pfile);
3794       }
3795       if (token != CPP_VSPACE) {
3796         cpp_error (pfile, "invalid format `#line' command");
3797         goto bad_line_directive;
3798       }
3799     }
3800
3801     hash_bucket =
3802       &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)];
3803     for (hp = *hash_bucket; hp != NULL; hp = hp->next)
3804       if (hp->length == fname_length &&
3805           strncmp (hp->value.cpval, fname, fname_length) == 0) {
3806         ip->nominal_fname = hp->value.cpval;
3807         break;
3808       }
3809     if (hp == 0) {
3810       /* Didn't find it; cons up a new one.  */
3811       hp = (HASHNODE *) xcalloc (1, sizeof (HASHNODE) + fname_length + 1);
3812       hp->next = *hash_bucket;
3813       *hash_bucket = hp;
3814
3815       hp->length = fname_length;
3816       ip->nominal_fname = hp->value.cpval = ((char *) hp) + sizeof (HASHNODE);
3817       bcopy (fname, hp->value.cpval, fname_length);
3818     }
3819   }
3820   else if (token != CPP_VSPACE && token != CPP_EOF) {
3821     cpp_error (pfile, "invalid format `#line' command");
3822     goto bad_line_directive;
3823   }
3824
3825   ip->lineno = new_lineno;
3826  bad_line_directive:
3827   skip_rest_of_line (pfile);
3828   CPP_SET_WRITTEN (pfile, old_written);
3829   output_line_command (pfile, 0, file_change);
3830   return 0;
3831 }
3832
3833 /*
3834  * remove the definition of a symbol from the symbol table.
3835  * according to un*x /lib/cpp, it is not an error to undef
3836  * something that has no definitions, so it isn't one here either.
3837  */
3838
3839 static int
3840 do_undef (pfile, keyword, buf, limit)
3841      cpp_reader *pfile;
3842      struct directive *keyword;
3843      U_CHAR *buf, *limit;
3844 {
3845   int sym_length;
3846   HASHNODE *hp;
3847   U_CHAR *orig_buf = buf;
3848
3849 #if 0
3850   /* If this is a precompiler run (with -pcp) pass thru #undef commands.  */
3851   if (pcp_outfile && keyword)
3852     pass_thru_directive (buf, limit, pfile, keyword);
3853 #endif
3854
3855   SKIP_WHITE_SPACE (buf);
3856   sym_length = check_macro_name (pfile, buf, "macro");
3857
3858   while ((hp = cpp_lookup (pfile, buf, sym_length, -1)) != NULL)
3859     {
3860       /* If we are generating additional info for debugging (with -g) we
3861          need to pass through all effective #undef commands.  */
3862       if (CPP_OPTIONS (pfile)->debug_output && keyword)
3863         pass_thru_directive (orig_buf, limit, pfile, keyword);
3864       if (hp->type != T_MACRO)
3865         cpp_warning (pfile, "undefining `%s'", hp->name);
3866       delete_macro (hp);
3867     }
3868
3869   if (CPP_PEDANTIC (pfile)) {
3870     buf += sym_length;
3871     SKIP_WHITE_SPACE (buf);
3872     if (buf != limit)
3873       cpp_pedwarn (pfile, "garbage after `#undef' directive");
3874   }
3875   return 0;
3876 }
3877 \f
3878 /*
3879  * Report an error detected by the program we are processing.
3880  * Use the text of the line in the error message.
3881  * (We use error because it prints the filename & line#.)
3882  */
3883
3884 static int
3885 do_error (pfile, keyword, buf, limit)
3886      cpp_reader *pfile;
3887      struct directive *keyword;
3888      U_CHAR *buf, *limit;
3889 {
3890   int length = limit - buf;
3891   U_CHAR *copy = (U_CHAR *) alloca (length + 1);
3892   bcopy (buf, copy, length);
3893   copy[length] = 0;
3894   SKIP_WHITE_SPACE (copy);
3895   cpp_error (pfile, "#error %s", copy);
3896   return 0;
3897 }
3898
3899 /*
3900  * Report a warning detected by the program we are processing.
3901  * Use the text of the line in the warning message, then continue.
3902  * (We use error because it prints the filename & line#.)
3903  */
3904
3905 static int
3906 do_warning (pfile, keyword, buf, limit)
3907      cpp_reader *pfile;
3908      struct directive *keyword;
3909      U_CHAR *buf, *limit;
3910 {
3911   int length = limit - buf;
3912   U_CHAR *copy = (U_CHAR *) alloca (length + 1);
3913   bcopy (buf, copy, length);
3914   copy[length] = 0;
3915   SKIP_WHITE_SPACE (copy);
3916   /* Use `pedwarn' not `warning', because #warning isn't in the C Standard;
3917      if -pedantic-errors is given, #warning should cause an error.  */
3918   cpp_pedwarn (pfile, "#warning %s", copy);
3919   return 0;
3920 }
3921
3922 /* Remember the name of the current file being read from so that we can
3923    avoid ever including it again.  */
3924
3925 static int
3926 do_once (pfile)
3927      cpp_reader *pfile;
3928 {
3929   cpp_buffer *ip = NULL;
3930   struct file_name_list *new;
3931
3932   for (ip = CPP_BUFFER (pfile); ; ip = CPP_PREV_BUFFER (ip))
3933     {
3934       if (ip == CPP_NULL_BUFFER (pfile))
3935         return 0;
3936       if (ip->fname != NULL)
3937         break;
3938     }
3939
3940     
3941   new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
3942   new->next = pfile->dont_repeat_files;
3943   pfile->dont_repeat_files = new;
3944   new->fname = savestring (ip->fname);
3945   new->control_macro = 0;
3946   new->got_name_map = 0;
3947   new->c_system_include_path = 0;
3948
3949   return 0;
3950 }
3951
3952 /* #ident has already been copied to the output file, so just ignore it.  */
3953
3954 static int
3955 do_ident (pfile, keyword, buf, limit)
3956      cpp_reader *pfile;
3957      struct directive *keyword;
3958      U_CHAR *buf, *limit;
3959 {
3960 /*  long old_written = CPP_WRITTEN (pfile);*/
3961   int len;
3962
3963   /* Allow #ident in system headers, since that's not user's fault.  */
3964   if (CPP_PEDANTIC (pfile) && !CPP_BUFFER (pfile)->system_header_p)
3965     cpp_pedwarn (pfile, "ANSI C does not allow `#ident'");
3966
3967   /* Leave rest of line to be read by later calls to cpp_get_token.  */
3968
3969   return 0;
3970 }
3971
3972 /* #pragma and its argument line have already been copied to the output file.
3973    Just check for some recognized pragmas that need validation here.  */
3974
3975 static int
3976 do_pragma (pfile, keyword, buf, limit)
3977      cpp_reader *pfile;
3978      struct directive *keyword;
3979      U_CHAR *buf, *limit;
3980 {
3981   while (*buf == ' ' || *buf == '\t')
3982     buf++;
3983   if (!strncmp (buf, "once", 4)) {
3984     /* Allow #pragma once in system headers, since that's not the user's
3985        fault.  */
3986     if (!CPP_BUFFER (pfile)->system_header_p)
3987       cpp_warning (pfile, "`#pragma once' is obsolete");
3988     do_once (pfile);
3989   }
3990
3991   if (!strncmp (buf, "implementation", 14)) {
3992     /* Be quiet about `#pragma implementation' for a file only if it hasn't
3993        been included yet.  */
3994     struct file_name_list *ptr;
3995     U_CHAR *p = buf + 14, *fname, *inc_fname;
3996     int fname_len;
3997     SKIP_WHITE_SPACE (p);
3998     if (*p == '\n' || *p != '\"')
3999       return 0;
4000
4001     fname = p + 1;
4002     p = (U_CHAR *) index (fname, '\"');
4003     fname_len = p != NULL ? p - fname : strlen (fname);
4004     
4005     for (ptr = pfile->all_include_files; ptr; ptr = ptr->next) {
4006       inc_fname = (U_CHAR *) rindex (ptr->fname, '/');
4007       inc_fname = inc_fname ? inc_fname + 1 : (U_CHAR *) ptr->fname;
4008       if (inc_fname && !strncmp (inc_fname, fname, fname_len))
4009         cpp_warning (pfile,
4010            "`#pragma implementation' for `%s' appears after file is included",
4011                      fname);
4012     }
4013   }
4014
4015   return 0;
4016 }
4017
4018 #if 0
4019 /* This was a fun hack, but #pragma seems to start to be useful.
4020    By failing to recognize it, we pass it through unchanged to cc1.  */
4021
4022 /*
4023  * the behavior of the #pragma directive is implementation defined.
4024  * this implementation defines it as follows.
4025  */
4026
4027 static int
4028 do_pragma ()
4029 {
4030   close (0);
4031   if (open ("/dev/tty", O_RDONLY, 0666) != 0)
4032     goto nope;
4033   close (1);
4034   if (open ("/dev/tty", O_WRONLY, 0666) != 1)
4035     goto nope;
4036   execl ("/usr/games/hack", "#pragma", 0);
4037   execl ("/usr/games/rogue", "#pragma", 0);
4038   execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
4039   execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
4040 nope:
4041   fatal ("You are in a maze of twisty compiler features, all different");
4042 }
4043 #endif
4044
4045 /* Just ignore #sccs, on systems where we define it at all.  */
4046
4047 static int
4048 do_sccs (pfile, keyword, buf, limit)
4049      cpp_reader *pfile;
4050      struct directive *keyword;
4051      U_CHAR *buf, *limit;
4052 {
4053   if (CPP_PEDANTIC (pfile))
4054     cpp_pedwarn (pfile, "ANSI C does not allow `#sccs'");
4055   return 0;
4056 }
4057 \f
4058 /*
4059  * handle #if command by
4060  *   1) inserting special `defined' keyword into the hash table
4061  *      that gets turned into 0 or 1 by special_symbol (thus,
4062  *      if the luser has a symbol called `defined' already, it won't
4063  *      work inside the #if command)
4064  *   2) rescan the input into a temporary output buffer
4065  *   3) pass the output buffer to the yacc parser and collect a value
4066  *   4) clean up the mess left from steps 1 and 2.
4067  *   5) call conditional_skip to skip til the next #endif (etc.),
4068  *      or not, depending on the value from step 3.
4069  */
4070
4071 static int
4072 do_if (pfile, keyword, buf, limit)
4073      cpp_reader *pfile;
4074      struct directive *keyword;
4075      U_CHAR *buf, *limit;
4076 {
4077   HOST_WIDE_INT value = eval_if_expression (pfile, buf, limit - buf);
4078   conditional_skip (pfile, value == 0, T_IF, NULL_PTR);
4079   return 0;
4080 }
4081
4082 /*
4083  * handle a #elif directive by not changing  if_stack  either.
4084  * see the comment above do_else.
4085  */
4086
4087 static int
4088 do_elif (pfile, keyword, buf, limit)
4089      cpp_reader *pfile;
4090      struct directive *keyword;
4091      U_CHAR *buf, *limit;
4092 {
4093   if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack) {
4094     cpp_error (pfile, "`#elif' not within a conditional");
4095     return 0;
4096   } else {
4097     if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) {
4098       cpp_error (pfile, "`#elif' after `#else'");
4099 #if 0
4100       fprintf (stderr, " (matches line %d", pfile->if_stack->lineno);
4101 #endif
4102       if (pfile->if_stack->fname != NULL && CPP_BUFFER (pfile)->fname != NULL
4103           && strcmp (pfile->if_stack->fname,
4104                      CPP_BUFFER (pfile)->nominal_fname) != 0)
4105         fprintf (stderr, ", file %s", pfile->if_stack->fname);
4106       fprintf (stderr, ")\n");
4107     }
4108     pfile->if_stack->type = T_ELIF;
4109   }
4110
4111   if (pfile->if_stack->if_succeeded)
4112     skip_if_group (pfile, 0);
4113   else {
4114     HOST_WIDE_INT value = eval_if_expression (pfile, buf, limit - buf);
4115     if (value == 0)
4116       skip_if_group (pfile, 0);
4117     else {
4118       ++pfile->if_stack->if_succeeded;  /* continue processing input */
4119       output_line_command (pfile, 1, same_file);
4120     }
4121   }
4122   return 0;
4123 }
4124
4125 /*
4126  * evaluate a #if expression in BUF, of length LENGTH,
4127  * then parse the result as a C expression and return the value as an int.
4128  */
4129
4130 static HOST_WIDE_INT
4131 eval_if_expression (pfile, buf, length)
4132      cpp_reader *pfile;
4133      U_CHAR *buf;
4134      int length;
4135 {
4136   HASHNODE *save_defined;
4137   HOST_WIDE_INT value;
4138   long old_written = CPP_WRITTEN (pfile);
4139
4140   save_defined = install ("defined", -1, T_SPEC_DEFINED, 0, 0, -1);
4141   pfile->pcp_inside_if = 1;
4142
4143   value = cpp_parse_expr (pfile);
4144   pfile->pcp_inside_if = 0;
4145   delete_macro (save_defined);  /* clean up special symbol */
4146
4147   CPP_SET_WRITTEN (pfile, old_written); /* Pop */
4148
4149   return value;
4150 }
4151
4152 /*
4153  * routine to handle ifdef/ifndef.  Try to look up the symbol,
4154  * then do or don't skip to the #endif/#else/#elif depending
4155  * on what directive is actually being processed.
4156  */
4157
4158 static int
4159 do_xifdef (pfile, keyword, unused1, unused2)
4160      cpp_reader *pfile;
4161      struct directive *keyword;
4162      U_CHAR *unused1, *unused2;
4163 {
4164   int skip;
4165   cpp_buffer *ip = CPP_BUFFER (pfile);
4166   U_CHAR *ident;
4167   int ident_length;
4168   enum cpp_token token;
4169   int start_of_file = 0;
4170   U_CHAR *control_macro = 0;
4171   int old_written = CPP_WRITTEN (pfile);
4172
4173   /* Detect a #ifndef at start of file (not counting comments).  */
4174   if (ip->fname != 0 && keyword->type == T_IFNDEF)
4175     start_of_file = pfile->only_seen_white == 2;
4176
4177   pfile->no_macro_expand++;
4178   token = get_directive_token (pfile);
4179   pfile->no_macro_expand--;
4180
4181   ident = pfile->token_buffer + old_written;
4182   ident_length = CPP_WRITTEN (pfile) - old_written;
4183   CPP_SET_WRITTEN (pfile, old_written); /* Pop */
4184
4185   if (token == CPP_VSPACE || token == CPP_POP || token == CPP_EOF)
4186     {
4187       skip = (keyword->type == T_IFDEF);
4188       if (! CPP_TRADITIONAL (pfile))
4189         cpp_pedwarn (pfile, "`#%s' with no argument", keyword->name);
4190     }
4191   else if (token == CPP_NAME)
4192     {
4193       HASHNODE *hp = cpp_lookup (pfile, ident, ident_length, -1);
4194       skip = (hp == NULL) ^ (keyword->type == T_IFNDEF);
4195       if (start_of_file && !skip)
4196         {
4197           control_macro = (U_CHAR *) xmalloc (ident_length + 1);
4198           bcopy (ident, control_macro, ident_length + 1);
4199         }
4200     }
4201   else
4202     {
4203       skip = (keyword->type == T_IFDEF);
4204       if (! CPP_TRADITIONAL (pfile))
4205         cpp_error (pfile, "`#%s' with invalid argument", keyword->name);
4206     }
4207
4208   if (!CPP_TRADITIONAL (pfile))
4209     { int c;
4210       cpp_skip_hspace (pfile);
4211       c = PEEKC ();
4212       if (c != EOF && c != '\n')
4213         cpp_pedwarn (pfile, "garbage at end of `#%s' argument", keyword->name);
4214     }
4215   skip_rest_of_line (pfile);
4216
4217 #if 0
4218     if (pcp_outfile) {
4219       /* Output a precondition for this macro.  */
4220       if (hp && hp->value.defn->predefined)
4221         fprintf (pcp_outfile, "#define %s\n", hp->name);
4222       else {
4223         U_CHAR *cp = buf;
4224         fprintf (pcp_outfile, "#undef ");
4225         while (is_idchar[*cp]) /* Ick! */
4226           fputc (*cp++, pcp_outfile);
4227         putc ('\n', pcp_outfile);
4228       }
4229 #endif
4230
4231   conditional_skip (pfile, skip, T_IF, control_macro);
4232   return 0;
4233 }
4234
4235 /* Push TYPE on stack; then, if SKIP is nonzero, skip ahead.
4236    If this is a #ifndef starting at the beginning of a file,
4237    CONTROL_MACRO is the macro name tested by the #ifndef.
4238    Otherwise, CONTROL_MACRO is 0.  */
4239
4240 static void
4241 conditional_skip (pfile, skip, type, control_macro)
4242      cpp_reader *pfile;
4243      int skip;
4244      enum node_type type;
4245      U_CHAR *control_macro;
4246 {
4247   IF_STACK_FRAME *temp;
4248
4249   temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
4250   temp->fname = CPP_BUFFER (pfile)->nominal_fname;
4251 #if 0
4252   temp->lineno = CPP_BUFFER (pfile)->lineno;
4253 #endif
4254   temp->next = pfile->if_stack;
4255   temp->control_macro = control_macro;
4256   pfile->if_stack = temp;
4257
4258   pfile->if_stack->type = type;
4259
4260   if (skip != 0) {
4261     skip_if_group (pfile, 0);
4262     return;
4263   } else {
4264     ++pfile->if_stack->if_succeeded;
4265     output_line_command (pfile, 1, same_file);
4266   }
4267 }
4268
4269 /*
4270  * skip to #endif, #else, or #elif.  adjust line numbers, etc.
4271  * leaves input ptr at the sharp sign found.
4272  * If ANY is nonzero, return at next directive of any sort.
4273  */
4274
4275 static void
4276 skip_if_group (pfile, any)
4277      cpp_reader *pfile;
4278      int any;
4279 {
4280   int c;
4281   int at_beg_of_line = 1;
4282   struct directive *kt;
4283   IF_STACK_FRAME *save_if_stack = pfile->if_stack; /* don't pop past here */
4284 #if 0
4285   U_CHAR *beg_of_line = bp;
4286 #endif
4287   register int ident_length;
4288   U_CHAR *ident, *after_ident;
4289   struct parse_marker line_start_mark;
4290
4291   parse_set_mark (&line_start_mark, pfile);
4292
4293   if (CPP_OPTIONS (pfile)->output_conditionals) {
4294     static char failed[] = "#failed\n";
4295     CPP_PUTS (pfile, failed, sizeof(failed)-1);
4296     pfile->lineno++;
4297     output_line_command (pfile, 1, same_file);
4298   }
4299
4300  beg_of_line:
4301   if (CPP_OPTIONS (pfile)->output_conditionals)
4302     {
4303       cpp_buffer *pbuf = CPP_BUFFER (pfile);
4304       U_CHAR *start_line = pbuf->buf + line_start_mark.position;
4305       CPP_PUTS (pfile, start_line, pbuf->cur - start_line);
4306     }
4307   parse_move_mark (&line_start_mark, pfile);
4308   if (!CPP_TRADITIONAL (pfile))
4309       cpp_skip_hspace (pfile);
4310   c  = GETC();
4311   if (c == '#')
4312     {
4313       int old_written = CPP_WRITTEN (pfile);
4314       cpp_skip_hspace (pfile);
4315
4316       parse_name (pfile, GETC());
4317       ident_length = CPP_WRITTEN (pfile) - old_written;
4318       ident = pfile->token_buffer + old_written;
4319       pfile->limit = ident;
4320 #if 0
4321       if (ident_length == 0)
4322         goto not_a_directive;
4323
4324       /* Handle # followed by a line number.  */
4325
4326       /* Avoid error for `###' and similar cases unless -pedantic.  */
4327 #endif
4328
4329       for (kt = directive_table; kt->length >= 0; kt++)
4330         {
4331           IF_STACK_FRAME *temp;
4332           if (ident_length == kt->length
4333               && strncmp (ident, kt->name, kt->length) == 0)
4334             {
4335               /* If we are asked to return on next directive, do so now.  */
4336               if (any)
4337                 goto done;
4338
4339               switch (kt->type)
4340                 {
4341                 case T_IF:
4342                 case T_IFDEF:
4343                 case T_IFNDEF:
4344                   temp
4345                     = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
4346                   temp->next = pfile->if_stack;
4347                   pfile->if_stack = temp;
4348 #if 0
4349                   temp->lineno = CPP_BUFFER(pfile)->lineno;
4350 #endif
4351                   temp->fname = CPP_BUFFER(pfile)->nominal_fname;
4352                   temp->type = kt->type;
4353                   break;
4354                 case T_ELSE:
4355                 case T_ENDIF:
4356                   if (CPP_PEDANTIC (pfile) && pfile->if_stack != save_if_stack)
4357                     validate_else (pfile,
4358                                    kt->type == T_ELSE ? "#else" : "#endif");
4359                 case T_ELIF:
4360                   if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack)
4361                     {
4362                       cpp_error (pfile,
4363                                  "`#%s' not within a conditional", kt->name);
4364                       break;
4365                     }
4366                   else if (pfile->if_stack == save_if_stack)
4367                     goto done;          /* found what we came for */
4368
4369                   if (kt->type != T_ENDIF)
4370                     {
4371                       if (pfile->if_stack->type == T_ELSE)
4372                         cpp_error (pfile, "`#else' or `#elif' after `#else'");
4373                       pfile->if_stack->type = kt->type;
4374                       break;
4375                     }
4376
4377                   temp = pfile->if_stack;
4378                   pfile->if_stack = temp->next;
4379                   free (temp);
4380                   break;
4381               default: ;
4382                 }
4383               break;
4384             }
4385           /* Don't let erroneous code go by.  */
4386           if (kt->length < 0 && !CPP_OPTIONS (pfile)->lang_asm
4387               && CPP_PEDANTIC (pfile))
4388             cpp_pedwarn (pfile, "invalid preprocessor directive name");
4389         }
4390       c = GETC ();
4391     }
4392   /* We're in the middle of a line.  Skip the rest of it.  */
4393   for (;;) {
4394     switch (c)
4395       {
4396         long old;
4397       case EOF:
4398         goto done;
4399       case '/':                 /* possible comment */
4400         c = skip_comment (pfile, NULL);
4401         if (c == EOF)
4402           goto done;
4403         break;
4404       case '\"':
4405       case '\'':
4406         FORWARD(-1);
4407         old = CPP_WRITTEN (pfile);
4408         cpp_get_token (pfile);
4409         CPP_SET_WRITTEN (pfile, old);
4410         break;
4411       case '\\':
4412         /* Char after backslash loses its special meaning.  */
4413         if (PEEKC() == '\n')
4414           FORWARD (1);
4415         break;
4416       case '\n':
4417         goto beg_of_line;
4418         break;
4419       }
4420     c = GETC ();
4421   }
4422  done:
4423   if (CPP_OPTIONS (pfile)->output_conditionals) {
4424     static char end_failed[] = "#endfailed\n";
4425     CPP_PUTS (pfile, end_failed, sizeof(end_failed)-1);
4426     pfile->lineno++;
4427   }
4428   pfile->only_seen_white = 1;
4429   parse_goto_mark (&line_start_mark, pfile);
4430   parse_clear_mark (&line_start_mark);
4431 }
4432
4433 /*
4434  * handle a #else directive.  Do this by just continuing processing
4435  * without changing  if_stack ;  this is so that the error message
4436  * for missing #endif's etc. will point to the original #if.  It
4437  * is possible that something different would be better.
4438  */
4439
4440 static int
4441 do_else (pfile, keyword, buf, limit)
4442      cpp_reader *pfile;
4443      struct directive *keyword;
4444      U_CHAR *buf, *limit;
4445 {
4446   cpp_buffer *ip = CPP_BUFFER (pfile);
4447
4448   if (CPP_PEDANTIC (pfile))
4449     validate_else (pfile, "#else");
4450   skip_rest_of_line (pfile);
4451
4452   if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack) {
4453     cpp_error (pfile, "`#else' not within a conditional");
4454     return 0;
4455   } else {
4456     /* #ifndef can't have its special treatment for containing the whole file
4457        if it has a #else clause.  */
4458     pfile->if_stack->control_macro = 0;
4459
4460     if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) {
4461       cpp_error (pfile, "`#else' after `#else'");
4462       fprintf (stderr, " (matches line %d", pfile->if_stack->lineno);
4463       if (strcmp (pfile->if_stack->fname, ip->nominal_fname) != 0)
4464         fprintf (stderr, ", file %s", pfile->if_stack->fname);
4465       fprintf (stderr, ")\n");
4466     }
4467     pfile->if_stack->type = T_ELSE;
4468   }
4469
4470   if (pfile->if_stack->if_succeeded)
4471     skip_if_group (pfile, 0);
4472   else {
4473     ++pfile->if_stack->if_succeeded;    /* continue processing input */
4474     output_line_command (pfile, 1, same_file);
4475   }
4476   return 0;
4477 }
4478
4479 /*
4480  * unstack after #endif command
4481  */
4482
4483 static int
4484 do_endif (pfile, keyword, buf, limit)
4485      cpp_reader *pfile;
4486      struct directive *keyword;
4487      U_CHAR *buf, *limit;
4488 {
4489   if (CPP_PEDANTIC (pfile))
4490     validate_else (pfile, "#endif");
4491   skip_rest_of_line (pfile);
4492
4493   if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack)
4494     cpp_error (pfile, "unbalanced `#endif'");
4495   else
4496     {
4497       IF_STACK_FRAME *temp = pfile->if_stack;
4498       pfile->if_stack = temp->next;
4499       if (temp->control_macro != 0)
4500         {
4501           /* This #endif matched a #ifndef at the start of the file.
4502              See if it is at the end of the file.  */
4503           struct parse_marker start_mark;
4504           int c;
4505
4506           parse_set_mark (&start_mark, pfile);
4507
4508           for (;;)
4509             {
4510               cpp_skip_hspace (pfile);
4511               c = GETC ();
4512               if (c != '\n')
4513                 break;
4514             }
4515           parse_goto_mark (&start_mark, pfile);
4516           parse_clear_mark (&start_mark);
4517
4518           if (c == EOF)
4519             {
4520               /* If we get here, this #endif ends a #ifndef
4521                  that contains all of the file (aside from whitespace).
4522                  Arrange not to include the file again
4523                  if the macro that was tested is defined.
4524
4525                  Do not do this for the top-level file in a -include or any
4526                  file in a -imacros.  */
4527 #if 0
4528 FIXME!
4529               if (indepth != 0
4530                   && ! (indepth == 1 && pfile->no_record_file)
4531                   && ! (pfile->no_record_file && no_output))
4532 #endif
4533                 {
4534                   struct file_name_list *ifile = pfile->all_include_files;
4535                   
4536                   for ( ; ifile != NULL; ifile = ifile->next)
4537                     {
4538                       if (!strcmp (ifile->fname, CPP_BUFFER (pfile)->fname))
4539                         {
4540                           ifile->control_macro = temp->control_macro;
4541                           break;
4542                         }
4543                     }
4544                 }
4545             }
4546         }
4547       free (temp);
4548       output_line_command (pfile, 1, same_file);
4549     }
4550   return 0;
4551 }
4552
4553 /* When an #else or #endif is found while skipping failed conditional,
4554    if -pedantic was specified, this is called to warn about text after
4555    the command name.  P points to the first char after the command name.  */
4556
4557 static void
4558 validate_else (pfile, directive)
4559      cpp_reader *pfile;
4560      char *directive;
4561 {
4562   int c;
4563   cpp_skip_hspace (pfile);
4564   c = PEEKC ();
4565   if (c != EOF && c != '\n')
4566     cpp_pedwarn (pfile,
4567                  "text following `%s' violates ANSI standard", directive);
4568 }
4569
4570 /* Get the next token, and add it to the text in pfile->token_buffer.
4571    Return the kind of token we got.  */
4572   
4573 enum cpp_token
4574 cpp_get_token (pfile)
4575      cpp_reader *pfile;
4576 {
4577   register int c, c2, c3;
4578   long old_written;
4579   long start_line, start_column;
4580   enum cpp_token token;
4581   struct cpp_options *opts = CPP_OPTIONS (pfile);
4582   CPP_BUFFER (pfile)->prev = CPP_BUFFER (pfile)->cur;
4583  get_next:
4584   c = GETC();
4585   if (c == EOF)
4586     {
4587     handle_eof:
4588       if (CPP_BUFFER (pfile)->seen_eof)
4589         {
4590           if (cpp_pop_buffer (pfile) != CPP_NULL_BUFFER (pfile))
4591             goto get_next;
4592           else
4593             return CPP_EOF;
4594         }
4595       else
4596         {
4597           cpp_buffer *next_buf
4598             = CPP_PREV_BUFFER (CPP_BUFFER (pfile));
4599           CPP_BUFFER (pfile)->seen_eof = 1;
4600           if (CPP_BUFFER (pfile)->nominal_fname
4601               && next_buf != CPP_NULL_BUFFER (pfile))
4602             {
4603               /* We're about to return from an #include file.
4604                  Emit #line information now (as part of the CPP_POP) result.
4605                  But the #line refers to the file we will pop to.  */
4606               cpp_buffer *cur_buffer = CPP_BUFFER (pfile);
4607               CPP_BUFFER (pfile) = next_buf;
4608               pfile->input_stack_listing_current = 0;
4609               output_line_command (pfile, 0, leave_file);
4610               CPP_BUFFER (pfile) = cur_buffer;
4611             }
4612           return CPP_POP;
4613         }
4614     }
4615   else
4616     {
4617       switch (c)
4618         {
4619           long newlines;
4620           struct parse_marker start_mark;
4621         case '/':
4622           if (PEEKC () == '=')
4623             goto op2;
4624           if (opts->put_out_comments)
4625             parse_set_mark (&start_mark, pfile);
4626           newlines = 0;
4627           cpp_buf_line_and_col (cpp_file_buffer (pfile),
4628                                 &start_line, &start_column);
4629           c = skip_comment (pfile, &newlines);
4630           if (opts->put_out_comments && (c == '/' || c == EOF))
4631             parse_clear_mark (&start_mark);
4632           if (c == '/')
4633             goto randomchar;
4634           if (c == EOF)
4635             {
4636               cpp_error_with_line (pfile, start_line, start_column,
4637                                    "unterminated comment");
4638               goto handle_eof;
4639             }
4640           c = '/';  /* Initial letter of comment.  */
4641         return_comment:
4642           /* Comments are equivalent to spaces.
4643              For -traditional, a comment is equivalent to nothing.  */
4644           if (opts->put_out_comments)
4645             {
4646               cpp_buffer *pbuf = CPP_BUFFER (pfile);
4647               long dummy;
4648               U_CHAR *start = pbuf->buf + start_mark.position;
4649               int len = pbuf->cur - start;
4650               CPP_RESERVE(pfile, 1 + len);
4651               CPP_PUTC_Q (pfile, c);
4652               CPP_PUTS_Q (pfile, start, len);
4653               pfile->lineno += newlines;
4654               parse_clear_mark (&start_mark);
4655               return CPP_COMMENT;
4656             }
4657           else if (CPP_TRADITIONAL (pfile))
4658             {
4659               return CPP_COMMENT;
4660             }
4661           else
4662             {
4663 #if 0
4664               /* This may not work if cpp_get_token is called recursively,
4665                  since many places look for horizontal space.  */
4666               if (newlines)
4667                 {
4668                   /* Copy the newlines into the output buffer, in order to
4669                      avoid the pain of a #line every time a multiline comment
4670                      is seen.  */
4671                   CPP_RESERVE(pfile, newlines);
4672                   while (--newlines >= 0)
4673                     {
4674                       CPP_PUTC_Q (pfile, '\n');
4675                       pfile->lineno++;
4676                     }
4677                   return CPP_VSPACE;
4678                 }
4679 #endif
4680               CPP_RESERVE(pfile, 1);
4681               CPP_PUTC_Q (pfile, ' ');
4682               return CPP_HSPACE;
4683             }
4684 #if 0
4685           if (opts->for_lint) {
4686             U_CHAR *argbp;
4687             int cmdlen, arglen;
4688             char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen);
4689             
4690             if (lintcmd != NULL) {
4691               /* I believe it is always safe to emit this newline: */
4692               obp[-1] = '\n';
4693               bcopy ("#pragma lint ", (char *) obp, 13);
4694               obp += 13;
4695               bcopy (lintcmd, (char *) obp, cmdlen);
4696               obp += cmdlen;
4697
4698               if (arglen != 0) {
4699                 *(obp++) = ' ';
4700                 bcopy (argbp, (char *) obp, arglen);
4701                 obp += arglen;
4702               }
4703
4704               /* OK, now bring us back to the state we were in before we entered
4705                  this branch.  We need #line b/c the newline for the pragma
4706                  could fuck things up.  */
4707               output_line_command (pfile, 0, same_file);
4708               *(obp++) = ' ';   /* just in case, if comments are copied thru */
4709               *(obp++) = '/';
4710             }
4711           }
4712 #endif
4713
4714         case '#':
4715 #if 0
4716           /* If this is expanding a macro definition, don't recognize
4717              preprocessor directives.  */
4718           if (ip->macro != 0)
4719             goto randomchar;
4720           /* If this is expand_into_temp_buffer, recognize them
4721              only after an actual newline at this level,
4722              not at the beginning of the input level.  */
4723           if (ip->fname == 0 && beg_of_line == ip->buf)
4724             goto randomchar;
4725           if (ident_length)
4726             goto specialchar;
4727 #endif
4728
4729           if (!pfile->only_seen_white)
4730             goto randomchar;
4731           if (handle_directive (pfile))
4732             return CPP_DIRECTIVE;
4733           pfile->only_seen_white = 0;
4734           return CPP_OTHER;
4735
4736         case '\"':
4737         case '\'':
4738           /* A single quoted string is treated like a double -- some
4739              programs (e.g., troff) are perverse this way */
4740           cpp_buf_line_and_col (cpp_file_buffer (pfile),
4741                                 &start_line, &start_column);
4742           old_written = CPP_WRITTEN (pfile);
4743         string:
4744           CPP_PUTC (pfile, c);
4745           while (1)
4746             {
4747               int cc = GETC();
4748               if (cc == EOF)
4749                 {
4750                   if (CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
4751                     {
4752                       /* try harder: this string crosses a macro expansion
4753                          boundary.  This can happen naturally if -traditional.
4754                          Otherwise, only -D can make a macro with an unmatched
4755                          quote.  */
4756                         cpp_buffer *next_buf
4757                             = CPP_PREV_BUFFER (CPP_BUFFER (pfile));
4758                         (*CPP_BUFFER (pfile)->cleanup)
4759                             (CPP_BUFFER (pfile), pfile);
4760                         CPP_BUFFER (pfile) = next_buf;
4761                         continue;
4762                     }
4763                   if (!CPP_TRADITIONAL (pfile))
4764                     {
4765                       cpp_error_with_line (pfile, start_line, start_column,
4766                               "unterminated string or character constant");
4767                       if (pfile->multiline_string_line != start_line
4768                           && pfile->multiline_string_line != 0)
4769                         cpp_error_with_line (pfile,
4770                                              pfile->multiline_string_line, -1,
4771                                "possible real start of unterminated constant");
4772                       pfile->multiline_string_line = 0;
4773                     }
4774                   break;
4775                 }
4776               CPP_PUTC (pfile, cc);
4777               switch (cc)
4778                 {
4779                 case '\n':
4780                   /* Traditionally, end of line ends a string constant with
4781                  no error.  So exit the loop and record the new line.  */
4782                   if (CPP_TRADITIONAL (pfile))
4783                     goto while2end;
4784                   if (c == '\'')
4785                     {
4786                       cpp_error_with_line (pfile, start_line, start_column,
4787                                            "unterminated character constant");
4788                       goto while2end;
4789                     }
4790                   if (CPP_PEDANTIC (pfile)
4791                       && pfile->multiline_string_line == 0)
4792                     {
4793                       cpp_pedwarn_with_line (pfile, start_line, start_column,
4794                                "string constant runs past end of line");
4795                     }
4796                   if (pfile->multiline_string_line == 0)
4797                     pfile->multiline_string_line = start_line;
4798                   break;
4799                 
4800                 case '\\':
4801                   cc = GETC();
4802                   if (cc == '\n')
4803                     {
4804                       /* Backslash newline is replaced by nothing at all.  */
4805                       CPP_ADJUST_WRITTEN (pfile, -1);
4806                       pfile->lineno++;
4807                     }
4808                   else
4809                     {
4810                       /* ANSI stupidly requires that in \\ the second \
4811                          is *not* prevented from combining with a newline.  */
4812                       NEWLINE_FIX1(cc);
4813                       if (cc != EOF)
4814                         CPP_PUTC (pfile, cc);
4815                     }
4816                   break;
4817
4818                 case '\"':
4819                 case '\'':
4820                   if (cc == c)
4821                     goto while2end;
4822                   break;
4823                 }
4824             }
4825         while2end:
4826           pfile->lineno += count_newlines (pfile->token_buffer + old_written,
4827                                            CPP_PWRITTEN (pfile));
4828           pfile->only_seen_white = 0;
4829           return c == '\'' ? CPP_CHAR : CPP_STRING;
4830
4831         case '$':
4832           if (!opts->dollars_in_ident)
4833             goto randomchar;
4834           goto letter;
4835
4836         case ':':
4837           if (opts->cplusplus && PEEKC () == ':')
4838             goto op2;
4839           goto randomchar;
4840
4841         case '&':
4842         case '+':
4843         case '|':
4844           NEWLINE_FIX;
4845           c2 = PEEKC ();
4846           if (c2 == c || c2 == '=')
4847             goto op2;
4848           goto randomchar;
4849
4850         case '*':
4851         case '!':
4852         case '%':
4853         case '=':
4854         case '^':
4855           NEWLINE_FIX;
4856           if (PEEKC () == '=')
4857             goto op2;
4858           goto randomchar;
4859
4860         case '-':
4861           NEWLINE_FIX;
4862           c2 = PEEKC ();
4863           if (c2 == '-' && opts->chill)
4864             {
4865               /* Chill style comment */
4866               if (opts->put_out_comments)
4867                 parse_set_mark (&start_mark, pfile);
4868               FORWARD(1);  /* Skip second '-'.  */
4869               for (;;)
4870                 {
4871                   c = GETC ();
4872                   if (c == EOF)
4873                     break;
4874                   if (c == '\n')
4875                     {
4876                       /* Don't consider final '\n' to be part of comment.  */
4877                       FORWARD(-1);
4878                       break;
4879                     }
4880                 }
4881               c = '-';
4882               goto return_comment;
4883             }
4884           if (c2 == '-' || c2 == '=' || c2 == '>')
4885             goto op2;
4886           goto randomchar;
4887
4888         case '<':
4889           if (pfile->parsing_include_directive)
4890             {
4891               for (;;)
4892                 {
4893                   CPP_PUTC (pfile, c);
4894                   if (c == '>')
4895                     break;
4896                   c = GETC ();
4897                   NEWLINE_FIX1 (c);
4898                   if (c == '\n' || c == EOF)
4899                     {
4900                       cpp_error (pfile,
4901                                  "missing '>' in `#include <FILENAME>'");
4902                       break;
4903                     }
4904                 }
4905               return CPP_STRING;
4906             }
4907           /* else fall through */
4908         case '>':
4909           NEWLINE_FIX;
4910           c2 = PEEKC ();
4911           if (c2 == '=')
4912             goto op2;
4913           if (c2 != c)
4914             goto randomchar;
4915           FORWARD(1);
4916           CPP_RESERVE (pfile, 4);
4917           CPP_PUTC (pfile, c);
4918           CPP_PUTC (pfile, c2);
4919           NEWLINE_FIX;
4920           c3 = PEEKC ();
4921           if (c3 == '=')
4922             CPP_PUTC_Q (pfile, GETC ());
4923           CPP_NUL_TERMINATE_Q (pfile);
4924           pfile->only_seen_white = 0;
4925           return CPP_OTHER;
4926
4927         case '@':
4928           if (CPP_BUFFER (pfile)->has_escapes)
4929             {
4930               c = GETC ();
4931               if (c == '-')
4932                 {
4933                   if (pfile->output_escapes)
4934                     CPP_PUTS (pfile, "@-", 2);
4935                   parse_name (pfile, GETC ());
4936                   return CPP_NAME;
4937                 }
4938               else if (is_space [c])
4939                 {
4940                   CPP_RESERVE (pfile, 2);
4941                   if (pfile->output_escapes)
4942                     CPP_PUTC_Q (pfile, '@');
4943                   CPP_PUTC_Q (pfile, c);
4944                   return CPP_HSPACE;
4945                 }
4946             }
4947           if (pfile->output_escapes)
4948             {
4949               CPP_PUTS (pfile, "@@", 2);
4950               return CPP_OTHER;
4951             }
4952           goto randomchar;
4953
4954         case '.':
4955           NEWLINE_FIX;
4956           c2 = PEEKC ();
4957           if (isdigit(c2))
4958             {
4959               CPP_RESERVE(pfile, 2);
4960               CPP_PUTC_Q (pfile, '.');
4961               c = GETC ();
4962               goto number;
4963             }
4964           /* FIXME - misses the case "..\\\n." */
4965           if (c2 == '.' && PEEKN(1) == '.')
4966             {
4967               CPP_RESERVE(pfile, 4);
4968               CPP_PUTC_Q (pfile, '.');
4969               CPP_PUTC_Q (pfile, '.');
4970               CPP_PUTC_Q (pfile, '.');
4971               FORWARD (2);
4972               CPP_NUL_TERMINATE_Q (pfile);
4973               pfile->only_seen_white = 0;
4974               return CPP_3DOTS;
4975             }
4976           goto randomchar;
4977
4978         op2:
4979           token = CPP_OTHER;
4980           pfile->only_seen_white = 0;
4981         op2any:
4982           CPP_RESERVE(pfile, 3);
4983           CPP_PUTC_Q (pfile, c);
4984           CPP_PUTC_Q (pfile, GETC ());
4985           CPP_NUL_TERMINATE_Q (pfile);
4986           return token;
4987
4988         case 'L':
4989           NEWLINE_FIX;
4990           c2 = PEEKC ();
4991           if ((c2 == '\'' || c2 == '\"') && !CPP_TRADITIONAL (pfile))
4992             {
4993               CPP_PUTC (pfile, c);
4994               c = GETC ();
4995               goto string;
4996             }
4997           goto letter;
4998
4999         case '0': case '1': case '2': case '3': case '4':
5000         case '5': case '6': case '7': case '8': case '9':
5001         number:
5002           c2  = '.';
5003           for (;;)
5004             {
5005               CPP_RESERVE (pfile, 2);
5006               CPP_PUTC_Q (pfile, c);
5007               NEWLINE_FIX;
5008               c = PEEKC ();
5009               if (c == EOF)
5010                 break;
5011               if (!is_idchar[c] && c != '.'
5012                   && ((c2 != 'e' && c2 != 'E'
5013                        && ((c2 != 'p' && c2 != 'P') || CPP_C89 (pfile)))
5014                       || (c != '+' && c != '-')))
5015                 break;
5016               FORWARD(1);
5017               c2= c;
5018             }
5019           CPP_NUL_TERMINATE_Q (pfile);
5020           pfile->only_seen_white = 0;
5021           return CPP_NUMBER;
5022         case 'b': case 'c': case 'd': case 'h': case 'o':
5023         case 'B': case 'C': case 'D': case 'H': case 'O':
5024           if (opts->chill && PEEKC () == '\'')
5025             {
5026               pfile->only_seen_white = 0;
5027               CPP_RESERVE (pfile, 2);
5028               CPP_PUTC_Q (pfile, c);
5029               CPP_PUTC_Q (pfile, '\'');
5030               FORWARD(1);
5031               for (;;)
5032                 {
5033                   c = GETC();
5034                   if (c == EOF)
5035                     goto chill_number_eof;
5036                   if (!is_idchar[c])
5037                     {
5038                       if (c == '\\' && PEEKC() == '\n')
5039                         {
5040                           FORWARD(2);
5041                           continue;
5042                         }
5043                       break;
5044                     }
5045                   CPP_PUTC (pfile, c);
5046                 }
5047               if (c == '\'')
5048                 {
5049                   CPP_RESERVE (pfile, 2);
5050                   CPP_PUTC_Q (pfile, c);
5051                   CPP_NUL_TERMINATE_Q (pfile);
5052                   return CPP_STRING;
5053                 }
5054               else
5055                 {
5056                   FORWARD(-1);
5057                 chill_number_eof:
5058                   CPP_NUL_TERMINATE (pfile);
5059                   return CPP_NUMBER;
5060                 }
5061             }
5062           else
5063             goto letter;
5064         case '_':
5065         case 'a': case 'e': case 'f': case 'g': case 'i': case 'j':
5066         case 'k': case 'l': case 'm': case 'n': case 'p': case 'q':
5067         case 'r': case 's': case 't': case 'u': case 'v': case 'w':
5068         case 'x': case 'y': case 'z':
5069         case 'A': case 'E': case 'F': case 'G': case 'I': case 'J':
5070         case 'K': case 'M': case 'N': case 'P': case 'Q': case 'R':
5071         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
5072         case 'Y': case 'Z':
5073         letter:
5074           {
5075             HASHNODE *hp;
5076             unsigned char *ident;
5077             int before_name_written = CPP_WRITTEN (pfile);
5078             int ident_len;
5079             parse_name (pfile, c);
5080             pfile->only_seen_white = 0;
5081             if (pfile->no_macro_expand)
5082               return CPP_NAME;
5083             ident = pfile->token_buffer + before_name_written;
5084             ident_len = CPP_PWRITTEN (pfile) - ident;
5085             hp = cpp_lookup (pfile, ident, ident_len, -1);
5086             if (!hp)
5087               return CPP_NAME;
5088             if (hp->type == T_DISABLED)
5089               {
5090                 if (pfile->output_escapes)
5091                   { /* Return "@-IDENT", followed by '\0'.  */
5092                     int i;
5093                     CPP_RESERVE (pfile, 3);
5094                     ident = pfile->token_buffer + before_name_written;
5095                     CPP_ADJUST_WRITTEN (pfile, 2);
5096                     for (i = ident_len; i >= 0; i--) ident[i+2] = ident[i];
5097                     ident[0] = '@';
5098                     ident[1] = '-';
5099                   }
5100                 return CPP_NAME;
5101               }
5102
5103             /* If macro wants an arglist, verify that a '(' follows.
5104                first skip all whitespace, copying it to the output
5105                after the macro name.  Then, if there is no '(',
5106                decide this is not a macro call and leave things that way.  */
5107             if (hp->type == T_MACRO && hp->value.defn->nargs >= 0)
5108             {
5109               struct parse_marker macro_mark;
5110               int is_macro_call;
5111               while (CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
5112                 {
5113                   cpp_buffer *next_buf;
5114                   cpp_skip_hspace (pfile);
5115                   if (PEEKC () != EOF)
5116                     break;
5117                   next_buf = CPP_PREV_BUFFER (CPP_BUFFER (pfile));
5118                   (*CPP_BUFFER (pfile)->cleanup) (CPP_BUFFER (pfile), pfile);
5119                   CPP_BUFFER (pfile) = next_buf;
5120                 }
5121               parse_set_mark (&macro_mark, pfile);
5122               for (;;)
5123                 {
5124                   cpp_skip_hspace (pfile);
5125                   c = PEEKC ();
5126                   is_macro_call = c == '(';
5127                   if (c != '\n')
5128                     break;
5129                   FORWARD (1);
5130                 }
5131               if (!is_macro_call)
5132                 parse_goto_mark (&macro_mark, pfile);
5133               parse_clear_mark (&macro_mark);
5134               if (!is_macro_call)
5135                 return CPP_NAME;
5136             }
5137             /* This is now known to be a macro call.  */
5138
5139             /* it might not actually be a macro.  */
5140             if (hp->type != T_MACRO) {
5141               int xbuf_len;  U_CHAR *xbuf;
5142               CPP_SET_WRITTEN (pfile, before_name_written);
5143               special_symbol (hp, pfile);
5144               xbuf_len = CPP_WRITTEN (pfile) - before_name_written;
5145               xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
5146               CPP_SET_WRITTEN (pfile, before_name_written);
5147               bcopy (CPP_PWRITTEN (pfile), xbuf, xbuf_len + 1);
5148               push_macro_expansion (pfile, xbuf, xbuf_len, hp);
5149             }
5150             else
5151               {
5152                 /* Expand the macro, reading arguments as needed,
5153                    and push the expansion on the input stack.  */
5154                 macroexpand (pfile, hp);
5155                 CPP_SET_WRITTEN (pfile, before_name_written);
5156               }
5157
5158             /* An extra "@ " is added to the end of a macro expansion
5159                to prevent accidental token pasting.  We prefer to avoid
5160                unneeded extra spaces (for the sake of cpp-using tools like
5161                imake).  Here we remove the space if it is safe to do so.  */
5162             if (pfile->buffer->rlimit - pfile->buffer->cur >= 3
5163                 && pfile->buffer->rlimit[-2] == '@'
5164                 && pfile->buffer->rlimit[-1] == ' ')
5165               {
5166                 int c1 = pfile->buffer->rlimit[-3];
5167                 int c2 = CPP_BUF_PEEK (CPP_PREV_BUFFER (CPP_BUFFER (pfile)));
5168                 if (c2 == EOF || ! unsafe_chars (c1, c2))
5169                   pfile->buffer->rlimit -= 2;
5170               }
5171           }
5172           goto get_next;
5173
5174         case ' ':  case '\t':  case '\v':  case '\r':
5175           for (;;)
5176             {
5177               CPP_PUTC (pfile, c);
5178               c = PEEKC ();
5179               if (c == EOF || !is_hor_space[c])
5180                 break;
5181               FORWARD(1);
5182             }
5183           return CPP_HSPACE;
5184
5185         case '\\':
5186           c2 = PEEKC ();
5187           if (c2 != '\n')
5188             goto randomchar;
5189           token = CPP_HSPACE;
5190           goto op2any;
5191
5192         case '\n':
5193           CPP_PUTC (pfile, c);
5194           if (pfile->only_seen_white == 0)
5195             pfile->only_seen_white = 1;
5196           pfile->lineno++;
5197           output_line_command (pfile, 1, same_file);
5198           return CPP_VSPACE;
5199
5200         case '(': token = CPP_LPAREN;    goto char1;
5201         case ')': token = CPP_RPAREN;    goto char1;
5202         case '{': token = CPP_LBRACE;    goto char1;
5203         case '}': token = CPP_RBRACE;    goto char1;
5204         case ',': token = CPP_COMMA;     goto char1;
5205         case ';': token = CPP_SEMICOLON; goto char1;
5206
5207         randomchar:
5208         default:
5209           token = CPP_OTHER;
5210         char1:
5211           pfile->only_seen_white = 0;
5212           CPP_PUTC (pfile, c);
5213           return token;
5214         }
5215     }
5216 }
5217
5218 /* Like cpp_get_token, but skip spaces and comments.  */
5219
5220 enum cpp_token
5221 cpp_get_non_space_token (pfile)
5222      cpp_reader *pfile;
5223 {
5224   int old_written = CPP_WRITTEN (pfile);
5225   for (;;)
5226     {
5227       enum cpp_token token = cpp_get_token (pfile);
5228       if (token != CPP_COMMENT && token != CPP_POP
5229           && token != CPP_HSPACE && token != CPP_VSPACE)
5230         return token;
5231       CPP_SET_WRITTEN (pfile, old_written);
5232     }
5233 }
5234
5235 /* Parse an identifier starting with C.  */
5236
5237 int
5238 parse_name (pfile, c)
5239      cpp_reader *pfile; int c;
5240 {
5241   for (;;)
5242   {
5243       if (! is_idchar[c])
5244       {
5245           if (c == '\\' && PEEKC() == '\n')
5246           {
5247               FORWARD(2);
5248               continue;
5249           }
5250           FORWARD (-1);
5251           break;
5252       }
5253
5254       if (c == '$' && CPP_PEDANTIC (pfile))
5255         cpp_pedwarn ("`$' in identifier");
5256
5257       CPP_RESERVE(pfile, 2); /* One more for final NUL.  */
5258       CPP_PUTC_Q (pfile, c);
5259       c = GETC();
5260       if (c == EOF)
5261         break;
5262   }
5263   CPP_NUL_TERMINATE_Q (pfile);
5264   return 1;
5265 }
5266
5267 \f
5268 /* Maintain and search list of included files, for #import.  */
5269
5270 /* Hash a file name for import_hash_table.  */
5271
5272 static int 
5273 import_hash (f)
5274      char *f;
5275 {
5276   int val = 0;
5277
5278   while (*f) val += *f++;
5279   return (val%IMPORT_HASH_SIZE);
5280 }
5281
5282 /* Search for file FILENAME in import_hash_table.
5283    Return -2 if found, either a matching name or a matching inode.
5284    Otherwise, open the file and return a file descriptor if successful
5285    or -1 if unsuccessful.  */
5286
5287 static int
5288 lookup_import (pfile, filename, searchptr)
5289      cpp_reader *pfile;
5290      char *filename;
5291      struct file_name_list *searchptr;
5292 {
5293   struct import_file *i;
5294   int h;
5295   int hashval;
5296   struct stat sb;
5297   int fd;
5298
5299   hashval = import_hash (filename);
5300
5301   /* Attempt to find file in list of already included files */
5302   i = pfile->import_hash_table[hashval];
5303
5304   while (i) {
5305     if (!strcmp (filename, i->name))
5306       return -2;                /* return found */
5307     i = i->next;
5308   }
5309   /* Open it and try a match on inode/dev */
5310   fd = open_include_file (pfile, filename, searchptr);
5311   if (fd < 0)
5312     return fd;
5313   fstat (fd, &sb);
5314   for (h = 0; h < IMPORT_HASH_SIZE; h++) {
5315     i = pfile->import_hash_table[h];
5316     while (i) {
5317       /* Compare the inode and the device.
5318          Supposedly on some systems the inode is not a scalar.  */
5319       if (!bcmp ((char *) &i->inode, (char *) &sb.st_ino, sizeof (sb.st_ino))
5320           && i->dev == sb.st_dev) {
5321         close (fd);
5322         return -2;              /* return found */
5323       }
5324       i = i->next;
5325     }
5326   }
5327   return fd;                    /* Not found, return open file */
5328 }
5329
5330 /* Add the file FNAME, open on descriptor FD, to import_hash_table.  */
5331
5332 static void
5333 add_import (pfile, fd, fname)
5334      cpp_reader *pfile;
5335      int fd;
5336      char *fname;
5337 {
5338   struct import_file *i;
5339   int hashval;
5340   struct stat sb;
5341
5342   hashval = import_hash (fname);
5343   fstat (fd, &sb);
5344   i = (struct import_file *)xmalloc (sizeof (struct import_file));
5345   i->name = (char *)xmalloc (strlen (fname)+1);
5346   strcpy (i->name, fname);
5347   bcopy ((char *) &sb.st_ino, (char *) &i->inode, sizeof (sb.st_ino));
5348   i->dev = sb.st_dev;
5349   i->next = pfile->import_hash_table[hashval];
5350   pfile->import_hash_table[hashval] = i;
5351 }
5352 \f
5353 /* The file_name_map structure holds a mapping of file names for a
5354    particular directory.  This mapping is read from the file named
5355    FILE_NAME_MAP_FILE in that directory.  Such a file can be used to
5356    map filenames on a file system with severe filename restrictions,
5357    such as DOS.  The format of the file name map file is just a series
5358    of lines with two tokens on each line.  The first token is the name
5359    to map, and the second token is the actual name to use.  */
5360
5361 struct file_name_map
5362 {
5363   struct file_name_map *map_next;
5364   char *map_from;
5365   char *map_to;
5366 };
5367
5368 #define FILE_NAME_MAP_FILE "header.gcc"
5369
5370 /* Read a space delimited string of unlimited length from a stdio
5371    file.  */
5372
5373 static char *
5374 read_filename_string (ch, f)
5375      int ch;
5376      FILE *f;
5377 {
5378   char *alloc, *set;
5379   int len;
5380
5381   len = 20;
5382   set = alloc = xmalloc (len + 1);
5383   if (! is_space[ch])
5384     {
5385       *set++ = ch;
5386       while ((ch = getc (f)) != EOF && ! is_space[ch])
5387         {
5388           if (set - alloc == len)
5389             {
5390               len *= 2;
5391               alloc = xrealloc (alloc, len + 1);
5392               set = alloc + len / 2;
5393             }
5394           *set++ = ch;
5395         }
5396     }
5397   *set = '\0';
5398   ungetc (ch, f);
5399   return alloc;
5400 }
5401
5402 /* This structure holds a linked list of file name maps, one per directory.  */
5403
5404 struct file_name_map_list
5405 {
5406   struct file_name_map_list *map_list_next;
5407   char *map_list_name;
5408   struct file_name_map *map_list_map;
5409 };
5410
5411 /* Read the file name map file for DIRNAME.  */
5412
5413 static struct file_name_map *
5414 read_name_map (pfile, dirname)
5415      cpp_reader *pfile;
5416      char *dirname;
5417 {
5418   register struct file_name_map_list *map_list_ptr;
5419   char *name;
5420   FILE *f;
5421
5422   for (map_list_ptr = CPP_OPTIONS (pfile)->map_list; map_list_ptr;
5423        map_list_ptr = map_list_ptr->map_list_next)
5424     if (! strcmp (map_list_ptr->map_list_name, dirname))
5425       return map_list_ptr->map_list_map;
5426
5427   map_list_ptr = ((struct file_name_map_list *)
5428                   xmalloc (sizeof (struct file_name_map_list)));
5429   map_list_ptr->map_list_name = savestring (dirname);
5430   map_list_ptr->map_list_map = NULL;
5431
5432   name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
5433   strcpy (name, dirname);
5434   if (*dirname)
5435     strcat (name, "/");
5436   strcat (name, FILE_NAME_MAP_FILE);
5437   f = fopen (name, "r");
5438   if (!f)
5439     map_list_ptr->map_list_map = NULL;
5440   else
5441     {
5442       int ch;
5443       int dirlen = strlen (dirname);
5444
5445       while ((ch = getc (f)) != EOF)
5446         {
5447           char *from, *to;
5448           struct file_name_map *ptr;
5449
5450           if (is_space[ch])
5451             continue;
5452           from = read_filename_string (ch, f);
5453           while ((ch = getc (f)) != EOF && is_hor_space[ch])
5454             ;
5455           to = read_filename_string (ch, f);
5456
5457           ptr = ((struct file_name_map *)
5458                  xmalloc (sizeof (struct file_name_map)));
5459           ptr->map_from = from;
5460
5461           /* Make the real filename absolute.  */
5462           if (*to == '/')
5463             ptr->map_to = to;
5464           else
5465             {
5466               ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
5467               strcpy (ptr->map_to, dirname);
5468               ptr->map_to[dirlen] = '/';
5469               strcpy (ptr->map_to + dirlen + 1, to);
5470               free (to);
5471             }         
5472
5473           ptr->map_next = map_list_ptr->map_list_map;
5474           map_list_ptr->map_list_map = ptr;
5475
5476           while ((ch = getc (f)) != '\n')
5477             if (ch == EOF)
5478               break;
5479         }
5480       fclose (f);
5481     }
5482   
5483   map_list_ptr->map_list_next = CPP_OPTIONS (pfile)->map_list;
5484   CPP_OPTIONS (pfile)->map_list = map_list_ptr;
5485
5486   return map_list_ptr->map_list_map;
5487 }  
5488
5489 /* Try to open include file FILENAME.  SEARCHPTR is the directory
5490    being tried from the include file search path.  This function maps
5491    filenames on file systems based on information read by
5492    read_name_map.  */
5493
5494 static int
5495 open_include_file (pfile, filename, searchptr)
5496      cpp_reader *pfile;
5497      char *filename;
5498      struct file_name_list *searchptr;
5499 {
5500   register struct file_name_map *map;
5501   register char *from;
5502   char *p, *dir;
5503
5504   if (searchptr && ! searchptr->got_name_map)
5505     {
5506       searchptr->name_map = read_name_map (pfile,
5507                                            searchptr->fname
5508                                            ? searchptr->fname : ".");
5509       searchptr->got_name_map = 1;
5510     }
5511
5512   /* First check the mapping for the directory we are using.  */
5513   if (searchptr && searchptr->name_map)
5514     {
5515       from = filename;
5516       if (searchptr->fname)
5517         from += strlen (searchptr->fname) + 1;
5518       for (map = searchptr->name_map; map; map = map->map_next)
5519         {
5520           if (! strcmp (map->map_from, from))
5521             {
5522               /* Found a match.  */
5523               return open (map->map_to, O_RDONLY, 0666);
5524             }
5525         }
5526     }
5527
5528   /* Try to find a mapping file for the particular directory we are
5529      looking in.  Thus #include <sys/types.h> will look up sys/types.h
5530      in /usr/include/header.gcc and look up types.h in
5531      /usr/include/sys/header.gcc.  */
5532   p = rindex (filename, '/');
5533   if (! p)
5534     p = filename;
5535   if (searchptr
5536       && searchptr->fname
5537       && strlen (searchptr->fname) == p - filename
5538       && ! strncmp (searchptr->fname, filename, p - filename))
5539     {
5540       /* FILENAME is in SEARCHPTR, which we've already checked.  */
5541       return open (filename, O_RDONLY, 0666);
5542     }
5543
5544   if (p == filename)
5545     {
5546       dir = ".";
5547       from = filename;
5548     }
5549   else
5550     {
5551       dir = (char *) alloca (p - filename + 1);
5552       bcopy (filename, dir, p - filename);
5553       dir[p - filename] = '\0';
5554       from = p + 1;
5555     }
5556   for (map = read_name_map (pfile, dir); map; map = map->map_next)
5557     if (! strcmp (map->map_from, from))
5558       return open (map->map_to, O_RDONLY, 0666);
5559
5560   return open (filename, O_RDONLY, 0666);
5561 }
5562
5563 /* Process the contents of include file FNAME, already open on descriptor F,
5564    with output to OP.
5565    SYSTEM_HEADER_P is 1 if this file resides in any one of the known
5566    "system" include directories (as decided by the `is_system_include'
5567    function above).
5568    DIRPTR is the link in the dir path through which this file was found,
5569    or 0 if the file name was absolute or via the current directory.
5570    Return 1 on success, 0 on failure.
5571
5572    The caller is responsible for the cpp_push_buffer.  */
5573
5574 static int
5575 finclude (pfile, f, fname, system_header_p, dirptr)
5576      cpp_reader *pfile;
5577      int f;
5578      char *fname;
5579      int system_header_p;
5580      struct file_name_list *dirptr;
5581 {
5582   int st_mode;
5583   long st_size;
5584   long i;
5585   int length;
5586   cpp_buffer *fp;                       /* For input stack frame */
5587   int missing_newline = 0;
5588
5589   if (file_size_and_mode (f, &st_mode, &st_size) < 0)
5590     {
5591       cpp_perror_with_name (pfile, fname);
5592       close (f);
5593       cpp_pop_buffer (pfile);
5594       return 0;
5595     }
5596
5597   fp = CPP_BUFFER (pfile);
5598   fp->nominal_fname = fp->fname = fname;
5599 #if 0
5600   fp->length = 0;
5601 #endif
5602   fp->dir = dirptr;
5603   fp->system_header_p = system_header_p;
5604   fp->lineno = 1;
5605   fp->colno = 1;
5606   fp->cleanup = file_cleanup;
5607
5608   if (S_ISREG (st_mode)) {
5609     fp->buf = (U_CHAR *) xmalloc (st_size + 2);
5610     fp->alimit = fp->buf + st_size + 2;
5611     fp->cur = fp->buf;
5612
5613     /* Read the file contents, knowing that st_size is an upper bound
5614        on the number of bytes we can read.  */
5615     length = safe_read (f, fp->buf, st_size);
5616     fp->rlimit = fp->buf + length;
5617     if (length < 0) goto nope;
5618   }
5619   else if (S_ISDIR (st_mode)) {
5620     cpp_error (pfile, "directory `%s' specified in #include", fname);
5621     close (f);
5622     return 0;
5623   } else {
5624     /* Cannot count its file size before reading.
5625        First read the entire file into heap and
5626        copy them into buffer on stack.  */
5627
5628     int bsize = 2000;
5629
5630     st_size = 0;
5631     fp->buf = (U_CHAR *) xmalloc (bsize + 2);
5632
5633     for (;;) {
5634       i = safe_read (f, fp->buf + st_size, bsize - st_size);
5635       if (i < 0)
5636         goto nope;      /* error! */
5637       st_size += i;
5638       if (st_size != bsize)
5639         break;  /* End of file */
5640       bsize *= 2;
5641       fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
5642     }
5643     fp->cur = fp->buf;
5644     length = st_size;
5645   }
5646
5647   if ((length > 0 && fp->buf[length - 1] != '\n')
5648       /* Backslash-newline at end is not good enough.  */
5649       || (length > 1 && fp->buf[length - 2] == '\\')) {
5650     fp->buf[length++] = '\n';
5651 #if 0
5652     missing_newline = 1;
5653 #endif
5654   }
5655   fp->buf[length] = '\0';
5656   fp->rlimit = fp->buf + length;
5657
5658   /* Close descriptor now, so nesting does not use lots of descriptors.  */
5659   close (f);
5660
5661   /* Must do this before calling trigraph_pcp, so that the correct file name
5662      will be printed in warning messages.  */
5663
5664   pfile->input_stack_listing_current = 0;
5665
5666 #if 0
5667   if (!no_trigraphs)
5668     trigraph_pcp (fp);
5669 #endif
5670
5671 #if 0
5672   rescan (op, 0);
5673
5674   if (missing_newline)
5675     fp->lineno--;
5676
5677   if (CPP_PEDANTIC (pfile) && missing_newline)
5678     pedwarn ("file does not end in newline");
5679
5680   indepth--;
5681   input_file_stack_tick++;
5682   free (fp->buf);
5683 #endif
5684   return 1;
5685
5686  nope:
5687
5688   cpp_perror_with_name (pfile, fname);
5689   close (f);
5690   free (fp->buf);
5691   return 1;
5692 }
5693
5694 /* This is called after options have been processed.
5695  * Check options for consistency, and setup for processing input
5696  * from the file named FNAME.  (Use standard input if FNAME==NULL.)
5697  * Return 1 on succes, 0 on failure.
5698  */
5699
5700 int
5701 cpp_start_read (pfile, fname)
5702      cpp_reader *pfile;
5703      char *fname;
5704 {
5705   struct cpp_options *opts = CPP_OPTIONS (pfile);
5706   struct cpp_pending *pend;
5707   char *p;
5708   int f;
5709   cpp_buffer *fp;
5710
5711   /* The code looks at the defaults through this pointer, rather than through
5712      the constant structure above.  This pointer gets changed if an environment
5713      variable specifies other defaults.  */
5714   struct default_include *include_defaults = include_defaults_array;
5715
5716   /* Add dirs from CPATH after dirs from -I.  */
5717   /* There seems to be confusion about what CPATH should do,
5718      so for the moment it is not documented.  */
5719   /* Some people say that CPATH should replace the standard include dirs,
5720      but that seems pointless: it comes before them, so it overrides them
5721      anyway.  */
5722   p = (char *) getenv ("CPATH");
5723   if (p != 0 && ! opts->no_standard_includes)
5724     path_include (pfile, p);
5725
5726   /* Now that dollars_in_ident is known, initialize is_idchar.  */
5727   initialize_char_syntax (opts);
5728
5729   /* Do partial setup of input buffer for the sake of generating
5730      early #line directives (when -g is in effect).  */
5731   fp = cpp_push_buffer (pfile, NULL, 0);
5732   if (!fp)
5733     return 0;
5734   if (opts->in_fname == NULL)
5735     opts->in_fname = "";
5736   fp->nominal_fname = fp->fname = opts->in_fname;
5737   fp->lineno = 0;
5738
5739   /* Install __LINE__, etc.  Must follow initialize_char_syntax
5740      and option processing.  */
5741   initialize_builtins (pfile);
5742
5743   /* Do standard #defines and assertions
5744      that identify system and machine type.  */
5745
5746   if (!opts->inhibit_predefs) {
5747     char *p = (char *) alloca (strlen (predefs) + 1);
5748     strcpy (p, predefs);
5749     while (*p) {
5750       char *q;
5751       while (*p == ' ' || *p == '\t')
5752         p++;
5753       /* Handle -D options.  */ 
5754       if (p[0] == '-' && p[1] == 'D') {
5755         q = &p[2];
5756         while (*p && *p != ' ' && *p != '\t')
5757           p++;
5758         if (*p != 0)
5759           *p++= 0;
5760         if (opts->debug_output)
5761           output_line_command (pfile, 0, same_file);
5762         cpp_define (pfile, q);
5763         while (*p == ' ' || *p == '\t')
5764           p++;
5765       } else if (p[0] == '-' && p[1] == 'A') {
5766         /* Handle -A options (assertions).  */ 
5767         char *assertion;
5768         char *past_name;
5769         char *value;
5770         char *past_value;
5771         char *termination;
5772         int save_char;
5773
5774         assertion = &p[2];
5775         past_name = assertion;
5776         /* Locate end of name.  */
5777         while (*past_name && *past_name != ' '
5778                && *past_name != '\t' && *past_name != '(')
5779           past_name++;
5780         /* Locate `(' at start of value.  */
5781         value = past_name;
5782         while (*value && (*value == ' ' || *value == '\t'))
5783           value++;
5784         if (*value++ != '(')
5785           abort ();
5786         while (*value && (*value == ' ' || *value == '\t'))
5787           value++;
5788         past_value = value;
5789         /* Locate end of value.  */
5790         while (*past_value && *past_value != ' '
5791                && *past_value != '\t' && *past_value != ')')
5792           past_value++;
5793         termination = past_value;
5794         while (*termination && (*termination == ' ' || *termination == '\t'))
5795           termination++;
5796         if (*termination++ != ')')
5797           abort ();
5798         if (*termination && *termination != ' ' && *termination != '\t')
5799           abort ();
5800         /* Temporarily null-terminate the value.  */
5801         save_char = *termination;
5802         *termination = '\0';
5803         /* Install the assertion.  */
5804         make_assertion (pfile, "-A", assertion);
5805         *termination = (char) save_char;
5806         p = termination;
5807         while (*p == ' ' || *p == '\t')
5808           p++;
5809       } else {
5810         abort ();
5811       }
5812     }
5813   }
5814
5815   /* Now handle the command line options.  */
5816
5817   /* Do -U's, -D's and -A's in the order they were seen.  */
5818   /* First reverse the list.  */
5819   opts->pending = nreverse_pending (opts->pending);
5820
5821   for (pend = opts->pending;  pend;  pend = pend->next)
5822     {
5823       if (pend->cmd != NULL && pend->cmd[0] == '-')
5824         {
5825           switch (pend->cmd[1])
5826             {
5827             case 'U':
5828               if (opts->debug_output)
5829                 output_line_command (pfile, 0, same_file);
5830               do_undef (pfile, NULL, pend->arg, pend->arg + strlen (pend->arg));
5831               break;
5832             case 'D':
5833               if (opts->debug_output)
5834                 output_line_command (pfile, 0, same_file);
5835               cpp_define (pfile, pend->arg);
5836               break;
5837             case 'A':
5838               make_assertion (pfile, "-A", pend->arg);
5839               break;
5840             }
5841         }
5842     }
5843
5844   opts->done_initializing = 1;
5845
5846   { /* Read the appropriate environment variable and if it exists
5847        replace include_defaults with the listed path.  */
5848     char *epath = 0;
5849     switch ((opts->objc << 1) + opts->cplusplus)
5850       {
5851       case 0:
5852         epath = getenv ("C_INCLUDE_PATH");
5853         break;
5854       case 1:
5855         epath = getenv ("CPLUS_INCLUDE_PATH");
5856         break;
5857       case 2:
5858         epath = getenv ("OBJC_INCLUDE_PATH");
5859         break;
5860       case 3:
5861         epath = getenv ("OBJCPLUS_INCLUDE_PATH");
5862         break;
5863       }
5864     /* If the environment var for this language is set,
5865        add to the default list of include directories.  */
5866     if (epath) {
5867       char *nstore = (char *) alloca (strlen (epath) + 2);
5868       int num_dirs;
5869       char *startp, *endp;
5870
5871       for (num_dirs = 1, startp = epath; *startp; startp++)
5872         if (*startp == PATH_SEPARATOR)
5873           num_dirs++;
5874       include_defaults
5875         = (struct default_include *) xmalloc ((num_dirs
5876                                                * sizeof (struct default_include))
5877                                               + sizeof (include_defaults_array));
5878       startp = endp = epath;
5879       num_dirs = 0;
5880       while (1) {
5881         /* Handle cases like c:/usr/lib:d:/gcc/lib */
5882         if ((*endp == PATH_SEPARATOR)
5883             || *endp == 0) {
5884           strncpy (nstore, startp, endp-startp);
5885           if (endp == startp)
5886             strcpy (nstore, ".");
5887           else
5888             nstore[endp-startp] = '\0';
5889
5890           include_defaults[num_dirs].fname = savestring (nstore);
5891           include_defaults[num_dirs].cplusplus = opts->cplusplus;
5892           include_defaults[num_dirs].cxx_aware = 1;
5893           num_dirs++;
5894           if (*endp == '\0')
5895             break;
5896           endp = startp = endp + 1;
5897         } else
5898           endp++;
5899       }
5900       /* Put the usual defaults back in at the end.  */
5901       bcopy ((char *) include_defaults_array,
5902              (char *) &include_defaults[num_dirs],
5903              sizeof (include_defaults_array));
5904     }
5905   }
5906
5907   append_include_chain (pfile, opts->before_system, opts->last_before_system);
5908   opts->first_system_include = opts->before_system;
5909
5910   /* Unless -fnostdinc,
5911      tack on the standard include file dirs to the specified list */
5912   if (!opts->no_standard_includes) {
5913     struct default_include *p = include_defaults;
5914     char *specd_prefix = opts->include_prefix;
5915     char *default_prefix = savestring (GCC_INCLUDE_DIR);
5916     int default_len = 0;
5917     /* Remove the `include' from /usr/local/lib/gcc.../include.  */
5918     if (!strcmp (default_prefix + strlen (default_prefix) - 8, "/include")) {
5919       default_len = strlen (default_prefix) - 7;
5920       default_prefix[default_len] = 0;
5921     }
5922     /* Search "translated" versions of GNU directories.
5923        These have /usr/local/lib/gcc... replaced by specd_prefix.  */
5924     if (specd_prefix != 0 && default_len != 0)
5925       for (p = include_defaults; p->fname; p++) {
5926         /* Some standard dirs are only for C++.  */
5927         if (!p->cplusplus
5928             || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) {
5929           /* Does this dir start with the prefix?  */
5930           if (!strncmp (p->fname, default_prefix, default_len)) {
5931             /* Yes; change prefix and add to search list.  */
5932             struct file_name_list *new
5933               = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
5934             int this_len = strlen (specd_prefix) + strlen (p->fname) - default_len;
5935             char *str = (char *) xmalloc (this_len + 1);
5936             strcpy (str, specd_prefix);
5937             strcat (str, p->fname + default_len);
5938             new->fname = str;
5939             new->control_macro = 0;
5940             new->c_system_include_path = !p->cxx_aware;
5941             new->got_name_map = 0;
5942             append_include_chain (pfile, new, new);
5943             if (opts->first_system_include == 0)
5944               opts->first_system_include = new;
5945           }
5946         }
5947       }
5948     /* Search ordinary names for GNU include directories.  */
5949     for (p = include_defaults; p->fname; p++) {
5950       /* Some standard dirs are only for C++.  */
5951       if (!p->cplusplus
5952           || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) {
5953         struct file_name_list *new
5954           = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
5955         new->control_macro = 0;
5956         new->c_system_include_path = !p->cxx_aware;
5957         new->fname = p->fname;
5958         new->got_name_map = 0;
5959         append_include_chain (pfile, new, new);
5960         if (opts->first_system_include == 0)
5961           opts->first_system_include = new;
5962       }
5963     }
5964   }
5965
5966   /* Tack the after_include chain at the end of the include chain.  */
5967   append_include_chain (pfile, opts->after_include, opts->last_after_include);
5968   if (opts->first_system_include == 0)
5969     opts->first_system_include = opts->after_include;
5970
5971   /* With -v, print the list of dirs to search.  */
5972   if (opts->verbose) {
5973     struct file_name_list *p;
5974     fprintf (stderr, "#include \"...\" search starts here:\n");
5975     for (p = opts->include; p; p = p->next) {
5976       if (p == opts->first_bracket_include)
5977         fprintf (stderr, "#include <...> search starts here:\n");
5978       fprintf (stderr, " %s\n", p->fname);
5979     }
5980     fprintf (stderr, "End of search list.\n");
5981   }
5982
5983   /* Scan the -imacros files before the main input.
5984      Much like #including them, but with no_output set
5985      so that only their macro definitions matter.  */
5986
5987   opts->no_output++; pfile->no_record_file++;
5988   for (pend = opts->pending;  pend;  pend = pend->next)
5989     {
5990       if (pend->cmd != NULL && strcmp (pend->cmd, "-imacros") == 0)
5991         {
5992           int fd = open (pend->arg, O_RDONLY, 0666);
5993           if (fd < 0)
5994             {
5995               cpp_perror_with_name (pfile, pend->arg);
5996               return 0;
5997             }
5998           if (!cpp_push_buffer (pfile, NULL, 0))
5999               return 0;
6000           finclude (pfile, fd, pend->arg, 0, NULL_PTR);
6001           cpp_scan_buffer (pfile);
6002         }
6003     }
6004   opts->no_output--; pfile->no_record_file--;
6005
6006   /* Copy the entire contents of the main input file into
6007      the stacked input buffer previously allocated for it.  */
6008   if (fname == NULL || *fname == 0) {
6009     fname = "";
6010     f = 0;
6011   } else if ((f = open (fname, O_RDONLY, 0666)) < 0)
6012     cpp_pfatal_with_name (pfile, fname);
6013
6014   /* -MG doesn't select the form of output and must be specified with one of
6015      -M or -MM.  -MG doesn't make sense with -MD or -MMD since they don't
6016      inhibit compilation.  */
6017   if (opts->print_deps_missing_files
6018       && (opts->print_deps == 0 || !opts->no_output))
6019     {
6020       cpp_fatal (pfile, "-MG must be specified with one of -M or -MM");
6021       return 0;
6022     }
6023
6024   /* Either of two environment variables can specify output of deps.
6025      Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
6026      where OUTPUT_FILE is the file to write deps info to
6027      and DEPS_TARGET is the target to mention in the deps.  */
6028
6029   if (opts->print_deps == 0
6030       && (getenv ("SUNPRO_DEPENDENCIES") != 0
6031           || getenv ("DEPENDENCIES_OUTPUT") != 0)) {
6032     char *spec = getenv ("DEPENDENCIES_OUTPUT");
6033     char *s;
6034     char *output_file;
6035
6036     if (spec == 0)
6037       {
6038         spec = getenv ("SUNPRO_DEPENDENCIES");
6039         opts->print_deps = 2;
6040       }
6041     else
6042       opts->print_deps = 1;
6043
6044     s = spec;
6045     /* Find the space before the DEPS_TARGET, if there is one.  */
6046     /* This should use index.  (mrs) */
6047     while (*s != 0 && *s != ' ') s++;
6048     if (*s != 0)
6049       {
6050         opts->deps_target = s + 1;
6051         output_file = (char *) xmalloc (s - spec + 1);
6052         bcopy (spec, output_file, s - spec);
6053         output_file[s - spec] = 0;
6054       }
6055     else
6056       {
6057         opts->deps_target = 0;
6058         output_file = spec;
6059       }
6060
6061     opts->deps_file = output_file;
6062     opts->print_deps_append = 1;
6063   }
6064
6065   /* For -M, print the expected object file name
6066      as the target of this Make-rule.  */
6067   if (opts->print_deps)
6068     {
6069       pfile->deps_allocated_size = 200;
6070       pfile->deps_buffer = (char *) xmalloc (pfile->deps_allocated_size);
6071       pfile->deps_buffer[0] = 0;
6072       pfile->deps_size = 0;
6073       pfile->deps_column = 0;
6074
6075       if (opts->deps_target)
6076         deps_output (pfile, opts->deps_target, ':');
6077       else if (*opts->in_fname == 0)
6078         deps_output (pfile, "-", ':');
6079       else
6080         {
6081           char *p, *q;
6082           int len;
6083
6084           /* Discard all directory prefixes from filename.  */
6085           if ((q = rindex (opts->in_fname, '/')) != NULL
6086 #ifdef DIR_SEPARATOR
6087               && (q = rindex (opts->in_fname, DIR_SEPARATOR)) != NULL
6088 #endif
6089               )
6090             ++q;
6091           else
6092             q = opts->in_fname;
6093
6094           /* Copy remainder to mungable area.  */
6095           p = (char *) alloca (strlen(q) + 8);
6096           strcpy (p, q);
6097
6098           /* Output P, but remove known suffixes.  */
6099           len = strlen (p);
6100           q = p + len;
6101           if (len >= 2
6102               && p[len - 2] == '.'
6103               && index("cCsSm", p[len - 1]))
6104             q = p + (len - 2);
6105           else if (len >= 3
6106                    && p[len - 3] == '.'
6107                    && p[len - 2] == 'c'
6108                    && p[len - 1] == 'c')
6109             q = p + (len - 3);
6110           else if (len >= 4
6111                    && p[len - 4] == '.'
6112                    && p[len - 3] == 'c'
6113                    && p[len - 2] == 'x'
6114                    && p[len - 1] == 'x')
6115             q = p + (len - 4);
6116           else if (len >= 4
6117                    && p[len - 4] == '.'
6118                    && p[len - 3] == 'c'
6119                    && p[len - 2] == 'p'
6120                    && p[len - 1] == 'p')
6121             q = p + (len - 4);
6122
6123           /* Supply our own suffix.  */
6124 #ifndef VMS
6125           strcpy (q, ".o");
6126 #else
6127           strcpy (q, ".obj");
6128 #endif
6129
6130           deps_output (pfile, p, ':');
6131           deps_output (pfile, opts->in_fname, ' ');
6132         }
6133     }
6134
6135 #if 0
6136   /* Make sure data ends with a newline.  And put a null after it.  */
6137
6138   if ((fp->length > 0 && fp->buf[fp->length - 1] != '\n')
6139       /* Backslash-newline at end is not good enough.  */
6140       || (fp->length > 1 && fp->buf[fp->length - 2] == '\\')) {
6141     fp->buf[fp->length++] = '\n';
6142     missing_newline = 1;
6143   }
6144   fp->buf[fp->length] = '\0';
6145
6146   /* Unless inhibited, convert trigraphs in the input.  */
6147
6148   if (!no_trigraphs)
6149     trigraph_pcp (fp);
6150 #endif
6151
6152   /* Scan the -include files before the main input.
6153    We push these in reverse order, so that the first one is handled first.  */
6154
6155   pfile->no_record_file++;
6156   opts->pending = nreverse_pending (opts->pending);
6157   for (pend = opts->pending;  pend;  pend = pend->next)
6158     {
6159       if (pend->cmd != NULL && strcmp (pend->cmd, "-include") == 0)
6160         {
6161           int fd = open (pend->arg, O_RDONLY, 0666);
6162           if (fd < 0)
6163             {
6164               cpp_perror_with_name (pfile, pend->arg);
6165               return 0;
6166             }
6167           if (!cpp_push_buffer (pfile, NULL, 0))
6168             return 0;
6169           finclude (pfile, fd, pend->arg, 0, NULL_PTR);
6170         }
6171     }
6172   pfile->no_record_file--;
6173
6174   /* Free the pending list.  */
6175   for (pend = opts->pending;  pend; )
6176     {
6177       struct cpp_pending *next = pend->next;
6178       free (pend);
6179       pend = next;
6180     }
6181   opts->pending = NULL;
6182
6183 #if 0
6184   /* Scan the input, processing macros and directives.  */
6185
6186   rescan (&outbuf, 0);
6187
6188   if (missing_newline)
6189     fp->lineno--;
6190
6191   if (CPP_PEDANTIC (pfile) && missing_newline)
6192     pedwarn ("file does not end in newline");
6193
6194 #endif
6195   if (finclude (pfile, f, fname, 0, NULL_PTR))
6196     output_line_command (pfile, 0, same_file);
6197   return 1;
6198 }
6199
6200 void
6201 cpp_reader_init (pfile)
6202      cpp_reader *pfile;
6203 {
6204   bzero ((char *) pfile, sizeof (cpp_reader));
6205   pfile->get_token = cpp_get_token;
6206
6207   pfile->token_buffer_size = 200;
6208   pfile->token_buffer = (U_CHAR *) xmalloc (pfile->token_buffer_size);
6209   CPP_SET_WRITTEN (pfile, 0);
6210
6211   pfile->system_include_depth = 0;
6212   pfile->dont_repeat_files = 0;
6213   pfile->all_include_files = 0;
6214   pfile->max_include_len = 0;
6215   pfile->timebuf = NULL;
6216   pfile->only_seen_white = 1;
6217   pfile->buffer = CPP_NULL_BUFFER(pfile);
6218 }
6219
6220 static struct cpp_pending *
6221 nreverse_pending (list)
6222      struct cpp_pending *list;
6223      
6224 {
6225   register struct cpp_pending *prev = 0, *next, *pend;
6226   for (pend = list;  pend;  pend = next)
6227     {
6228       next = pend->next;
6229       pend->next = prev;
6230       prev = pend;
6231     }
6232   return prev;
6233 }
6234
6235 static void
6236 push_pending (pfile, cmd, arg)
6237      cpp_reader *pfile;
6238      char *cmd;
6239      char *arg;
6240 {
6241   struct cpp_pending *pend
6242     = (struct cpp_pending *) xmalloc (sizeof (struct cpp_pending));
6243   pend->cmd = cmd;
6244   pend->arg = arg;
6245   pend->next = CPP_OPTIONS (pfile)->pending;
6246   CPP_OPTIONS (pfile)->pending = pend;
6247 }
6248
6249 /* Handle command-line options in (argc, argv).
6250    Can be called multiple times, to handle multiple sets of options.
6251    Returns if an unrecognized option is seen.
6252    Returns number of handled arguments.  */
6253
6254 int
6255 cpp_handle_options (pfile, argc, argv)
6256      cpp_reader *pfile;
6257      int argc;
6258      char **argv;
6259 {
6260   int i;
6261   struct cpp_options *opts = CPP_OPTIONS (pfile);
6262   for (i = 0; i < argc; i++) {
6263     if (argv[i][0] != '-') {
6264       if (opts->out_fname != NULL)
6265         {
6266           cpp_fatal (pfile, "Usage: %s [switches] input output", argv[0]);
6267           return argc;
6268         }
6269       else if (opts->in_fname != NULL)
6270         opts->out_fname = argv[i];
6271       else
6272         opts->in_fname = argv[i];
6273     } else {
6274       switch (argv[i][1]) {
6275
6276       missing_filename:
6277         cpp_fatal (pfile, "Filename missing after `%s' option", argv[i]);
6278         return argc;
6279       missing_dirname:
6280         cpp_fatal (pfile, "Directory name missing after `%s' option", argv[i]);
6281         return argc;
6282
6283       case 'i':
6284         if (!strcmp (argv[i], "-include")
6285             || !strcmp (argv[i], "-imacros")) {
6286           if (i + 1 == argc)
6287             goto missing_filename;
6288           else
6289             push_pending (pfile, argv[i], argv[i+1]), i++;
6290         }
6291         if (!strcmp (argv[i], "-iprefix")) {
6292           if (i + 1 == argc)
6293             goto missing_filename;
6294           else
6295             opts->include_prefix = argv[++i];
6296         }
6297         if (!strcmp (argv[i], "-ifoutput")) {
6298           opts->output_conditionals = 1;
6299         }
6300         if (!strcmp (argv[i], "-isystem")) {
6301           struct file_name_list *dirtmp;
6302
6303           if (i + 1 == argc)
6304             goto missing_filename;
6305
6306           dirtmp = (struct file_name_list *)
6307             xmalloc (sizeof (struct file_name_list));
6308           dirtmp->next = 0;
6309           dirtmp->control_macro = 0;
6310           dirtmp->c_system_include_path = 1;
6311           dirtmp->fname = (char *) xmalloc (strlen (argv[i+1]) + 1);
6312           strcpy (dirtmp->fname, argv[++i]);
6313           dirtmp->got_name_map = 0;
6314
6315           if (opts->before_system == 0)
6316             opts->before_system = dirtmp;
6317           else
6318             opts->last_before_system->next = dirtmp;
6319           opts->last_before_system = dirtmp; /* Tail follows the last one */
6320         }
6321         /* Add directory to end of path for includes,
6322            with the default prefix at the front of its name.  */
6323         if (!strcmp (argv[i], "-iwithprefix")) {
6324           struct file_name_list *dirtmp;
6325           char *prefix;
6326
6327           if (opts->include_prefix != 0)
6328             prefix = opts->include_prefix;
6329           else {
6330             prefix = savestring (GCC_INCLUDE_DIR);
6331             /* Remove the `include' from /usr/local/lib/gcc.../include.  */
6332             if (!strcmp (prefix + strlen (prefix) - 8, "/include"))
6333               prefix[strlen (prefix) - 7] = 0;
6334           }
6335
6336           dirtmp = (struct file_name_list *)
6337             xmalloc (sizeof (struct file_name_list));
6338           dirtmp->next = 0;     /* New one goes on the end */
6339           dirtmp->control_macro = 0;
6340           dirtmp->c_system_include_path = 0;
6341           if (i + 1 == argc)
6342             goto missing_dirname;
6343
6344           dirtmp->fname = (char *) xmalloc (strlen (argv[i+1])
6345                                             + strlen (prefix) + 1);
6346           strcpy (dirtmp->fname, prefix);
6347           strcat (dirtmp->fname, argv[++i]);
6348           dirtmp->got_name_map = 0;
6349
6350           if (opts->after_include == 0)
6351             opts->after_include = dirtmp;
6352           else
6353             opts->last_after_include->next = dirtmp;
6354           opts->last_after_include = dirtmp; /* Tail follows the last one */
6355         }
6356         /* Add directory to main path for includes,
6357            with the default prefix at the front of its name.  */
6358         if (!strcmp (argv[i], "-iwithprefixbefore")) {
6359           struct file_name_list *dirtmp;
6360           char *prefix;
6361
6362           if (opts->include_prefix != 0)
6363             prefix = opts->include_prefix;
6364           else {
6365             prefix = savestring (GCC_INCLUDE_DIR);
6366             /* Remove the `include' from /usr/local/lib/gcc.../include.  */
6367             if (!strcmp (prefix + strlen (prefix) - 8, "/include"))
6368               prefix[strlen (prefix) - 7] = 0;
6369           }
6370
6371           dirtmp = (struct file_name_list *)
6372             xmalloc (sizeof (struct file_name_list));
6373           dirtmp->next = 0;     /* New one goes on the end */
6374           dirtmp->control_macro = 0;
6375           dirtmp->c_system_include_path = 0;
6376           if (i + 1 == argc)
6377             goto missing_dirname;
6378
6379           dirtmp->fname = (char *) xmalloc (strlen (argv[i+1])
6380                                             + strlen (prefix) + 1);
6381           strcpy (dirtmp->fname, prefix);
6382           strcat (dirtmp->fname, argv[++i]);
6383           dirtmp->got_name_map = 0;
6384
6385           append_include_chain (pfile, dirtmp, dirtmp);
6386         }
6387         /* Add directory to end of path for includes.  */
6388         if (!strcmp (argv[i], "-idirafter")) {
6389           struct file_name_list *dirtmp;
6390
6391           dirtmp = (struct file_name_list *)
6392             xmalloc (sizeof (struct file_name_list));
6393           dirtmp->next = 0;     /* New one goes on the end */
6394           dirtmp->control_macro = 0;
6395           dirtmp->c_system_include_path = 0;
6396           if (i + 1 == argc)
6397             goto missing_dirname;
6398           else
6399             dirtmp->fname = argv[++i];
6400           dirtmp->got_name_map = 0;
6401
6402           if (opts->after_include == 0)
6403             opts->after_include = dirtmp;
6404           else
6405             opts->last_after_include->next = dirtmp;
6406           opts->last_after_include = dirtmp; /* Tail follows the last one */
6407         }
6408         break;
6409
6410       case 'o':
6411         if (opts->out_fname != NULL)
6412           {
6413             cpp_fatal (pfile, "Output filename specified twice");
6414             return argc;
6415           }
6416         if (i + 1 == argc)
6417           goto missing_filename;
6418         opts->out_fname = argv[++i];
6419         if (!strcmp (opts->out_fname, "-"))
6420           opts->out_fname = "";
6421         break;
6422
6423       case 'p':
6424         if (!strcmp (argv[i], "-pedantic"))
6425           CPP_PEDANTIC (pfile) = 1;
6426         else if (!strcmp (argv[i], "-pedantic-errors")) {
6427           CPP_PEDANTIC (pfile) = 1;
6428           opts->pedantic_errors = 1;
6429         }
6430 #if 0
6431         else if (!strcmp (argv[i], "-pcp")) {
6432           char *pcp_fname = argv[++i];
6433           pcp_outfile = 
6434             ((pcp_fname[0] != '-' || pcp_fname[1] != '\0')
6435              ? fopen (pcp_fname, "w")
6436              : fdopen (dup (fileno (stdout)), "w"));
6437           if (pcp_outfile == 0)
6438             cpp_pfatal_with_name (pfile, pcp_fname);
6439           no_precomp = 1;
6440         }
6441 #endif
6442         break;
6443
6444       case 't':
6445         if (!strcmp (argv[i], "-traditional")) {
6446           opts->traditional = 1;
6447         } else if (!strcmp (argv[i], "-trigraphs")) {
6448           if (!opts->chill)
6449             opts->no_trigraphs = 0;
6450         }
6451         break;
6452
6453       case 'l':
6454         if (! strcmp (argv[i], "-lang-c"))
6455           opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
6456           opts->objc = 0;
6457         if (! strcmp (argv[i], "-lang-c89"))
6458           opts->cplusplus = 0, opts->cplusplus_comments = 0, opts->c89 = 1,
6459           opts->objc = 0;
6460         if (! strcmp (argv[i], "-lang-c++"))
6461           opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
6462           opts->objc = 0;
6463         if (! strcmp (argv[i], "-lang-objc"))
6464           opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
6465           opts->objc = 1;
6466         if (! strcmp (argv[i], "-lang-objc++"))
6467           opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
6468           opts->objc = 1;
6469         if (! strcmp (argv[i], "-lang-asm"))
6470           opts->lang_asm = 1;
6471         if (! strcmp (argv[i], "-lint"))
6472           opts->for_lint = 1;
6473         if (! strcmp (argv[i], "-lang-chill"))
6474           opts->objc = 0, opts->cplusplus = 0, opts->chill = 1,
6475           opts->traditional = 1, opts->no_trigraphs = 1;
6476         break;
6477
6478       case '+':
6479         opts->cplusplus = 1, opts->cplusplus_comments = 1;
6480         break;
6481
6482       case 'w':
6483         opts->inhibit_warnings = 1;
6484         break;
6485
6486       case 'W':
6487         if (!strcmp (argv[i], "-Wtrigraphs"))
6488           opts->warn_trigraphs = 1;
6489         else if (!strcmp (argv[i], "-Wno-trigraphs"))
6490           opts->warn_trigraphs = 0;
6491         else if (!strcmp (argv[i], "-Wcomment"))
6492           opts->warn_comments = 1;
6493         else if (!strcmp (argv[i], "-Wno-comment"))
6494           opts->warn_comments = 0;
6495         else if (!strcmp (argv[i], "-Wcomments"))
6496           opts->warn_comments = 1;
6497         else if (!strcmp (argv[i], "-Wno-comments"))
6498           opts->warn_comments = 0;
6499         else if (!strcmp (argv[i], "-Wtraditional"))
6500           opts->warn_stringify = 1;
6501         else if (!strcmp (argv[i], "-Wno-traditional"))
6502           opts->warn_stringify = 0;
6503         else if (!strcmp (argv[i], "-Wundef"))
6504           opts->warn_undef = 1;
6505         else if (!strcmp (argv[i], "-Wno-undef"))
6506           opts->warn_undef = 0;
6507         else if (!strcmp (argv[i], "-Wimport"))
6508           opts->warn_import = 1;
6509         else if (!strcmp (argv[i], "-Wno-import"))
6510           opts->warn_import = 0;
6511         else if (!strcmp (argv[i], "-Werror"))
6512           opts->warnings_are_errors = 1;
6513         else if (!strcmp (argv[i], "-Wno-error"))
6514           opts->warnings_are_errors = 0;
6515         else if (!strcmp (argv[i], "-Wall"))
6516           {
6517             opts->warn_trigraphs = 1;
6518             opts->warn_comments = 1;
6519           }
6520         break;
6521
6522       case 'M':
6523         /* The style of the choices here is a bit mixed.
6524            The chosen scheme is a hybrid of keeping all options in one string
6525            and specifying each option in a separate argument:
6526            -M|-MM|-MD file|-MMD file [-MG].  An alternative is:
6527            -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
6528            -M[M][G][D file].  This is awkward to handle in specs, and is not
6529            as extensible.  */
6530         /* ??? -MG must be specified in addition to one of -M or -MM.
6531            This can be relaxed in the future without breaking anything.
6532            The converse isn't true.  */
6533
6534         /* -MG isn't valid with -MD or -MMD.  This is checked for later.  */
6535         if (!strcmp (argv[i], "-MG"))
6536           {
6537             opts->print_deps_missing_files = 1;
6538             break;
6539           }
6540         if (!strcmp (argv[i], "-M"))
6541           opts->print_deps = 2;
6542         else if (!strcmp (argv[i], "-MM"))
6543           opts->print_deps = 1;
6544         else if (!strcmp (argv[i], "-MD"))
6545           opts->print_deps = 2;
6546         else if (!strcmp (argv[i], "-MMD"))
6547           opts->print_deps = 1;
6548         /* For -MD and -MMD options, write deps on file named by next arg.  */
6549         if (!strcmp (argv[i], "-MD") || !strcmp (argv[i], "-MMD"))
6550           {
6551             if (i+1 == argc)
6552               goto missing_filename;
6553             opts->deps_file = argv[++i];
6554           }
6555         else
6556           {
6557             /* For -M and -MM, write deps on standard output
6558                and suppress the usual output.  */
6559             opts->no_output = 1;
6560           }       
6561         break;
6562
6563       case 'd':
6564         {
6565           char *p = argv[i] + 2;
6566           char c;
6567           while ((c = *p++) != 0) {
6568             /* Arg to -d specifies what parts of macros to dump */
6569             switch (c) {
6570             case 'M':
6571               opts->dump_macros = dump_only;
6572               opts->no_output = 1;
6573               break;
6574             case 'N':
6575               opts->dump_macros = dump_names;
6576               break;
6577             case 'D':
6578               opts->dump_macros = dump_definitions;
6579               break;
6580             }
6581           }
6582         }
6583         break;
6584
6585       case 'g':
6586         if (argv[i][2] == '3')
6587           opts->debug_output = 1;
6588         break;
6589
6590       case 'v':
6591         fprintf (stderr, "GNU CPP version %s", version_string);
6592 #ifdef TARGET_VERSION
6593         TARGET_VERSION;
6594 #endif
6595         fprintf (stderr, "\n");
6596         opts->verbose = 1;
6597         break;
6598
6599       case 'H':
6600         opts->print_include_names = 1;
6601         break;
6602
6603       case 'D':
6604         if (argv[i][2] != 0)
6605           push_pending (pfile, "-D", argv[i] + 2);
6606         else if (i + 1 == argc)
6607           {
6608             cpp_fatal (pfile, "Macro name missing after -D option");
6609             return argc;
6610           }
6611         else
6612           i++, push_pending (pfile, "-D", argv[i]);
6613         break;
6614
6615       case 'A':
6616         {
6617           char *p;
6618
6619           if (argv[i][2] != 0)
6620             p = argv[i] + 2;
6621           else if (i + 1 == argc)
6622             {
6623               cpp_fatal (pfile, "Assertion missing after -A option");
6624               return argc;
6625             }
6626           else
6627             p = argv[++i];
6628
6629           if (!strcmp (p, "-")) {
6630             struct cpp_pending **ptr;
6631             /* -A- eliminates all predefined macros and assertions.
6632                Let's include also any that were specified earlier
6633                on the command line.  That way we can get rid of any
6634                that were passed automatically in from GCC.  */
6635             int j;
6636             opts->inhibit_predefs = 1;
6637             for (ptr = &opts->pending; *ptr != NULL; )
6638               {
6639                 struct cpp_pending *pend = *ptr;
6640                 if (pend->cmd && pend->cmd[0] == '-'
6641                     && (pend->cmd[1] == 'D' || pend->cmd[1] == 'A'))
6642                   {
6643                     *ptr = pend->next;
6644                     free (pend);
6645                   }
6646                 else
6647                   ptr = &pend->next;
6648               }
6649           } else {
6650             push_pending (pfile, "-A", p);
6651           }
6652         }
6653         break;
6654
6655       case 'U':         /* JF #undef something */
6656         if (argv[i][2] != 0)
6657           push_pending (pfile, "-U", argv[i] + 2);
6658         else if (i + 1 == argc)
6659           {
6660             cpp_fatal (pfile, "Macro name missing after -U option", NULL);
6661             return argc;
6662           }
6663         else
6664           push_pending (pfile, "-U", argv[i+1]), i++;
6665         break;
6666
6667       case 'C':
6668         opts->put_out_comments = 1;
6669         break;
6670
6671       case 'E':                 /* -E comes from cc -E; ignore it.  */
6672         break;
6673
6674       case 'P':
6675         opts->no_line_commands = 1;
6676         break;
6677
6678       case '$':                 /* Don't include $ in identifiers.  */
6679         opts->dollars_in_ident = 0;
6680         break;
6681
6682       case 'I':                 /* Add directory to path for includes.  */
6683         {
6684           struct file_name_list *dirtmp;
6685
6686           if (! CPP_OPTIONS(pfile)->ignore_srcdir
6687               && !strcmp (argv[i] + 2, "-")) {
6688             CPP_OPTIONS (pfile)->ignore_srcdir = 1;
6689             /* Don't use any preceding -I directories for #include <...>.  */
6690             CPP_OPTIONS (pfile)->first_bracket_include = 0;
6691           }
6692           else {
6693             dirtmp = (struct file_name_list *)
6694               xmalloc (sizeof (struct file_name_list));
6695             dirtmp->next = 0;           /* New one goes on the end */
6696             dirtmp->control_macro = 0;
6697             dirtmp->c_system_include_path = 0;
6698             if (argv[i][2] != 0)
6699               dirtmp->fname = argv[i] + 2;
6700             else if (i + 1 == argc)
6701               goto missing_dirname;
6702             else
6703               dirtmp->fname = argv[++i];
6704             dirtmp->got_name_map = 0;
6705             append_include_chain (pfile, dirtmp, dirtmp);
6706           }
6707         }
6708         break;
6709
6710       case 'n':
6711         if (!strcmp (argv[i], "-nostdinc"))
6712           /* -nostdinc causes no default include directories.
6713              You must specify all include-file directories with -I.  */
6714           opts->no_standard_includes = 1;
6715         else if (!strcmp (argv[i], "-nostdinc++"))
6716           /* -nostdinc++ causes no default C++-specific include directories. */
6717           opts->no_standard_cplusplus_includes = 1;
6718 #if 0
6719         else if (!strcmp (argv[i], "-noprecomp"))
6720           no_precomp = 1;
6721 #endif
6722         break;
6723
6724       case 'u':
6725         /* Sun compiler passes undocumented switch "-undef".
6726            Let's assume it means to inhibit the predefined symbols.  */
6727         opts->inhibit_predefs = 1;
6728         break;
6729
6730       case '\0': /* JF handle '-' as file name meaning stdin or stdout */
6731         if (opts->in_fname == NULL) {
6732           opts->in_fname = "";
6733           break;
6734         } else if (opts->out_fname == NULL) {
6735           opts->out_fname = "";
6736           break;
6737         }       /* else fall through into error */
6738
6739       default:
6740         return i;
6741       }
6742     }
6743   }
6744   return i;
6745 }
6746 \f
6747 void
6748 cpp_finish (pfile)
6749      cpp_reader *pfile;
6750 {
6751   struct cpp_options *opts = CPP_OPTIONS (pfile);
6752   
6753   if (opts->print_deps)
6754     {
6755       /* Stream on which to print the dependency information.  */
6756       FILE *deps_stream;
6757
6758       /* Don't actually write the deps file if compilation has failed.  */
6759       if (pfile->errors == 0)
6760         {
6761           char *deps_mode = opts->print_deps_append ? "a" : "w";
6762           if (opts->deps_file == 0)
6763             deps_stream = stdout;
6764           else if ((deps_stream = fopen (opts->deps_file, deps_mode)) == 0)
6765             cpp_pfatal_with_name (pfile, opts->deps_file);
6766           fputs (pfile->deps_buffer, deps_stream);
6767           putc ('\n', deps_stream);
6768           if (opts->deps_file)
6769             {
6770               if (ferror (deps_stream) || fclose (deps_stream) != 0)
6771                 cpp_fatal (pfile, "I/O error on output");
6772             }
6773         }
6774     }
6775 }
6776
6777 /* Free resources used by PFILE.
6778    This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology).  */
6779
6780 void
6781 cpp_cleanup (pfile)
6782      cpp_reader *pfile;
6783 {
6784   int i;
6785   while ( CPP_BUFFER (pfile) != CPP_NULL_BUFFER (pfile))
6786     cpp_pop_buffer (pfile);
6787
6788   if (pfile->token_buffer)
6789     {
6790       free (pfile->token_buffer);
6791       pfile->token_buffer = NULL;
6792     }
6793
6794   if (pfile->deps_buffer)
6795     {
6796       free (pfile->deps_buffer);
6797       pfile->deps_buffer = NULL;
6798       pfile->deps_allocated_size = 0;
6799     }
6800
6801   while (pfile->if_stack)
6802     {
6803       IF_STACK_FRAME *temp = pfile->if_stack;
6804       pfile->if_stack = temp->next;
6805       free (temp);
6806     }
6807
6808   while (pfile->dont_repeat_files)
6809     {
6810       struct file_name_list *temp = pfile->dont_repeat_files;
6811       pfile->dont_repeat_files = temp->next;
6812       free (temp->fname);
6813       free (temp);
6814     }
6815
6816   while (pfile->all_include_files)
6817     {
6818       struct file_name_list *temp = pfile->all_include_files;
6819       pfile->all_include_files = temp->next;
6820       free (temp->fname);
6821       free (temp);
6822     }
6823
6824   for (i = IMPORT_HASH_SIZE; --i >= 0; )
6825     {
6826       register struct import_file *imp = pfile->import_hash_table[i];
6827       while (imp)
6828         {
6829           struct import_file *next = imp->next;
6830           free (imp->name);
6831           free (imp);
6832           imp = next;
6833         }
6834       pfile->import_hash_table[i] = 0;
6835     }
6836
6837   for (i = ASSERTION_HASHSIZE; --i >= 0; )
6838     {
6839       while (pfile->assertion_hashtab[i])
6840         delete_assertion (pfile->assertion_hashtab[i]);
6841     }
6842
6843   cpp_hash_cleanup (pfile);
6844 }
6845 \f
6846 static int
6847 do_assert (pfile, keyword, buf, limit)
6848      cpp_reader *pfile;
6849      struct directive *keyword;
6850      U_CHAR *buf, *limit;
6851 {
6852   long symstart;                /* remember where symbol name starts */
6853   int c;
6854   int sym_length;               /* and how long it is */
6855   struct arglist *tokens = NULL;
6856
6857   if (CPP_PEDANTIC (pfile) && CPP_OPTIONS (pfile)->done_initializing
6858       && !CPP_BUFFER (pfile)->system_header_p)
6859     cpp_pedwarn (pfile, "ANSI C does not allow `#assert'");
6860
6861   cpp_skip_hspace (pfile);
6862   symstart = CPP_WRITTEN (pfile);       /* remember where it starts */
6863   parse_name (pfile, GETC());
6864   sym_length = check_macro_name (pfile, pfile->token_buffer + symstart,
6865                                  "assertion");
6866
6867   cpp_skip_hspace (pfile);
6868   if (PEEKC() != '(') {
6869     cpp_error (pfile, "missing token-sequence in `#assert'");
6870     goto error;
6871   }
6872
6873   {
6874     int error_flag = 0;
6875     tokens = read_token_list (pfile, &error_flag);
6876     if (error_flag)
6877       goto error;
6878     if (tokens == 0) {
6879       cpp_error (pfile, "empty token-sequence in `#assert'");
6880       goto error;
6881     }
6882   cpp_skip_hspace (pfile);
6883   c = PEEKC ();
6884   if (c != EOF && c != '\n')
6885       cpp_pedwarn (pfile, "junk at end of `#assert'");
6886   skip_rest_of_line (pfile);
6887   }
6888
6889   /* If this name isn't already an assertion name, make it one.
6890      Error if it was already in use in some other way.  */
6891
6892   {
6893     ASSERTION_HASHNODE *hp;
6894     U_CHAR *symname = pfile->token_buffer + symstart;
6895     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
6896     struct tokenlist_list *value
6897       = (struct tokenlist_list *) xmalloc (sizeof (struct tokenlist_list));
6898
6899     hp = assertion_lookup (pfile, symname, sym_length, hashcode);
6900     if (hp == NULL) {
6901       if (sym_length == 7 && ! strncmp (symname, "defined", sym_length))
6902         cpp_error (pfile, "`defined' redefined as assertion");
6903       hp = assertion_install (pfile, symname, sym_length, hashcode);
6904     }
6905
6906     /* Add the spec'd token-sequence to the list of such.  */
6907     value->tokens = tokens;
6908     value->next = hp->value;
6909     hp->value = value;
6910   }
6911   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
6912   return 0;
6913  error:
6914   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
6915   skip_rest_of_line (pfile);
6916   return 1;
6917 }
6918 \f
6919 static int
6920 do_unassert (pfile, keyword, buf, limit)
6921      cpp_reader *pfile;
6922      struct directive *keyword;
6923      U_CHAR *buf, *limit;
6924 {
6925   long symstart;                /* remember where symbol name starts */
6926   int sym_length;       /* and how long it is */
6927   int c;
6928
6929   struct arglist *tokens = NULL;
6930   int tokens_specified = 0;
6931
6932   if (CPP_PEDANTIC (pfile) && CPP_OPTIONS (pfile)->done_initializing
6933       && !CPP_BUFFER (pfile)->system_header_p)
6934     cpp_pedwarn (pfile, "ANSI C does not allow `#unassert'");
6935
6936   cpp_skip_hspace (pfile);
6937
6938   symstart = CPP_WRITTEN (pfile);       /* remember where it starts */
6939   parse_name (pfile, GETC());
6940   sym_length = check_macro_name (pfile, pfile->token_buffer + symstart,
6941                                  "assertion");
6942
6943   cpp_skip_hspace (pfile);
6944   if (PEEKC() == '(') {
6945     int error_flag = 0;
6946
6947     tokens = read_token_list (pfile, &error_flag);
6948     if (error_flag)
6949       goto error;
6950     if (tokens == 0) {
6951       cpp_error (pfile, "empty token list in `#unassert'");
6952       goto error;
6953     }
6954
6955     tokens_specified = 1;
6956   }
6957
6958   cpp_skip_hspace (pfile);
6959   c = PEEKC ();
6960   if (c != EOF && c != '\n')
6961       cpp_error (pfile, "junk at end of `#unassert'");
6962   skip_rest_of_line (pfile);
6963
6964   {
6965     ASSERTION_HASHNODE *hp;
6966     U_CHAR *symname = pfile->token_buffer + symstart;
6967     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
6968     struct tokenlist_list *tail, *prev;
6969
6970     hp = assertion_lookup (pfile, symname, sym_length, hashcode);
6971     if (hp == NULL)
6972       return 1;
6973
6974     /* If no token list was specified, then eliminate this assertion
6975        entirely.  */
6976     if (! tokens_specified)
6977       delete_assertion (hp);
6978     else {
6979       /* If a list of tokens was given, then delete any matching list.  */
6980
6981       tail = hp->value;
6982       prev = 0;
6983       while (tail) {
6984         struct tokenlist_list *next = tail->next;
6985         if (compare_token_lists (tail->tokens, tokens)) {
6986           if (prev)
6987             prev->next = next;
6988           else
6989             hp->value = tail->next;
6990           free_token_list (tail->tokens);
6991           free (tail);
6992         } else {
6993           prev = tail;
6994         }
6995         tail = next;
6996       }
6997     }
6998   }
6999
7000   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
7001   return 0;
7002  error:
7003   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
7004   skip_rest_of_line (pfile);
7005   return 1;
7006 }
7007 \f
7008 /* Test whether there is an assertion named NAME
7009    and optionally whether it has an asserted token list TOKENS.
7010    NAME is not null terminated; its length is SYM_LENGTH.
7011    If TOKENS_SPECIFIED is 0, then don't check for any token list.  */
7012
7013 int
7014 check_assertion (pfile, name, sym_length, tokens_specified, tokens)
7015      cpp_reader *pfile;
7016      U_CHAR *name;
7017      int sym_length;
7018      int tokens_specified;
7019      struct arglist *tokens;
7020 {
7021   ASSERTION_HASHNODE *hp;
7022   int hashcode = hashf (name, sym_length, ASSERTION_HASHSIZE);
7023
7024   if (CPP_PEDANTIC (pfile) && !CPP_BUFFER (pfile)->system_header_p)
7025     cpp_pedwarn (pfile, "ANSI C does not allow testing assertions");
7026
7027   hp = assertion_lookup (pfile, name, sym_length, hashcode);
7028   if (hp == NULL)
7029     /* It is not an assertion; just return false.  */
7030     return 0;
7031
7032   /* If no token list was specified, then value is 1.  */
7033   if (! tokens_specified)
7034     return 1;
7035
7036   {
7037     struct tokenlist_list *tail;
7038
7039     tail = hp->value;
7040
7041     /* If a list of tokens was given,
7042        then succeed if the assertion records a matching list.  */
7043
7044     while (tail) {
7045       if (compare_token_lists (tail->tokens, tokens))
7046         return 1;
7047       tail = tail->next;
7048     }
7049
7050     /* Fail if the assertion has no matching list.  */
7051     return 0;
7052   }
7053 }
7054
7055 /* Compare two lists of tokens for equality including order of tokens.  */
7056
7057 static int
7058 compare_token_lists (l1, l2)
7059      struct arglist *l1, *l2;
7060 {
7061   while (l1 && l2) {
7062     if (l1->length != l2->length)
7063       return 0;
7064     if (strncmp (l1->name, l2->name, l1->length))
7065       return 0;
7066     l1 = l1->next;
7067     l2 = l2->next;
7068   }
7069
7070   /* Succeed if both lists end at the same time.  */
7071   return l1 == l2;
7072 }
7073 \f
7074 struct arglist *
7075 reverse_token_list (tokens)
7076      struct arglist *tokens;
7077 {
7078   register struct arglist *prev = 0, *this, *next;
7079   for (this = tokens; this; this = next)
7080     {
7081       next = this->next;
7082       this->next = prev;
7083       prev = this;
7084     }
7085   return prev;
7086 }
7087
7088 /* Read a space-separated list of tokens ending in a close parenthesis.
7089    Return a list of strings, in the order they were written.
7090    (In case of error, return 0 and store -1 in *ERROR_FLAG.) */
7091
7092 static struct arglist *
7093 read_token_list (pfile, error_flag)
7094      cpp_reader *pfile;
7095      int *error_flag;
7096 {
7097   struct arglist *token_ptrs = 0;
7098   int depth = 1;
7099   int length;
7100
7101   *error_flag = 0;
7102   FORWARD (1);  /* Skip '(' */
7103
7104   /* Loop over the assertion value tokens.  */
7105   while (depth > 0)
7106     {
7107       struct arglist *temp;
7108       long name_written = CPP_WRITTEN (pfile);
7109       int eofp = 0;  int c;
7110
7111       cpp_skip_hspace (pfile);
7112
7113       c = GETC ();
7114           
7115       /* Find the end of the token.  */
7116       if (c == '(')
7117         {
7118           CPP_PUTC (pfile, c);
7119           depth++;
7120         }
7121       else if (c == ')')
7122         {
7123           depth--;
7124           if (depth == 0)
7125             break;
7126           CPP_PUTC (pfile, c);
7127         }
7128       else if (c == '"' || c == '\'')
7129         {
7130           FORWARD(-1);
7131           cpp_get_token (pfile);
7132         }
7133       else if (c == '\n')
7134         break;
7135       else
7136         {
7137           while (c != EOF && ! is_space[c] && c != '(' && c != ')'
7138                  && c != '"' && c != '\'')
7139             {
7140               CPP_PUTC (pfile, c);
7141               c = GETC();
7142             }
7143           if (c != EOF)  FORWARD(-1);
7144         }
7145
7146       length = CPP_WRITTEN (pfile) - name_written;
7147       temp = (struct arglist *)
7148           xmalloc (sizeof (struct arglist) + length + 1);
7149       temp->name = (U_CHAR *) (temp + 1);
7150       bcopy ((char *) (pfile->token_buffer + name_written),
7151              (char *) temp->name, length);
7152       temp->name[length] = 0;
7153       temp->next = token_ptrs;
7154       token_ptrs = temp;
7155       temp->length = length;
7156
7157       CPP_ADJUST_WRITTEN (pfile, -length); /* pop */
7158
7159       if (c == EOF || c == '\n')
7160         { /* FIXME */
7161           cpp_error (pfile,
7162                      "unterminated token sequence following  `#' operator");
7163           return 0;
7164         }
7165     }
7166
7167   /* We accumulated the names in reverse order.
7168      Now reverse them to get the proper order.  */
7169   return reverse_token_list (token_ptrs);
7170 }
7171
7172 static void
7173 free_token_list (tokens)
7174      struct arglist *tokens;
7175 {
7176   while (tokens) {
7177     struct arglist *next = tokens->next;
7178     free (tokens->name);
7179     free (tokens);
7180     tokens = next;
7181   }
7182 }
7183 \f
7184 /* Get the file-mode and data size of the file open on FD
7185    and store them in *MODE_POINTER and *SIZE_POINTER.  */
7186
7187 static int
7188 file_size_and_mode (fd, mode_pointer, size_pointer)
7189      int fd;
7190      int *mode_pointer;
7191      long int *size_pointer;
7192 {
7193   struct stat sbuf;
7194
7195   if (fstat (fd, &sbuf) < 0) return (-1);
7196   if (mode_pointer) *mode_pointer = sbuf.st_mode;
7197   if (size_pointer) *size_pointer = sbuf.st_size;
7198   return 0;
7199 }
7200
7201 /* Read LEN bytes at PTR from descriptor DESC, for file FILENAME,
7202    retrying if necessary.  Return a negative value if an error occurs,
7203    otherwise return the actual number of bytes read,
7204    which must be LEN unless end-of-file was reached.  */
7205
7206 static int
7207 safe_read (desc, ptr, len)
7208      int desc;
7209      char *ptr;
7210      int len;
7211 {
7212   int left = len;
7213   while (left > 0) {
7214     int nchars = read (desc, ptr, left);
7215     if (nchars < 0)
7216       {
7217 #ifdef EINTR
7218         if (errno == EINTR)
7219           continue;
7220 #endif
7221         return nchars;
7222       }
7223     if (nchars == 0)
7224       break;
7225     ptr += nchars;
7226     left -= nchars;
7227   }
7228   return len - left;
7229 }
7230
7231 static char *
7232 xcalloc (number, size)
7233      unsigned number, size;
7234 {
7235   register unsigned total = number * size;
7236   register char *ptr = (char *) xmalloc (total);
7237   bzero (ptr, total);
7238   return ptr;
7239 }
7240
7241 static char *
7242 savestring (input)
7243      char *input;
7244 {
7245   unsigned size = strlen (input);
7246   char *output = xmalloc (size + 1);
7247   strcpy (output, input);
7248   return output;
7249 }
7250 \f
7251 /* Initialize PMARK to remember the current position of PFILE.  */
7252
7253 void
7254 parse_set_mark (pmark, pfile)
7255      struct parse_marker *pmark;
7256      cpp_reader *pfile;
7257 {
7258   cpp_buffer *pbuf = CPP_BUFFER (pfile);
7259   pmark->next = pbuf->marks;
7260   pbuf->marks = pmark;
7261   pmark->buf = pbuf;
7262   pmark->position = pbuf->cur - pbuf->buf;
7263 }
7264
7265 /* Cleanup PMARK - we no longer need it.  */
7266
7267 void
7268 parse_clear_mark (pmark)
7269      struct parse_marker *pmark;
7270 {
7271   struct parse_marker **pp = &pmark->buf->marks;
7272   for (; ; pp = &(*pp)->next) {
7273     if (*pp == NULL) abort ();
7274     if (*pp == pmark) break;
7275   }
7276   *pp = pmark->next;
7277 }
7278
7279 /* Backup the current position of PFILE to that saved in PMARK.  */
7280
7281 void
7282 parse_goto_mark (pmark, pfile)
7283      struct parse_marker *pmark;
7284      cpp_reader *pfile;
7285 {
7286   cpp_buffer *pbuf = CPP_BUFFER (pfile);
7287   if (pbuf != pmark->buf)
7288     cpp_fatal (pfile, "internal error %s", "parse_goto_mark");
7289   pbuf->cur = pbuf->buf + pmark->position;
7290 }
7291
7292 /* Reset PMARK to point to the current position of PFILE.  (Same
7293    as parse_clear_mark (PMARK), parse_set_mark (PMARK, PFILE) but faster.  */
7294
7295 void
7296 parse_move_mark (pmark, pfile)
7297      struct parse_marker *pmark;
7298      cpp_reader *pfile;
7299 {
7300   cpp_buffer *pbuf = CPP_BUFFER (pfile);
7301   if (pbuf != pmark->buf)
7302     cpp_fatal (pfile, "internal error %s", "parse_move_mark");
7303   pmark->position = pbuf->cur - pbuf->buf;
7304 }
7305
7306 int
7307 cpp_read_check_assertion (pfile)
7308      cpp_reader *pfile;
7309 {
7310   int name_start = CPP_WRITTEN (pfile);
7311   int name_length, name_written;
7312   int result;
7313   FORWARD (1);  /* Skip '#' */
7314   cpp_skip_hspace (pfile);
7315   parse_name (pfile, GETC ());
7316   name_written = CPP_WRITTEN (pfile);
7317   name_length = name_written - name_start;
7318   cpp_skip_hspace (pfile);
7319   if (CPP_BUF_PEEK (CPP_BUFFER (pfile)) == '(')
7320     {
7321       int error_flag;
7322       struct arglist *token_ptrs = read_token_list (pfile, &error_flag);
7323       result = check_assertion (pfile,
7324                                 pfile->token_buffer + name_start, name_length,
7325                                 1, token_ptrs);
7326     }
7327   else
7328     result = check_assertion (pfile,
7329                               pfile->token_buffer + name_start, name_length,
7330                               0, NULL_PTR);
7331   CPP_ADJUST_WRITTEN (pfile, - name_length);  /* pop */
7332   return result;
7333 }
7334 \f
7335 void
7336 cpp_print_file_and_line (pfile)
7337      cpp_reader *pfile;
7338 {
7339   cpp_buffer *ip = cpp_file_buffer (pfile);
7340
7341   if (ip != NULL)
7342     {
7343       long line, col;
7344       cpp_buf_line_and_col (ip, &line, &col);
7345       cpp_file_line_for_message (pfile, ip->nominal_fname,
7346                                  line, pfile->show_column ? col : -1);
7347     }
7348 }
7349
7350 void
7351 cpp_error (pfile, msg, arg1, arg2, arg3)
7352      cpp_reader *pfile;
7353      char *msg;
7354      char *arg1, *arg2, *arg3;
7355 {
7356   cpp_print_containing_files (pfile);
7357   cpp_print_file_and_line (pfile);
7358   cpp_message (pfile, 1, msg, arg1, arg2, arg3);
7359 }
7360
7361 /* Print error message but don't count it.  */
7362
7363 void
7364 cpp_warning (pfile, msg, arg1, arg2, arg3)
7365      cpp_reader *pfile;
7366      char *msg;
7367      char *arg1, *arg2, *arg3;
7368 {
7369   if (CPP_OPTIONS (pfile)->inhibit_warnings)
7370     return;
7371
7372   if (CPP_OPTIONS (pfile)->warnings_are_errors)
7373     pfile->errors++;
7374
7375   cpp_print_containing_files (pfile);
7376   cpp_print_file_and_line (pfile);
7377   cpp_message (pfile, 0, msg, arg1, arg2, arg3);
7378 }
7379
7380 /* Print an error message and maybe count it.  */
7381
7382 void
7383 cpp_pedwarn (pfile, msg, arg1, arg2, arg3)
7384      cpp_reader *pfile;
7385      char *msg;
7386      char *arg1, *arg2, *arg3;
7387 {
7388   if (CPP_OPTIONS (pfile)->pedantic_errors)
7389     cpp_error (pfile, msg, arg1, arg2, arg3);
7390   else
7391     cpp_warning (pfile, msg, arg1, arg2, arg3);
7392 }
7393
7394 void
7395 cpp_error_with_line (pfile, line, column, msg, arg1, arg2, arg3)
7396      cpp_reader *pfile;
7397      int line, column;
7398      char *msg;
7399      char *arg1, *arg2, *arg3;
7400 {
7401   int i;
7402   cpp_buffer *ip = cpp_file_buffer (pfile);
7403
7404   cpp_print_containing_files (pfile);
7405
7406   if (ip != NULL)
7407     cpp_file_line_for_message (pfile, ip->nominal_fname, line, column);
7408
7409   cpp_message (pfile, 1, msg, arg1, arg2, arg3);
7410 }
7411
7412 static void
7413 cpp_warning_with_line (pfile, line, column, msg, arg1, arg2, arg3)
7414      cpp_reader *pfile;
7415      int line, column;
7416      char *msg;
7417      char *arg1, *arg2, *arg3;
7418 {
7419   int i;
7420   cpp_buffer *ip;
7421
7422   if (CPP_OPTIONS (pfile)->inhibit_warnings)
7423     return;
7424
7425   if (CPP_OPTIONS (pfile)->warnings_are_errors)
7426     pfile->errors++;
7427
7428   cpp_print_containing_files (pfile);
7429
7430   ip = cpp_file_buffer (pfile);
7431
7432   if (ip != NULL)
7433     cpp_file_line_for_message (pfile, ip->nominal_fname, line, column);
7434
7435   cpp_message (pfile, 0, msg, arg1, arg2, arg3);
7436 }
7437
7438 void
7439 cpp_pedwarn_with_line (pfile, line, column, msg, arg1, arg2, arg3)
7440      cpp_reader *pfile;
7441      int line;
7442      char *msg;
7443      char *arg1, *arg2, *arg3;
7444 {
7445   if (CPP_OPTIONS (pfile)->pedantic_errors)
7446     cpp_error_with_line (pfile, column, line, msg, arg1, arg2, arg3);
7447   else
7448     cpp_warning_with_line (pfile, line, column, msg, arg1, arg2, arg3);
7449 }
7450
7451 /* Report a warning (or an error if pedantic_errors)
7452    giving specified file name and line number, not current.  */
7453
7454 void
7455 cpp_pedwarn_with_file_and_line (pfile, file, line, msg, arg1, arg2, arg3)
7456      cpp_reader *pfile;
7457      char *file;
7458      int line;
7459      char *msg;
7460      char *arg1, *arg2, *arg3;
7461 {
7462   if (!CPP_OPTIONS (pfile)->pedantic_errors
7463       && CPP_OPTIONS (pfile)->inhibit_warnings)
7464     return;
7465   if (file != NULL)
7466     cpp_file_line_for_message (pfile, file, line, -1);
7467   cpp_message (pfile, CPP_OPTIONS (pfile)->pedantic_errors,
7468                msg, arg1, arg2, arg3);
7469 }
7470
7471 /* This defines "errno" properly for VMS, and gives us EACCES.  */
7472 #include <errno.h>
7473 #ifndef errno
7474 extern int errno;
7475 #endif
7476
7477 #ifndef VMS
7478 #ifndef HAVE_STRERROR
7479 extern int sys_nerr;
7480 #if defined(bsd4_4)
7481 extern const char *const sys_errlist[];
7482 #else
7483 extern char *sys_errlist[];
7484 #endif
7485 #else   /* HAVE_STRERROR */
7486 char *strerror ();
7487 #endif
7488 #else   /* VMS */
7489 char *strerror (int,...);
7490 #endif
7491
7492 /* my_strerror - return the descriptive text associated with an
7493    `errno' code.  */
7494
7495 char *
7496 my_strerror (errnum)
7497      int errnum;
7498 {
7499   char *result;
7500
7501 #ifndef VMS
7502 #ifndef HAVE_STRERROR
7503   result = (char *) ((errnum < sys_nerr) ? sys_errlist[errnum] : 0);
7504 #else
7505   result = strerror (errnum);
7506 #endif
7507 #else   /* VMS */
7508   /* VAXCRTL's strerror() takes an optional second argument, which only
7509      matters when the first argument is EVMSERR.  However, it's simplest
7510      just to pass it unconditionally.  `vaxc$errno' is declared in
7511      <errno.h>, and maintained by the library in parallel with `errno'.
7512      We assume that caller's `errnum' either matches the last setting of
7513      `errno' by the library or else does not have the value `EVMSERR'.  */
7514
7515   result = strerror (errnum, vaxc$errno);
7516 #endif
7517
7518   if (!result)
7519     result = "undocumented I/O error";
7520
7521   return result;
7522 }
7523
7524 /* Error including a message from `errno'.  */
7525
7526 void
7527 cpp_error_from_errno (pfile, name)
7528      cpp_reader *pfile;
7529      char *name;
7530 {
7531   int i;
7532   cpp_buffer *ip = cpp_file_buffer (pfile);
7533
7534   cpp_print_containing_files (pfile);
7535
7536   if (ip != NULL)
7537     cpp_file_line_for_message (pfile, ip->nominal_fname, ip->lineno, -1);
7538
7539   cpp_message (pfile, 1, "%s: %s", name, my_strerror (errno));
7540 }
7541
7542 void
7543 cpp_perror_with_name (pfile, name)
7544      cpp_reader *pfile;
7545      char *name;
7546 {
7547   cpp_message (pfile, 1, "%s: %s: %s", progname, name, my_strerror (errno));
7548 }
7549
7550 /* TODO:
7551  * No pre-compiled header file support.
7552  *
7553  * Possibly different enum token codes for each C/C++ token.
7554  *
7555  * Should clean up remaining directives to that do_XXX functions
7556  *   only take two arguments and all have command_reads_line.
7557  *
7558  * Find and cleanup remaining uses of static variables,
7559  *
7560  * Support for trigraphs.
7561  *
7562  * Support -dM flag (dump_all_macros).
7563  *
7564  * Support for_lint flag.
7565  */