Convert cpplib to use libiberty/hashtab.c.
[gcc.git] / gcc / cppinit.c
1 /* CPP Library.
2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000 Free Software Foundation, Inc.
4 Contributed by Per Bothner, 1994-95.
5 Based on CCCP program by Paul Rubin, June 1986
6 Adapted to ANSI C, Richard Stallman, Jan 1987
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 #include "config.h"
23 #include "system.h"
24
25 #include "cpplib.h"
26 #include "cpphash.h"
27 #include "output.h"
28 #include "prefix.h"
29 #include "intl.h"
30 #include "version.h"
31 #include "hashtab.h"
32 #include "mkdeps.h"
33
34 /* Predefined symbols, built-in macros, and the default include path. */
35
36 #ifndef GET_ENV_PATH_LIST
37 #define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0)
38 #endif
39
40 /* Windows does not natively support inodes, and neither does MSDOS.
41 Cygwin's emulation can generate non-unique inodes, so don't use it.
42 VMS has non-numeric inodes. */
43 #ifdef VMS
44 #define INO_T_EQ(a, b) (!memcmp (&(a), &(b), sizeof (a)))
45 #elif (defined _WIN32 && ! defined (_UWIN)) || defined __MSDOS__
46 #define INO_T_EQ(a, b) 0
47 #else
48 #define INO_T_EQ(a, b) ((a) == (b))
49 #endif
50
51 #ifndef STANDARD_INCLUDE_DIR
52 #define STANDARD_INCLUDE_DIR "/usr/include"
53 #endif
54
55 /* We let tm.h override the types used here, to handle trivial differences
56 such as the choice of unsigned int or long unsigned int for size_t.
57 When machines start needing nontrivial differences in the size type,
58 it would be best to do something here to figure out automatically
59 from other information what type to use. */
60
61 /* The string value for __SIZE_TYPE__. */
62
63 #ifndef SIZE_TYPE
64 #define SIZE_TYPE "long unsigned int"
65 #endif
66
67 /* The string value for __PTRDIFF_TYPE__. */
68
69 #ifndef PTRDIFF_TYPE
70 #define PTRDIFF_TYPE "long int"
71 #endif
72
73 /* The string value for __WCHAR_TYPE__. */
74
75 #ifndef WCHAR_TYPE
76 #define WCHAR_TYPE "int"
77 #endif
78
79 /* The string value for __USER_LABEL_PREFIX__ */
80
81 #ifndef USER_LABEL_PREFIX
82 #define USER_LABEL_PREFIX ""
83 #endif
84
85 /* The string value for __REGISTER_PREFIX__ */
86
87 #ifndef REGISTER_PREFIX
88 #define REGISTER_PREFIX ""
89 #endif
90
91 /* This is the default list of directories to search for include files.
92 It may be overridden by the various -I and -ixxx options.
93
94 #include "file" looks in the same directory as the current file,
95 then this list.
96 #include <file> just looks in this list.
97
98 All these directories are treated as `system' include directories
99 (they are not subject to pedantic warnings in some cases). */
100
101 struct default_include
102 {
103 const char *fname; /* The name of the directory. */
104 const char *component; /* The component containing the directory
105 (see update_path in prefix.c) */
106 int cplusplus; /* Only look here if we're compiling C++. */
107 int cxx_aware; /* Includes in this directory don't need to
108 be wrapped in extern "C" when compiling
109 C++. */
110 };
111
112 #ifndef STANDARD_INCLUDE_COMPONENT
113 #define STANDARD_INCLUDE_COMPONENT 0
114 #endif
115
116 #ifdef CROSS_COMPILE
117 #undef LOCAL_INCLUDE_DIR
118 #undef SYSTEM_INCLUDE_DIR
119 #undef STANDARD_INCLUDE_DIR
120 #else
121 #undef CROSS_INCLUDE_DIR
122 #endif
123
124 static const struct default_include include_defaults_array[]
125 #ifdef INCLUDE_DEFAULTS
126 = INCLUDE_DEFAULTS;
127 #else
128 = {
129 #ifdef GPLUSPLUS_INCLUDE_DIR
130 /* Pick up GNU C++ specific include files. */
131 { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },
132 #endif
133 #ifdef LOCAL_INCLUDE_DIR
134 /* /usr/local/include comes before the fixincluded header files. */
135 { LOCAL_INCLUDE_DIR, 0, 0, 1 },
136 #endif
137 #ifdef GCC_INCLUDE_DIR
138 /* This is the dir for fixincludes and for gcc's private headers. */
139 { GCC_INCLUDE_DIR, "GCC", 0, 0 },
140 #endif
141 #ifdef CROSS_INCLUDE_DIR
142 /* One place the target system's headers might be. */
143 { CROSS_INCLUDE_DIR, "GCC", 0, 0 },
144 #endif
145 #ifdef TOOL_INCLUDE_DIR
146 /* Another place the target system's headers might be. */
147 { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 },
148 #endif
149 #ifdef SYSTEM_INCLUDE_DIR
150 /* Some systems have an extra dir of include files. */
151 { SYSTEM_INCLUDE_DIR, 0, 0, 0 },
152 #endif
153 #ifdef STANDARD_INCLUDE_DIR
154 /* /usr/include comes dead last. */
155 { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0 },
156 #endif
157 { 0, 0, 0, 0 }
158 };
159 #endif /* no INCLUDE_DEFAULTS */
160
161 /* Internal structures and prototypes. */
162
163 /* A `struct pending_option' remembers one -D, -A, -U, -include, or -imacros
164 switch. There are four lists: one for -D and -U, one for -A, one
165 for -include, one for -imacros. `undef' is set for -U, clear for
166 -D, ignored for the others.
167 (Future: add an equivalent of -U for -A) */
168
169 typedef void (* cl_directive_handler) PARAMS ((cpp_reader *, const char *));
170 struct pending_option
171 {
172 struct pending_option *next;
173 const char *arg;
174 cl_directive_handler handler;
175 };
176
177 /* The `pending' structure accumulates all the options that are not
178 actually processed until we hit cpp_start_read. It consists of
179 several lists, one for each type of option. We keep both head and
180 tail pointers for quick insertion. */
181 struct cpp_pending
182 {
183 struct pending_option *directive_head, *directive_tail;
184
185 struct file_name_list *quote_head, *quote_tail;
186 struct file_name_list *brack_head, *brack_tail;
187 struct file_name_list *systm_head, *systm_tail;
188 struct file_name_list *after_head, *after_tail;
189
190 struct pending_option *imacros_head, *imacros_tail;
191 struct pending_option *include_head, *include_tail;
192 };
193
194 #ifdef __STDC__
195 #define APPEND(pend, list, elt) \
196 do { if (!(pend)->list##_head) (pend)->list##_head = (elt); \
197 else (pend)->list##_tail->next = (elt); \
198 (pend)->list##_tail = (elt); \
199 } while (0)
200 #else
201 #define APPEND(pend, list, elt) \
202 do { if (!(pend)->list/**/_head) (pend)->list/**/_head = (elt); \
203 else (pend)->list/**/_tail->next = (elt); \
204 (pend)->list/**/_tail = (elt); \
205 } while (0)
206 #endif
207
208 static void print_help PARAMS ((void));
209 static void path_include PARAMS ((cpp_reader *,
210 struct cpp_pending *,
211 char *, int));
212 static void initialize_builtins PARAMS ((cpp_reader *));
213 static void append_include_chain PARAMS ((cpp_reader *,
214 struct cpp_pending *,
215 char *, int, int));
216 static void merge_include_chains PARAMS ((struct cpp_options *));
217
218 static void dump_special_to_buffer PARAMS ((cpp_reader *, const char *));
219 static void initialize_dependency_output PARAMS ((cpp_reader *));
220 static void initialize_standard_includes PARAMS ((cpp_reader *));
221 static void new_pending_directive PARAMS ((struct cpp_options *,
222 const char *,
223 cl_directive_handler));
224 #ifdef HOST_EBCDIC
225 static int opt_comp PARAMS ((const void *, const void *));
226 #endif
227 static int parse_option PARAMS ((const char *));
228 static int handle_option PARAMS ((cpp_reader *, int, char **));
229
230 /* Fourth argument to append_include_chain: chain to use */
231 enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
232
233 /* If we have designated initializers (GCC >2.7, or C99) this table
234 can be initialized, constant data. Otherwise, it has to be filled
235 in at runtime. */
236
237 #if (GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)
238 #define init_IStable() /* nothing */
239 #define ISTABLE const unsigned char _cpp_IStable[256] = {
240 #define END };
241 #define s(p, v) [p] = v,
242 #else
243 #define ISTABLE unsigned char _cpp_IStable[256] = { 0 }; \
244 static void init_IStable PARAMS ((void)) { \
245 unsigned char *x = _cpp_IStable;
246 #define END }
247 #define s(p, v) x[p] = v;
248 #endif
249
250 #define A(x) s(x, ISidnum|ISidstart)
251 #define N(x) s(x, ISidnum|ISnumstart)
252 #define H(x) s(x, IShspace|ISspace)
253 #define S(x) s(x, ISspace)
254
255 ISTABLE
256 A('_')
257
258 A('a') A('b') A('c') A('d') A('e') A('f') A('g') A('h') A('i')
259 A('j') A('k') A('l') A('m') A('n') A('o') A('p') A('q') A('r')
260 A('s') A('t') A('u') A('v') A('w') A('x') A('y') A('z')
261
262 A('A') A('B') A('C') A('D') A('E') A('F') A('G') A('H') A('I')
263 A('J') A('K') A('L') A('M') A('N') A('O') A('P') A('Q') A('R')
264 A('S') A('T') A('U') A('V') A('W') A('X') A('Y') A('Z')
265
266 N('1') N('2') N('3') N('4') N('5') N('6') N('7') N('8') N('9') N('0')
267
268 H(' ') H('\t') H('\v') H('\f')
269
270 S('\n')
271 END
272
273 #undef A
274 #undef N
275 #undef H
276 #undef S
277 #undef s
278 #undef ISTABLE
279 #undef END
280
281 /* Given a colon-separated list of file names PATH,
282 add all the names to the search path for include files. */
283
284 static void
285 path_include (pfile, pend, list, path)
286 cpp_reader *pfile;
287 struct cpp_pending *pend;
288 char *list;
289 int path;
290 {
291 char *p, *q, *name;
292
293 p = list;
294
295 do
296 {
297 /* Find the end of this name. */
298 q = p;
299 while (*q != 0 && *q != PATH_SEPARATOR) q++;
300 if (q == p)
301 {
302 /* An empty name in the path stands for the current directory. */
303 name = (char *) xmalloc (2);
304 name[0] = '.';
305 name[1] = 0;
306 }
307 else
308 {
309 /* Otherwise use the directory that is named. */
310 name = (char *) xmalloc (q - p + 1);
311 memcpy (name, p, q - p);
312 name[q - p] = 0;
313 }
314
315 append_include_chain (pfile, pend, name, path, 0);
316
317 /* Advance past this name. */
318 if (*q == 0)
319 break;
320 p = q + 1;
321 }
322 while (1);
323 }
324
325 /* Append DIR to include path PATH. DIR must be permanently allocated
326 and writable. */
327 static void
328 append_include_chain (pfile, pend, dir, path, cxx_aware)
329 cpp_reader *pfile;
330 struct cpp_pending *pend;
331 char *dir;
332 int path;
333 int cxx_aware;
334 {
335 struct file_name_list *new;
336 struct stat st;
337 unsigned int len;
338
339 _cpp_simplify_pathname (dir);
340 if (stat (dir, &st))
341 {
342 /* Dirs that don't exist are silently ignored. */
343 if (errno != ENOENT)
344 cpp_notice_from_errno (pfile, dir);
345 else if (CPP_OPTIONS (pfile)->verbose)
346 fprintf (stderr, _("ignoring nonexistent directory `%s'\n"), dir);
347 return;
348 }
349
350 if (!S_ISDIR (st.st_mode))
351 {
352 cpp_notice (pfile, "%s: Not a directory", dir);
353 return;
354 }
355
356 len = strlen (dir);
357 if (len > pfile->max_include_len)
358 pfile->max_include_len = len;
359
360 new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
361 new->name = dir;
362 new->nlen = len;
363 new->ino = st.st_ino;
364 new->dev = st.st_dev;
365 if (path == SYSTEM)
366 new->sysp = cxx_aware ? 1 : 2;
367 else
368 new->sysp = 0;
369 new->name_map = NULL;
370 new->next = NULL;
371 new->alloc = NULL;
372
373 switch (path)
374 {
375 case QUOTE: APPEND (pend, quote, new); break;
376 case BRACKET: APPEND (pend, brack, new); break;
377 case SYSTEM: APPEND (pend, systm, new); break;
378 case AFTER: APPEND (pend, after, new); break;
379 }
380 }
381
382 /* Merge the four include chains together in the order quote, bracket,
383 system, after. Remove duplicate dirs (as determined by
384 INO_T_EQ()). The system_include and after_include chains are never
385 referred to again after this function; all access is through the
386 bracket_include path.
387
388 For the future: Check if the directory is empty (but
389 how?) and possibly preload the include hash. */
390
391 static void
392 merge_include_chains (opts)
393 struct cpp_options *opts;
394 {
395 struct file_name_list *prev, *cur, *other;
396 struct file_name_list *quote, *brack, *systm, *after;
397 struct file_name_list *qtail, *btail, *stail, *atail;
398
399 qtail = opts->pending->quote_tail;
400 btail = opts->pending->brack_tail;
401 stail = opts->pending->systm_tail;
402 atail = opts->pending->after_tail;
403
404 quote = opts->pending->quote_head;
405 brack = opts->pending->brack_head;
406 systm = opts->pending->systm_head;
407 after = opts->pending->after_head;
408
409 /* Paste together bracket, system, and after include chains. */
410 if (stail)
411 stail->next = after;
412 else
413 systm = after;
414 if (btail)
415 btail->next = systm;
416 else
417 brack = systm;
418
419 /* This is a bit tricky.
420 First we drop dupes from the quote-include list.
421 Then we drop dupes from the bracket-include list.
422 Finally, if qtail and brack are the same directory,
423 we cut out qtail.
424
425 We can't just merge the lists and then uniquify them because
426 then we may lose directories from the <> search path that should
427 be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however
428 safe to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written
429 -Ibar -I- -Ifoo -Iquux.
430
431 Note that this algorithm is quadratic in the number of -I switches,
432 which is acceptable since there aren't usually that many of them. */
433
434 for (cur = quote, prev = NULL; cur; cur = cur->next)
435 {
436 for (other = quote; other != cur; other = other->next)
437 if (INO_T_EQ (cur->ino, other->ino)
438 && cur->dev == other->dev)
439 {
440 if (opts->verbose)
441 fprintf (stderr, _("ignoring duplicate directory `%s'\n"),
442 cur->name);
443
444 prev->next = cur->next;
445 free (cur->name);
446 free (cur);
447 cur = prev;
448 break;
449 }
450 prev = cur;
451 }
452 qtail = prev;
453
454 for (cur = brack; cur; cur = cur->next)
455 {
456 for (other = brack; other != cur; other = other->next)
457 if (INO_T_EQ (cur->ino, other->ino)
458 && cur->dev == other->dev)
459 {
460 if (opts->verbose)
461 fprintf (stderr, _("ignoring duplicate directory `%s'\n"),
462 cur->name);
463
464 prev->next = cur->next;
465 free (cur->name);
466 free (cur);
467 cur = prev;
468 break;
469 }
470 prev = cur;
471 }
472
473 if (quote)
474 {
475 if (INO_T_EQ (qtail->ino, brack->ino) && qtail->dev == brack->dev)
476 {
477 if (quote == qtail)
478 {
479 if (opts->verbose)
480 fprintf (stderr, _("ignoring duplicate directory `%s'\n"),
481 quote->name);
482
483 free (quote->name);
484 free (quote);
485 quote = brack;
486 }
487 else
488 {
489 cur = quote;
490 while (cur->next != qtail)
491 cur = cur->next;
492 cur->next = brack;
493 if (opts->verbose)
494 fprintf (stderr, _("ignoring duplicate directory `%s'\n"),
495 qtail->name);
496
497 free (qtail->name);
498 free (qtail);
499 }
500 }
501 else
502 qtail->next = brack;
503 }
504 else
505 quote = brack;
506
507 opts->quote_include = quote;
508 opts->bracket_include = brack;
509 }
510
511
512 /* Write out a #define command for the special named MACRO_NAME
513 to PFILE's token_buffer. */
514
515 static void
516 dump_special_to_buffer (pfile, macro_name)
517 cpp_reader *pfile;
518 const char *macro_name;
519 {
520 static const char define_directive[] = "#define ";
521 int macro_name_length = strlen (macro_name);
522 output_line_command (pfile, same_file);
523 CPP_RESERVE (pfile, sizeof(define_directive) + macro_name_length);
524 CPP_PUTS_Q (pfile, define_directive, sizeof(define_directive)-1);
525 CPP_PUTS_Q (pfile, macro_name, macro_name_length);
526 CPP_PUTC_Q (pfile, ' ');
527 cpp_expand_to_buffer (pfile, macro_name, macro_name_length);
528 CPP_PUTC (pfile, '\n');
529 }
530
531 /* Initialize a cpp_options structure. */
532 void
533 cpp_options_init (opts)
534 cpp_options *opts;
535 {
536 memset ((char *) opts, 0, sizeof (struct cpp_options));
537
538 opts->dollars_in_ident = 1;
539 opts->cplusplus_comments = 1;
540 opts->warn_import = 1;
541 opts->discard_comments = 1;
542
543 opts->pending =
544 (struct cpp_pending *) xcalloc (1, sizeof (struct cpp_pending));
545 }
546
547 /* Initialize a cpp_reader structure. */
548 void
549 cpp_reader_init (pfile)
550 cpp_reader *pfile;
551 {
552 memset ((char *) pfile, 0, sizeof (cpp_reader));
553
554 pfile->token_buffer_size = 200;
555 pfile->token_buffer = (U_CHAR *) xmalloc (pfile->token_buffer_size);
556 CPP_SET_WRITTEN (pfile, 0);
557
558 _cpp_init_macro_hash (pfile);
559 _cpp_init_include_hash (pfile);
560 }
561
562 /* Free resources used by PFILE.
563 This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology). */
564 void
565 cpp_cleanup (pfile)
566 cpp_reader *pfile;
567 {
568 while (CPP_BUFFER (pfile) != NULL)
569 cpp_pop_buffer (pfile);
570
571 if (pfile->token_buffer)
572 {
573 free (pfile->token_buffer);
574 pfile->token_buffer = NULL;
575 }
576
577 if (pfile->input_buffer)
578 {
579 free (pfile->input_buffer);
580 free (pfile->input_speccase);
581 pfile->input_buffer = pfile->input_speccase = NULL;
582 pfile->input_buffer_len = 0;
583 }
584
585 if (pfile->deps)
586 deps_free (pfile->deps);
587
588 htab_delete (pfile->hashtab);
589 htab_delete (pfile->all_include_files);
590 }
591
592
593 /* This structure defines one built-in macro. A node of type TYPE will
594 be entered in the macro hash table under the name NAME, with value
595 VALUE (if any). FLAGS tweaks the behavior a little:
596 DUMP write debug info for this macro
597 STDC define only if not -traditional
598 ULP value is the global user_label_prefix (which can't be
599 put directly into the table).
600 */
601
602 struct builtin
603 {
604 const char *name;
605 const char *value;
606 unsigned short type;
607 unsigned short flags;
608 };
609 #define DUMP 0x01
610 #define STDC 0x02
611 #define ULP 0x10
612
613 static const struct builtin builtin_array[] =
614 {
615 { "__TIME__", 0, T_TIME, DUMP },
616 { "__DATE__", 0, T_DATE, DUMP },
617 { "__FILE__", 0, T_FILE, 0 },
618 { "__BASE_FILE__", 0, T_BASE_FILE, 0 },
619 { "__LINE__", 0, T_SPECLINE, 0 },
620 { "__INCLUDE_LEVEL__", 0, T_INCLUDE_LEVEL, 0 },
621 { "__VERSION__", 0, T_VERSION, DUMP },
622 { "__STDC__", 0, T_STDC, DUMP|STDC },
623
624 { "__USER_LABEL_PREFIX__", 0, T_CONST, ULP },
625 { "__REGISTER_PREFIX__", REGISTER_PREFIX, T_CONST, 0 },
626 { "__HAVE_BUILTIN_SETJMP__", "1", T_CONST, 0 },
627 #ifndef NO_BUILTIN_SIZE_TYPE
628 { "__SIZE_TYPE__", SIZE_TYPE, T_CONST, DUMP },
629 #endif
630 #ifndef NO_BUILTIN_PTRDIFF_TYPE
631 { "__PTRDIFF_TYPE__", PTRDIFF_TYPE, T_CONST, DUMP },
632 #endif
633 #ifndef NO_BUILTIN_WCHAR_TYPE
634 { "__WCHAR_TYPE__", WCHAR_TYPE, T_CONST, DUMP },
635 #endif
636 { 0, 0, 0, 0 }
637 };
638
639 /* Subroutine of cpp_start_read; reads the builtins table above and
640 enters the macros into the hash table. */
641 static void
642 initialize_builtins (pfile)
643 cpp_reader *pfile;
644 {
645 int len;
646 const struct builtin *b;
647 const char *val;
648 HASHNODE *hp;
649 for(b = builtin_array; b->name; b++)
650 {
651 if ((b->flags & STDC) && CPP_TRADITIONAL (pfile))
652 continue;
653
654 val = (b->flags & ULP) ? user_label_prefix : b->value;
655 len = strlen (b->name);
656
657 hp = _cpp_make_hashnode (b->name, len, b->type, -1);
658 hp->value.cpval = val;
659 *(htab_find_slot (pfile->hashtab, (void *)hp, 1)) = hp;
660
661 if ((b->flags & DUMP) && CPP_OPTIONS (pfile)->debug_output)
662 dump_special_to_buffer (pfile, b->name);
663 }
664
665 }
666 #undef DUMP
667 #undef STDC
668 #undef ULP
669
670 /* Another subroutine of cpp_start_read. This one sets up to do
671 dependency-file output. */
672 static void
673 initialize_dependency_output (pfile)
674 cpp_reader *pfile;
675 {
676 cpp_options *opts = CPP_OPTIONS (pfile);
677 char *spec, *s, *output_file;
678
679 /* Either of two environment variables can specify output of deps.
680 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
681 where OUTPUT_FILE is the file to write deps info to
682 and DEPS_TARGET is the target to mention in the deps. */
683
684 if (opts->print_deps == 0)
685 {
686 spec = getenv ("DEPENDENCIES_OUTPUT");
687 if (spec)
688 opts->print_deps = 1;
689 else
690 {
691 spec = getenv ("SUNPRO_DEPENDENCIES");
692 if (spec)
693 opts->print_deps = 2;
694 else
695 return;
696 }
697
698 /* Find the space before the DEPS_TARGET, if there is one. */
699 s = strchr (spec, ' ');
700 if (s)
701 {
702 opts->deps_target = s + 1;
703 output_file = (char *) xmalloc (s - spec + 1);
704 memcpy (output_file, spec, s - spec);
705 output_file[s - spec] = 0;
706 }
707 else
708 {
709 opts->deps_target = 0;
710 output_file = spec;
711 }
712
713 opts->deps_file = output_file;
714 opts->print_deps_append = 1;
715 }
716
717 pfile->deps = deps_init ();
718
719 /* Print the expected object file name as the target of this Make-rule. */
720 if (opts->deps_target)
721 deps_add_target (pfile->deps, opts->deps_target);
722 else if (*opts->in_fname == 0)
723 deps_add_target (pfile->deps, "-");
724 else
725 deps_calc_target (pfile->deps, opts->in_fname);
726
727 if (opts->in_fname)
728 deps_add_dep (pfile->deps, opts->in_fname);
729 }
730
731 /* And another subroutine. This one sets up the standard include path. */
732 static void
733 initialize_standard_includes (pfile)
734 cpp_reader *pfile;
735 {
736 cpp_options *opts = CPP_OPTIONS (pfile);
737 char *path;
738 const struct default_include *p;
739 const char *specd_prefix = opts->include_prefix;
740
741 /* Several environment variables may add to the include search path.
742 CPATH specifies an additional list of directories to be searched
743 as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH,
744 etc. specify an additional list of directories to be searched as
745 if specified with -isystem, for the language indicated. */
746
747 GET_ENV_PATH_LIST (path, "CPATH");
748 if (path != 0 && *path != 0)
749 path_include (pfile, opts->pending, path, BRACKET);
750
751 switch ((opts->objc << 1) + opts->cplusplus)
752 {
753 case 0:
754 GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH");
755 break;
756 case 1:
757 GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH");
758 break;
759 case 2:
760 GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH");
761 break;
762 case 3:
763 GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH");
764 break;
765 }
766 if (path != 0 && *path != 0)
767 path_include (pfile, opts->pending, path, SYSTEM);
768
769 /* Search "translated" versions of GNU directories.
770 These have /usr/local/lib/gcc... replaced by specd_prefix. */
771 if (specd_prefix != 0)
772 {
773 char *default_prefix = alloca (sizeof GCC_INCLUDE_DIR - 7);
774 /* Remove the `include' from /usr/local/lib/gcc.../include.
775 GCC_INCLUDE_DIR will always end in /include. */
776 int default_len = sizeof GCC_INCLUDE_DIR - 8;
777 int specd_len = strlen (specd_prefix);
778
779 memcpy (default_prefix, GCC_INCLUDE_DIR, default_len);
780 default_prefix[default_len] = '\0';
781
782 for (p = include_defaults_array; p->fname; p++)
783 {
784 /* Some standard dirs are only for C++. */
785 if (!p->cplusplus
786 || (opts->cplusplus
787 && !opts->no_standard_cplusplus_includes))
788 {
789 /* Does this dir start with the prefix? */
790 if (!strncmp (p->fname, default_prefix, default_len))
791 {
792 /* Yes; change prefix and add to search list. */
793 int flen = strlen (p->fname);
794 int this_len = specd_len + flen - default_len;
795 char *str = (char *) xmalloc (this_len + 1);
796 memcpy (str, specd_prefix, specd_len);
797 memcpy (str + specd_len,
798 p->fname + default_len,
799 flen - default_len + 1);
800
801 append_include_chain (pfile, opts->pending,
802 str, SYSTEM, p->cxx_aware);
803 }
804 }
805 }
806 }
807
808 /* Search ordinary names for GNU include directories. */
809 for (p = include_defaults_array; p->fname; p++)
810 {
811 /* Some standard dirs are only for C++. */
812 if (!p->cplusplus
813 || (opts->cplusplus
814 && !opts->no_standard_cplusplus_includes))
815 {
816 /* XXX Potential memory leak! */
817 char *str = xstrdup (update_path (p->fname, p->component));
818 append_include_chain (pfile, opts->pending, str, SYSTEM,
819 p->cxx_aware);
820 }
821 }
822 }
823
824 /* This is called after options have been processed.
825 * Check options for consistency, and setup for processing input
826 * from the file named FNAME. (Use standard input if FNAME==NULL.)
827 * Return 1 on success, 0 on failure.
828 */
829
830 int
831 cpp_start_read (pfile, fname)
832 cpp_reader *pfile;
833 const char *fname;
834 {
835 struct cpp_options *opts = CPP_OPTIONS (pfile);
836 struct pending_option *p, *q;
837
838 /* -MG doesn't select the form of output and must be specified with one of
839 -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't
840 inhibit compilation. */
841 if (opts->print_deps_missing_files
842 && (opts->print_deps == 0 || !opts->no_output))
843 {
844 cpp_fatal (pfile, "-MG must be specified with one of -M or -MM");
845 return 0;
846 }
847
848 /* Chill should not be used with -trigraphs. */
849 if (opts->chill && opts->trigraphs)
850 {
851 cpp_warning (pfile, "-lang-chill and -trigraphs are mutually exclusive");
852 opts->trigraphs = 0;
853 }
854
855 /* Set this if it hasn't been set already. */
856 if (user_label_prefix == NULL)
857 user_label_prefix = USER_LABEL_PREFIX;
858
859 /* Don't bother trying to do macro expansion if we've already done
860 preprocessing. */
861 if (opts->preprocessed)
862 pfile->no_macro_expand++;
863
864 /* Set up the IStable. This doesn't do anything if we were compiled
865 with a compiler that supports C99 designated initializers. */
866 init_IStable ();
867
868 /* Set up the include search path now. */
869 if (! opts->no_standard_includes)
870 initialize_standard_includes (pfile);
871
872 merge_include_chains (opts);
873
874 /* With -v, print the list of dirs to search. */
875 if (opts->verbose)
876 {
877 struct file_name_list *l;
878 fprintf (stderr, _("#include \"...\" search starts here:\n"));
879 for (l = opts->quote_include; l; l = l->next)
880 {
881 if (l == opts->bracket_include)
882 fprintf (stderr, _("#include <...> search starts here:\n"));
883 fprintf (stderr, " %s\n", l->name);
884 }
885 fprintf (stderr, _("End of search list.\n"));
886 }
887
888 initialize_dependency_output (pfile);
889
890 /* Open the main input file. This must be done before -D processing
891 so we have a buffer to stand on. */
892 if (opts->in_fname == NULL || *opts->in_fname == 0)
893 {
894 opts->in_fname = fname;
895 if (opts->in_fname == NULL)
896 opts->in_fname = "";
897 }
898
899 if (!cpp_read_file (pfile, fname))
900 return 0;
901
902 /* -D and friends may produce output, which should be identified
903 as line 0. */
904
905 CPP_BUFFER (pfile)->lineno = 0;
906
907 /* Install __LINE__, etc. */
908 initialize_builtins (pfile);
909
910 /* Do -U's, -D's and -A's in the order they were seen. */
911 p = opts->pending->directive_head;
912 while (p)
913 {
914 (*p->handler) (pfile, p->arg);
915 q = p->next;
916 free (p);
917 p = q;
918 }
919
920 opts->done_initializing = 1;
921 CPP_BUFFER (pfile)->lineno = 1;
922
923 if (opts->preprocessed)
924 /* If we've already processed this code, we want to trust the #line
925 directives in the input. But we still need to update our line
926 counter accordingly. */
927 pfile->lineno = CPP_BUFFER (pfile)->lineno;
928 else
929 output_line_command (pfile, same_file);
930 pfile->only_seen_white = 2;
931
932 /* The -imacros files can be scanned now, but the -include files
933 have to be pushed onto the include stack and processed later,
934 in the main loop calling cpp_get_token. */
935
936 opts->no_output++;
937 p = opts->pending->imacros_head;
938 while (p)
939 {
940 if (cpp_read_file (pfile, p->arg))
941 cpp_scan_buffer (pfile);
942
943 q = p->next;
944 free (p);
945 p = q;
946 }
947 opts->no_output--;
948
949 p = opts->pending->include_head;
950 while (p)
951 {
952 if (cpp_read_file (pfile, p->arg))
953 output_line_command (pfile, enter_file);
954
955 q = p->next;
956 free (p);
957 p = q;
958 }
959
960 free (opts->pending);
961 opts->pending = NULL;
962
963 return 1;
964 }
965
966 /* This is called at the end of preprocessing. It pops the
967 last buffer and writes dependency output. It should also
968 clear macro definitions, such that you could call cpp_start_read
969 with a new filename to restart processing. */
970 void
971 cpp_finish (pfile)
972 cpp_reader *pfile;
973 {
974 struct cpp_options *opts = CPP_OPTIONS (pfile);
975
976 if (CPP_PREV_BUFFER (CPP_BUFFER (pfile)))
977 cpp_ice (pfile, "buffers still stacked in cpp_finish");
978 while (CPP_BUFFER (pfile))
979 cpp_pop_buffer (pfile);
980
981 /* Don't write the deps file if preprocessing has failed. */
982 if (opts->print_deps && pfile->errors == 0)
983 {
984 /* Stream on which to print the dependency information. */
985 FILE *deps_stream = 0;
986
987 const char *deps_mode = opts->print_deps_append ? "a" : "w";
988 if (opts->deps_file == 0)
989 deps_stream = stdout;
990 else if ((deps_stream = fopen (opts->deps_file, deps_mode)) == 0)
991 cpp_notice_from_errno (pfile, opts->deps_file);
992
993 if (deps_stream)
994 {
995 deps_write (pfile->deps, deps_stream, 72);
996 if (opts->deps_file)
997 {
998 if (ferror (deps_stream) || fclose (deps_stream) != 0)
999 cpp_fatal (pfile, "I/O error on output");
1000 }
1001 }
1002 }
1003
1004 if (opts->dump_macros == dump_only)
1005 _cpp_dump_macro_hash (pfile);
1006 }
1007
1008 static void
1009 new_pending_directive (opts, text, handler)
1010 struct cpp_options *opts;
1011 const char *text;
1012 cl_directive_handler handler;
1013 {
1014 struct pending_option *o = (struct pending_option *)
1015 xmalloc (sizeof (struct pending_option));
1016
1017 o->arg = text;
1018 o->next = NULL;
1019 o->handler = handler;
1020 APPEND (opts->pending, directive, o);
1021 }
1022
1023 enum opt_code
1024 {
1025 OPT_stdin_stdout = 0, OPT_dollar, OPT_plus,
1026 OPT__help, OPT__version,
1027 OPT_A, OPT_C, OPT_D, OPT_H, OPT_I, OPT_M,
1028 OPT_MD, OPT_MG, OPT_MM, OPT_MMD,
1029 OPT_P, OPT_U, OPT_W,
1030 OPT_d,
1031 OPT_fleading_underscore, OPT_fno_leading_underscore,
1032 OPT_fpreprocessed, OPT_fno_preprocessed,
1033 OPT_g, OPT_h,
1034 OPT_idirafter, OPT_imacros, OPT_include,
1035 OPT_iprefix, OPT_isystem, OPT_iwithprefix, OPT_iwithprefixbefore,
1036 OPT_lang_asm, OPT_lang_c, OPT_lang_cplusplus, OPT_lang_c89,
1037 OPT_lang_chill, OPT_lang_fortran, OPT_lang_objc, OPT_lang_objcplusplus,
1038 OPT_nostdinc, OPT_nostdincplusplus,
1039 OPT_o,
1040 OPT_pedantic, OPT_pedantic_errors, OPT_remap,
1041 OPT_std_c89, OPT_std_c99, OPT_std_c9x, OPT_std_gnu89, OPT_std_gnu99,
1042 OPT_std_gnu9x, OPT_std_iso9899_1990, OPT_std_iso9899_199409,
1043 OPT_std_iso9899_1999, OPT_std_iso9899_199x,
1044 OPT_traditional, OPT_trigraphs,
1045 OPT_v, OPT_w,
1046 N_OPTS
1047 };
1048
1049 struct cl_option
1050 {
1051 const char *opt_text;
1052 const char *msg;
1053 size_t opt_len;
1054 enum opt_code opt_code;
1055 };
1056
1057 /* Irix6 "cc -n32" and OSF4 cc have problems with char foo[] = ("string");
1058 I.e. a const string initializer with parens around it. That is
1059 what N_("string") resolves to, so we make no_* be macros instead. */
1060 #define no_arg N_("Argument missing after `%s' option")
1061 #define no_ass N_("Assertion missing after `%s' option")
1062 #define no_dir N_("Directory name missing after `%s' option")
1063 #define no_fil N_("File name missing after `%s' option")
1064 #define no_mac N_("Macro name missing after `%s' option")
1065 #define no_pth N_("Path name missing after `%s' option")
1066
1067 /* This list must be ASCII sorted. Make enum order above match this. */
1068 #define DEF_OPT(text, msg, code) {text, msg, sizeof(text) - 1, code}
1069
1070 #ifdef HOST_EBCDIC
1071 static struct cl_option cl_options[] =
1072 #else
1073 static const struct cl_option cl_options[] =
1074 #endif
1075 {
1076 DEF_OPT("", 0, OPT_stdin_stdout),
1077 DEF_OPT("$", 0, OPT_dollar),
1078 DEF_OPT("+", 0, OPT_plus),
1079 DEF_OPT("-help", 0, OPT__help),
1080 DEF_OPT("-version", 0, OPT__version),
1081 DEF_OPT("A", no_ass, OPT_A),
1082 DEF_OPT("C", 0, OPT_C),
1083 DEF_OPT("D", no_mac, OPT_D),
1084 DEF_OPT("H", 0, OPT_H),
1085 DEF_OPT("I", no_dir, OPT_I),
1086 DEF_OPT("M", 0, OPT_M),
1087 DEF_OPT("MD", no_fil, OPT_MD),
1088 DEF_OPT("MG", 0, OPT_MG),
1089 DEF_OPT("MM", 0, OPT_MM),
1090 DEF_OPT("MMD", no_fil, OPT_MMD),
1091 DEF_OPT("P", 0, OPT_P),
1092 DEF_OPT("U", no_mac, OPT_U),
1093 /* NB: Immed arg only, and not reqd */
1094 DEF_OPT("W", no_arg, OPT_W),
1095 DEF_OPT("d", no_arg, OPT_d),
1096 DEF_OPT("fleading-underscore", 0, OPT_fleading_underscore),
1097 DEF_OPT("fno-leading-underscore", 0, OPT_fno_leading_underscore),
1098 DEF_OPT("fpreprocessed", 0, OPT_fpreprocessed),
1099 DEF_OPT("fno-preprocessed", 0, OPT_fno_preprocessed),
1100 /* NB: Immed arg only, and not reqd */
1101 DEF_OPT("g", no_arg, OPT_g),
1102 DEF_OPT("h", 0, OPT_h),
1103 DEF_OPT("idirafter", no_dir, OPT_idirafter),
1104 DEF_OPT("imacros", no_fil, OPT_imacros),
1105 DEF_OPT("include", no_fil, OPT_include),
1106 DEF_OPT("iprefix", no_pth, OPT_iprefix),
1107 DEF_OPT("isystem", no_dir, OPT_isystem),
1108 DEF_OPT("iwithprefix", no_dir, OPT_iwithprefix),
1109 DEF_OPT("iwithprefixbefore", no_dir, OPT_iwithprefixbefore),
1110 DEF_OPT("lang-asm", 0, OPT_lang_asm),
1111 DEF_OPT("lang-c", 0, OPT_lang_c),
1112 DEF_OPT("lang-c++", 0, OPT_lang_cplusplus),
1113 DEF_OPT("lang-c89", 0, OPT_lang_c89),
1114 DEF_OPT("lang-chill", 0, OPT_lang_chill),
1115 DEF_OPT("lang-fortran", 0, OPT_lang_fortran),
1116 DEF_OPT("lang-objc", 0, OPT_lang_objc),
1117 DEF_OPT("lang-objc++", 0, OPT_lang_objcplusplus),
1118 DEF_OPT("nostdinc", 0, OPT_nostdinc),
1119 DEF_OPT("nostdinc++", 0, OPT_nostdincplusplus),
1120 DEF_OPT("o", no_fil, OPT_o),
1121 DEF_OPT("pedantic", 0, OPT_pedantic),
1122 DEF_OPT("pedantic-errors", 0, OPT_pedantic_errors),
1123 DEF_OPT("remap", 0, OPT_remap),
1124 DEF_OPT("std=c89", 0, OPT_std_c89),
1125 DEF_OPT("std=c99", 0, OPT_std_c99),
1126 DEF_OPT("std=c9x", 0, OPT_std_c9x),
1127 DEF_OPT("std=gnu89", 0, OPT_std_gnu89),
1128 DEF_OPT("std=gnu99", 0, OPT_std_gnu99),
1129 DEF_OPT("std=gnu9x", 0, OPT_std_gnu9x),
1130 DEF_OPT("std=iso9899:1990", 0, OPT_std_iso9899_1990),
1131 DEF_OPT("std=iso9899:199409", 0, OPT_std_iso9899_199409),
1132 DEF_OPT("std=iso9899:1999", 0, OPT_std_iso9899_1999),
1133 DEF_OPT("std=iso9899:199x", 0, OPT_std_iso9899_199x),
1134 DEF_OPT("traditional", 0, OPT_traditional),
1135 DEF_OPT("trigraphs", 0, OPT_trigraphs),
1136 DEF_OPT("v", 0, OPT_v),
1137 DEF_OPT("w", 0, OPT_w)
1138 };
1139 #undef DEF_OPT
1140
1141 /* Perform a binary search to find which, if any, option the given
1142 command-line matches. Returns its index in the option array,
1143 negative on failure. Complications arise since some options can be
1144 suffixed with an argument, and multiple complete matches can occur,
1145 e.g. -iwithprefix and -iwithprefixbefore. Moreover, we want to
1146 accept options beginning with -g and -W that we do not recognise,
1147 but not to swallow any subsequent command line argument; these are
1148 handled as special cases in cpp_handle_option */
1149 static int
1150 parse_option (input)
1151 const char *input;
1152 {
1153 unsigned int md, mn, mx;
1154 size_t opt_len;
1155 int comp;
1156
1157 mn = 0;
1158 mx = N_OPTS;
1159
1160 while (mx > mn)
1161 {
1162 md = (mn + mx) / 2;
1163
1164 opt_len = cl_options[md].opt_len;
1165 comp = strncmp (input, cl_options[md].opt_text, opt_len);
1166
1167 if (comp > 0)
1168 mn = md + 1;
1169 else if (comp < 0)
1170 mx = md;
1171 else
1172 {
1173 if (input[opt_len] == '\0')
1174 return md;
1175 /* We were passed more text. If the option takes an argument,
1176 we may match a later option or we may have been passed the
1177 argument. The longest possible option match succeeds.
1178 If the option takes no arguments we have not matched and
1179 continue the search (e.g. input="stdc++" match was "stdc") */
1180 mn = md + 1;
1181 if (cl_options[md].msg)
1182 {
1183 /* Scan forwards. If we get an exact match, return it.
1184 Otherwise, return the longest option-accepting match.
1185 This loops no more than twice with current options */
1186 mx = md;
1187 for (; mn < N_OPTS; mn++)
1188 {
1189 opt_len = cl_options[mn].opt_len;
1190 if (strncmp (input, cl_options[mn].opt_text, opt_len))
1191 break;
1192 if (input[opt_len] == '\0')
1193 return mn;
1194 if (cl_options[mn].msg)
1195 mx = mn;
1196 }
1197 return mx;
1198 }
1199 }
1200 }
1201
1202 return -1;
1203 }
1204
1205 /* Handle one command-line option in (argc, argv).
1206 Can be called multiple times, to handle multiple sets of options.
1207 Returns number of strings consumed. */
1208
1209 static int
1210 handle_option (pfile, argc, argv)
1211 cpp_reader *pfile;
1212 int argc;
1213 char **argv;
1214 {
1215 struct cpp_options *opts = CPP_OPTIONS (pfile);
1216 int i = 0;
1217
1218 if (argv[i][0] != '-')
1219 {
1220 if (opts->out_fname != NULL)
1221 {
1222 print_help ();
1223 cpp_fatal (pfile, "Too many arguments");
1224 }
1225 else if (opts->in_fname != NULL)
1226 opts->out_fname = argv[i];
1227 else
1228 opts->in_fname = argv[i];
1229 }
1230 else
1231 {
1232 enum opt_code opt_code;
1233 int opt_index;
1234 const char *arg = 0;
1235
1236 /* Skip over '-' */
1237 opt_index = parse_option (&argv[i][1]);
1238 if (opt_index < 0)
1239 return i;
1240
1241 opt_code = cl_options[opt_index].opt_code;
1242 if (cl_options[opt_index].msg)
1243 {
1244 arg = &argv[i][cl_options[opt_index].opt_len + 1];
1245
1246 /* Yuk. Special case for -g and -W as they must not swallow
1247 up any following argument. If this becomes common, add
1248 another field to the cl_options table */
1249 if (arg[0] == '\0' && !(opt_code == OPT_g || opt_code == OPT_W))
1250 {
1251 arg = argv[++i];
1252 if (!arg)
1253 {
1254 cpp_fatal (pfile, _(cl_options[opt_index].msg), argv[i - 1]);
1255 return argc;
1256 }
1257 }
1258 }
1259
1260 switch (opt_code)
1261 {
1262 case N_OPTS: /* shut GCC up */
1263 break;
1264 case OPT_fleading_underscore:
1265 user_label_prefix = "_";
1266 break;
1267 case OPT_fno_leading_underscore:
1268 user_label_prefix = "";
1269 break;
1270 case OPT_fpreprocessed:
1271 opts->preprocessed = 1;
1272 break;
1273 case OPT_fno_preprocessed:
1274 opts->preprocessed = 0;
1275 break;
1276 case OPT_w:
1277 opts->inhibit_warnings = 1;
1278 break;
1279 case OPT_g: /* Silently ignore anything but -g3 */
1280 if (!strcmp(&argv[i][2], "3"))
1281 opts->debug_output = 1;
1282 break;
1283 case OPT_h:
1284 case OPT__help:
1285 print_help ();
1286 exit (0); /* XXX */
1287 break;
1288 case OPT__version:
1289 fprintf (stderr, _("GNU CPP version %s (cpplib)\n"), version_string);
1290 exit (0); /* XXX */
1291 break;
1292 case OPT_C:
1293 opts->discard_comments = 0;
1294 break;
1295 case OPT_P:
1296 opts->no_line_commands = 1;
1297 break;
1298 case OPT_dollar: /* Don't include $ in identifiers. */
1299 opts->dollars_in_ident = 0;
1300 break;
1301 case OPT_H:
1302 opts->print_include_names = 1;
1303 break;
1304 case OPT_D:
1305 new_pending_directive (opts, arg, cpp_define);
1306 break;
1307 case OPT_pedantic_errors:
1308 opts->pedantic_errors = 1;
1309 /* fall through */
1310 case OPT_pedantic:
1311 opts->pedantic = 1;
1312 break;
1313 case OPT_traditional:
1314 opts->traditional = 1;
1315 opts->cplusplus_comments = 0;
1316 opts->trigraphs = 0;
1317 opts->warn_trigraphs = 0;
1318 break;
1319 case OPT_trigraphs:
1320 opts->trigraphs = 1;
1321 break;
1322 case OPT_plus:
1323 opts->cplusplus = 1;
1324 opts->cplusplus_comments = 1;
1325 break;
1326 case OPT_remap:
1327 opts->remap = 1;
1328 break;
1329 case OPT_iprefix:
1330 opts->include_prefix = arg;
1331 opts->include_prefix_len = strlen (arg);
1332 break;
1333 case OPT_lang_c:
1334 opts->cplusplus = 0, opts->cplusplus_comments = 1;
1335 opts->c89 = 0, opts->c99 = 1, opts->objc = 0;
1336 break;
1337 case OPT_lang_c89:
1338 opts->cplusplus = 0, opts->cplusplus_comments = 0;
1339 opts->c89 = 1, opts->c99 = 0, opts->objc = 0;
1340 opts->trigraphs = 1;
1341 new_pending_directive (opts, "__STRICT_ANSI__", cpp_define);
1342 break;
1343 case OPT_lang_cplusplus:
1344 opts->cplusplus = 1, opts->cplusplus_comments = 1;
1345 opts->c89 = 0, opts->c99 = 0, opts->objc = 0;
1346 break;
1347 case OPT_lang_objc:
1348 case OPT_lang_objcplusplus:
1349 opts->cplusplus = opt_code == OPT_lang_objcplusplus;
1350 opts->cplusplus_comments = 1;
1351 opts->c89 = 0, opts->c99 = 0, opts->objc = 1;
1352 break;
1353 case OPT_lang_asm:
1354 opts->lang_asm = 1;
1355 break;
1356 case OPT_lang_fortran:
1357 opts->lang_fortran = 1, opts->cplusplus_comments = 0;
1358 break;
1359 case OPT_lang_chill:
1360 opts->objc = 0, opts->cplusplus = 0;
1361 opts->chill = 1, opts->traditional = 1;
1362 break;
1363 case OPT_nostdinc:
1364 /* -nostdinc causes no default include directories.
1365 You must specify all include-file directories with -I. */
1366 opts->no_standard_includes = 1;
1367 break;
1368 case OPT_nostdincplusplus:
1369 /* -nostdinc++ causes no default C++-specific include directories. */
1370 opts->no_standard_cplusplus_includes = 1;
1371 break;
1372 case OPT_std_gnu89:
1373 opts->cplusplus = 0, opts->cplusplus_comments = 1;
1374 opts->c89 = 1, opts->c99 = 0, opts->objc = 0;
1375 break;
1376 case OPT_std_gnu9x:
1377 case OPT_std_gnu99:
1378 opts->cplusplus = 0, opts->cplusplus_comments = 1;
1379 opts->c89 = 0, opts->c99 = 1, opts->objc = 0;
1380 new_pending_directive (opts, "__STDC_VERSION__=199901L", cpp_define);
1381 break;
1382 case OPT_std_iso9899_199409:
1383 new_pending_directive (opts, "__STDC_VERSION__=199409L", cpp_define);
1384 /* Fall through */
1385 case OPT_std_iso9899_1990:
1386 case OPT_std_c89:
1387 opts->cplusplus = 0, opts->cplusplus_comments = 0;
1388 opts->c89 = 1, opts->c99 = 0, opts->objc = 0;
1389 opts->trigraphs = 1;
1390 new_pending_directive (opts, "__STRICT_ANSI__", cpp_define);
1391 break;
1392 case OPT_std_iso9899_199x:
1393 case OPT_std_iso9899_1999:
1394 case OPT_std_c9x:
1395 case OPT_std_c99:
1396 opts->cplusplus = 0, opts->cplusplus_comments = 1;
1397 opts->c89 = 0, opts->c99 = 1, opts->objc = 0;
1398 opts->trigraphs = 1;
1399 new_pending_directive (opts, "__STRICT_ANSI__", cpp_define);
1400 new_pending_directive (opts, "__STDC_VERSION__=199901L", cpp_define);
1401 break;
1402 case OPT_o:
1403 if (opts->out_fname != NULL)
1404 {
1405 cpp_fatal (pfile, "Output filename specified twice");
1406 return argc;
1407 }
1408 opts->out_fname = arg;
1409 if (!strcmp (opts->out_fname, "-"))
1410 opts->out_fname = "";
1411 break;
1412 case OPT_v:
1413 fprintf (stderr, _("GNU CPP version %s (cpplib)\n"), version_string);
1414 #ifdef TARGET_VERSION
1415 TARGET_VERSION;
1416 #endif
1417 fputc ('\n', stderr);
1418 opts->verbose = 1;
1419 break;
1420 case OPT_stdin_stdout:
1421 /* JF handle '-' as file name meaning stdin or stdout */
1422 if (opts->in_fname == NULL)
1423 opts->in_fname = "";
1424 else if (opts->out_fname == NULL)
1425 opts->out_fname = "";
1426 break;
1427 case OPT_d:
1428 /* Args to -d specify what parts of macros to dump.
1429 Silently ignore unrecognised options; they may
1430 be aimed at the compiler proper. */
1431 {
1432 char c;
1433
1434 while ((c = *arg++) != '\0')
1435 switch (c)
1436 {
1437 case 'M':
1438 opts->dump_macros = dump_only;
1439 opts->no_output = 1;
1440 break;
1441 case 'N':
1442 opts->dump_macros = dump_names;
1443 break;
1444 case 'D':
1445 opts->dump_macros = dump_definitions;
1446 break;
1447 case 'I':
1448 opts->dump_includes = 1;
1449 break;
1450 }
1451 }
1452 break;
1453 /* The style of the choices here is a bit mixed.
1454 The chosen scheme is a hybrid of keeping all options in one string
1455 and specifying each option in a separate argument:
1456 -M|-MM|-MD file|-MMD file [-MG]. An alternative is:
1457 -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
1458 -M[M][G][D file]. This is awkward to handle in specs, and is not
1459 as extensible. */
1460 /* ??? -MG must be specified in addition to one of -M or -MM.
1461 This can be relaxed in the future without breaking anything.
1462 The converse isn't true. */
1463
1464 /* -MG isn't valid with -MD or -MMD. This is checked for later. */
1465 case OPT_MG:
1466 opts->print_deps_missing_files = 1;
1467 break;
1468 case OPT_M:
1469 case OPT_MD:
1470 case OPT_MM:
1471 case OPT_MMD:
1472 if (opt_code == OPT_M || opt_code == OPT_MD)
1473 opts->print_deps = 2;
1474 else
1475 opts->print_deps = 1;
1476
1477 /* For -MD and -MMD options, write deps on file named by next arg */
1478 /* For -M and -MM, write deps on standard output
1479 and suppress the usual output. */
1480 if (opt_code == OPT_MD || opt_code == OPT_MMD)
1481 opts->deps_file = arg;
1482 else
1483 opts->no_output = 1;
1484 break;
1485 case OPT_A:
1486 if (strcmp (arg, "-"))
1487 new_pending_directive (opts, arg, cpp_assert);
1488 else
1489 {
1490 /* -A- eliminates all predefined macros and assertions.
1491 Let's include also any that were specified earlier
1492 on the command line. That way we can get rid of any
1493 that were passed automatically in from GCC. */
1494 struct pending_option *o1, *o2;
1495
1496 o1 = opts->pending->directive_head;
1497 while (o1)
1498 {
1499 o2 = o1->next;
1500 free (o1);
1501 o1 = o2;
1502 }
1503 opts->pending->directive_head = NULL;
1504 opts->pending->directive_tail = NULL;
1505 }
1506 break;
1507 case OPT_U:
1508 new_pending_directive (opts, arg, cpp_undef);
1509 break;
1510 case OPT_I: /* Add directory to path for includes. */
1511 if (!strcmp (arg, "-"))
1512 {
1513 /* -I- means:
1514 Use the preceding -I directories for #include "..."
1515 but not #include <...>.
1516 Don't search the directory of the present file
1517 for #include "...". (Note that -I. -I- is not the same as
1518 the default setup; -I. uses the compiler's working dir.) */
1519 if (! opts->ignore_srcdir)
1520 {
1521 opts->ignore_srcdir = 1;
1522 opts->pending->quote_head = opts->pending->brack_head;
1523 opts->pending->quote_tail = opts->pending->brack_tail;
1524 opts->pending->brack_head = 0;
1525 opts->pending->brack_tail = 0;
1526 }
1527 else
1528 {
1529 cpp_fatal (pfile, "-I- specified twice");
1530 return argc;
1531 }
1532 }
1533 else
1534 append_include_chain (pfile, opts->pending,
1535 xstrdup (arg), BRACKET, 0);
1536 break;
1537 case OPT_isystem:
1538 /* Add directory to beginning of system include path, as a system
1539 include directory. */
1540 append_include_chain (pfile, opts->pending,
1541 xstrdup (arg), SYSTEM, 0);
1542 break;
1543 case OPT_include:
1544 {
1545 struct pending_option *o = (struct pending_option *)
1546 xmalloc (sizeof (struct pending_option));
1547 o->arg = arg;
1548
1549 /* This list has to be built in reverse order so that
1550 when cpp_start_read pushes all the -include files onto
1551 the buffer stack, they will be scanned in forward order. */
1552 o->next = opts->pending->include_head;
1553 opts->pending->include_head = o;
1554 }
1555 break;
1556 case OPT_imacros:
1557 {
1558 struct pending_option *o = (struct pending_option *)
1559 xmalloc (sizeof (struct pending_option));
1560 o->arg = arg;
1561 o->next = NULL;
1562
1563 APPEND (opts->pending, imacros, o);
1564 }
1565 break;
1566 case OPT_iwithprefix:
1567 /* Add directory to end of path for includes,
1568 with the default prefix at the front of its name. */
1569 /* fall through */
1570 case OPT_iwithprefixbefore:
1571 /* Add directory to main path for includes,
1572 with the default prefix at the front of its name. */
1573 {
1574 char *fname;
1575 int len;
1576
1577 len = strlen (arg);
1578
1579 if (opts->include_prefix != 0)
1580 {
1581 fname = xmalloc (opts->include_prefix_len + len + 1);
1582 memcpy (fname, opts->include_prefix, opts->include_prefix_len);
1583 memcpy (fname + opts->include_prefix_len, arg, len + 1);
1584 }
1585 else
1586 {
1587 fname = xmalloc (sizeof GCC_INCLUDE_DIR - 8 + len);
1588 memcpy (fname, GCC_INCLUDE_DIR, sizeof GCC_INCLUDE_DIR - 9);
1589 memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, arg, len + 1);
1590 }
1591
1592 append_include_chain (pfile, opts->pending, fname,
1593 opt_code == OPT_iwithprefix ? SYSTEM: BRACKET, 0);
1594 }
1595 break;
1596 case OPT_idirafter:
1597 /* Add directory to end of path for includes. */
1598 append_include_chain (pfile, opts->pending,
1599 xstrdup (arg), AFTER, 0);
1600 break;
1601 case OPT_W:
1602 /* Silently ignore unrecognised options */
1603 if (!strcmp (argv[i], "-Wall"))
1604 {
1605 opts->warn_trigraphs = 1;
1606 opts->warn_comments = 1;
1607 }
1608 else if (!strcmp (argv[i], "-Wtraditional"))
1609 opts->warn_stringify = 1;
1610 else if (!strcmp (argv[i], "-Wtrigraphs"))
1611 opts->warn_trigraphs = 1;
1612 else if (!strcmp (argv[i], "-Wcomment"))
1613 opts->warn_comments = 1;
1614 else if (!strcmp (argv[i], "-Wcomments"))
1615 opts->warn_comments = 1;
1616 else if (!strcmp (argv[i], "-Wundef"))
1617 opts->warn_undef = 1;
1618 else if (!strcmp (argv[i], "-Wimport"))
1619 opts->warn_import = 1;
1620 else if (!strcmp (argv[i], "-Werror"))
1621 opts->warnings_are_errors = 1;
1622 else if (!strcmp (argv[i], "-Wno-traditional"))
1623 opts->warn_stringify = 0;
1624 else if (!strcmp (argv[i], "-Wno-trigraphs"))
1625 opts->warn_trigraphs = 0;
1626 else if (!strcmp (argv[i], "-Wno-comment"))
1627 opts->warn_comments = 0;
1628 else if (!strcmp (argv[i], "-Wno-comments"))
1629 opts->warn_comments = 0;
1630 else if (!strcmp (argv[i], "-Wno-undef"))
1631 opts->warn_undef = 0;
1632 else if (!strcmp (argv[i], "-Wno-import"))
1633 opts->warn_import = 0;
1634 else if (!strcmp (argv[i], "-Wno-error"))
1635 opts->warnings_are_errors = 0;
1636 break;
1637 }
1638 }
1639 return i + 1;
1640 }
1641
1642 #ifdef HOST_EBCDIC
1643 static int
1644 opt_comp (const void *p1, const void *p2)
1645 {
1646 return strcmp (((struct cl_option *)p1)->opt_text,
1647 ((struct cl_option *)p2)->opt_text);
1648 }
1649 #endif
1650
1651 /* Handle command-line options in (argc, argv).
1652 Can be called multiple times, to handle multiple sets of options.
1653 Returns if an unrecognized option is seen.
1654 Returns number of strings consumed. */
1655 int
1656 cpp_handle_options (pfile, argc, argv)
1657 cpp_reader *pfile;
1658 int argc;
1659 char **argv;
1660 {
1661 int i;
1662 int strings_processed;
1663
1664 #ifdef HOST_EBCDIC
1665 static int opts_sorted = 0;
1666
1667 if (!opts_sorted)
1668 {
1669 opts_sorted = 1;
1670 /* For non-ASCII hosts, the array needs to be sorted at runtime */
1671 qsort (cl_options, N_OPTS, sizeof (struct cl_option), opt_comp);
1672 }
1673 #endif
1674
1675 for (i = 0; i < argc; i += strings_processed)
1676 {
1677 strings_processed = handle_option (pfile, argc - i, argv + i);
1678 if (strings_processed == 0)
1679 break;
1680 }
1681 return i;
1682 }
1683
1684 static void
1685 print_help ()
1686 {
1687 fprintf (stderr, _("Usage: %s [switches] input output\n"), progname);
1688 fputs (_("\
1689 Switches:\n\
1690 -include <file> Include the contents of <file> before other files\n\
1691 -imacros <file> Accept definition of macros in <file>\n\
1692 -iprefix <path> Specify <path> as a prefix for next two options\n\
1693 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1694 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1695 -isystem <dir> Add <dir> to the start of the system include path\n\
1696 -idirafter <dir> Add <dir> to the end of the system include path\n\
1697 -I <dir> Add <dir> to the end of the main include path\n\
1698 -I- Fine-grained include path control; see info docs\n\
1699 -nostdinc Do not search system include directories\n\
1700 (dirs specified with -isystem will still be used)\n\
1701 -nostdinc++ Do not search system include directories for C++\n\
1702 -o <file> Put output into <file>\n\
1703 -pedantic Issue all warnings demanded by strict ANSI C\n\
1704 -pedantic-errors Issue -pedantic warnings as errors instead\n\
1705 -traditional Follow K&R pre-processor behaviour\n\
1706 -trigraphs Support ANSI C trigraphs\n\
1707 -lang-c Assume that the input sources are in C\n\
1708 -lang-c89 Assume that the input sources are in C89\n\
1709 -lang-c++ Assume that the input sources are in C++\n\
1710 -lang-objc Assume that the input sources are in ObjectiveC\n\
1711 -lang-objc++ Assume that the input sources are in ObjectiveC++\n\
1712 -lang-asm Assume that the input sources are in assembler\n\
1713 -lang-fortran Assume that the input sources are in Fortran\n\
1714 -lang-chill Assume that the input sources are in Chill\n\
1715 -std=<std name> Specify the conformance standard; one of:\n\
1716 gnu89, gnu99, c89, c99, iso9899:1990,\n\
1717 iso9899:199409, iso9899:1999\n\
1718 -+ Allow parsing of C++ style features\n\
1719 -w Inhibit warning messages\n\
1720 -Wtrigraphs Warn if trigraphs are encountered\n\
1721 -Wno-trigraphs Do not warn about trigraphs\n\
1722 -Wcomment{s} Warn if one comment starts inside another\n\
1723 -Wno-comment{s} Do not warn about comments\n\
1724 -Wtraditional Warn if a macro argument is/would be turned into\n\
1725 a string if -traditional is specified\n\
1726 -Wno-traditional Do not warn about stringification\n\
1727 -Wundef Warn if an undefined macro is used by #if\n\
1728 -Wno-undef Do not warn about testing undefined macros\n\
1729 -Wimport Warn about the use of the #import directive\n\
1730 -Wno-import Do not warn about the use of #import\n\
1731 -Werror Treat all warnings as errors\n\
1732 -Wno-error Do not treat warnings as errors\n\
1733 -Wall Enable all preprocessor warnings\n\
1734 -M Generate make dependencies\n\
1735 -MM As -M, but ignore system header files\n\
1736 -MD As -M, but put output in a .d file\n\
1737 -MMD As -MD, but ignore system header files\n\
1738 -MG Treat missing header file as generated files\n\
1739 -g3 Include #define and #undef directives in the output\n\
1740 -D<macro> Define a <macro> with string '1' as its value\n\
1741 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1742 -A<question> (<answer>) Assert the <answer> to <question>\n\
1743 -U<macro> Undefine <macro> \n\
1744 -v Display the version number\n\
1745 -H Print the name of header files as they are used\n\
1746 -C Do not discard comments\n\
1747 -dM Display a list of macro definitions active at end\n\
1748 -dD Preserve macro definitions in output\n\
1749 -dN As -dD except that only the names are preserved\n\
1750 -dI Include #include directives in the output\n\
1751 -P Do not generate #line directives\n\
1752 -$ Do not allow '$' in identifiers\n\
1753 -remap Remap file names when including files.\n\
1754 --version Display version information\n\
1755 -h or --help Display this information\n\
1756 "), stdout);
1757 }