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
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
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.
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. */
31 /* XXX Should be in a header file. */
32 extern char *version_string;
34 /* Predefined symbols, built-in macros, and the default include path. */
36 #ifndef GET_ENV_PATH_LIST
37 #define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0)
40 /* By default, colon separates directories in a path. */
41 #ifndef PATH_SEPARATOR
42 #define PATH_SEPARATOR ':'
45 #ifndef STANDARD_INCLUDE_DIR
46 #define STANDARD_INCLUDE_DIR "/usr/include"
49 /* We let tm.h override the types used here, to handle trivial differences
50 such as the choice of unsigned int or long unsigned int for size_t.
51 When machines start needing nontrivial differences in the size type,
52 it would be best to do something here to figure out automatically
53 from other information what type to use. */
55 /* The string value for __SIZE_TYPE__. */
58 #define SIZE_TYPE "long unsigned int"
61 /* The string value for __PTRDIFF_TYPE__. */
64 #define PTRDIFF_TYPE "long int"
67 /* The string value for __WCHAR_TYPE__. */
70 #define WCHAR_TYPE "int"
72 #define CPP_WCHAR_TYPE(PFILE) \
73 (CPP_OPTIONS (PFILE)->cplusplus ? "__wchar_t" : WCHAR_TYPE)
75 /* The string value for __USER_LABEL_PREFIX__ */
77 #ifndef USER_LABEL_PREFIX
78 #define USER_LABEL_PREFIX ""
81 /* The string value for __REGISTER_PREFIX__ */
83 #ifndef REGISTER_PREFIX
84 #define REGISTER_PREFIX ""
87 /* Suffix for object files, and known input-file extensions. */
88 static const char * const known_suffixes[] =
90 ".c", ".C", ".s", ".S", ".m",
91 ".cc", ".cxx", ".cpp", ".cp", ".c++",
97 # define OBJECT_SUFFIX ".obj"
99 # define OBJECT_SUFFIX ".o"
104 /* This is the default list of directories to search for include files.
105 It may be overridden by the various -I and -ixxx options.
107 #include "file" looks in the same directory as the current file,
109 #include <file> just looks in this list.
111 All these directories are treated as `system' include directories
112 (they are not subject to pedantic warnings in some cases). */
114 static struct default_include
116 const char *fname; /* The name of the directory. */
117 const char *component; /* The component containing the directory
118 (see update_path in prefix.c) */
119 int cplusplus; /* Only look here if we're compiling C++. */
120 int cxx_aware; /* Includes in this directory don't need to
121 be wrapped in extern "C" when compiling
122 C++. This is not used anymore. */
124 include_defaults_array[]
125 #ifdef INCLUDE_DEFAULTS
129 /* Pick up GNU C++ specific include files. */
130 { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },
132 /* This is the dir for fixincludes. Put it just before
133 the files that we fix. */
134 { GCC_INCLUDE_DIR, "GCC", 0, 0 },
135 /* For cross-compilation, this dir name is generated
136 automatically in Makefile.in. */
137 { CROSS_INCLUDE_DIR, "GCC", 0, 0 },
138 #ifdef TOOL_INCLUDE_DIR
139 /* This is another place that the target system's headers might be. */
140 { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 },
142 #else /* not CROSS_COMPILE */
143 #ifdef LOCAL_INCLUDE_DIR
144 /* This should be /usr/local/include and should come before
145 the fixincludes-fixed header files. */
146 { LOCAL_INCLUDE_DIR, 0, 0, 1 },
148 #ifdef TOOL_INCLUDE_DIR
149 /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
150 Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h. */
151 { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 },
153 /* This is the dir for fixincludes. Put it just before
154 the files that we fix. */
155 { GCC_INCLUDE_DIR, "GCC", 0, 0 },
156 /* Some systems have an extra dir of include files. */
157 #ifdef SYSTEM_INCLUDE_DIR
158 { SYSTEM_INCLUDE_DIR, 0, 0, 0 },
160 #ifndef STANDARD_INCLUDE_COMPONENT
161 #define STANDARD_INCLUDE_COMPONENT 0
163 { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0 },
164 #endif /* not CROSS_COMPILE */
167 #endif /* no INCLUDE_DEFAULTS */
169 /* Internal structures and prototypes. */
171 /* A `struct pending_option' remembers one -D, -A, -U, -include, or -imacros
172 switch. There are four lists: one for -D and -U, one for -A, one
173 for -include, one for -imacros. `undef' is set for -U, clear for
174 -D, ignored for the others.
175 (Future: add an equivalent of -U for -A) */
176 struct pending_option
178 struct pending_option *next;
184 #define APPEND(pend, list, elt) \
185 do { if (!(pend)->list##_head) (pend)->list##_head = (elt); \
186 else (pend)->list##_tail->next = (elt); \
187 (pend)->list##_tail = (elt); \
190 #define APPEND(pend, list, elt) \
191 do { if (!(pend)->list/**/_head) (pend)->list/**/_head = (elt); \
192 else (pend)->list/**/_tail->next = (elt); \
193 (pend)->list/**/_tail = (elt); \
197 static void initialize_char_syntax PARAMS ((int));
198 static void print_help PARAMS ((void));
199 static void path_include PARAMS ((cpp_reader *,
200 struct cpp_pending *,
202 static void initialize_builtins PARAMS ((cpp_reader *));
203 static void append_include_chain PARAMS ((cpp_reader *,
204 struct cpp_pending *,
206 static char *base_name PARAMS ((const char *));
207 static void dump_special_to_buffer PARAMS ((cpp_reader *, const char *));
208 static void initialize_dependency_output PARAMS ((cpp_reader *));
210 /* Last argument to append_include_chain: chain to use */
211 enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
213 /* If gcc is in use (stage2/stage3) we can make these tables initialized
215 #if defined __GNUC__ && (__GNUC__ > 2 \
216 || (__GNUC__ == 2 && __GNUC_MINOR__ > 6))
217 /* Table to tell if a character is legal as the second or later character
218 of a C identifier. */
219 U_CHAR is_idchar[256] =
221 ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1,
222 ['g'] = 1, ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1,
223 ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1,
224 ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1,
225 ['y'] = 1, ['z'] = 1,
227 ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1,
228 ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1,
229 ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1,
230 ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1,
231 ['Y'] = 1, ['Z'] = 1,
233 ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1,
234 ['7'] = 1, ['8'] = 1, ['9'] = 1, ['0'] = 1,
239 /* Table to tell if a character is legal as the first character of
241 U_CHAR is_idstart[256] =
243 ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1,
244 ['g'] = 1, ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1,
245 ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1,
246 ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1,
247 ['y'] = 1, ['z'] = 1,
249 ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1,
250 ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1,
251 ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1,
252 ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1,
253 ['Y'] = 1, ['Z'] = 1,
258 /* Table to tell if a character is horizontal space.
259 \r is magical, so it is not in here. */
260 U_CHAR is_hor_space[256] =
262 [' '] = 1, ['\t'] = 1, ['\v'] = 1, ['\f'] = 1,
264 /* table to tell if a character is horizontal or vertical space. */
265 U_CHAR is_space[256] =
267 [' '] = 1, ['\t'] = 1, ['\v'] = 1, ['\f'] = 1, ['\n'] = 1,
269 /* Table to handle trigraph conversion, which occurs before all other
270 processing, everywhere in the file. (This is necessary since one
271 of the trigraphs encodes backslash.) Note it's off by default.
273 from to from to from to
278 There is not a space between the ?? and the third char. I put spaces
279 there to avoid warnings when compiling this file. */
280 U_CHAR trigraph_table[256] =
282 ['='] = '#', [')'] = ']', ['!'] = '|',
283 ['('] = '[', ['\''] = '^', ['>'] = '}',
284 ['/'] = '\\', ['<'] = '{', ['-'] = '~',
287 /* This function will be entirely removed soon. */
289 initialize_char_syntax (dollar_in_ident)
292 is_idchar['$'] = dollar_in_ident;
293 is_idstart['$'] = dollar_in_ident;
298 U_CHAR is_idchar[256] = { 0 };
299 U_CHAR is_idstart[256] = { 0 };
300 U_CHAR is_hor_space[256] = { 0 };
301 U_CHAR is_space[256] = { 0 };
302 U_CHAR trigraph_table[256] = { 0 };
304 /* Initialize syntactic classifications of characters. */
306 initialize_char_syntax (dollar_in_ident)
309 is_idstart['a'] = 1; is_idstart['b'] = 1; is_idstart['c'] = 1;
310 is_idstart['d'] = 1; is_idstart['e'] = 1; is_idstart['f'] = 1;
311 is_idstart['g'] = 1; is_idstart['h'] = 1; is_idstart['i'] = 1;
312 is_idstart['j'] = 1; is_idstart['k'] = 1; is_idstart['l'] = 1;
313 is_idstart['m'] = 1; is_idstart['n'] = 1; is_idstart['o'] = 1;
314 is_idstart['p'] = 1; is_idstart['q'] = 1; is_idstart['r'] = 1;
315 is_idstart['s'] = 1; is_idstart['t'] = 1; is_idstart['u'] = 1;
316 is_idstart['v'] = 1; is_idstart['w'] = 1; is_idstart['x'] = 1;
317 is_idstart['y'] = 1; is_idstart['z'] = 1;
319 is_idstart['A'] = 1; is_idstart['B'] = 1; is_idstart['C'] = 1;
320 is_idstart['D'] = 1; is_idstart['E'] = 1; is_idstart['F'] = 1;
321 is_idstart['G'] = 1; is_idstart['H'] = 1; is_idstart['I'] = 1;
322 is_idstart['J'] = 1; is_idstart['K'] = 1; is_idstart['L'] = 1;
323 is_idstart['M'] = 1; is_idstart['N'] = 1; is_idstart['O'] = 1;
324 is_idstart['P'] = 1; is_idstart['Q'] = 1; is_idstart['R'] = 1;
325 is_idstart['S'] = 1; is_idstart['T'] = 1; is_idstart['U'] = 1;
326 is_idstart['V'] = 1; is_idstart['W'] = 1; is_idstart['X'] = 1;
327 is_idstart['Y'] = 1; is_idstart['Z'] = 1;
331 is_idchar['a'] = 1; is_idchar['b'] = 1; is_idchar['c'] = 1;
332 is_idchar['d'] = 1; is_idchar['e'] = 1; is_idchar['f'] = 1;
333 is_idchar['g'] = 1; is_idchar['h'] = 1; is_idchar['i'] = 1;
334 is_idchar['j'] = 1; is_idchar['k'] = 1; is_idchar['l'] = 1;
335 is_idchar['m'] = 1; is_idchar['n'] = 1; is_idchar['o'] = 1;
336 is_idchar['p'] = 1; is_idchar['q'] = 1; is_idchar['r'] = 1;
337 is_idchar['s'] = 1; is_idchar['t'] = 1; is_idchar['u'] = 1;
338 is_idchar['v'] = 1; is_idchar['w'] = 1; is_idchar['x'] = 1;
339 is_idchar['y'] = 1; is_idchar['z'] = 1;
341 is_idchar['A'] = 1; is_idchar['B'] = 1; is_idchar['C'] = 1;
342 is_idchar['D'] = 1; is_idchar['E'] = 1; is_idchar['F'] = 1;
343 is_idchar['G'] = 1; is_idchar['H'] = 1; is_idchar['I'] = 1;
344 is_idchar['J'] = 1; is_idchar['K'] = 1; is_idchar['L'] = 1;
345 is_idchar['M'] = 1; is_idchar['N'] = 1; is_idchar['O'] = 1;
346 is_idchar['P'] = 1; is_idchar['Q'] = 1; is_idchar['R'] = 1;
347 is_idchar['S'] = 1; is_idchar['T'] = 1; is_idchar['U'] = 1;
348 is_idchar['V'] = 1; is_idchar['W'] = 1; is_idchar['X'] = 1;
349 is_idchar['Y'] = 1; is_idchar['Z'] = 1;
351 is_idchar['1'] = 1; is_idchar['2'] = 1; is_idchar['3'] = 1;
352 is_idchar['4'] = 1; is_idchar['5'] = 1; is_idchar['6'] = 1;
353 is_idchar['7'] = 1; is_idchar['8'] = 1; is_idchar['9'] = 1;
358 is_idchar['$'] = dollar_in_ident;
359 is_idstart['$'] = dollar_in_ident;
361 /* white space tables */
362 is_hor_space[' '] = 1;
363 is_hor_space['\t'] = 1;
364 is_hor_space['\v'] = 1;
365 is_hor_space['\f'] = 1;
373 /* trigraph conversion */
374 trigraph_table['='] = '#'; trigraph_table[')'] = ']';
375 trigraph_table['!'] = '|'; trigraph_table['('] = '[';
376 trigraph_table['\''] = '^'; trigraph_table['>'] = '}';
377 trigraph_table['/'] = '\\'; trigraph_table['<'] = '{';
378 trigraph_table['-'] = '~';
381 #endif /* Not GCC. */
383 /* Given a colon-separated list of file names PATH,
384 add all the names to the search path for include files. */
387 path_include (pfile, pend, list, path)
389 struct cpp_pending *pend;
399 /* Find the end of this name. */
401 while (*q != 0 && *q != PATH_SEPARATOR) q++;
404 /* An empty name in the path stands for the current directory. */
405 name = (char *) xmalloc (2);
411 /* Otherwise use the directory that is named. */
412 name = (char *) xmalloc (q - p + 1);
413 memcpy (name, p, q - p);
417 append_include_chain (pfile, pend, name, path);
419 /* Advance past this name. */
427 /* Find the base name of a (partial) pathname FNAME.
428 Returns a pointer into the string passed in.
429 Accepts Unix (/-separated) paths on all systems,
430 DOS and VMS paths on those systems. */
435 char *s = (char *)fname;
437 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
438 if (ISALPHA (s[0]) && s[1] == ':') s += 2;
439 if ((p = rindex (s, '\\'))) s = p + 1;
441 if ((p = rindex (s, ':'))) s = p + 1; /* Skip device. */
442 if ((p = rindex (s, ']'))) s = p + 1; /* Skip directory. */
443 if ((p = rindex (s, '>'))) s = p + 1; /* Skip alternate (int'n'l) dir. */
445 if ((p = rindex (s, '/'))) s = p + 1;
450 /* Append DIR to include path PATH. DIR must be permanently allocated
453 append_include_chain (pfile, pend, dir, path)
455 struct cpp_pending *pend;
459 struct file_name_list *new;
463 simplify_pathname (dir);
466 /* Dirs that don't exist are silently ignored. */
468 cpp_perror_with_name (pfile, dir);
469 else if (CPP_OPTIONS (pfile)->verbose)
470 cpp_notice ("ignoring nonexistent directory `%s'\n", dir);
474 if (!S_ISDIR (st.st_mode))
476 cpp_message (pfile, 1, "%s: %s: Not a directory", progname, dir);
481 if (len > pfile->max_include_len)
482 pfile->max_include_len = len;
484 new = (struct file_name_list *)xmalloc (sizeof (struct file_name_list));
487 new->ino = st.st_ino;
488 new->dev = st.st_dev;
489 new->sysp = (path == SYSTEM);
490 new->name_map = NULL;
496 case QUOTE: APPEND (pend, quote, new); break;
497 case BRACKET: APPEND (pend, brack, new); break;
498 case SYSTEM: APPEND (pend, systm, new); break;
499 case AFTER: APPEND (pend, after, new); break;
504 /* Write out a #define command for the special named MACRO_NAME
505 to PFILE's token_buffer. */
508 dump_special_to_buffer (pfile, macro_name)
510 const char *macro_name;
512 static char define_directive[] = "#define ";
513 int macro_name_length = strlen (macro_name);
514 output_line_command (pfile, same_file);
515 CPP_RESERVE (pfile, sizeof(define_directive) + macro_name_length);
516 CPP_PUTS_Q (pfile, define_directive, sizeof(define_directive)-1);
517 CPP_PUTS_Q (pfile, macro_name, macro_name_length);
518 CPP_PUTC_Q (pfile, ' ');
519 cpp_expand_to_buffer (pfile, macro_name, macro_name_length);
520 CPP_PUTC (pfile, '\n');
523 /* Initialize a cpp_options structure. */
525 cpp_options_init (opts)
528 bzero ((char *) opts, sizeof (struct cpp_options));
530 opts->dollars_in_ident = 1;
531 opts->cplusplus_comments = 1;
532 opts->warn_import = 1;
535 (struct cpp_pending *) xcalloc (1, sizeof (struct cpp_pending));
538 /* Initialize a cpp_reader structure. */
540 cpp_reader_init (pfile)
543 bzero ((char *) pfile, sizeof (cpp_reader));
545 pfile->get_token = cpp_get_token;
548 pfile->token_buffer_size = 200;
549 pfile->token_buffer = (U_CHAR *) xmalloc (pfile->token_buffer_size);
550 CPP_SET_WRITTEN (pfile, 0);
552 pfile->hashtab = (HASHNODE **) xcalloc (HASHSIZE, sizeof (HASHNODE *));
555 /* Free resources used by PFILE.
556 This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology). */
562 while (CPP_BUFFER (pfile) != CPP_NULL_BUFFER (pfile))
563 cpp_pop_buffer (pfile);
565 if (pfile->token_buffer)
567 free (pfile->token_buffer);
568 pfile->token_buffer = NULL;
571 if (pfile->deps_buffer)
573 free (pfile->deps_buffer);
574 pfile->deps_buffer = NULL;
575 pfile->deps_allocated_size = 0;
578 if (pfile->input_buffer)
580 free (pfile->input_buffer);
581 free (pfile->input_speccase);
582 pfile->input_buffer = pfile->input_speccase = NULL;
583 pfile->input_buffer_len = 0;
586 while (pfile->if_stack)
588 IF_STACK_FRAME *temp = pfile->if_stack;
589 pfile->if_stack = temp->next;
593 for (i = ALL_INCLUDE_HASHSIZE; --i >= 0; )
595 struct include_hash *imp = pfile->all_include_files[i];
598 struct include_hash *next = imp->next;
600 /* This gets freed elsewhere - I think. */
606 pfile->all_include_files[i] = 0;
609 for (i = HASHSIZE; --i >= 0;)
611 while (pfile->hashtab[i])
612 delete_macro (pfile->hashtab[i]);
614 free (pfile->hashtab);
618 /* Initialize the built-in macros. */
620 initialize_builtins (pfile)
623 #define NAME(str) (const U_CHAR *)str, sizeof str - 1
624 cpp_install (pfile, NAME("__TIME__"), T_TIME, 0, -1);
625 cpp_install (pfile, NAME("__DATE__"), T_DATE, 0, -1);
626 cpp_install (pfile, NAME("__FILE__"), T_FILE, 0, -1);
627 cpp_install (pfile, NAME("__BASE_FILE__"), T_BASE_FILE, 0, -1);
628 cpp_install (pfile, NAME("__LINE__"), T_SPECLINE, 0, -1);
629 cpp_install (pfile, NAME("__INCLUDE_LEVEL__"), T_INCLUDE_LEVEL, 0, -1);
630 cpp_install (pfile, NAME("__VERSION__"), T_VERSION, 0, -1);
631 #ifndef NO_BUILTIN_SIZE_TYPE
632 cpp_install (pfile, NAME("__SIZE_TYPE__"), T_CONST, SIZE_TYPE, -1);
634 #ifndef NO_BUILTIN_PTRDIFF_TYPE
635 cpp_install (pfile, NAME("__PTRDIFF_TYPE__ "), T_CONST, PTRDIFF_TYPE, -1);
637 cpp_install (pfile, NAME("__WCHAR_TYPE__"), T_CONST, WCHAR_TYPE, -1);
638 cpp_install (pfile, NAME("__USER_LABEL_PREFIX__"), T_CONST, user_label_prefix, -1);
639 cpp_install (pfile, NAME("__REGISTER_PREFIX__"), T_CONST, REGISTER_PREFIX, -1);
640 cpp_install (pfile, NAME("__HAVE_BUILTIN_SETJMP__"), T_CONST, "1", -1);
641 if (!CPP_TRADITIONAL (pfile))
643 cpp_install (pfile, NAME("__STDC__"), T_STDC, 0, -1);
645 if (CPP_OPTIONS (pfile)->c9x)
646 cpp_install (pfile, NAME("__STDC_VERSION__"),T_CONST, "199909L", -1);
649 cpp_install (pfile, NAME("__STDC_VERSION__"),T_CONST, "199409L", -1);
653 if (CPP_OPTIONS (pfile)->debug_output)
655 dump_special_to_buffer (pfile, "__BASE_FILE__");
656 dump_special_to_buffer (pfile, "__VERSION__");
657 #ifndef NO_BUILTIN_SIZE_TYPE
658 dump_special_to_buffer (pfile, "__SIZE_TYPE__");
660 #ifndef NO_BUILTIN_PTRDIFF_TYPE
661 dump_special_to_buffer (pfile, "__PTRDIFF_TYPE__");
663 dump_special_to_buffer (pfile, "__WCHAR_TYPE__");
664 dump_special_to_buffer (pfile, "__DATE__");
665 dump_special_to_buffer (pfile, "__TIME__");
666 if (!CPP_TRADITIONAL (pfile))
667 dump_special_to_buffer (pfile, "__STDC__");
671 /* Another subroutine of cpp_start_read. This one sets up to do
672 dependency-file output. */
674 initialize_dependency_output (pfile)
677 cpp_options *opts = CPP_OPTIONS (pfile);
678 char *spec, *s, *output_file;
680 /* Either of two environment variables can specify output of deps.
681 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
682 where OUTPUT_FILE is the file to write deps info to
683 and DEPS_TARGET is the target to mention in the deps. */
685 if (opts->print_deps == 0)
687 spec = getenv ("DEPENDENCIES_OUTPUT");
689 opts->print_deps = 1;
692 spec = getenv ("SUNPRO_DEPENDENCIES");
694 opts->print_deps = 2;
699 /* Find the space before the DEPS_TARGET, if there is one. */
700 s = strchr (spec, ' ');
703 opts->deps_target = s + 1;
704 output_file = (char *) xmalloc (s - spec + 1);
705 memcpy (output_file, spec, s - spec);
706 output_file[s - spec] = 0;
710 opts->deps_target = 0;
714 opts->deps_file = output_file;
715 opts->print_deps_append = 1;
718 /* Print the expected object file name as the target of this Make-rule. */
719 pfile->deps_allocated_size = 200;
720 pfile->deps_buffer = (char *) xmalloc (pfile->deps_allocated_size);
721 pfile->deps_buffer[0] = 0;
722 pfile->deps_size = 0;
723 pfile->deps_column = 0;
725 if (opts->deps_target)
726 deps_output (pfile, opts->deps_target, ':');
727 else if (*opts->in_fname == 0)
728 deps_output (pfile, "-", ':');
734 /* Discard all directory prefixes from filename. */
735 q = base_name (opts->in_fname);
737 /* Copy remainder to mungable area. */
739 p = (char *) alloca (len + 8);
742 /* Output P, but remove known suffixes. */
744 /* Point to the filename suffix. */
746 /* Compare against the known suffixes. */
747 for (x = 0; known_suffixes[x]; x++)
749 if (strncmp (known_suffixes[x], r, q - r) == 0)
751 /* Make q point to the bit we're going to overwrite
752 with an object suffix. */
758 /* Supply our own suffix. */
759 strcpy (q, OBJECT_SUFFIX);
761 deps_output (pfile, p, ':');
762 deps_output (pfile, opts->in_fname, ' ');
766 /* This is called after options have been processed.
767 * Check options for consistency, and setup for processing input
768 * from the file named FNAME. (Use standard input if FNAME==NULL.)
769 * Return 1 on success, 0 on failure.
773 cpp_start_read (pfile, fname)
777 struct cpp_options *opts = CPP_OPTIONS (pfile);
778 struct pending_option *p, *q;
781 struct include_hash *ih_fake;
783 /* -MG doesn't select the form of output and must be specified with one of
784 -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't
785 inhibit compilation. */
786 if (opts->print_deps_missing_files
787 && (opts->print_deps == 0 || !opts->no_output))
789 cpp_fatal (pfile, "-MG must be specified with one of -M or -MM");
793 /* Chill should not be used with -trigraphs. */
794 if (opts->chill && opts->trigraphs)
796 cpp_warning (pfile, "-lang-chill and -trigraphs are mutually exclusive");
800 /* Set this if it hasn't been set already. */
801 if (user_label_prefix == NULL)
802 user_label_prefix = USER_LABEL_PREFIX;
804 /* Now that we know dollars_in_ident, we can initialize the syntax
806 initialize_char_syntax (opts->dollars_in_ident);
808 /* Do partial setup of input buffer for the sake of generating
809 early #line directives (when -g is in effect). */
810 fp = cpp_push_buffer (pfile, NULL, 0);
813 if (opts->in_fname == NULL || *opts->in_fname == 0)
815 opts->in_fname = fname;
816 if (opts->in_fname == NULL)
819 fp->nominal_fname = fp->fname = opts->in_fname;
822 /* Install __LINE__, etc. Must follow initialize_char_syntax
823 and option processing. */
824 initialize_builtins (pfile);
826 /* Do -U's, -D's and -A's in the order they were seen. */
827 p = opts->pending->define_head;
830 if (opts->debug_output)
831 output_line_command (pfile, same_file);
833 cpp_undef (pfile, p->arg);
835 cpp_define (pfile, p->arg);
842 p = opts->pending->assert_head;
845 if (opts->debug_output)
846 output_line_command (pfile, same_file);
848 cpp_unassert (pfile, p->arg);
850 cpp_assert (pfile, p->arg);
857 opts->done_initializing = 1;
859 /* Several environment variables may add to the include search path.
860 CPATH specifies an additional list of directories to be searched
861 as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH,
862 etc. specify an additional list of directories to be searched as
863 if specified with -isystem, for the language indicated.
865 These variables are ignored if -nostdinc is on. */
866 if (! opts->no_standard_includes)
869 GET_ENV_PATH_LIST (path, "CPATH");
870 if (path != 0 && *path != 0)
871 path_include (pfile, opts->pending, path, BRACKET);
873 switch ((opts->objc << 1) + opts->cplusplus)
876 GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH");
879 GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH");
882 GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH");
885 GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH");
888 if (path != 0 && *path != 0)
889 path_include (pfile, opts->pending, path, SYSTEM);
892 /* Unless -nostdinc, add the compiled-in include path to the list,
893 translating prefixes. */
894 if (!opts->no_standard_includes)
896 struct default_include *p = include_defaults_array;
897 char *specd_prefix = opts->include_prefix;
899 /* Search "translated" versions of GNU directories.
900 These have /usr/local/lib/gcc... replaced by specd_prefix. */
901 if (specd_prefix != 0)
903 char *default_prefix = alloca (sizeof GCC_INCLUDE_DIR - 7);
904 /* Remove the `include' from /usr/local/lib/gcc.../include.
905 GCC_INCLUDE_DIR will always end in /include. */
906 int default_len = sizeof GCC_INCLUDE_DIR - 8;
907 int specd_len = strlen (specd_prefix);
909 default_len = sizeof GCC_INCLUDE_DIR - 8;
910 memcpy (default_prefix, GCC_INCLUDE_DIR, default_len);
911 default_prefix[default_len] = '\0';
913 for (p = include_defaults_array; p->fname; p++)
915 /* Some standard dirs are only for C++. */
918 && !opts->no_standard_cplusplus_includes))
920 /* Does this dir start with the prefix? */
921 if (!strncmp (p->fname, default_prefix, default_len))
923 /* Yes; change prefix and add to search list. */
924 int flen = strlen (p->fname);
925 int this_len = specd_len + flen - default_len;
926 char *str = (char *) xmalloc (this_len + 1);
927 memcpy (str, specd_prefix, specd_len);
928 memcpy (str + specd_len,
929 p->fname + default_len,
930 flen - default_len + 1);
932 append_include_chain (pfile, opts->pending,
939 /* Search ordinary names for GNU include directories. */
940 for (p = include_defaults_array; p->fname; p++)
942 /* Some standard dirs are only for C++. */
945 && !opts->no_standard_cplusplus_includes))
947 /* XXX Potential memory leak! */
948 char *str = xstrdup (update_path (p->fname, p->component));
949 append_include_chain (pfile, opts->pending, str, SYSTEM);
954 merge_include_chains (opts);
956 /* With -v, print the list of dirs to search. */
959 struct file_name_list *p;
960 cpp_message (pfile, -1, "#include \"...\" search starts here:\n");
961 for (p = opts->quote_include; p; p = p->next)
963 if (p == opts->bracket_include)
964 cpp_message (pfile, -1, "#include <...> search starts here:\n");
965 fprintf (stderr, " %s\n", p->name);
967 cpp_message (pfile, -1, "End of search list.\n");
970 /* Don't bother trying to do macro expansion if we've already done
972 if (opts->preprocessed)
973 pfile->no_macro_expand++;
975 /* Open the main input file.
976 We do this in nonblocking mode so we don't get stuck here if
977 someone clever has asked cpp to process /dev/rmt0;
978 finclude() will check that we have a real file to work with. */
979 if (fname == NULL || *fname == 0)
984 else if ((f = open (fname, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666)) < 0)
985 cpp_pfatal_with_name (pfile, fname);
987 initialize_dependency_output (pfile);
989 /* Must call finclude() on the main input before processing
990 -include switches; otherwise the -included text winds up
991 after the main input. */
992 ih_fake = (struct include_hash *) xmalloc (sizeof (struct include_hash));
994 ih_fake->next_this_file = 0;
995 ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
996 ih_fake->name = fname;
997 ih_fake->control_macro = 0;
998 ih_fake->buf = (char *)-1;
1000 if (!finclude (pfile, f, ih_fake))
1002 if (opts->preprocessed)
1003 /* If we've already processed this code, we want to trust the #line
1004 directives in the input. But we still need to update our line
1005 counter accordingly. */
1006 pfile->lineno = CPP_BUFFER (pfile)->lineno;
1008 output_line_command (pfile, same_file);
1009 pfile->only_seen_white = 2;
1011 /* The -imacros files can be scanned now, but the -include files
1012 have to be pushed onto the include stack and processed later,
1013 in the main loop calling cpp_get_token. */
1015 pfile->no_record_file++;
1017 p = opts->pending->imacros_head;
1020 int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
1023 cpp_perror_with_name (pfile, p->arg);
1026 if (!cpp_push_buffer (pfile, NULL, 0))
1029 ih_fake = (struct include_hash *)
1030 xmalloc (sizeof (struct include_hash));
1032 ih_fake->next_this_file = 0;
1033 ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
1034 ih_fake->name = p->arg;
1035 ih_fake->control_macro = 0;
1036 ih_fake->buf = (char *)-1;
1038 if (finclude (pfile, fd, ih_fake))
1040 if (CPP_PRINT_DEPS (pfile))
1041 deps_output (pfile, ih_fake->name, ' ');
1043 cpp_scan_buffer (pfile);
1046 cpp_pop_buffer (pfile);
1056 p = opts->pending->include_head;
1059 int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
1062 cpp_perror_with_name (pfile, p->arg);
1065 if (!cpp_push_buffer (pfile, NULL, 0))
1068 ih_fake = (struct include_hash *)
1069 xmalloc (sizeof (struct include_hash));
1071 ih_fake->next_this_file = 0;
1072 ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
1073 ih_fake->name = p->arg;
1074 ih_fake->control_macro = 0;
1075 ih_fake->buf = (char *)-1;
1077 if (finclude (pfile, fd, ih_fake))
1079 if (CPP_PRINT_DEPS (pfile))
1080 deps_output (pfile, ih_fake->name, ' ');
1082 output_line_command (pfile, enter_file);
1085 cpp_pop_buffer (pfile);
1090 pfile->no_record_file--;
1092 free (opts->pending);
1093 opts->pending = NULL;
1098 /* This is called at the end of preprocessing. It pops the
1099 last buffer and writes dependency output. It should also
1100 clear macro definitions, such that you could call cpp_start_read
1101 with a new filename to restart processing. */
1106 struct cpp_options *opts = CPP_OPTIONS (pfile);
1108 if (CPP_PREV_BUFFER (CPP_BUFFER (pfile)) != CPP_NULL_BUFFER (pfile))
1110 "cpplib internal error: buffers still stacked in cpp_finish");
1111 cpp_pop_buffer (pfile);
1113 if (opts->print_deps)
1115 /* Stream on which to print the dependency information. */
1118 /* Don't actually write the deps file if compilation has failed. */
1119 if (pfile->errors == 0)
1121 const char *deps_mode = opts->print_deps_append ? "a" : "w";
1122 if (opts->deps_file == 0)
1123 deps_stream = stdout;
1124 else if ((deps_stream = fopen (opts->deps_file, deps_mode)) == 0)
1125 cpp_pfatal_with_name (pfile, opts->deps_file);
1126 fputs (pfile->deps_buffer, deps_stream);
1127 putc ('\n', deps_stream);
1128 if (opts->deps_file)
1130 if (ferror (deps_stream) || fclose (deps_stream) != 0)
1131 cpp_fatal (pfile, "I/O error on output");
1136 if (opts->dump_macros == dump_only)
1141 for (i = HASHSIZE; --i >= 0;)
1143 for (h = pfile->hashtab[i]; h; h = h->next)
1144 if (h->type == T_MACRO)
1146 m.defn = h->value.defn;
1148 m.symlen = h->length;
1149 dump_definition (pfile, m);
1150 CPP_PUTC (pfile, '\n');
1156 /* Handle one command-line option in (argc, argv).
1157 Can be called multiple times, to handle multiple sets of options.
1158 Returns number of strings consumed. */
1160 cpp_handle_option (pfile, argc, argv)
1165 struct cpp_options *opts = CPP_OPTIONS (pfile);
1168 if (argv[i][0] != '-')
1170 if (opts->out_fname != NULL)
1173 cpp_fatal (pfile, "Too many arguments");
1175 else if (opts->in_fname != NULL)
1176 opts->out_fname = argv[i];
1178 opts->in_fname = argv[i];
1184 if (!strcmp (argv[i], "-fleading-underscore"))
1185 user_label_prefix = "_";
1186 else if (!strcmp (argv[i], "-fno-leading-underscore"))
1187 user_label_prefix = "";
1188 else if (!strcmp (argv[i], "-fpreprocessed"))
1189 opts->preprocessed = 1;
1190 else if (!strcmp (argv[i], "-fno-preprocessed"))
1191 opts->preprocessed = 0;
1194 case 'I': /* Add directory to path for includes. */
1195 if (!strcmp (argv[i] + 2, "-"))
1198 Use the preceding -I directories for #include "..."
1199 but not #include <...>.
1200 Don't search the directory of the present file
1201 for #include "...". (Note that -I. -I- is not the same as
1202 the default setup; -I. uses the compiler's working dir.) */
1203 if (! opts->ignore_srcdir)
1205 opts->ignore_srcdir = 1;
1206 opts->pending->quote_head = opts->pending->brack_head;
1207 opts->pending->quote_tail = opts->pending->brack_tail;
1208 opts->pending->brack_head = 0;
1209 opts->pending->brack_tail = 0;
1213 cpp_fatal (pfile, "-I- specified twice");
1220 if (argv[i][2] != 0)
1221 fname = argv[i] + 2;
1222 else if (i + 1 == argc)
1223 goto missing_dirname;
1226 append_include_chain (pfile, opts->pending,
1227 xstrdup (fname), BRACKET);
1232 /* Add directory to beginning of system include path, as a system
1233 include directory. */
1234 if (!strcmp (argv[i], "-isystem"))
1237 goto missing_filename;
1238 append_include_chain (pfile, opts->pending,
1239 xstrdup (argv[++i]), SYSTEM);
1241 else if (!strcmp (argv[i], "-include"))
1244 goto missing_filename;
1247 struct pending_option *o = (struct pending_option *)
1248 xmalloc (sizeof (struct pending_option));
1251 /* This list has to be built in reverse order so that
1252 when cpp_start_read pushes all the -include files onto
1253 the buffer stack, they will be scanned in forward order. */
1254 o->next = opts->pending->include_head;
1255 opts->pending->include_head = o;
1258 else if (!strcmp (argv[i], "-imacros"))
1261 goto missing_filename;
1264 struct pending_option *o = (struct pending_option *)
1265 xmalloc (sizeof (struct pending_option));
1269 APPEND (opts->pending, imacros, o);
1272 /* Add directory to end of path for includes,
1273 with the default prefix at the front of its name. */
1274 else if (!strcmp (argv[i], "-iwithprefix"))
1279 goto missing_dirname;
1281 len = strlen (argv[i]);
1283 if (opts->include_prefix != 0)
1285 fname = xmalloc (opts->include_prefix_len + len + 1);
1286 memcpy (fname, opts->include_prefix, opts->include_prefix_len);
1287 memcpy (fname + opts->include_prefix_len, argv[i], len + 1);
1291 fname = xmalloc (sizeof GCC_INCLUDE_DIR - 8 + len);
1292 memcpy (fname, GCC_INCLUDE_DIR, sizeof GCC_INCLUDE_DIR - 9);
1293 memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1);
1296 append_include_chain (pfile, opts->pending, fname, SYSTEM);
1298 /* Add directory to main path for includes,
1299 with the default prefix at the front of its name. */
1300 else if (!strcmp (argv[i], "-iwithprefixbefore"))
1305 goto missing_dirname;
1307 len = strlen (argv[i]);
1309 if (opts->include_prefix != 0)
1311 fname = xmalloc (opts->include_prefix_len + len + 1);
1312 memcpy (fname, opts->include_prefix, opts->include_prefix_len);
1313 memcpy (fname + opts->include_prefix_len, argv[i], len + 1);
1317 fname = xmalloc (sizeof GCC_INCLUDE_DIR - 8 + len);
1318 memcpy (fname, GCC_INCLUDE_DIR, sizeof GCC_INCLUDE_DIR - 9);
1319 memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1);
1322 append_include_chain (pfile, opts->pending, fname, BRACKET);
1324 /* Add directory to end of path for includes. */
1325 else if (!strcmp (argv[i], "-idirafter"))
1328 goto missing_dirname;
1329 append_include_chain (pfile, opts->pending,
1330 xstrdup (argv[++i]), AFTER);
1332 else if (!strcmp (argv[i], "-iprefix"))
1335 goto missing_filename;
1338 opts->include_prefix = argv[++i];
1339 opts->include_prefix_len = strlen (argv[i]);
1342 else if (!strcmp (argv[i], "-ifoutput"))
1343 opts->output_conditionals = 1;
1348 if (opts->out_fname != NULL)
1350 cpp_fatal (pfile, "Output filename specified twice");
1354 goto missing_filename;
1355 opts->out_fname = argv[++i];
1356 if (!strcmp (opts->out_fname, "-"))
1357 opts->out_fname = "";
1361 if (!strcmp (argv[i], "-pedantic"))
1362 CPP_PEDANTIC (pfile) = 1;
1363 else if (!strcmp (argv[i], "-pedantic-errors"))
1365 CPP_PEDANTIC (pfile) = 1;
1366 opts->pedantic_errors = 1;
1369 else if (!strcmp (argv[i], "-pcp")) {
1370 char *pcp_fname = argv[++i];
1371 pcp_outfile = ((pcp_fname[0] != '-' || pcp_fname[1] != '\0')
1372 ? fopen (pcp_fname, "w")
1373 : fdopen (dup (fileno (stdout)), "w"));
1374 if (pcp_outfile == 0)
1375 cpp_pfatal_with_name (pfile, pcp_fname);
1382 if (!strcmp (argv[i], "-traditional"))
1384 opts->traditional = 1;
1385 opts->cplusplus_comments = 0;
1387 else if (!strcmp (argv[i], "-trigraphs"))
1388 opts->trigraphs = 1;
1392 if (! strcmp (argv[i], "-lang-c"))
1393 opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
1394 opts->c9x = 1, opts->objc = 0;
1395 if (! strcmp (argv[i], "-lang-c89"))
1396 opts->cplusplus = 0, opts->cplusplus_comments = 0, opts->c89 = 1,
1397 opts->c9x = 0, opts->objc = 0;
1398 if (! strcmp (argv[i], "-lang-c++"))
1399 opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
1400 opts->c9x = 0, opts->objc = 0;
1401 if (! strcmp (argv[i], "-lang-objc"))
1402 opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
1403 opts->c9x = 0, opts->objc = 1;
1404 if (! strcmp (argv[i], "-lang-objc++"))
1405 opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
1406 opts->c9x = 0, opts->objc = 1;
1407 if (! strcmp (argv[i], "-lang-asm"))
1409 if (! strcmp (argv[i], "-lint"))
1411 if (! strcmp (argv[i], "-lang-chill"))
1412 opts->objc = 0, opts->cplusplus = 0, opts->chill = 1,
1413 opts->traditional = 1;
1417 opts->cplusplus = 1, opts->cplusplus_comments = 1;
1421 if (!strcmp (argv[i], "-std=iso9899:1990")
1422 || !strcmp (argv[i], "-std=iso9899:199409")
1423 || !strcmp (argv[i], "-std=c89")
1424 || !strcmp (argv[i], "-std=gnu89"))
1425 opts->cplusplus = 0, opts->cplusplus_comments = 0,
1426 opts->c89 = 1, opts->c9x = 0, opts->objc = 0;
1427 else if (!strcmp (argv[i], "-std=iso9899:199x")
1428 || !strcmp (argv[i], "-std=c9x")
1429 || !strcmp (argv[i], "-std=gnu9x"))
1430 opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
1431 opts->c9x = 1, opts->objc = 0;
1435 opts->inhibit_warnings = 1;
1439 if (!strcmp (argv[i], "-Wtrigraphs"))
1440 opts->warn_trigraphs = 1;
1441 else if (!strcmp (argv[i], "-Wno-trigraphs"))
1442 opts->warn_trigraphs = 0;
1443 else if (!strcmp (argv[i], "-Wcomment"))
1444 opts->warn_comments = 1;
1445 else if (!strcmp (argv[i], "-Wno-comment"))
1446 opts->warn_comments = 0;
1447 else if (!strcmp (argv[i], "-Wcomments"))
1448 opts->warn_comments = 1;
1449 else if (!strcmp (argv[i], "-Wno-comments"))
1450 opts->warn_comments = 0;
1451 else if (!strcmp (argv[i], "-Wtraditional"))
1452 opts->warn_stringify = 1;
1453 else if (!strcmp (argv[i], "-Wno-traditional"))
1454 opts->warn_stringify = 0;
1455 else if (!strcmp (argv[i], "-Wundef"))
1456 opts->warn_undef = 1;
1457 else if (!strcmp (argv[i], "-Wno-undef"))
1458 opts->warn_undef = 0;
1459 else if (!strcmp (argv[i], "-Wimport"))
1460 opts->warn_import = 1;
1461 else if (!strcmp (argv[i], "-Wno-import"))
1462 opts->warn_import = 0;
1463 else if (!strcmp (argv[i], "-Werror"))
1464 opts->warnings_are_errors = 1;
1465 else if (!strcmp (argv[i], "-Wno-error"))
1466 opts->warnings_are_errors = 0;
1467 else if (!strcmp (argv[i], "-Wall"))
1469 opts->warn_trigraphs = 1;
1470 opts->warn_comments = 1;
1475 /* The style of the choices here is a bit mixed.
1476 The chosen scheme is a hybrid of keeping all options in one string
1477 and specifying each option in a separate argument:
1478 -M|-MM|-MD file|-MMD file [-MG]. An alternative is:
1479 -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
1480 -M[M][G][D file]. This is awkward to handle in specs, and is not
1482 /* ??? -MG must be specified in addition to one of -M or -MM.
1483 This can be relaxed in the future without breaking anything.
1484 The converse isn't true. */
1486 /* -MG isn't valid with -MD or -MMD. This is checked for later. */
1487 if (!strcmp (argv[i], "-MG"))
1489 opts->print_deps_missing_files = 1;
1492 if (!strcmp (argv[i], "-M"))
1493 opts->print_deps = 2;
1494 else if (!strcmp (argv[i], "-MM"))
1495 opts->print_deps = 1;
1496 else if (!strcmp (argv[i], "-MD"))
1497 opts->print_deps = 2;
1498 else if (!strcmp (argv[i], "-MMD"))
1499 opts->print_deps = 1;
1500 /* For -MD and -MMD options, write deps on file named by next arg. */
1501 if (!strcmp (argv[i], "-MD") || !strcmp (argv[i], "-MMD"))
1504 goto missing_filename;
1505 opts->deps_file = argv[++i];
1509 /* For -M and -MM, write deps on standard output
1510 and suppress the usual output. */
1511 opts->no_output = 1;
1517 char *p = argv[i] + 2;
1519 while ((c = *p++) != 0)
1521 /* Arg to -d specifies what parts of macros to dump */
1525 opts->dump_macros = dump_only;
1526 opts->no_output = 1;
1529 opts->dump_macros = dump_names;
1532 opts->dump_macros = dump_definitions;
1535 opts->dump_includes = 1;
1543 if (argv[i][2] == '3')
1544 opts->debug_output = 1;
1548 if (!strcmp (argv[i], "--help"))
1550 else if (!strcmp (argv[i], "--version"))
1551 cpp_notice ("GNU CPP version %s\n", version_string);
1556 cpp_notice ("GNU CPP version %s", version_string);
1557 #ifdef TARGET_VERSION
1560 fputc ('\n', stderr);
1565 opts->print_include_names = 1;
1570 struct pending_option *o = (struct pending_option *)
1571 xmalloc (sizeof (struct pending_option));
1572 if (argv[i][2] != 0)
1573 o->arg = argv[i] + 2;
1574 else if (i + 1 == argc)
1576 cpp_fatal (pfile, "Macro name missing after -D option");
1584 APPEND (opts->pending, define, o);
1592 if (argv[i][2] != 0)
1594 else if (i + 1 == argc)
1596 cpp_fatal (pfile, "Assertion missing after -A option");
1602 if (strcmp (p, "-"))
1604 struct pending_option *o = (struct pending_option *)
1605 xmalloc (sizeof (struct pending_option));
1610 APPEND (opts->pending, assert, o);
1614 /* -A- eliminates all predefined macros and assertions.
1615 Let's include also any that were specified earlier
1616 on the command line. That way we can get rid of any
1617 that were passed automatically in from GCC. */
1618 struct pending_option *o1, *o2;
1620 o1 = opts->pending->define_head;
1627 o1 = opts->pending->assert_head;
1634 opts->pending->assert_head = NULL;
1635 opts->pending->assert_tail = NULL;
1636 opts->pending->define_head = NULL;
1637 opts->pending->define_tail = NULL;
1644 struct pending_option *o = (struct pending_option *)
1645 xmalloc (sizeof (struct pending_option));
1647 if (argv[i][2] != 0)
1648 o->arg = argv[i] + 2;
1649 else if (i + 1 == argc)
1651 cpp_fatal (pfile, "Macro name missing after -U option");
1659 APPEND (opts->pending, define, o);
1664 opts->put_out_comments = 1;
1667 case 'E': /* -E comes from cc -E; ignore it. */
1671 opts->no_line_commands = 1;
1674 case '$': /* Don't include $ in identifiers. */
1675 opts->dollars_in_ident = 0;
1679 if (!strcmp (argv[i], "-nostdinc"))
1680 /* -nostdinc causes no default include directories.
1681 You must specify all include-file directories with -I. */
1682 opts->no_standard_includes = 1;
1683 else if (!strcmp (argv[i], "-nostdinc++"))
1684 /* -nostdinc++ causes no default C++-specific include directories. */
1685 opts->no_standard_cplusplus_includes = 1;
1687 else if (!strcmp (argv[i], "-noprecomp"))
1693 if (!strcmp (argv[i], "-remap"))
1697 case '\0': /* JF handle '-' as file name meaning stdin or stdout */
1698 if (opts->in_fname == NULL)
1699 opts->in_fname = "";
1700 else if (opts->out_fname == NULL)
1701 opts->out_fname = "";
1703 return i; /* error */
1713 cpp_fatal (pfile, "Filename missing after `%s' option", argv[i]);
1716 cpp_fatal (pfile, "Directory name missing after `%s' option", argv[i]);
1720 /* Handle command-line options in (argc, argv).
1721 Can be called multiple times, to handle multiple sets of options.
1722 Returns if an unrecognized option is seen.
1723 Returns number of strings consumed. */
1726 cpp_handle_options (pfile, argc, argv)
1732 int strings_processed;
1733 for (i = 0; i < argc; i += strings_processed)
1735 strings_processed = cpp_handle_option (pfile, argc - i, argv + i);
1736 if (strings_processed == 0)
1745 cpp_notice ("Usage: %s [switches] input output\n", progname);
1748 -include <file> Include the contents of <file> before other files\n\
1749 -imacros <file> Accept definition of macros in <file>\n\
1750 -iprefix <path> Specify <path> as a prefix for next two options\n\
1751 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1752 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1753 -isystem <dir> Add <dir> to the start of the system include path\n\
1754 -idirafter <dir> Add <dir> to the end of the system include path\n\
1755 -I <dir> Add <dir> to the end of the main include path\n\
1756 -nostdinc Do not search system include directories\n\
1757 (dirs specified with -isystem will still be used)\n\
1758 -nostdinc++ Do not search system include directories for C++\n\
1759 -o <file> Put output into <file>\n\
1760 -pedantic Issue all warnings demanded by strict ANSI C\n\
1761 -traditional Follow K&R pre-processor behaviour\n\
1762 -trigraphs Support ANSI C trigraphs\n\
1763 -lang-c Assume that the input sources are in C\n\
1764 -lang-c89 Assume that the input sources are in C89\n\
1765 -lang-c++ Assume that the input sources are in C++\n\
1766 -lang-objc Assume that the input sources are in ObjectiveC\n\
1767 -lang-objc++ Assume that the input sources are in ObjectiveC++\n\
1768 -lang-asm Assume that the input sources are in assembler\n\
1769 -lang-chill Assume that the input sources are in Chill\n\
1770 -std=<std name> Specify the conformance standard; one of:\n\
1771 gnu89, gnu9x, c89, c9x, iso9899:1990,\n\
1772 iso9899:199409, iso9899:199x\n\
1773 -+ Allow parsing of C++ style features\n\
1774 -w Inhibit warning messages\n\
1775 -Wtrigraphs Warn if trigraphs are encountered\n\
1776 -Wno-trigraphs Do not warn about trigraphs\n\
1777 -Wcomment{s} Warn if one comment starts inside another\n\
1778 -Wno-comment{s} Do not warn about comments\n\
1779 -Wtraditional Warn if a macro argument is/would be turned into\n\
1780 a string if -traditional is specified\n\
1781 -Wno-traditional Do not warn about stringification\n\
1782 -Wundef Warn if an undefined macro is used by #if\n\
1783 -Wno-undef Do not warn about testing undefined macros\n\
1784 -Wimport Warn about the use of the #import directive\n\
1785 -Wno-import Do not warn about the use of #import\n\
1786 -Werror Treat all warnings as errors\n\
1787 -Wno-error Do not treat warnings as errors\n\
1788 -Wall Enable all preprocessor warnings\n\
1789 -M Generate make dependencies\n\
1790 -MM As -M, but ignore system header files\n\
1791 -MD As -M, but put output in a .d file\n\
1792 -MMD As -MD, but ignore system header files\n\
1793 -MG Treat missing header file as generated files\n\
1794 -g Include #define and #undef directives in the output\n\
1795 -D<macro> Define a <macro> with string '1' as its value\n\
1796 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1797 -A<question> (<answer>) Assert the <answer> to <question>\n\
1798 -U<macro> Undefine <macro> \n\
1799 -v Display the version number\n\
1800 -H Print the name of header files as they are used\n\
1801 -C Do not discard comments\n\
1802 -dM Display a list of macro definitions active at end\n\
1803 -dD Preserve macro definitions in output\n\
1804 -dN As -dD except that only the names are preserved\n\
1805 -dI Include #include directives in the output\n\
1806 -ifoutput Describe skipped code blocks in output \n\
1807 -P Do not generate #line directives\n\
1808 -$ Do not allow '$' in identifiers\n\
1809 -remap Remap file names when including files.\n\
1810 -h or --help Display this information\n\