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