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 char *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 char *fname; /* The name of the directory. */
117 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 *,
207 /* Last argument to append_include_chain: chain to use */
208 enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
210 /* If gcc is in use (stage2/stage3) we can make these tables initialized
212 #if defined __GNUC__ && (__GNUC__ > 2 \
213 || (__GNUC__ == 2 && __GNUC_MINOR__ > 8))
214 /* Table to tell if a character is legal as the second or later character
215 of a C identifier. */
216 U_CHAR is_idchar[256] =
218 ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1,
219 ['g'] = 1, ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1,
220 ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1,
221 ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1,
222 ['y'] = 1, ['z'] = 1,
224 ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1,
225 ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1,
226 ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1,
227 ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1,
228 ['Y'] = 1, ['Z'] = 1,
230 ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1,
231 ['7'] = 1, ['8'] = 1, ['9'] = 1, ['0'] = 1,
236 /* Table to tell if a character is legal as the first character of
238 U_CHAR is_idstart[256] =
240 ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1,
241 ['g'] = 1, ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1,
242 ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1,
243 ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1,
244 ['y'] = 1, ['z'] = 1,
246 ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1,
247 ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1,
248 ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1,
249 ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1,
250 ['Y'] = 1, ['Z'] = 1,
255 /* Table to tell if a character is horizontal space.
256 \r is magical, so it is not in here. */
257 U_CHAR is_hor_space[256] =
259 [' '] = 1, ['\t'] = 1, ['\v'] = 1, ['\f'] = 1,
261 /* table to tell if a character is horizontal or vertical space. */
262 U_CHAR is_space[256] =
264 [' '] = 1, ['\t'] = 1, ['\v'] = 1, ['\f'] = 1, ['\n'] = 1,
266 /* Table to handle trigraph conversion, which occurs before all other
267 processing, everywhere in the file. (This is necessary since one
268 of the trigraphs encodes backslash.) Note it's off by default.
270 from to from to from to
275 There is not a space between the ?? and the third char. I put spaces
276 there to avoid warnings when compiling this file. */
277 U_CHAR trigraph_table[256] =
279 ['='] = '#', [')'] = ']', ['!'] = '|',
280 ['('] = '[', ['\''] = '^', ['>'] = '}',
281 ['/'] = '\\', ['<'] = '{', ['-'] = '~',
284 /* This function will be entirely removed soon. */
286 initialize_char_syntax (dollar_in_ident)
289 is_idchar['$'] = dollar_in_ident;
290 is_idstart['$'] = dollar_in_ident;
295 U_CHAR is_idchar[256] = { 0 };
296 U_CHAR is_idstart[256] = { 0 };
297 U_CHAR is_hor_space[256] = { 0 };
298 U_CHAR is_space[256] = { 0 };
299 U_CHAR trigraph_table[256] = { 0 };
301 /* Initialize syntactic classifications of characters. */
303 initialize_char_syntax (dollar_in_ident)
306 is_idstart['a'] = 1; is_idstart['b'] = 1; is_idstart['c'] = 1;
307 is_idstart['d'] = 1; is_idstart['e'] = 1; is_idstart['f'] = 1;
308 is_idstart['g'] = 1; is_idstart['h'] = 1; is_idstart['i'] = 1;
309 is_idstart['j'] = 1; is_idstart['k'] = 1; is_idstart['l'] = 1;
310 is_idstart['m'] = 1; is_idstart['n'] = 1; is_idstart['o'] = 1;
311 is_idstart['p'] = 1; is_idstart['q'] = 1; is_idstart['r'] = 1;
312 is_idstart['s'] = 1; is_idstart['t'] = 1; is_idstart['u'] = 1;
313 is_idstart['v'] = 1; is_idstart['w'] = 1; is_idstart['x'] = 1;
314 is_idstart['y'] = 1; is_idstart['z'] = 1;
316 is_idstart['A'] = 1; is_idstart['B'] = 1; is_idstart['C'] = 1;
317 is_idstart['D'] = 1; is_idstart['E'] = 1; is_idstart['F'] = 1;
318 is_idstart['G'] = 1; is_idstart['H'] = 1; is_idstart['I'] = 1;
319 is_idstart['J'] = 1; is_idstart['K'] = 1; is_idstart['L'] = 1;
320 is_idstart['M'] = 1; is_idstart['N'] = 1; is_idstart['O'] = 1;
321 is_idstart['P'] = 1; is_idstart['Q'] = 1; is_idstart['R'] = 1;
322 is_idstart['S'] = 1; is_idstart['T'] = 1; is_idstart['U'] = 1;
323 is_idstart['V'] = 1; is_idstart['W'] = 1; is_idstart['X'] = 1;
324 is_idstart['Y'] = 1; is_idstart['Z'] = 1;
328 is_idchar['a'] = 1; is_idchar['b'] = 1; is_idchar['c'] = 1;
329 is_idchar['d'] = 1; is_idchar['e'] = 1; is_idchar['f'] = 1;
330 is_idchar['g'] = 1; is_idchar['h'] = 1; is_idchar['i'] = 1;
331 is_idchar['j'] = 1; is_idchar['k'] = 1; is_idchar['l'] = 1;
332 is_idchar['m'] = 1; is_idchar['n'] = 1; is_idchar['o'] = 1;
333 is_idchar['p'] = 1; is_idchar['q'] = 1; is_idchar['r'] = 1;
334 is_idchar['s'] = 1; is_idchar['t'] = 1; is_idchar['u'] = 1;
335 is_idchar['v'] = 1; is_idchar['w'] = 1; is_idchar['x'] = 1;
336 is_idchar['y'] = 1; is_idchar['z'] = 1;
338 is_idchar['A'] = 1; is_idchar['B'] = 1; is_idchar['C'] = 1;
339 is_idchar['D'] = 1; is_idchar['E'] = 1; is_idchar['F'] = 1;
340 is_idchar['G'] = 1; is_idchar['H'] = 1; is_idchar['I'] = 1;
341 is_idchar['J'] = 1; is_idchar['K'] = 1; is_idchar['L'] = 1;
342 is_idchar['M'] = 1; is_idchar['N'] = 1; is_idchar['O'] = 1;
343 is_idchar['P'] = 1; is_idchar['Q'] = 1; is_idchar['R'] = 1;
344 is_idchar['S'] = 1; is_idchar['T'] = 1; is_idchar['U'] = 1;
345 is_idchar['V'] = 1; is_idchar['W'] = 1; is_idchar['X'] = 1;
346 is_idchar['Y'] = 1; is_idchar['Z'] = 1;
348 is_idchar['1'] = 1; is_idchar['2'] = 1; is_idchar['3'] = 1;
349 is_idchar['4'] = 1; is_idchar['5'] = 1; is_idchar['6'] = 1;
350 is_idchar['7'] = 1; is_idchar['8'] = 1; is_idchar['9'] = 1;
355 is_idchar['$'] = dollar_in_ident;
356 is_idstart['$'] = dollar_in_ident;
358 /* white space tables */
359 is_hor_space[' '] = 1;
360 is_hor_space['\t'] = 1;
361 is_hor_space['\v'] = 1;
362 is_hor_space['\f'] = 1;
370 /* trigraph conversion */
371 trigraph_table['='] = '#'; trigraph_table[')'] = ']';
372 trigraph_table['!'] = '|'; trigraph_table['('] = '[';
373 trigraph_table['\''] = '^'; trigraph_table['>'] = '}';
374 trigraph_table['/'] = '\\'; trigraph_table['<'] = '{';
375 trigraph_table['-'] = '~';
378 #endif /* Not GCC. */
380 /* Given a colon-separated list of file names PATH,
381 add all the names to the search path for include files. */
384 path_include (pfile, pend, list, path)
386 struct cpp_pending *pend;
396 /* Find the end of this name. */
398 while (*q != 0 && *q != PATH_SEPARATOR) q++;
401 /* An empty name in the path stands for the current directory. */
402 name = (char *) xmalloc (2);
408 /* Otherwise use the directory that is named. */
409 name = (char *) xmalloc (q - p + 1);
410 memcpy (name, p, q - p);
414 append_include_chain (pfile, pend, name, path);
416 /* Advance past this name. */
424 /* Find the base name of a (partial) pathname FNAME.
425 Returns a pointer into the string passed in.
426 Accepts Unix (/-separated) paths on all systems,
427 DOS and VMS paths on those systems. */
432 char *s = (char *)fname;
434 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
435 if (ISALPHA (s[0]) && s[1] == ':') s += 2;
436 if ((p = rindex (s, '\\'))) s = p + 1;
438 if ((p = rindex (s, ':'))) s = p + 1; /* Skip device. */
439 if ((p = rindex (s, ']'))) s = p + 1; /* Skip directory. */
440 if ((p = rindex (s, '>'))) s = p + 1; /* Skip alternate (int'n'l) dir. */
442 if ((p = rindex (s, '/'))) s = p + 1;
447 /* Append DIR to include path PATH. DIR must be permanently allocated
450 append_include_chain (pfile, pend, dir, path)
452 struct cpp_pending *pend;
456 struct file_name_list *new;
460 simplify_pathname (dir);
463 /* Dirs that don't exist are silently ignored. */
465 cpp_perror_with_name (pfile, dir);
466 else if (CPP_OPTIONS (pfile)->verbose)
467 cpp_notice ("ignoring nonexistent directory `%s'\n", dir);
471 if (!S_ISDIR (st.st_mode))
473 cpp_message (pfile, 1, "%s: %s: Not a directory", progname, dir);
478 if (len > pfile->max_include_len)
479 pfile->max_include_len = len;
481 new = (struct file_name_list *)xmalloc (sizeof (struct file_name_list));
484 new->ino = st.st_ino;
485 new->dev = st.st_dev;
486 new->sysp = (path == SYSTEM);
487 new->name_map = NULL;
491 case QUOTE: APPEND (pend, quote, new); break;
492 case BRACKET: APPEND (pend, brack, new); break;
493 case SYSTEM: APPEND (pend, systm, new); break;
494 case AFTER: APPEND (pend, after, new); break;
499 /* Write out a #define command for the special named MACRO_NAME
500 to PFILE's token_buffer. */
503 dump_special_to_buffer (pfile, macro_name)
507 static char define_directive[] = "#define ";
508 int macro_name_length = strlen (macro_name);
509 output_line_command (pfile, same_file);
510 CPP_RESERVE (pfile, sizeof(define_directive) + macro_name_length);
511 CPP_PUTS_Q (pfile, define_directive, sizeof(define_directive)-1);
512 CPP_PUTS_Q (pfile, macro_name, macro_name_length);
513 CPP_PUTC_Q (pfile, ' ');
514 cpp_expand_to_buffer (pfile, macro_name, macro_name_length);
515 CPP_PUTC (pfile, '\n');
518 /* Initialize a cpp_options structure. */
520 cpp_options_init (opts)
523 bzero ((char *) opts, sizeof (struct cpp_options));
525 opts->dollars_in_ident = 1;
526 opts->cplusplus_comments = 1;
527 opts->warn_import = 1;
529 opts->pending = (struct cpp_pending *) xmalloc (sizeof (struct cpp_pending));
530 bzero ((char *) opts->pending, sizeof (struct cpp_pending));
533 /* Initialize a cpp_reader structure. */
535 cpp_reader_init (pfile)
538 bzero ((char *) pfile, sizeof (cpp_reader));
540 pfile->get_token = cpp_get_token;
543 pfile->token_buffer_size = 200;
544 pfile->token_buffer = (U_CHAR *) xmalloc (pfile->token_buffer_size);
545 CPP_SET_WRITTEN (pfile, 0);
547 pfile->hashtab = (HASHNODE **) xcalloc (HASHSIZE, sizeof (HASHNODE *));
550 /* Free resources used by PFILE.
551 This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology). */
557 while (CPP_BUFFER (pfile) != CPP_NULL_BUFFER (pfile))
558 cpp_pop_buffer (pfile);
560 if (pfile->token_buffer)
562 free (pfile->token_buffer);
563 pfile->token_buffer = NULL;
566 if (pfile->deps_buffer)
568 free (pfile->deps_buffer);
569 pfile->deps_buffer = NULL;
570 pfile->deps_allocated_size = 0;
573 if (pfile->input_buffer)
575 free (pfile->input_buffer);
576 free (pfile->input_speccase);
577 pfile->input_buffer = pfile->input_speccase = NULL;
578 pfile->input_buffer_len = 0;
581 while (pfile->if_stack)
583 IF_STACK_FRAME *temp = pfile->if_stack;
584 pfile->if_stack = temp->next;
588 for (i = ALL_INCLUDE_HASHSIZE; --i >= 0; )
590 struct include_hash *imp = pfile->all_include_files[i];
593 struct include_hash *next = imp->next;
595 /* This gets freed elsewhere - I think. */
601 pfile->all_include_files[i] = 0;
604 for (i = HASHSIZE; --i >= 0;)
606 while (pfile->hashtab[i])
607 delete_macro (pfile->hashtab[i]);
609 free (pfile->hashtab);
613 /* Initialize the built-in macros. */
615 initialize_builtins (pfile)
618 #define NAME(str) (U_CHAR *)str, sizeof str - 1
619 cpp_install (pfile, NAME("__TIME__"), T_TIME, 0, -1);
620 cpp_install (pfile, NAME("__DATE__"), T_DATE, 0, -1);
621 cpp_install (pfile, NAME("__FILE__"), T_FILE, 0, -1);
622 cpp_install (pfile, NAME("__BASE_FILE__"), T_BASE_FILE, 0, -1);
623 cpp_install (pfile, NAME("__LINE__"), T_SPECLINE, 0, -1);
624 cpp_install (pfile, NAME("__INCLUDE_LEVEL__"), T_INCLUDE_LEVEL, 0, -1);
625 cpp_install (pfile, NAME("__VERSION__"), T_VERSION, 0, -1);
626 #ifndef NO_BUILTIN_SIZE_TYPE
627 cpp_install (pfile, NAME("__SIZE_TYPE__"), T_CONST, SIZE_TYPE, -1);
629 #ifndef NO_BUILTIN_PTRDIFF_TYPE
630 cpp_install (pfile, NAME("__PTRDIFF_TYPE__ "), T_CONST, PTRDIFF_TYPE, -1);
632 cpp_install (pfile, NAME("__WCHAR_TYPE__"), T_CONST, WCHAR_TYPE, -1);
633 cpp_install (pfile, NAME("__USER_LABEL_PREFIX__"), T_CONST, user_label_prefix, -1);
634 cpp_install (pfile, NAME("__REGISTER_PREFIX__"), T_CONST, REGISTER_PREFIX, -1);
635 cpp_install (pfile, NAME("__HAVE_BUILTIN_SETJMP__"), T_CONST, "1", -1);
636 if (!CPP_TRADITIONAL (pfile))
638 cpp_install (pfile, NAME("__STDC__"), T_STDC, 0, -1);
640 if (CPP_OPTIONS (pfile)->c9x)
641 cpp_install (pfile, NAME("__STDC_VERSION__"),T_CONST, "199909L", -1);
644 cpp_install (pfile, NAME("__STDC_VERSION__"),T_CONST, "199409L", -1);
648 if (CPP_OPTIONS (pfile)->debug_output)
650 dump_special_to_buffer (pfile, "__BASE_FILE__");
651 dump_special_to_buffer (pfile, "__VERSION__");
652 #ifndef NO_BUILTIN_SIZE_TYPE
653 dump_special_to_buffer (pfile, "__SIZE_TYPE__");
655 #ifndef NO_BUILTIN_PTRDIFF_TYPE
656 dump_special_to_buffer (pfile, "__PTRDIFF_TYPE__");
658 dump_special_to_buffer (pfile, "__WCHAR_TYPE__");
659 dump_special_to_buffer (pfile, "__DATE__");
660 dump_special_to_buffer (pfile, "__TIME__");
661 if (!CPP_TRADITIONAL (pfile))
662 dump_special_to_buffer (pfile, "__STDC__");
666 /* Another subroutine of cpp_start_read. This one sets up to do
667 dependency-file output. */
669 initialize_dependency_output (pfile)
672 cpp_options *opts = CPP_OPTIONS (pfile);
673 char *spec, *s, *output_file;
675 /* Either of two environment variables can specify output of deps.
676 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
677 where OUTPUT_FILE is the file to write deps info to
678 and DEPS_TARGET is the target to mention in the deps. */
680 if (opts->print_deps == 0)
682 spec = getenv ("DEPENDENCIES_OUTPUT");
684 opts->print_deps = 1;
687 spec = getenv ("SUNPRO_DEPENDENCIES");
689 opts->print_deps = 2;
694 /* Find the space before the DEPS_TARGET, if there is one. */
695 s = strchr (spec, ' ');
698 opts->deps_target = s + 1;
699 output_file = (char *) xmalloc (s - spec + 1);
700 memcpy (output_file, spec, s - spec);
701 output_file[s - spec] = 0;
705 opts->deps_target = 0;
709 opts->deps_file = output_file;
710 opts->print_deps_append = 1;
713 /* Print the expected object file name as the target of this Make-rule. */
714 pfile->deps_allocated_size = 200;
715 pfile->deps_buffer = (char *) xmalloc (pfile->deps_allocated_size);
716 pfile->deps_buffer[0] = 0;
717 pfile->deps_size = 0;
718 pfile->deps_column = 0;
720 if (opts->deps_target)
721 deps_output (pfile, opts->deps_target, ':');
722 else if (*opts->in_fname == 0)
723 deps_output (pfile, "-", ':');
729 /* Discard all directory prefixes from filename. */
730 q = base_name (opts->in_fname);
732 /* Copy remainder to mungable area. */
734 p = (char *) alloca (len + 8);
737 /* Output P, but remove known suffixes. */
739 /* Point to the filename suffix. */
741 /* Compare against the known suffixes. */
742 for (x = 0; known_suffixes[x]; x++)
744 if (strncmp (known_suffixes[x], r, q - r) == 0)
746 /* Make q point to the bit we're going to overwrite
747 with an object suffix. */
753 /* Supply our own suffix. */
754 strcpy (q, OBJECT_SUFFIX);
756 deps_output (pfile, p, ':');
757 deps_output (pfile, opts->in_fname, ' ');
761 /* This is called after options have been processed.
762 * Check options for consistency, and setup for processing input
763 * from the file named FNAME. (Use standard input if FNAME==NULL.)
764 * Return 1 on success, 0 on failure.
768 cpp_start_read (pfile, fname)
772 struct cpp_options *opts = CPP_OPTIONS (pfile);
773 struct pending_option *p, *q;
776 struct include_hash *ih_fake;
778 /* -MG doesn't select the form of output and must be specified with one of
779 -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't
780 inhibit compilation. */
781 if (opts->print_deps_missing_files
782 && (opts->print_deps == 0 || !opts->no_output))
784 cpp_fatal (pfile, "-MG must be specified with one of -M or -MM");
788 /* Chill should not be used with -trigraphs. */
789 if (opts->chill && opts->trigraphs)
791 cpp_warning (pfile, "-lang-chill and -trigraphs are mutually exclusive");
795 /* Set this if it hasn't been set already. */
796 if (user_label_prefix == NULL)
797 user_label_prefix = USER_LABEL_PREFIX;
799 /* Now that we know dollars_in_ident, we can initialize the syntax
801 initialize_char_syntax (opts->dollars_in_ident);
803 /* Do partial setup of input buffer for the sake of generating
804 early #line directives (when -g is in effect). */
805 fp = cpp_push_buffer (pfile, NULL, 0);
808 if (opts->in_fname == NULL || *opts->in_fname == 0)
810 opts->in_fname = fname;
811 if (opts->in_fname == NULL)
814 fp->nominal_fname = fp->fname = opts->in_fname;
817 /* Install __LINE__, etc. Must follow initialize_char_syntax
818 and option processing. */
819 initialize_builtins (pfile);
821 /* Do -U's, -D's and -A's in the order they were seen. */
822 p = opts->pending->define_head;
825 if (opts->debug_output)
826 output_line_command (pfile, same_file);
828 cpp_undef (pfile, p->arg);
830 cpp_define (pfile, p->arg);
837 p = opts->pending->assert_head;
840 if (opts->debug_output)
841 output_line_command (pfile, same_file);
843 cpp_unassert (pfile, p->arg);
845 cpp_assert (pfile, p->arg);
852 opts->done_initializing = 1;
854 /* Several environment variables may add to the include search path.
855 CPATH specifies an additional list of directories to be searched
856 as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH,
857 etc. specify an additional list of directories to be searched as
858 if specified with -isystem, for the language indicated.
860 These variables are ignored if -nostdinc is on. */
861 if (! opts->no_standard_includes)
864 GET_ENV_PATH_LIST (path, "CPATH");
865 if (path != 0 && *path != 0)
866 path_include (pfile, opts->pending, path, BRACKET);
868 switch ((opts->objc << 1) + opts->cplusplus)
871 GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH");
874 GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH");
877 GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH");
880 GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH");
883 if (path != 0 && *path != 0)
884 path_include (pfile, opts->pending, path, SYSTEM);
887 /* Unless -nostdinc, add the compiled-in include path to the list,
888 translating prefixes. */
889 if (!opts->no_standard_includes)
891 struct default_include *p = include_defaults_array;
892 char *specd_prefix = opts->include_prefix;
894 /* Search "translated" versions of GNU directories.
895 These have /usr/local/lib/gcc... replaced by specd_prefix. */
896 if (specd_prefix != 0)
898 char *default_prefix = alloca (sizeof GCC_INCLUDE_DIR - 7);
899 /* Remove the `include' from /usr/local/lib/gcc.../include.
900 GCC_INCLUDE_DIR will always end in /include. */
901 int default_len = sizeof GCC_INCLUDE_DIR - 8;
902 int specd_len = strlen (specd_prefix);
904 default_len = sizeof GCC_INCLUDE_DIR - 8;
905 memcpy (default_prefix, GCC_INCLUDE_DIR, default_len);
906 default_prefix[default_len] = '\0';
908 for (p = include_defaults_array; p->fname; p++)
910 /* Some standard dirs are only for C++. */
913 && !opts->no_standard_cplusplus_includes))
915 /* Does this dir start with the prefix? */
916 if (!strncmp (p->fname, default_prefix, default_len))
918 /* Yes; change prefix and add to search list. */
919 int flen = strlen (p->fname);
920 int this_len = specd_len + flen - default_len;
921 char *str = (char *) xmalloc (this_len + 1);
922 memcpy (str, specd_prefix, specd_len);
923 memcpy (str + specd_len,
924 p->fname + default_len,
925 flen - default_len + 1);
927 append_include_chain (pfile, opts->pending,
934 /* Search ordinary names for GNU include directories. */
935 for (p = include_defaults_array; p->fname; p++)
937 /* Some standard dirs are only for C++. */
940 && !opts->no_standard_cplusplus_includes))
942 char *str = (char *) update_path (p->fname, p->component);
943 str = xstrdup (str); /* XXX Potential memory leak! */
944 append_include_chain (pfile, opts->pending, str, SYSTEM);
949 merge_include_chains (opts);
951 /* With -v, print the list of dirs to search. */
954 struct file_name_list *p;
955 cpp_message (pfile, -1, "#include \"...\" search starts here:\n");
956 for (p = opts->quote_include; p; p = p->next)
958 if (p == opts->bracket_include)
959 cpp_message (pfile, -1, "#include <...> search starts here:\n");
960 fprintf (stderr, " %s\n", p->name);
962 cpp_message (pfile, -1, "End of search list.\n");
965 /* Open the main input file.
966 We do this in nonblocking mode so we don't get stuck here if
967 someone clever has asked cpp to process /dev/rmt0;
968 finclude() will check that we have a real file to work with. */
969 if (fname == NULL || *fname == 0)
974 else if ((f = open (fname, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666)) < 0)
975 cpp_pfatal_with_name (pfile, fname);
977 initialize_dependency_output (pfile);
979 /* Must call finclude() on the main input before processing
980 -include switches; otherwise the -included text winds up
981 after the main input. */
982 ih_fake = (struct include_hash *) xmalloc (sizeof (struct include_hash));
984 ih_fake->next_this_file = 0;
985 ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
986 ih_fake->name = fname;
987 ih_fake->control_macro = 0;
988 ih_fake->buf = (char *)-1;
990 if (!finclude (pfile, f, ih_fake))
992 output_line_command (pfile, same_file);
993 pfile->only_seen_white = 2;
995 /* The -imacros files can be scanned now, but the -include files
996 have to be pushed onto the include stack and processed later,
997 in the main loop calling cpp_get_token. */
999 pfile->no_record_file++;
1001 p = opts->pending->imacros_head;
1004 int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
1007 cpp_perror_with_name (pfile, p->arg);
1010 if (!cpp_push_buffer (pfile, NULL, 0))
1013 ih_fake = (struct include_hash *)
1014 xmalloc (sizeof (struct include_hash));
1016 ih_fake->next_this_file = 0;
1017 ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
1018 ih_fake->name = p->arg;
1019 ih_fake->control_macro = 0;
1020 ih_fake->buf = (char *)-1;
1022 if (!finclude (pfile, fd, ih_fake))
1023 cpp_scan_buffer (pfile);
1033 p = opts->pending->include_head;
1036 int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
1039 cpp_perror_with_name (pfile, p->arg);
1042 if (!cpp_push_buffer (pfile, NULL, 0))
1045 ih_fake = (struct include_hash *)
1046 xmalloc (sizeof (struct include_hash));
1048 ih_fake->next_this_file = 0;
1049 ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */
1050 ih_fake->name = p->arg;
1051 ih_fake->control_macro = 0;
1052 ih_fake->buf = (char *)-1;
1054 if (finclude (pfile, fd, ih_fake))
1055 output_line_command (pfile, enter_file);
1061 pfile->no_record_file--;
1063 free (opts->pending);
1064 opts->pending = NULL;
1069 /* This is called at the end of preprocessing. It pops the
1070 last buffer and writes dependency output. It should also
1071 clear macro definitions, such that you could call cpp_start_read
1072 with a new filename to restart processing. */
1077 struct cpp_options *opts = CPP_OPTIONS (pfile);
1079 if (CPP_PREV_BUFFER (CPP_BUFFER (pfile)) != CPP_NULL_BUFFER (pfile))
1081 "cpplib internal error: buffers still stacked in cpp_finish");
1082 cpp_pop_buffer (pfile);
1084 if (opts->print_deps)
1086 /* Stream on which to print the dependency information. */
1089 /* Don't actually write the deps file if compilation has failed. */
1090 if (pfile->errors == 0)
1092 char *deps_mode = opts->print_deps_append ? "a" : "w";
1093 if (opts->deps_file == 0)
1094 deps_stream = stdout;
1095 else if ((deps_stream = fopen (opts->deps_file, deps_mode)) == 0)
1096 cpp_pfatal_with_name (pfile, opts->deps_file);
1097 fputs (pfile->deps_buffer, deps_stream);
1098 putc ('\n', deps_stream);
1099 if (opts->deps_file)
1101 if (ferror (deps_stream) || fclose (deps_stream) != 0)
1102 cpp_fatal (pfile, "I/O error on output");
1107 if (opts->dump_macros == dump_only)
1112 for (i = HASHSIZE; --i >= 0;)
1114 for (h = pfile->hashtab[i]; h; h = h->next)
1115 if (h->type == T_MACRO)
1117 m.defn = h->value.defn;
1119 m.symlen = h->length;
1120 dump_definition (pfile, m);
1121 CPP_PUTC (pfile, '\n');
1127 /* Handle one command-line option in (argc, argv).
1128 Can be called multiple times, to handle multiple sets of options.
1129 Returns number of strings consumed. */
1131 cpp_handle_option (pfile, argc, argv)
1136 struct cpp_options *opts = CPP_OPTIONS (pfile);
1139 if (argv[i][0] != '-')
1141 if (opts->out_fname != NULL)
1144 cpp_fatal (pfile, "Too many arguments");
1146 else if (opts->in_fname != NULL)
1147 opts->out_fname = argv[i];
1149 opts->in_fname = argv[i];
1155 if (!strcmp (argv[i], "-fleading-underscore"))
1156 user_label_prefix = "_";
1157 else if (!strcmp (argv[i], "-fno-leading-underscore"))
1158 user_label_prefix = "";
1161 case 'I': /* Add directory to path for includes. */
1162 if (!strcmp (argv[i] + 2, "-"))
1165 Use the preceding -I directories for #include "..."
1166 but not #include <...>.
1167 Don't search the directory of the present file
1168 for #include "...". (Note that -I. -I- is not the same as
1169 the default setup; -I. uses the compiler's working dir.) */
1170 if (! opts->ignore_srcdir)
1172 opts->ignore_srcdir = 1;
1173 opts->pending->quote_head = opts->pending->brack_head;
1174 opts->pending->quote_tail = opts->pending->brack_tail;
1175 opts->pending->brack_head = 0;
1176 opts->pending->brack_tail = 0;
1180 cpp_fatal (pfile, "-I- specified twice");
1187 if (argv[i][2] != 0)
1188 fname = argv[i] + 2;
1189 else if (i + 1 == argc)
1190 goto missing_dirname;
1193 append_include_chain (pfile, opts->pending,
1194 xstrdup (fname), BRACKET);
1199 /* Add directory to beginning of system include path, as a system
1200 include directory. */
1201 if (!strcmp (argv[i], "-isystem"))
1204 goto missing_filename;
1205 append_include_chain (pfile, opts->pending,
1206 xstrdup (argv[++i]), SYSTEM);
1208 else if (!strcmp (argv[i], "-include"))
1211 goto missing_filename;
1214 struct pending_option *o = (struct pending_option *)
1215 xmalloc (sizeof (struct pending_option));
1218 /* This list has to be built in reverse order so that
1219 when cpp_start_read pushes all the -include files onto
1220 the buffer stack, they will be scanned in forward order. */
1221 o->next = opts->pending->include_head;
1222 opts->pending->include_head = o;
1225 else if (!strcmp (argv[i], "-imacros"))
1228 goto missing_filename;
1231 struct pending_option *o = (struct pending_option *)
1232 xmalloc (sizeof (struct pending_option));
1236 APPEND (opts->pending, imacros, o);
1239 /* Add directory to end of path for includes,
1240 with the default prefix at the front of its name. */
1241 else if (!strcmp (argv[i], "-iwithprefix"))
1246 goto missing_dirname;
1248 len = strlen (argv[i]);
1250 if (opts->include_prefix != 0)
1252 fname = xmalloc (opts->include_prefix_len + len + 1);
1253 memcpy (fname, opts->include_prefix, opts->include_prefix_len);
1254 memcpy (fname + opts->include_prefix_len, argv[i], len + 1);
1258 fname = xmalloc (sizeof GCC_INCLUDE_DIR - 8 + len);
1259 memcpy (fname, GCC_INCLUDE_DIR, sizeof GCC_INCLUDE_DIR - 9);
1260 memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1);
1263 append_include_chain (pfile, opts->pending, fname, SYSTEM);
1265 /* Add directory to main path for includes,
1266 with the default prefix at the front of its name. */
1267 else if (!strcmp (argv[i], "-iwithprefixbefore"))
1272 goto missing_dirname;
1274 len = strlen (argv[i]);
1276 if (opts->include_prefix != 0)
1278 fname = xmalloc (opts->include_prefix_len + len + 1);
1279 memcpy (fname, opts->include_prefix, opts->include_prefix_len);
1280 memcpy (fname + opts->include_prefix_len, argv[i], len + 1);
1284 fname = xmalloc (sizeof GCC_INCLUDE_DIR - 8 + len);
1285 memcpy (fname, GCC_INCLUDE_DIR, sizeof GCC_INCLUDE_DIR - 9);
1286 memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1);
1289 append_include_chain (pfile, opts->pending, fname, BRACKET);
1291 /* Add directory to end of path for includes. */
1292 else if (!strcmp (argv[i], "-idirafter"))
1295 goto missing_dirname;
1296 append_include_chain (pfile, opts->pending,
1297 xstrdup (argv[++i]), AFTER);
1299 else if (!strcmp (argv[i], "-iprefix"))
1302 goto missing_filename;
1305 opts->include_prefix = argv[++i];
1306 opts->include_prefix_len = strlen (argv[i]);
1309 else if (!strcmp (argv[i], "-ifoutput"))
1310 opts->output_conditionals = 1;
1315 if (opts->out_fname != NULL)
1317 cpp_fatal (pfile, "Output filename specified twice");
1321 goto missing_filename;
1322 opts->out_fname = argv[++i];
1323 if (!strcmp (opts->out_fname, "-"))
1324 opts->out_fname = "";
1328 if (!strcmp (argv[i], "-pedantic"))
1329 CPP_PEDANTIC (pfile) = 1;
1330 else if (!strcmp (argv[i], "-pedantic-errors"))
1332 CPP_PEDANTIC (pfile) = 1;
1333 opts->pedantic_errors = 1;
1336 else if (!strcmp (argv[i], "-pcp")) {
1337 char *pcp_fname = argv[++i];
1338 pcp_outfile = ((pcp_fname[0] != '-' || pcp_fname[1] != '\0')
1339 ? fopen (pcp_fname, "w")
1340 : fdopen (dup (fileno (stdout)), "w"));
1341 if (pcp_outfile == 0)
1342 cpp_pfatal_with_name (pfile, pcp_fname);
1349 if (!strcmp (argv[i], "-traditional"))
1351 opts->traditional = 1;
1352 opts->cplusplus_comments = 0;
1354 else if (!strcmp (argv[i], "-trigraphs"))
1355 opts->trigraphs = 1;
1359 if (! strcmp (argv[i], "-lang-c"))
1360 opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
1361 opts->c9x = 1, opts->objc = 0;
1362 if (! strcmp (argv[i], "-lang-c89"))
1363 opts->cplusplus = 0, opts->cplusplus_comments = 0, opts->c89 = 1,
1364 opts->c9x = 0, opts->objc = 0;
1365 if (! strcmp (argv[i], "-lang-c++"))
1366 opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
1367 opts->c9x = 0, opts->objc = 0;
1368 if (! strcmp (argv[i], "-lang-objc"))
1369 opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
1370 opts->c9x = 0, opts->objc = 1;
1371 if (! strcmp (argv[i], "-lang-objc++"))
1372 opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0,
1373 opts->c9x = 0, opts->objc = 1;
1374 if (! strcmp (argv[i], "-lang-asm"))
1376 if (! strcmp (argv[i], "-lint"))
1378 if (! strcmp (argv[i], "-lang-chill"))
1379 opts->objc = 0, opts->cplusplus = 0, opts->chill = 1,
1380 opts->traditional = 1;
1384 opts->cplusplus = 1, opts->cplusplus_comments = 1;
1388 if (!strcmp (argv[i], "-std=iso9899:1990")
1389 || !strcmp (argv[i], "-std=iso9899:199409")
1390 || !strcmp (argv[i], "-std=c89")
1391 || !strcmp (argv[i], "-std=gnu89"))
1392 opts->cplusplus = 0, opts->cplusplus_comments = 0,
1393 opts->c89 = 1, opts->c9x = 0, opts->objc = 0;
1394 else if (!strcmp (argv[i], "-std=iso9899:199x")
1395 || !strcmp (argv[i], "-std=c9x")
1396 || !strcmp (argv[i], "-std=gnu9x"))
1397 opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0,
1398 opts->c9x = 1, opts->objc = 0;
1402 opts->inhibit_warnings = 1;
1406 if (!strcmp (argv[i], "-Wtrigraphs"))
1407 opts->warn_trigraphs = 1;
1408 else if (!strcmp (argv[i], "-Wno-trigraphs"))
1409 opts->warn_trigraphs = 0;
1410 else if (!strcmp (argv[i], "-Wcomment"))
1411 opts->warn_comments = 1;
1412 else if (!strcmp (argv[i], "-Wno-comment"))
1413 opts->warn_comments = 0;
1414 else if (!strcmp (argv[i], "-Wcomments"))
1415 opts->warn_comments = 1;
1416 else if (!strcmp (argv[i], "-Wno-comments"))
1417 opts->warn_comments = 0;
1418 else if (!strcmp (argv[i], "-Wtraditional"))
1419 opts->warn_stringify = 1;
1420 else if (!strcmp (argv[i], "-Wno-traditional"))
1421 opts->warn_stringify = 0;
1422 else if (!strcmp (argv[i], "-Wundef"))
1423 opts->warn_undef = 1;
1424 else if (!strcmp (argv[i], "-Wno-undef"))
1425 opts->warn_undef = 0;
1426 else if (!strcmp (argv[i], "-Wimport"))
1427 opts->warn_import = 1;
1428 else if (!strcmp (argv[i], "-Wno-import"))
1429 opts->warn_import = 0;
1430 else if (!strcmp (argv[i], "-Werror"))
1431 opts->warnings_are_errors = 1;
1432 else if (!strcmp (argv[i], "-Wno-error"))
1433 opts->warnings_are_errors = 0;
1434 else if (!strcmp (argv[i], "-Wall"))
1436 opts->warn_trigraphs = 1;
1437 opts->warn_comments = 1;
1442 /* The style of the choices here is a bit mixed.
1443 The chosen scheme is a hybrid of keeping all options in one string
1444 and specifying each option in a separate argument:
1445 -M|-MM|-MD file|-MMD file [-MG]. An alternative is:
1446 -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
1447 -M[M][G][D file]. This is awkward to handle in specs, and is not
1449 /* ??? -MG must be specified in addition to one of -M or -MM.
1450 This can be relaxed in the future without breaking anything.
1451 The converse isn't true. */
1453 /* -MG isn't valid with -MD or -MMD. This is checked for later. */
1454 if (!strcmp (argv[i], "-MG"))
1456 opts->print_deps_missing_files = 1;
1459 if (!strcmp (argv[i], "-M"))
1460 opts->print_deps = 2;
1461 else if (!strcmp (argv[i], "-MM"))
1462 opts->print_deps = 1;
1463 else if (!strcmp (argv[i], "-MD"))
1464 opts->print_deps = 2;
1465 else if (!strcmp (argv[i], "-MMD"))
1466 opts->print_deps = 1;
1467 /* For -MD and -MMD options, write deps on file named by next arg. */
1468 if (!strcmp (argv[i], "-MD") || !strcmp (argv[i], "-MMD"))
1471 goto missing_filename;
1472 opts->deps_file = argv[++i];
1476 /* For -M and -MM, write deps on standard output
1477 and suppress the usual output. */
1478 opts->no_output = 1;
1484 char *p = argv[i] + 2;
1486 while ((c = *p++) != 0)
1488 /* Arg to -d specifies what parts of macros to dump */
1492 opts->dump_macros = dump_only;
1493 opts->no_output = 1;
1496 opts->dump_macros = dump_names;
1499 opts->dump_macros = dump_definitions;
1502 opts->dump_includes = 1;
1510 if (argv[i][2] == '3')
1511 opts->debug_output = 1;
1515 if (!strcmp (argv[i], "--help"))
1517 else if (!strcmp (argv[i], "--version"))
1518 cpp_notice ("GNU CPP version %s\n", version_string);
1523 cpp_notice ("GNU CPP version %s", version_string);
1524 #ifdef TARGET_VERSION
1527 fputc ('\n', stderr);
1532 opts->print_include_names = 1;
1537 struct pending_option *o = (struct pending_option *)
1538 xmalloc (sizeof (struct pending_option));
1539 if (argv[i][2] != 0)
1540 o->arg = argv[i] + 2;
1541 else if (i + 1 == argc)
1543 cpp_fatal (pfile, "Macro name missing after -D option");
1551 APPEND (opts->pending, define, o);
1559 if (argv[i][2] != 0)
1561 else if (i + 1 == argc)
1563 cpp_fatal (pfile, "Assertion missing after -A option");
1569 if (strcmp (p, "-"))
1571 struct pending_option *o = (struct pending_option *)
1572 xmalloc (sizeof (struct pending_option));
1577 APPEND (opts->pending, assert, o);
1581 /* -A- eliminates all predefined macros and assertions.
1582 Let's include also any that were specified earlier
1583 on the command line. That way we can get rid of any
1584 that were passed automatically in from GCC. */
1585 struct pending_option *o1, *o2;
1587 o1 = opts->pending->define_head;
1594 o1 = opts->pending->assert_head;
1601 opts->pending->assert_head = NULL;
1602 opts->pending->assert_tail = NULL;
1603 opts->pending->define_head = NULL;
1604 opts->pending->define_tail = NULL;
1611 struct pending_option *o = (struct pending_option *)
1612 xmalloc (sizeof (struct pending_option));
1614 if (argv[i][2] != 0)
1615 o->arg = argv[i] + 2;
1616 else if (i + 1 == argc)
1618 cpp_fatal (pfile, "Macro name missing after -U option");
1626 APPEND (opts->pending, define, o);
1631 opts->put_out_comments = 1;
1634 case 'E': /* -E comes from cc -E; ignore it. */
1638 opts->no_line_commands = 1;
1641 case '$': /* Don't include $ in identifiers. */
1642 opts->dollars_in_ident = 0;
1646 if (!strcmp (argv[i], "-nostdinc"))
1647 /* -nostdinc causes no default include directories.
1648 You must specify all include-file directories with -I. */
1649 opts->no_standard_includes = 1;
1650 else if (!strcmp (argv[i], "-nostdinc++"))
1651 /* -nostdinc++ causes no default C++-specific include directories. */
1652 opts->no_standard_cplusplus_includes = 1;
1654 else if (!strcmp (argv[i], "-noprecomp"))
1660 if (!strcmp (argv[i], "-remap"))
1664 case '\0': /* JF handle '-' as file name meaning stdin or stdout */
1665 if (opts->in_fname == NULL)
1666 opts->in_fname = "";
1667 else if (opts->out_fname == NULL)
1668 opts->out_fname = "";
1670 return i; /* error */
1680 cpp_fatal (pfile, "Filename missing after `%s' option", argv[i]);
1683 cpp_fatal (pfile, "Directory name missing after `%s' option", argv[i]);
1687 /* Handle command-line options in (argc, argv).
1688 Can be called multiple times, to handle multiple sets of options.
1689 Returns if an unrecognized option is seen.
1690 Returns number of strings consumed. */
1693 cpp_handle_options (pfile, argc, argv)
1699 int strings_processed;
1700 for (i = 0; i < argc; i += strings_processed)
1702 strings_processed = cpp_handle_option (pfile, argc - i, argv + i);
1703 if (strings_processed == 0)
1712 cpp_notice ("Usage: %s [switches] input output\n", progname);
1715 -include <file> Include the contents of <file> before other files\n\
1716 -imacros <file> Accept definition of macros in <file>\n\
1717 -iprefix <path> Specify <path> as a prefix for next two options\n\
1718 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1719 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1720 -isystem <dir> Add <dir> to the start of the system include path\n\
1721 -idirafter <dir> Add <dir> to the end of the system include path\n\
1722 -I <dir> Add <dir> to the end of the main include path\n\
1723 -nostdinc Do not search system include directories\n\
1724 (dirs specified with -isystem will still be used)\n\
1725 -nostdinc++ Do not search system include directories for C++\n\
1726 -o <file> Put output into <file>\n\
1727 -pedantic Issue all warnings demanded by strict ANSI C\n\
1728 -traditional Follow K&R pre-processor behaviour\n\
1729 -trigraphs Support ANSI C trigraphs\n\
1730 -lang-c Assume that the input sources are in C\n\
1731 -lang-c89 Assume that the input sources are in C89\n\
1732 -lang-c++ Assume that the input sources are in C++\n\
1733 -lang-objc Assume that the input sources are in ObjectiveC\n\
1734 -lang-objc++ Assume that the input sources are in ObjectiveC++\n\
1735 -lang-asm Assume that the input sources are in assembler\n\
1736 -lang-chill Assume that the input sources are in Chill\n\
1737 -std=<std name> Specify the conformance standard; one of:\n\
1738 gnu89, gnu9x, c89, c9x, iso9899:1990,\n\
1739 iso9899:199409, iso9899:199x\n\
1740 -+ Allow parsing of C++ style features\n\
1741 -w Inhibit warning messages\n\
1742 -Wtrigraphs Warn if trigraphs are encountered\n\
1743 -Wno-trigraphs Do not warn about trigraphs\n\
1744 -Wcomment{s} Warn if one comment starts inside another\n\
1745 -Wno-comment{s} Do not warn about comments\n\
1746 -Wtraditional Warn if a macro argument is/would be turned into\n\
1747 a string if -traditional is specified\n\
1748 -Wno-traditional Do not warn about stringification\n\
1749 -Wundef Warn if an undefined macro is used by #if\n\
1750 -Wno-undef Do not warn about testing undefined macros\n\
1751 -Wimport Warn about the use of the #import directive\n\
1752 -Wno-import Do not warn about the use of #import\n\
1753 -Werror Treat all warnings as errors\n\
1754 -Wno-error Do not treat warnings as errors\n\
1755 -Wall Enable all preprocessor warnings\n\
1756 -M Generate make dependencies\n\
1757 -MM As -M, but ignore system header files\n\
1758 -MD As -M, but put output in a .d file\n\
1759 -MMD As -MD, but ignore system header files\n\
1760 -MG Treat missing header file as generated files\n\
1761 -g Include #define and #undef directives in the output\n\
1762 -D<macro> Define a <macro> with string '1' as its value\n\
1763 -D<macro>=<val> Define a <macro> with <val> as its value\n\
1764 -A<question> (<answer>) Assert the <answer> to <question>\n\
1765 -U<macro> Undefine <macro> \n\
1766 -v Display the version number\n\
1767 -H Print the name of header files as they are used\n\
1768 -C Do not discard comments\n\
1769 -dM Display a list of macro definitions active at end\n\
1770 -dD Preserve macro definitions in output\n\
1771 -dN As -dD except that only the names are preserved\n\
1772 -dI Include #include directives in the output\n\
1773 -ifoutput Describe skipped code blocks in output \n\
1774 -P Do not generate #line directives\n\
1775 -$ Do not allow '$' in identifiers\n\
1776 -remap Remap file names when including files.\n\
1777 -h or --help Display this information\n\