diff options
Diffstat (limited to 'contrib/gcc/cppinit.c')
-rw-r--r-- | contrib/gcc/cppinit.c | 1779 |
1 files changed, 0 insertions, 1779 deletions
diff --git a/contrib/gcc/cppinit.c b/contrib/gcc/cppinit.c deleted file mode 100644 index 86e0d68a78fe..000000000000 --- a/contrib/gcc/cppinit.c +++ /dev/null @@ -1,1779 +0,0 @@ -/* CPP Library. - Copyright (C) 1986, 87, 89, 92-98, 1999 Free Software Foundation, Inc. - Contributed by Per Bothner, 1994-95. - Based on CCCP program by Paul Rubin, June 1986 - Adapted to ANSI C, Richard Stallman, Jan 1987 - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "config.h" -#include "system.h" - -#define FAKE_CONST -#include "cpplib.h" -#include "cpphash.h" -#include "output.h" -#include "prefix.h" -#include "intl.h" - -/* XXX Should be in a header file. */ -extern char *version_string; - -/* Predefined symbols, built-in macros, and the default include path. */ - -#ifndef GET_ENV_PATH_LIST -#define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0) -#endif - -/* By default, colon separates directories in a path. */ -#ifndef PATH_SEPARATOR -#define PATH_SEPARATOR ':' -#endif - -#ifndef STANDARD_INCLUDE_DIR -#define STANDARD_INCLUDE_DIR "/usr/include" -#endif - -/* We let tm.h override the types used here, to handle trivial differences - such as the choice of unsigned int or long unsigned int for size_t. - When machines start needing nontrivial differences in the size type, - it would be best to do something here to figure out automatically - from other information what type to use. */ - -/* The string value for __SIZE_TYPE__. */ - -#ifndef SIZE_TYPE -#define SIZE_TYPE "long unsigned int" -#endif - -/* The string value for __PTRDIFF_TYPE__. */ - -#ifndef PTRDIFF_TYPE -#define PTRDIFF_TYPE "long int" -#endif - -/* The string value for __WCHAR_TYPE__. */ - -#ifndef WCHAR_TYPE -#define WCHAR_TYPE "int" -#endif -#define CPP_WCHAR_TYPE(PFILE) \ - (CPP_OPTIONS (PFILE)->cplusplus ? "__wchar_t" : WCHAR_TYPE) - -/* The string value for __USER_LABEL_PREFIX__ */ - -#ifndef USER_LABEL_PREFIX -#define USER_LABEL_PREFIX "" -#endif - -/* The string value for __REGISTER_PREFIX__ */ - -#ifndef REGISTER_PREFIX -#define REGISTER_PREFIX "" -#endif - -/* Suffix for object files, and known input-file extensions. */ -static char *known_suffixes[] = -{ - ".c", ".C", ".s", ".S", ".m", - ".cc", ".cxx", ".cpp", ".cp", ".c++", - NULL -}; - -#ifndef OBJECT_SUFFIX -# ifdef VMS -# define OBJECT_SUFFIX ".obj" -# else -# define OBJECT_SUFFIX ".o" -# endif -#endif - - -/* This is the default list of directories to search for include files. - It may be overridden by the various -I and -ixxx options. - - #include "file" looks in the same directory as the current file, - then this list. - #include <file> just looks in this list. - - All these directories are treated as `system' include directories - (they are not subject to pedantic warnings in some cases). */ - -static struct default_include -{ - char *fname; /* The name of the directory. */ - char *component; /* The component containing the directory - (see update_path in prefix.c) */ - int cplusplus; /* Only look here if we're compiling C++. */ - int cxx_aware; /* Includes in this directory don't need to - be wrapped in extern "C" when compiling - C++. This is not used anymore. */ -} -include_defaults_array[] -#ifdef INCLUDE_DEFAULTS -= INCLUDE_DEFAULTS; -#else -= { - /* Pick up GNU C++ specific include files. */ - { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, -#ifdef CROSS_COMPILE - /* This is the dir for fixincludes. Put it just before - the files that we fix. */ - { GCC_INCLUDE_DIR, "GCC", 0, 0 }, - /* For cross-compilation, this dir name is generated - automatically in Makefile.in. */ - { CROSS_INCLUDE_DIR, "GCC", 0, 0 }, -#ifdef TOOL_INCLUDE_DIR - /* This is another place that the target system's headers might be. */ - { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 }, -#endif -#else /* not CROSS_COMPILE */ -#ifdef LOCAL_INCLUDE_DIR - /* This should be /usr/local/include and should come before - the fixincludes-fixed header files. */ - { LOCAL_INCLUDE_DIR, 0, 0, 1 }, -#endif -#ifdef TOOL_INCLUDE_DIR - /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here. - Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h. */ - { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 }, -#endif - /* This is the dir for fixincludes. Put it just before - the files that we fix. */ - { GCC_INCLUDE_DIR, "GCC", 0, 0 }, - /* Some systems have an extra dir of include files. */ -#ifdef SYSTEM_INCLUDE_DIR - { SYSTEM_INCLUDE_DIR, 0, 0, 0 }, -#endif -#ifndef STANDARD_INCLUDE_COMPONENT -#define STANDARD_INCLUDE_COMPONENT 0 -#endif - { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0 }, -#endif /* not CROSS_COMPILE */ - { 0, 0, 0, 0 } - }; -#endif /* no INCLUDE_DEFAULTS */ - -/* Internal structures and prototypes. */ - -/* A `struct pending_option' remembers one -D, -A, -U, -include, or -imacros - switch. There are four lists: one for -D and -U, one for -A, one - for -include, one for -imacros. `undef' is set for -U, clear for - -D, ignored for the others. - (Future: add an equivalent of -U for -A) */ -struct pending_option -{ - struct pending_option *next; - char *arg; - int undef; -}; - -#ifdef __STDC__ -#define APPEND(pend, list, elt) \ - do { if (!(pend)->list##_head) (pend)->list##_head = (elt); \ - else (pend)->list##_tail->next = (elt); \ - (pend)->list##_tail = (elt); \ - } while (0) -#else -#define APPEND(pend, list, elt) \ - do { if (!(pend)->list/**/_head) (pend)->list/**/_head = (elt); \ - else (pend)->list/**/_tail->next = (elt); \ - (pend)->list/**/_tail = (elt); \ - } while (0) -#endif - -static void initialize_char_syntax PARAMS ((int)); -static void print_help PARAMS ((void)); -static void path_include PARAMS ((cpp_reader *, - struct cpp_pending *, - char *, int)); -static void initialize_builtins PARAMS ((cpp_reader *)); -static void append_include_chain PARAMS ((cpp_reader *, - struct cpp_pending *, - char *, int)); - -/* Last argument to append_include_chain: chain to use */ -enum { QUOTE = 0, BRACKET, SYSTEM, AFTER }; - -/* If gcc is in use (stage2/stage3) we can make these tables initialized - data. */ -#if defined __GNUC__ && (__GNUC__ > 2 \ - || (__GNUC__ == 2 && __GNUC_MINOR__ > 8)) -/* Table to tell if a character is legal as the second or later character - of a C identifier. */ -U_CHAR is_idchar[256] = -{ - ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, - ['g'] = 1, ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, - ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, - ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1, - ['y'] = 1, ['z'] = 1, - - ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, - ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1, - ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1, - ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1, - ['Y'] = 1, ['Z'] = 1, - - ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1, - ['7'] = 1, ['8'] = 1, ['9'] = 1, ['0'] = 1, - - ['_'] = 1, -}; - -/* Table to tell if a character is legal as the first character of - a C identifier. */ -U_CHAR is_idstart[256] = -{ - ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, - ['g'] = 1, ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, - ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, - ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1, - ['y'] = 1, ['z'] = 1, - - ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, - ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1, - ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1, - ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1, - ['Y'] = 1, ['Z'] = 1, - - ['_'] = 1, -}; - -/* Table to tell if a character is horizontal space. - \r is magical, so it is not in here. */ -U_CHAR is_hor_space[256] = -{ - [' '] = 1, ['\t'] = 1, ['\v'] = 1, ['\f'] = 1, -}; -/* table to tell if a character is horizontal or vertical space. */ -U_CHAR is_space[256] = -{ - [' '] = 1, ['\t'] = 1, ['\v'] = 1, ['\f'] = 1, ['\n'] = 1, -}; -/* Table to handle trigraph conversion, which occurs before all other - processing, everywhere in the file. (This is necessary since one - of the trigraphs encodes backslash.) Note it's off by default. - - from to from to from to - ?? = # ?? ) ] ?? ! | - ?? ( [ ?? ' ^ ?? > } - ?? / \ ?? < { ?? - ~ - - There is not a space between the ?? and the third char. I put spaces - there to avoid warnings when compiling this file. */ -U_CHAR trigraph_table[256] = -{ - ['='] = '#', [')'] = ']', ['!'] = '|', - ['('] = '[', ['\''] = '^', ['>'] = '}', - ['/'] = '\\', ['<'] = '{', ['-'] = '~', -}; - -/* This function will be entirely removed soon. */ -static inline void -initialize_char_syntax (dollar_in_ident) - int dollar_in_ident; -{ - is_idchar['$'] = dollar_in_ident; - is_idstart['$'] = dollar_in_ident; -} - -#else /* Not GCC. */ - -U_CHAR is_idchar[256] = { 0 }; -U_CHAR is_idstart[256] = { 0 }; -U_CHAR is_hor_space[256] = { 0 }; -U_CHAR is_space[256] = { 0 }; -U_CHAR trigraph_table[256] = { 0 }; - -/* Initialize syntactic classifications of characters. */ -static void -initialize_char_syntax (dollar_in_ident) - int dollar_in_ident; -{ - is_idstart['a'] = 1; is_idstart['b'] = 1; is_idstart['c'] = 1; - is_idstart['d'] = 1; is_idstart['e'] = 1; is_idstart['f'] = 1; - is_idstart['g'] = 1; is_idstart['h'] = 1; is_idstart['i'] = 1; - is_idstart['j'] = 1; is_idstart['k'] = 1; is_idstart['l'] = 1; - is_idstart['m'] = 1; is_idstart['n'] = 1; is_idstart['o'] = 1; - is_idstart['p'] = 1; is_idstart['q'] = 1; is_idstart['r'] = 1; - is_idstart['s'] = 1; is_idstart['t'] = 1; is_idstart['u'] = 1; - is_idstart['v'] = 1; is_idstart['w'] = 1; is_idstart['x'] = 1; - is_idstart['y'] = 1; is_idstart['z'] = 1; - - is_idstart['A'] = 1; is_idstart['B'] = 1; is_idstart['C'] = 1; - is_idstart['D'] = 1; is_idstart['E'] = 1; is_idstart['F'] = 1; - is_idstart['G'] = 1; is_idstart['H'] = 1; is_idstart['I'] = 1; - is_idstart['J'] = 1; is_idstart['K'] = 1; is_idstart['L'] = 1; - is_idstart['M'] = 1; is_idstart['N'] = 1; is_idstart['O'] = 1; - is_idstart['P'] = 1; is_idstart['Q'] = 1; is_idstart['R'] = 1; - is_idstart['S'] = 1; is_idstart['T'] = 1; is_idstart['U'] = 1; - is_idstart['V'] = 1; is_idstart['W'] = 1; is_idstart['X'] = 1; - is_idstart['Y'] = 1; is_idstart['Z'] = 1; - - is_idstart['_'] = 1; - - is_idchar['a'] = 1; is_idchar['b'] = 1; is_idchar['c'] = 1; - is_idchar['d'] = 1; is_idchar['e'] = 1; is_idchar['f'] = 1; - is_idchar['g'] = 1; is_idchar['h'] = 1; is_idchar['i'] = 1; - is_idchar['j'] = 1; is_idchar['k'] = 1; is_idchar['l'] = 1; - is_idchar['m'] = 1; is_idchar['n'] = 1; is_idchar['o'] = 1; - is_idchar['p'] = 1; is_idchar['q'] = 1; is_idchar['r'] = 1; - is_idchar['s'] = 1; is_idchar['t'] = 1; is_idchar['u'] = 1; - is_idchar['v'] = 1; is_idchar['w'] = 1; is_idchar['x'] = 1; - is_idchar['y'] = 1; is_idchar['z'] = 1; - - is_idchar['A'] = 1; is_idchar['B'] = 1; is_idchar['C'] = 1; - is_idchar['D'] = 1; is_idchar['E'] = 1; is_idchar['F'] = 1; - is_idchar['G'] = 1; is_idchar['H'] = 1; is_idchar['I'] = 1; - is_idchar['J'] = 1; is_idchar['K'] = 1; is_idchar['L'] = 1; - is_idchar['M'] = 1; is_idchar['N'] = 1; is_idchar['O'] = 1; - is_idchar['P'] = 1; is_idchar['Q'] = 1; is_idchar['R'] = 1; - is_idchar['S'] = 1; is_idchar['T'] = 1; is_idchar['U'] = 1; - is_idchar['V'] = 1; is_idchar['W'] = 1; is_idchar['X'] = 1; - is_idchar['Y'] = 1; is_idchar['Z'] = 1; - - is_idchar['1'] = 1; is_idchar['2'] = 1; is_idchar['3'] = 1; - is_idchar['4'] = 1; is_idchar['5'] = 1; is_idchar['6'] = 1; - is_idchar['7'] = 1; is_idchar['8'] = 1; is_idchar['9'] = 1; - is_idchar['0'] = 1; - - is_idchar['_'] = 1; - - is_idchar['$'] = dollar_in_ident; - is_idstart['$'] = dollar_in_ident; - - /* white space tables */ - is_hor_space[' '] = 1; - is_hor_space['\t'] = 1; - is_hor_space['\v'] = 1; - is_hor_space['\f'] = 1; - - is_space[' '] = 1; - is_space['\t'] = 1; - is_space['\v'] = 1; - is_space['\f'] = 1; - is_space['\n'] = 1; - - /* trigraph conversion */ - trigraph_table['='] = '#'; trigraph_table[')'] = ']'; - trigraph_table['!'] = '|'; trigraph_table['('] = '['; - trigraph_table['\''] = '^'; trigraph_table['>'] = '}'; - trigraph_table['/'] = '\\'; trigraph_table['<'] = '{'; - trigraph_table['-'] = '~'; -} - -#endif /* Not GCC. */ - -/* Given a colon-separated list of file names PATH, - add all the names to the search path for include files. */ - -static void -path_include (pfile, pend, list, path) - cpp_reader *pfile; - struct cpp_pending *pend; - char *list; - int path; -{ - char *p, *q, *name; - - p = list; - - do - { - /* Find the end of this name. */ - q = p; - while (*q != 0 && *q != PATH_SEPARATOR) q++; - if (q == p) - { - /* An empty name in the path stands for the current directory. */ - name = (char *) xmalloc (2); - name[0] = '.'; - name[1] = 0; - } - else - { - /* Otherwise use the directory that is named. */ - name = (char *) xmalloc (q - p + 1); - memcpy (name, p, q - p); - name[q - p] = 0; - } - - append_include_chain (pfile, pend, name, path); - - /* Advance past this name. */ - if (*q == 0) - break; - p = q + 1; - } - while (1); -} - -/* Find the base name of a (partial) pathname FNAME. - Returns a pointer into the string passed in. - Accepts Unix (/-separated) paths on all systems, - DOS and VMS paths on those systems. */ -static char * -base_name (fname) - const char *fname; -{ - char *s = (char *)fname; - char *p; -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (ISALPHA (s[0]) && s[1] == ':') s += 2; - if ((p = rindex (s, '\\'))) s = p + 1; -#elif defined VMS - if ((p = rindex (s, ':'))) s = p + 1; /* Skip device. */ - if ((p = rindex (s, ']'))) s = p + 1; /* Skip directory. */ - if ((p = rindex (s, '>'))) s = p + 1; /* Skip alternate (int'n'l) dir. */ -#endif - if ((p = rindex (s, '/'))) s = p + 1; - return s; -} - - -/* Append DIR to include path PATH. DIR must be permanently allocated - and writable. */ -static void -append_include_chain (pfile, pend, dir, path) - cpp_reader *pfile; - struct cpp_pending *pend; - char *dir; - int path; -{ - struct file_name_list *new; - struct stat st; - unsigned int len; - - simplify_pathname (dir); - if (stat (dir, &st)) - { - /* Dirs that don't exist are silently ignored. */ - if (errno != ENOENT) - cpp_perror_with_name (pfile, dir); - else if (CPP_OPTIONS (pfile)->verbose) - cpp_notice ("ignoring nonexistent directory `%s'\n", dir); - return; - } - - if (!S_ISDIR (st.st_mode)) - { - cpp_message (pfile, 1, "%s: %s: Not a directory", progname, dir); - return; - } - - len = strlen (dir); - if (len > pfile->max_include_len) - pfile->max_include_len = len; - - new = (struct file_name_list *)xmalloc (sizeof (struct file_name_list)); - new->name = dir; - new->nlen = len; - new->ino = st.st_ino; - new->dev = st.st_dev; - new->sysp = (path == SYSTEM); - new->name_map = NULL; - - switch (path) - { - case QUOTE: APPEND (pend, quote, new); break; - case BRACKET: APPEND (pend, brack, new); break; - case SYSTEM: APPEND (pend, systm, new); break; - case AFTER: APPEND (pend, after, new); break; - } -} - - -/* Write out a #define command for the special named MACRO_NAME - to PFILE's token_buffer. */ - -static void -dump_special_to_buffer (pfile, macro_name) - cpp_reader *pfile; - char *macro_name; -{ - static char define_directive[] = "#define "; - int macro_name_length = strlen (macro_name); - output_line_command (pfile, same_file); - CPP_RESERVE (pfile, sizeof(define_directive) + macro_name_length); - CPP_PUTS_Q (pfile, define_directive, sizeof(define_directive)-1); - CPP_PUTS_Q (pfile, macro_name, macro_name_length); - CPP_PUTC_Q (pfile, ' '); - cpp_expand_to_buffer (pfile, macro_name, macro_name_length); - CPP_PUTC (pfile, '\n'); -} - -/* Initialize a cpp_options structure. */ -void -cpp_options_init (opts) - cpp_options *opts; -{ - bzero ((char *) opts, sizeof (struct cpp_options)); - - opts->dollars_in_ident = 1; - opts->cplusplus_comments = 1; - opts->warn_import = 1; - - opts->pending = (struct cpp_pending *) xmalloc (sizeof (struct cpp_pending)); - bzero ((char *) opts->pending, sizeof (struct cpp_pending)); -} - -/* Initialize a cpp_reader structure. */ -void -cpp_reader_init (pfile) - cpp_reader *pfile; -{ - bzero ((char *) pfile, sizeof (cpp_reader)); -#if 0 - pfile->get_token = cpp_get_token; -#endif - - pfile->token_buffer_size = 200; - pfile->token_buffer = (U_CHAR *) xmalloc (pfile->token_buffer_size); - CPP_SET_WRITTEN (pfile, 0); - - pfile->hashtab = (HASHNODE **) xcalloc (HASHSIZE, sizeof (HASHNODE *)); -} - -/* Free resources used by PFILE. - This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology). */ -void -cpp_cleanup (pfile) - cpp_reader *pfile; -{ - int i; - while (CPP_BUFFER (pfile) != CPP_NULL_BUFFER (pfile)) - cpp_pop_buffer (pfile); - - if (pfile->token_buffer) - { - free (pfile->token_buffer); - pfile->token_buffer = NULL; - } - - if (pfile->deps_buffer) - { - free (pfile->deps_buffer); - pfile->deps_buffer = NULL; - pfile->deps_allocated_size = 0; - } - - if (pfile->input_buffer) - { - free (pfile->input_buffer); - free (pfile->input_speccase); - pfile->input_buffer = pfile->input_speccase = NULL; - pfile->input_buffer_len = 0; - } - - while (pfile->if_stack) - { - IF_STACK_FRAME *temp = pfile->if_stack; - pfile->if_stack = temp->next; - free (temp); - } - - for (i = ALL_INCLUDE_HASHSIZE; --i >= 0; ) - { - struct include_hash *imp = pfile->all_include_files[i]; - while (imp) - { - struct include_hash *next = imp->next; -#if 0 - /* This gets freed elsewhere - I think. */ - free (imp->name); -#endif - free (imp); - imp = next; - } - pfile->all_include_files[i] = 0; - } - - for (i = HASHSIZE; --i >= 0;) - { - while (pfile->hashtab[i]) - delete_macro (pfile->hashtab[i]); - } - free (pfile->hashtab); -} - - -/* Initialize the built-in macros. */ -static void -initialize_builtins (pfile) - cpp_reader *pfile; -{ -#define NAME(str) (U_CHAR *)str, sizeof str - 1 - cpp_install (pfile, NAME("__TIME__"), T_TIME, 0, -1); - cpp_install (pfile, NAME("__DATE__"), T_DATE, 0, -1); - cpp_install (pfile, NAME("__FILE__"), T_FILE, 0, -1); - cpp_install (pfile, NAME("__BASE_FILE__"), T_BASE_FILE, 0, -1); - cpp_install (pfile, NAME("__LINE__"), T_SPECLINE, 0, -1); - cpp_install (pfile, NAME("__INCLUDE_LEVEL__"), T_INCLUDE_LEVEL, 0, -1); - cpp_install (pfile, NAME("__VERSION__"), T_VERSION, 0, -1); -#ifndef NO_BUILTIN_SIZE_TYPE - cpp_install (pfile, NAME("__SIZE_TYPE__"), T_CONST, SIZE_TYPE, -1); -#endif -#ifndef NO_BUILTIN_PTRDIFF_TYPE - cpp_install (pfile, NAME("__PTRDIFF_TYPE__ "), T_CONST, PTRDIFF_TYPE, -1); -#endif - cpp_install (pfile, NAME("__WCHAR_TYPE__"), T_CONST, WCHAR_TYPE, -1); - cpp_install (pfile, NAME("__USER_LABEL_PREFIX__"), T_CONST, user_label_prefix, -1); - cpp_install (pfile, NAME("__REGISTER_PREFIX__"), T_CONST, REGISTER_PREFIX, -1); - cpp_install (pfile, NAME("__HAVE_BUILTIN_SETJMP__"), T_CONST, "1", -1); - if (!CPP_TRADITIONAL (pfile)) - { - cpp_install (pfile, NAME("__STDC__"), T_STDC, 0, -1); -#if 0 - if (CPP_OPTIONS (pfile)->c9x) - cpp_install (pfile, NAME("__STDC_VERSION__"),T_CONST, "199909L", -1); - else -#endif - cpp_install (pfile, NAME("__STDC_VERSION__"),T_CONST, "199409L", -1); - } -#undef NAME - - if (CPP_OPTIONS (pfile)->debug_output) - { - dump_special_to_buffer (pfile, "__BASE_FILE__"); - dump_special_to_buffer (pfile, "__VERSION__"); -#ifndef NO_BUILTIN_SIZE_TYPE - dump_special_to_buffer (pfile, "__SIZE_TYPE__"); -#endif -#ifndef NO_BUILTIN_PTRDIFF_TYPE - dump_special_to_buffer (pfile, "__PTRDIFF_TYPE__"); -#endif - dump_special_to_buffer (pfile, "__WCHAR_TYPE__"); - dump_special_to_buffer (pfile, "__DATE__"); - dump_special_to_buffer (pfile, "__TIME__"); - if (!CPP_TRADITIONAL (pfile)) - dump_special_to_buffer (pfile, "__STDC__"); - } -} - -/* Another subroutine of cpp_start_read. This one sets up to do - dependency-file output. */ -static void -initialize_dependency_output (pfile) - cpp_reader *pfile; -{ - cpp_options *opts = CPP_OPTIONS (pfile); - char *spec, *s, *output_file; - - /* Either of two environment variables can specify output of deps. - Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET", - where OUTPUT_FILE is the file to write deps info to - and DEPS_TARGET is the target to mention in the deps. */ - - if (opts->print_deps == 0) - { - spec = getenv ("DEPENDENCIES_OUTPUT"); - if (spec) - opts->print_deps = 1; - else - { - spec = getenv ("SUNPRO_DEPENDENCIES"); - if (spec) - opts->print_deps = 2; - else - return; - } - - /* Find the space before the DEPS_TARGET, if there is one. */ - s = strchr (spec, ' '); - if (s) - { - opts->deps_target = s + 1; - output_file = (char *) xmalloc (s - spec + 1); - memcpy (output_file, spec, s - spec); - output_file[s - spec] = 0; - } - else - { - opts->deps_target = 0; - output_file = spec; - } - - opts->deps_file = output_file; - opts->print_deps_append = 1; - } - - /* Print the expected object file name as the target of this Make-rule. */ - pfile->deps_allocated_size = 200; - pfile->deps_buffer = (char *) xmalloc (pfile->deps_allocated_size); - pfile->deps_buffer[0] = 0; - pfile->deps_size = 0; - pfile->deps_column = 0; - - if (opts->deps_target) - deps_output (pfile, opts->deps_target, ':'); - else if (*opts->in_fname == 0) - deps_output (pfile, "-", ':'); - else - { - char *p, *q, *r; - int len, x; - - /* Discard all directory prefixes from filename. */ - q = base_name (opts->in_fname); - - /* Copy remainder to mungable area. */ - len = strlen (q); - p = (char *) alloca (len + 8); - strcpy (p, q); - - /* Output P, but remove known suffixes. */ - q = p + len; - /* Point to the filename suffix. */ - r = rindex (p, '.'); - /* Compare against the known suffixes. */ - for (x = 0; known_suffixes[x]; x++) - { - if (strncmp (known_suffixes[x], r, q - r) == 0) - { - /* Make q point to the bit we're going to overwrite - with an object suffix. */ - q = r; - break; - } - } - - /* Supply our own suffix. */ - strcpy (q, OBJECT_SUFFIX); - - deps_output (pfile, p, ':'); - deps_output (pfile, opts->in_fname, ' '); - } -} - -/* This is called after options have been processed. - * Check options for consistency, and setup for processing input - * from the file named FNAME. (Use standard input if FNAME==NULL.) - * Return 1 on success, 0 on failure. - */ - -int -cpp_start_read (pfile, fname) - cpp_reader *pfile; - char *fname; -{ - struct cpp_options *opts = CPP_OPTIONS (pfile); - struct pending_option *p, *q; - int f; - cpp_buffer *fp; - struct include_hash *ih_fake; - - /* -MG doesn't select the form of output and must be specified with one of - -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't - inhibit compilation. */ - if (opts->print_deps_missing_files - && (opts->print_deps == 0 || !opts->no_output)) - { - cpp_fatal (pfile, "-MG must be specified with one of -M or -MM"); - return 0; - } - - /* Chill should not be used with -trigraphs. */ - if (opts->chill && opts->trigraphs) - { - cpp_warning (pfile, "-lang-chill and -trigraphs are mutually exclusive"); - opts->trigraphs = 0; - } - - /* Set this if it hasn't been set already. */ - if (user_label_prefix == NULL) - user_label_prefix = USER_LABEL_PREFIX; - - /* Now that we know dollars_in_ident, we can initialize the syntax - tables. */ - initialize_char_syntax (opts->dollars_in_ident); - - /* Do partial setup of input buffer for the sake of generating - early #line directives (when -g is in effect). */ - fp = cpp_push_buffer (pfile, NULL, 0); - if (!fp) - return 0; - if (opts->in_fname == NULL || *opts->in_fname == 0) - { - opts->in_fname = fname; - if (opts->in_fname == NULL) - opts->in_fname = ""; - } - fp->nominal_fname = fp->fname = opts->in_fname; - fp->lineno = 0; - - /* Install __LINE__, etc. Must follow initialize_char_syntax - and option processing. */ - initialize_builtins (pfile); - - /* Do -U's, -D's and -A's in the order they were seen. */ - p = opts->pending->define_head; - while (p) - { - if (opts->debug_output) - output_line_command (pfile, same_file); - if (p->undef) - cpp_undef (pfile, p->arg); - else - cpp_define (pfile, p->arg); - - q = p->next; - free (p); - p = q; - } - - p = opts->pending->assert_head; - while (p) - { - if (opts->debug_output) - output_line_command (pfile, same_file); - if (p->undef) - cpp_unassert (pfile, p->arg); - else - cpp_assert (pfile, p->arg); - - q = p->next; - free (p); - p = q; - } - - opts->done_initializing = 1; - - /* Several environment variables may add to the include search path. - CPATH specifies an additional list of directories to be searched - as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, - etc. specify an additional list of directories to be searched as - if specified with -isystem, for the language indicated. - - These variables are ignored if -nostdinc is on. */ - if (! opts->no_standard_includes) - { - char *path; - GET_ENV_PATH_LIST (path, "CPATH"); - if (path != 0 && *path != 0) - path_include (pfile, opts->pending, path, BRACKET); - - switch ((opts->objc << 1) + opts->cplusplus) - { - case 0: - GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH"); - break; - case 1: - GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH"); - break; - case 2: - GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH"); - break; - case 3: - GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH"); - break; - } - if (path != 0 && *path != 0) - path_include (pfile, opts->pending, path, SYSTEM); - } - - /* Unless -nostdinc, add the compiled-in include path to the list, - translating prefixes. */ - if (!opts->no_standard_includes) - { - struct default_include *p = include_defaults_array; - char *specd_prefix = opts->include_prefix; - - /* Search "translated" versions of GNU directories. - These have /usr/local/lib/gcc... replaced by specd_prefix. */ - if (specd_prefix != 0) - { - char *default_prefix = alloca (sizeof GCC_INCLUDE_DIR - 7); - /* Remove the `include' from /usr/local/lib/gcc.../include. - GCC_INCLUDE_DIR will always end in /include. */ - int default_len = sizeof GCC_INCLUDE_DIR - 8; - int specd_len = strlen (specd_prefix); - - default_len = sizeof GCC_INCLUDE_DIR - 8; - memcpy (default_prefix, GCC_INCLUDE_DIR, default_len); - default_prefix[default_len] = '\0'; - - for (p = include_defaults_array; p->fname; p++) - { - /* Some standard dirs are only for C++. */ - if (!p->cplusplus - || (opts->cplusplus - && !opts->no_standard_cplusplus_includes)) - { - /* Does this dir start with the prefix? */ - if (!strncmp (p->fname, default_prefix, default_len)) - { - /* Yes; change prefix and add to search list. */ - int flen = strlen (p->fname); - int this_len = specd_len + flen - default_len; - char *str = (char *) xmalloc (this_len + 1); - memcpy (str, specd_prefix, specd_len); - memcpy (str + specd_len, - p->fname + default_len, - flen - default_len + 1); - - append_include_chain (pfile, opts->pending, - str, SYSTEM); - } - } - } - } - - /* Search ordinary names for GNU include directories. */ - for (p = include_defaults_array; p->fname; p++) - { - /* Some standard dirs are only for C++. */ - if (!p->cplusplus - || (opts->cplusplus - && !opts->no_standard_cplusplus_includes)) - { - char *str = (char *) update_path (p->fname, p->component); - str = xstrdup (str); /* XXX Potential memory leak! */ - append_include_chain (pfile, opts->pending, str, SYSTEM); - } - } - } - - merge_include_chains (opts); - - /* With -v, print the list of dirs to search. */ - if (opts->verbose) - { - struct file_name_list *p; - cpp_message (pfile, -1, "#include \"...\" search starts here:\n"); - for (p = opts->quote_include; p; p = p->next) - { - if (p == opts->bracket_include) - cpp_message (pfile, -1, "#include <...> search starts here:\n"); - fprintf (stderr, " %s\n", p->name); - } - cpp_message (pfile, -1, "End of search list.\n"); - } - - /* Open the main input file. - We do this in nonblocking mode so we don't get stuck here if - someone clever has asked cpp to process /dev/rmt0; - finclude() will check that we have a real file to work with. */ - if (fname == NULL || *fname == 0) - { - fname = ""; - f = 0; - } - else if ((f = open (fname, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666)) < 0) - cpp_pfatal_with_name (pfile, fname); - - initialize_dependency_output (pfile); - - /* Must call finclude() on the main input before processing - -include switches; otherwise the -included text winds up - after the main input. */ - ih_fake = (struct include_hash *) xmalloc (sizeof (struct include_hash)); - ih_fake->next = 0; - ih_fake->next_this_file = 0; - ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */ - ih_fake->name = fname; - ih_fake->control_macro = 0; - ih_fake->buf = (char *)-1; - ih_fake->limit = 0; - if (!finclude (pfile, f, ih_fake)) - return 0; - output_line_command (pfile, same_file); - pfile->only_seen_white = 2; - - /* The -imacros files can be scanned now, but the -include files - have to be pushed onto the include stack and processed later, - in the main loop calling cpp_get_token. */ - - pfile->no_record_file++; - opts->no_output++; - p = opts->pending->imacros_head; - while (p) - { - int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666); - if (fd < 0) - { - cpp_perror_with_name (pfile, p->arg); - return 0; - } - if (!cpp_push_buffer (pfile, NULL, 0)) - return 0; - - ih_fake = (struct include_hash *) - xmalloc (sizeof (struct include_hash)); - ih_fake->next = 0; - ih_fake->next_this_file = 0; - ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */ - ih_fake->name = p->arg; - ih_fake->control_macro = 0; - ih_fake->buf = (char *)-1; - ih_fake->limit = 0; - if (!finclude (pfile, fd, ih_fake)) - cpp_scan_buffer (pfile); - free (ih_fake); - - q = p->next; - free (p); - p = q; - } - - opts->no_output--; - - p = opts->pending->include_head; - while (p) - { - int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666); - if (fd < 0) - { - cpp_perror_with_name (pfile, p->arg); - return 0; - } - if (!cpp_push_buffer (pfile, NULL, 0)) - return 0; - - ih_fake = (struct include_hash *) - xmalloc (sizeof (struct include_hash)); - ih_fake->next = 0; - ih_fake->next_this_file = 0; - ih_fake->foundhere = ABSOLUTE_PATH; /* well sort of ... */ - ih_fake->name = p->arg; - ih_fake->control_macro = 0; - ih_fake->buf = (char *)-1; - ih_fake->limit = 0; - if (finclude (pfile, fd, ih_fake)) - output_line_command (pfile, enter_file); - - q = p->next; - free (p); - p = q; - } - pfile->no_record_file--; - - free (opts->pending); - opts->pending = NULL; - - return 1; -} - -/* This is called at the end of preprocessing. It pops the - last buffer and writes dependency output. It should also - clear macro definitions, such that you could call cpp_start_read - with a new filename to restart processing. */ -void -cpp_finish (pfile) - cpp_reader *pfile; -{ - struct cpp_options *opts = CPP_OPTIONS (pfile); - - if (CPP_PREV_BUFFER (CPP_BUFFER (pfile)) != CPP_NULL_BUFFER (pfile)) - cpp_fatal (pfile, - "cpplib internal error: buffers still stacked in cpp_finish"); - cpp_pop_buffer (pfile); - - if (opts->print_deps) - { - /* Stream on which to print the dependency information. */ - FILE *deps_stream; - - /* Don't actually write the deps file if compilation has failed. */ - if (pfile->errors == 0) - { - char *deps_mode = opts->print_deps_append ? "a" : "w"; - if (opts->deps_file == 0) - deps_stream = stdout; - else if ((deps_stream = fopen (opts->deps_file, deps_mode)) == 0) - cpp_pfatal_with_name (pfile, opts->deps_file); - fputs (pfile->deps_buffer, deps_stream); - putc ('\n', deps_stream); - if (opts->deps_file) - { - if (ferror (deps_stream) || fclose (deps_stream) != 0) - cpp_fatal (pfile, "I/O error on output"); - } - } - } - - if (opts->dump_macros == dump_only) - { - int i; - HASHNODE *h; - MACRODEF m; - for (i = HASHSIZE; --i >= 0;) - { - for (h = pfile->hashtab[i]; h; h = h->next) - if (h->type == T_MACRO) - { - m.defn = h->value.defn; - m.symnam = h->name; - m.symlen = h->length; - dump_definition (pfile, m); - CPP_PUTC (pfile, '\n'); - } - } - } -} - -/* Handle one command-line option in (argc, argv). - Can be called multiple times, to handle multiple sets of options. - Returns number of strings consumed. */ -int -cpp_handle_option (pfile, argc, argv) - cpp_reader *pfile; - int argc; - char **argv; -{ - struct cpp_options *opts = CPP_OPTIONS (pfile); - int i = 0; - - if (argv[i][0] != '-') - { - if (opts->out_fname != NULL) - { - print_help (); - cpp_fatal (pfile, "Too many arguments"); - } - else if (opts->in_fname != NULL) - opts->out_fname = argv[i]; - else - opts->in_fname = argv[i]; - } - else - switch (argv[i][1]) - { - case 'f': - if (!strcmp (argv[i], "-fleading-underscore")) - user_label_prefix = "_"; - else if (!strcmp (argv[i], "-fno-leading-underscore")) - user_label_prefix = ""; - break; - - case 'I': /* Add directory to path for includes. */ - if (!strcmp (argv[i] + 2, "-")) - { - /* -I- means: - Use the preceding -I directories for #include "..." - but not #include <...>. - Don't search the directory of the present file - for #include "...". (Note that -I. -I- is not the same as - the default setup; -I. uses the compiler's working dir.) */ - if (! opts->ignore_srcdir) - { - opts->ignore_srcdir = 1; - opts->pending->quote_head = opts->pending->brack_head; - opts->pending->quote_tail = opts->pending->brack_tail; - opts->pending->brack_head = 0; - opts->pending->brack_tail = 0; - } - else - { - cpp_fatal (pfile, "-I- specified twice"); - return argc; - } - } - else - { - char *fname; - if (argv[i][2] != 0) - fname = argv[i] + 2; - else if (i + 1 == argc) - goto missing_dirname; - else - fname = argv[++i]; - append_include_chain (pfile, opts->pending, - xstrdup (fname), BRACKET); - } - break; - - case 'i': - /* Add directory to beginning of system include path, as a system - include directory. */ - if (!strcmp (argv[i], "-isystem")) - { - if (i + 1 == argc) - goto missing_filename; - append_include_chain (pfile, opts->pending, - xstrdup (argv[++i]), SYSTEM); - } - else if (!strcmp (argv[i], "-include")) - { - if (i + 1 == argc) - goto missing_filename; - else - { - struct pending_option *o = (struct pending_option *) - xmalloc (sizeof (struct pending_option)); - o->arg = argv[++i]; - - /* This list has to be built in reverse order so that - when cpp_start_read pushes all the -include files onto - the buffer stack, they will be scanned in forward order. */ - o->next = opts->pending->include_head; - opts->pending->include_head = o; - } - } - else if (!strcmp (argv[i], "-imacros")) - { - if (i + 1 == argc) - goto missing_filename; - else - { - struct pending_option *o = (struct pending_option *) - xmalloc (sizeof (struct pending_option)); - o->arg = argv[++i]; - o->next = NULL; - - APPEND (opts->pending, imacros, o); - } - } - /* Add directory to end of path for includes, - with the default prefix at the front of its name. */ - else if (!strcmp (argv[i], "-iwithprefix")) - { - char *fname; - int len; - if (i + 1 == argc) - goto missing_dirname; - ++i; - len = strlen (argv[i]); - - if (opts->include_prefix != 0) - { - fname = xmalloc (opts->include_prefix_len + len + 1); - memcpy (fname, opts->include_prefix, opts->include_prefix_len); - memcpy (fname + opts->include_prefix_len, argv[i], len + 1); - } - else - { - fname = xmalloc (sizeof GCC_INCLUDE_DIR - 8 + len); - memcpy (fname, GCC_INCLUDE_DIR, sizeof GCC_INCLUDE_DIR - 9); - memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1); - } - - append_include_chain (pfile, opts->pending, fname, SYSTEM); - } - /* Add directory to main path for includes, - with the default prefix at the front of its name. */ - else if (!strcmp (argv[i], "-iwithprefixbefore")) - { - char *fname; - int len; - if (i + 1 == argc) - goto missing_dirname; - ++i; - len = strlen (argv[i]); - - if (opts->include_prefix != 0) - { - fname = xmalloc (opts->include_prefix_len + len + 1); - memcpy (fname, opts->include_prefix, opts->include_prefix_len); - memcpy (fname + opts->include_prefix_len, argv[i], len + 1); - } - else - { - fname = xmalloc (sizeof GCC_INCLUDE_DIR - 8 + len); - memcpy (fname, GCC_INCLUDE_DIR, sizeof GCC_INCLUDE_DIR - 9); - memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1); - } - - append_include_chain (pfile, opts->pending, fname, BRACKET); - } - /* Add directory to end of path for includes. */ - else if (!strcmp (argv[i], "-idirafter")) - { - if (i + 1 == argc) - goto missing_dirname; - append_include_chain (pfile, opts->pending, - xstrdup (argv[++i]), AFTER); - } - else if (!strcmp (argv[i], "-iprefix")) - { - if (i + 1 == argc) - goto missing_filename; - else - { - opts->include_prefix = argv[++i]; - opts->include_prefix_len = strlen (argv[i]); - } - } - else if (!strcmp (argv[i], "-ifoutput")) - opts->output_conditionals = 1; - - break; - - case 'o': - if (opts->out_fname != NULL) - { - cpp_fatal (pfile, "Output filename specified twice"); - return argc; - } - if (i + 1 == argc) - goto missing_filename; - opts->out_fname = argv[++i]; - if (!strcmp (opts->out_fname, "-")) - opts->out_fname = ""; - break; - - case 'p': - if (!strcmp (argv[i], "-pedantic")) - CPP_PEDANTIC (pfile) = 1; - else if (!strcmp (argv[i], "-pedantic-errors")) - { - CPP_PEDANTIC (pfile) = 1; - opts->pedantic_errors = 1; - } -#if 0 - else if (!strcmp (argv[i], "-pcp")) { - char *pcp_fname = argv[++i]; - pcp_outfile = ((pcp_fname[0] != '-' || pcp_fname[1] != '\0') - ? fopen (pcp_fname, "w") - : fdopen (dup (fileno (stdout)), "w")); - if (pcp_outfile == 0) - cpp_pfatal_with_name (pfile, pcp_fname); - no_precomp = 1; - } -#endif - break; - - case 't': - if (!strcmp (argv[i], "-traditional")) - { - opts->traditional = 1; - opts->cplusplus_comments = 0; - } - else if (!strcmp (argv[i], "-trigraphs")) - opts->trigraphs = 1; - break; - - case 'l': - if (! strcmp (argv[i], "-lang-c")) - opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0, - opts->c9x = 1, opts->objc = 0; - if (! strcmp (argv[i], "-lang-c89")) - opts->cplusplus = 0, opts->cplusplus_comments = 0, opts->c89 = 1, - opts->c9x = 0, opts->objc = 0; - if (! strcmp (argv[i], "-lang-c++")) - opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0, - opts->c9x = 0, opts->objc = 0; - if (! strcmp (argv[i], "-lang-objc")) - opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0, - opts->c9x = 0, opts->objc = 1; - if (! strcmp (argv[i], "-lang-objc++")) - opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->c89 = 0, - opts->c9x = 0, opts->objc = 1; - if (! strcmp (argv[i], "-lang-asm")) - opts->lang_asm = 1; - if (! strcmp (argv[i], "-lint")) - opts->for_lint = 1; - if (! strcmp (argv[i], "-lang-chill")) - opts->objc = 0, opts->cplusplus = 0, opts->chill = 1, - opts->traditional = 1; - break; - - case '+': - opts->cplusplus = 1, opts->cplusplus_comments = 1; - break; - - case 's': - if (!strcmp (argv[i], "-std=iso9899:1990") - || !strcmp (argv[i], "-std=iso9899:199409") - || !strcmp (argv[i], "-std=c89") - || !strcmp (argv[i], "-std=gnu89")) - opts->cplusplus = 0, opts->cplusplus_comments = 0, - opts->c89 = 1, opts->c9x = 0, opts->objc = 0; - else if (!strcmp (argv[i], "-std=iso9899:199x") - || !strcmp (argv[i], "-std=c9x") - || !strcmp (argv[i], "-std=gnu9x")) - opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->c89 = 0, - opts->c9x = 1, opts->objc = 0; - break; - - case 'w': - opts->inhibit_warnings = 1; - break; - - case 'W': - if (!strcmp (argv[i], "-Wtrigraphs")) - opts->warn_trigraphs = 1; - else if (!strcmp (argv[i], "-Wno-trigraphs")) - opts->warn_trigraphs = 0; - else if (!strcmp (argv[i], "-Wcomment")) - opts->warn_comments = 1; - else if (!strcmp (argv[i], "-Wno-comment")) - opts->warn_comments = 0; - else if (!strcmp (argv[i], "-Wcomments")) - opts->warn_comments = 1; - else if (!strcmp (argv[i], "-Wno-comments")) - opts->warn_comments = 0; - else if (!strcmp (argv[i], "-Wtraditional")) - opts->warn_stringify = 1; - else if (!strcmp (argv[i], "-Wno-traditional")) - opts->warn_stringify = 0; - else if (!strcmp (argv[i], "-Wundef")) - opts->warn_undef = 1; - else if (!strcmp (argv[i], "-Wno-undef")) - opts->warn_undef = 0; - else if (!strcmp (argv[i], "-Wimport")) - opts->warn_import = 1; - else if (!strcmp (argv[i], "-Wno-import")) - opts->warn_import = 0; - else if (!strcmp (argv[i], "-Werror")) - opts->warnings_are_errors = 1; - else if (!strcmp (argv[i], "-Wno-error")) - opts->warnings_are_errors = 0; - else if (!strcmp (argv[i], "-Wall")) - { - opts->warn_trigraphs = 1; - opts->warn_comments = 1; - } - break; - - case 'M': - /* The style of the choices here is a bit mixed. - The chosen scheme is a hybrid of keeping all options in one string - and specifying each option in a separate argument: - -M|-MM|-MD file|-MMD file [-MG]. An alternative is: - -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely: - -M[M][G][D file]. This is awkward to handle in specs, and is not - as extensible. */ - /* ??? -MG must be specified in addition to one of -M or -MM. - This can be relaxed in the future without breaking anything. - The converse isn't true. */ - - /* -MG isn't valid with -MD or -MMD. This is checked for later. */ - if (!strcmp (argv[i], "-MG")) - { - opts->print_deps_missing_files = 1; - break; - } - if (!strcmp (argv[i], "-M")) - opts->print_deps = 2; - else if (!strcmp (argv[i], "-MM")) - opts->print_deps = 1; - else if (!strcmp (argv[i], "-MD")) - opts->print_deps = 2; - else if (!strcmp (argv[i], "-MMD")) - opts->print_deps = 1; - /* For -MD and -MMD options, write deps on file named by next arg. */ - if (!strcmp (argv[i], "-MD") || !strcmp (argv[i], "-MMD")) - { - if (i+1 == argc) - goto missing_filename; - opts->deps_file = argv[++i]; - } - else - { - /* For -M and -MM, write deps on standard output - and suppress the usual output. */ - opts->no_output = 1; - } - break; - - case 'd': - { - char *p = argv[i] + 2; - char c; - while ((c = *p++) != 0) - { - /* Arg to -d specifies what parts of macros to dump */ - switch (c) - { - case 'M': - opts->dump_macros = dump_only; - opts->no_output = 1; - break; - case 'N': - opts->dump_macros = dump_names; - break; - case 'D': - opts->dump_macros = dump_definitions; - break; - case 'I': - opts->dump_includes = 1; - break; - } - } - } - break; - - case 'g': - if (argv[i][2] == '3') - opts->debug_output = 1; - break; - - case '-': - if (!strcmp (argv[i], "--help")) - print_help (); - else if (!strcmp (argv[i], "--version")) - cpp_notice ("GNU CPP version %s\n", version_string); - exit (0); /* XXX */ - break; - - case 'v': - cpp_notice ("GNU CPP version %s", version_string); -#ifdef TARGET_VERSION - TARGET_VERSION; -#endif - fputc ('\n', stderr); - opts->verbose = 1; - break; - - case 'H': - opts->print_include_names = 1; - break; - - case 'D': - { - struct pending_option *o = (struct pending_option *) - xmalloc (sizeof (struct pending_option)); - if (argv[i][2] != 0) - o->arg = argv[i] + 2; - else if (i + 1 == argc) - { - cpp_fatal (pfile, "Macro name missing after -D option"); - return argc; - } - else - o->arg = argv[++i]; - - o->next = NULL; - o->undef = 0; - APPEND (opts->pending, define, o); - } - break; - - case 'A': - { - char *p; - - if (argv[i][2] != 0) - p = argv[i] + 2; - else if (i + 1 == argc) - { - cpp_fatal (pfile, "Assertion missing after -A option"); - return argc; - } - else - p = argv[++i]; - - if (strcmp (p, "-")) - { - struct pending_option *o = (struct pending_option *) - xmalloc (sizeof (struct pending_option)); - - o->arg = p; - o->next = NULL; - o->undef = 0; - APPEND (opts->pending, assert, o); - } - else - { - /* -A- eliminates all predefined macros and assertions. - Let's include also any that were specified earlier - on the command line. That way we can get rid of any - that were passed automatically in from GCC. */ - struct pending_option *o1, *o2; - - o1 = opts->pending->define_head; - while (o1) - { - o2 = o1->next; - free (o1); - o1 = o2; - } - o1 = opts->pending->assert_head; - while (o1) - { - o2 = o1->next; - free (o1); - o1 = o2; - } - opts->pending->assert_head = NULL; - opts->pending->assert_tail = NULL; - opts->pending->define_head = NULL; - opts->pending->define_tail = NULL; - } - } - break; - - case 'U': - { - struct pending_option *o = (struct pending_option *) - xmalloc (sizeof (struct pending_option)); - - if (argv[i][2] != 0) - o->arg = argv[i] + 2; - else if (i + 1 == argc) - { - cpp_fatal (pfile, "Macro name missing after -U option"); - return argc; - } - else - o->arg = argv[++i]; - - o->next = NULL; - o->undef = 1; - APPEND (opts->pending, define, o); - } - break; - - case 'C': - opts->put_out_comments = 1; - break; - - case 'E': /* -E comes from cc -E; ignore it. */ - break; - - case 'P': - opts->no_line_commands = 1; - break; - - case '$': /* Don't include $ in identifiers. */ - opts->dollars_in_ident = 0; - break; - - case 'n': - if (!strcmp (argv[i], "-nostdinc")) - /* -nostdinc causes no default include directories. - You must specify all include-file directories with -I. */ - opts->no_standard_includes = 1; - else if (!strcmp (argv[i], "-nostdinc++")) - /* -nostdinc++ causes no default C++-specific include directories. */ - opts->no_standard_cplusplus_includes = 1; -#if 0 - else if (!strcmp (argv[i], "-noprecomp")) - no_precomp = 1; -#endif - break; - - case 'r': - if (!strcmp (argv[i], "-remap")) - opts->remap = 1; - break; - - case '\0': /* JF handle '-' as file name meaning stdin or stdout */ - if (opts->in_fname == NULL) - opts->in_fname = ""; - else if (opts->out_fname == NULL) - opts->out_fname = ""; - else - return i; /* error */ - break; - - default: - return i; - } - - return i + 1; - - missing_filename: - cpp_fatal (pfile, "Filename missing after `%s' option", argv[i]); - return argc; - missing_dirname: - cpp_fatal (pfile, "Directory name missing after `%s' option", argv[i]); - return argc; -} - -/* Handle command-line options in (argc, argv). - Can be called multiple times, to handle multiple sets of options. - Returns if an unrecognized option is seen. - Returns number of strings consumed. */ - -int -cpp_handle_options (pfile, argc, argv) - cpp_reader *pfile; - int argc; - char **argv; -{ - int i; - int strings_processed; - for (i = 0; i < argc; i += strings_processed) - { - strings_processed = cpp_handle_option (pfile, argc - i, argv + i); - if (strings_processed == 0) - break; - } - return i; -} - -static void -print_help () -{ - cpp_notice ("Usage: %s [switches] input output\n", progname); - fputs (_("\ -Switches:\n\ - -include <file> Include the contents of <file> before other files\n\ - -imacros <file> Accept definition of macros in <file>\n\ - -iprefix <path> Specify <path> as a prefix for next two options\n\ - -iwithprefix <dir> Add <dir> to the end of the system include path\n\ - -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\ - -isystem <dir> Add <dir> to the start of the system include path\n\ - -idirafter <dir> Add <dir> to the end of the system include path\n\ - -I <dir> Add <dir> to the end of the main include path\n\ - -nostdinc Do not search system include directories\n\ - (dirs specified with -isystem will still be used)\n\ - -nostdinc++ Do not search system include directories for C++\n\ - -o <file> Put output into <file>\n\ - -pedantic Issue all warnings demanded by strict ANSI C\n\ - -traditional Follow K&R pre-processor behaviour\n\ - -trigraphs Support ANSI C trigraphs\n\ - -lang-c Assume that the input sources are in C\n\ - -lang-c89 Assume that the input sources are in C89\n\ - -lang-c++ Assume that the input sources are in C++\n\ - -lang-objc Assume that the input sources are in ObjectiveC\n\ - -lang-objc++ Assume that the input sources are in ObjectiveC++\n\ - -lang-asm Assume that the input sources are in assembler\n\ - -lang-chill Assume that the input sources are in Chill\n\ - -std=<std name> Specify the conformance standard; one of:\n\ - gnu89, gnu9x, c89, c9x, iso9899:1990,\n\ - iso9899:199409, iso9899:199x\n\ - -+ Allow parsing of C++ style features\n\ - -w Inhibit warning messages\n\ - -Wtrigraphs Warn if trigraphs are encountered\n\ - -Wno-trigraphs Do not warn about trigraphs\n\ - -Wcomment{s} Warn if one comment starts inside another\n\ - -Wno-comment{s} Do not warn about comments\n\ - -Wtraditional Warn if a macro argument is/would be turned into\n\ - a string if -traditional is specified\n\ - -Wno-traditional Do not warn about stringification\n\ - -Wundef Warn if an undefined macro is used by #if\n\ - -Wno-undef Do not warn about testing undefined macros\n\ - -Wimport Warn about the use of the #import directive\n\ - -Wno-import Do not warn about the use of #import\n\ - -Werror Treat all warnings as errors\n\ - -Wno-error Do not treat warnings as errors\n\ - -Wall Enable all preprocessor warnings\n\ - -M Generate make dependencies\n\ - -MM As -M, but ignore system header files\n\ - -MD As -M, but put output in a .d file\n\ - -MMD As -MD, but ignore system header files\n\ - -MG Treat missing header file as generated files\n\ - -g Include #define and #undef directives in the output\n\ - -D<macro> Define a <macro> with string '1' as its value\n\ - -D<macro>=<val> Define a <macro> with <val> as its value\n\ - -A<question> (<answer>) Assert the <answer> to <question>\n\ - -U<macro> Undefine <macro> \n\ - -v Display the version number\n\ - -H Print the name of header files as they are used\n\ - -C Do not discard comments\n\ - -dM Display a list of macro definitions active at end\n\ - -dD Preserve macro definitions in output\n\ - -dN As -dD except that only the names are preserved\n\ - -dI Include #include directives in the output\n\ - -ifoutput Describe skipped code blocks in output \n\ - -P Do not generate #line directives\n\ - -$ Do not allow '$' in identifiers\n\ - -remap Remap file names when including files.\n\ - -h or --help Display this information\n\ -"), stdout); -} |