OSDN Git Service

gcc/fortran:
[pf3gnuchains/gcc-fork.git] / gcc / fix-header.c
index 8434cce..82244d0 100644 (file)
@@ -1,6 +1,6 @@
 /* fix-header.c - Make C header file suitable for C++.
    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
 
 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
@@ -14,7 +14,7 @@ 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.  */
+Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /* This program massages a system include file (such as stdio.h),
    into a form that is compatible with GNU C and GNU C++.
@@ -79,9 +79,27 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "scan.h"
 #include "cpplib.h"
 #include "c-incpath.h"
+#include "errors.h"
 
-static void v_fatal PARAMS ((const char *, va_list)) ATTRIBUTE_PRINTF (1,0) ATTRIBUTE_NORETURN;
-static void fatal PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
+#ifdef TARGET_EXTRA_INCLUDES
+void
+TARGET_EXTRA_INCLUDES (const char *sysroot ATTRIBUTE_UNUSED,
+                      const char *iprefix ATTRIBUTE_UNUSED,
+                      int stdinc ATTRIBUTE_UNUSED)
+{
+}
+#endif
+
+#ifdef TARGET_EXTRA_PRE_INCLUDES 
+void
+TARGET_EXTRA_PRE_INCLUDES (const char *sysroot ATTRIBUTE_UNUSED,
+                          const char *iprefix ATTRIBUTE_UNUSED,
+                          int stdinc ATTRIBUTE_UNUSED)
+{
+}
+#endif
+
+struct line_maps line_table;
 
 sstring buf;
 
@@ -89,10 +107,6 @@ int verbose = 0;
 int partial_count = 0;
 int warnings = 0;
 
-/* We no longer need to add extern "C", because cpp implicitly
-   forces the standard include files to be treated as C.  */
-/*#define ADD_MISSING_EXTERN_C 1 */
-
 #if ADD_MISSING_EXTERN_C
 int missing_extern_C_count = 0;
 #endif
@@ -191,23 +205,21 @@ struct symbol_list {
 struct symbol_list symbol_table[SYMBOL_TABLE_SIZE];
 int cur_symbol_table_size;
 
-static void add_symbols PARAMS ((symbol_flags, namelist));
-static struct fn_decl *lookup_std_proto PARAMS ((const char *, int));
-static void write_lbrac PARAMS ((void));
-static void recognized_macro PARAMS ((const char *));
-static void check_macro_names PARAMS ((cpp_reader *, namelist));
-static void read_scan_file PARAMS ((char *, int, char **));
-static void write_rbrac PARAMS ((void));
-static int inf_skip_spaces PARAMS ((int));
-static int inf_read_upto PARAMS ((sstring *, int));
-static int inf_scan_ident PARAMS ((sstring *, int));
-static int check_protection PARAMS ((int *, int *));
-static void cb_file_change PARAMS ((cpp_reader *, const struct line_map *));
+static void add_symbols (symbol_flags, namelist);
+static struct fn_decl *lookup_std_proto (const char *, int);
+static void write_lbrac (void);
+static void recognized_macro (const char *);
+static void check_macro_names (cpp_reader *, namelist);
+static void read_scan_file (char *, int, char **);
+static void write_rbrac (void);
+static int inf_skip_spaces (int);
+static int inf_read_upto (sstring *, int);
+static int inf_scan_ident (sstring *, int);
+static int check_protection (int *, int *);
+static void cb_file_change (cpp_reader *, const struct line_map *);
 
 static void
-add_symbols (flags, names)
-     symbol_flags flags;
-     namelist names;
+add_symbols (symbol_flags flags, namelist names)
 {
   symbol_table[cur_symbol_table_size].flags = flags;
   symbol_table[cur_symbol_table_size].names = names;
@@ -272,7 +284,8 @@ tan\0tanh\0" },
      sigfillset sigismember sigpending sigprocmask sigsuspend"
      because these need sigset_t or struct sigaction.
      Most systems that provide them will also declare them.  */
-  { "signal.h", ANSI_SYMBOL, "kill\0raise\0" },
+  { "signal.h", ANSI_SYMBOL, "raise\0" },
+  { CONTINUED, POSIX1_SYMBOL, "kill\0" },
 
   { "stdio.h", ANSI_SYMBOL,
       "clearerr\0fclose\0feof\0ferror\0fflush\0fgetc\0fgetpos\0\
@@ -291,9 +304,10 @@ tmpnam\0ungetc\0" },
      Should perhaps also add NULL */
   { "stdlib.h", ANSI_SYMBOL,
       "abort\0abs\0atexit\0atof\0atoi\0atol\0bsearch\0calloc\0\
-exit\0free\0getenv\0labs\0malloc\0putenv\0qsort\0rand\0realloc\0\
+exit\0free\0getenv\0labs\0malloc\0qsort\0rand\0realloc\0\
 srand\0strtod\0strtol\0strtoul\0system\0" },
   { CONTINUED, ANSI_SYMBOL|MACRO_SYMBOL, "EXIT_FAILURE\0EXIT_SUCCESS\0" },
+  { CONTINUED, POSIX1_SYMBOL, "putenv\0" },
 
   { "string.h", ANSI_SYMBOL, "memchr\0memcmp\0memcpy\0memmove\0memset\0\
 strcat\0strchr\0strcmp\0strcoll\0strcpy\0strcspn\0strerror\0\
@@ -342,7 +356,8 @@ WTERMSIG\0WNOHANG\0WNOTRACED\0" },
       "cfgetispeed\0cfgetospeed\0cfsetispeed\0cfsetospeed\0tcdrain\0tcflow\0tcflush\0tcgetattr\0tcsendbreak\0tcsetattr\0" },
 
   { "time.h", ANSI_SYMBOL,
-      "asctime\0clock\0ctime\0difftime\0gmtime\0localtime\0mktime\0strftime\0time\0tzset\0" },
+      "asctime\0clock\0ctime\0difftime\0gmtime\0localtime\0mktime\0strftime\0time\0" },
+  { CONTINUED, POSIX1_SYMBOL, "tzset\0" },
 
   { "unistd.h", POSIX1_SYMBOL,
       "_exit\0access\0alarm\0chdir\0chown\0close\0ctermid\0cuserid\0\
@@ -380,9 +395,7 @@ struct obstack scan_file_obstack;
 /* NOTE:  If you edit this, also edit gen-protos.c !! */
 
 static struct fn_decl *
-lookup_std_proto (name, name_length)
-     const char *name;
-     int name_length;
+lookup_std_proto (const char *name, int name_length)
 {
   int i = hashstr (name, name_length) % HASH_SIZE;
   int i0 = i;
@@ -396,14 +409,12 @@ lookup_std_proto (name, name_length)
          && strncmp (fn->fname, name, name_length) == 0)
        return fn;
       i = (i+1) % HASH_SIZE;
-      if (i == i0)
-       abort ();
+      gcc_assert (i != i0);
     }
 }
 
 char *inc_filename;
 int inc_filename_length;
-const char *progname = "fix-header";
 FILE *outf;
 sstring line;
 
@@ -413,14 +424,8 @@ int required_unseen_count = 0;
 int required_other = 0;
 
 static void
-write_lbrac ()
+write_lbrac (void)
 {
-
-#if ADD_MISSING_EXTERN_C
-  if (missing_extern_C_count + required_unseen_count > 0)
-    fprintf (outf, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n");
-#endif
-
   if (partial_count)
     {
       fprintf (outf, "#ifndef _PARAMS\n");
@@ -448,8 +453,7 @@ struct partial_proto required_dummy_proto, seen_dummy_proto;
 #define SEEN(FN) ((FN)->partial == &seen_dummy_proto)
 
 static void
-recognized_macro (fname)
-     const char *fname;
+recognized_macro (const char *fname)
 {
   /* The original include file defines fname as a macro.  */
   struct fn_decl *fn = lookup_std_proto (fname, strlen (fname));
@@ -498,8 +502,7 @@ recognized_macro (fname)
 }
 
 void
-recognized_extern (name)
-     const cpp_token *name;
+recognized_extern (const cpp_token *name)
 {
   switch (special_file_handling)
     {
@@ -519,19 +522,12 @@ recognized_extern (name)
    'extern "C"' braces); or 'f' for other function declarations.  */
 
 void
-recognized_function (fname, line, kind, have_arg_list)
-     const cpp_token *fname;
-     unsigned int line;
-     int kind; /* One of 'f' 'F' or 'I' */
-     int have_arg_list;
+recognized_function (const cpp_token *fname, unsigned int line, int kind,
+                    int have_arg_list)
 {
   struct partial_proto *partial;
   int i;
   struct fn_decl *fn;
-#if ADD_MISSING_EXTERN_C
-  if (kind == 'f')
-    missing_extern_C_count++;
-#endif
 
   fn = lookup_std_proto ((const char *) NODE_NAME (fname->val.node),
                         NODE_LEN (fname->val.node));
@@ -566,8 +562,7 @@ recognized_function (fname, line, kind, have_arg_list)
   /* We only have a partial function declaration,
      so remember that we have to add a complete prototype.  */
   partial_count++;
-  partial = (struct partial_proto *)
-    obstack_alloc (&scan_file_obstack, sizeof (struct partial_proto));
+  partial = obstack_alloc (&scan_file_obstack, sizeof (struct partial_proto));
   partial->line_seen = line;
   partial->fn = fn;
   fn->partial = partial;
@@ -584,9 +579,7 @@ recognized_function (fname, line, kind, have_arg_list)
    call recognized_macro on it.  */
 
 static void
-check_macro_names (pfile, names)
-     cpp_reader *pfile;
-     namelist names;
+check_macro_names (cpp_reader *pfile, namelist names)
 {
   size_t len;
   while (*names)
@@ -599,19 +592,15 @@ check_macro_names (pfile, names)
 }
 
 static void
-cb_file_change (pfile, map)
-     cpp_reader *pfile ATTRIBUTE_UNUSED;
-     const struct line_map *map;
+cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
+               const struct line_map *map)
 {
   /* Just keep track of current file name.  */
-  cur_file = map->to_file;
+  cur_file = map == NULL ? NULL : map->to_file;
 }
 
 static void
-read_scan_file (in_fname, argc, argv)
-     char *in_fname;
-     int argc;
-     char **argv;
+read_scan_file (char *in_fname, int argc, char **argv)
 {
   cpp_reader *scan_in;
   cpp_callbacks *cb;
@@ -622,7 +611,8 @@ read_scan_file (in_fname, argc, argv)
 
   obstack_init (&scan_file_obstack);
 
-  scan_in = cpp_create_reader (CLK_GNUC89);
+  linemap_init (&line_table);
+  scan_in = cpp_create_reader (CLK_GNUC89, NULL, &line_table);
   cb = cpp_get_callbacks (scan_in);
   cb->file_change = cb_file_change;
 
@@ -631,10 +621,16 @@ read_scan_file (in_fname, argc, argv)
   options = cpp_get_options (scan_in);
   options->inhibit_warnings = 1;
   options->inhibit_errors = 1;
+  cpp_post_options (scan_in);
 
-  if (! cpp_read_main_file (scan_in, in_fname, NULL))
+  if (!cpp_read_main_file (scan_in, in_fname))
     exit (FATAL_EXIT_CODE);
 
+  cpp_change_file (scan_in, LC_RENAME, "<built-in>");
+  cpp_init_builtins (scan_in, true);
+  cpp_change_file (scan_in, LC_RENAME, in_fname);
+
+  /* Process switches after builtins so -D can override them.  */
   for (i = 0; i < argc; i += strings_processed)
     {
       strings_processed = 0;
@@ -645,12 +641,12 @@ read_scan_file (in_fname, argc, argv)
              if (argv[i][2] != '\0')
                {
                  strings_processed = 1;
-                 add_path (xstrdup (argv[i] + 2), BRACKET, false);
+                 add_path (xstrdup (argv[i] + 2), BRACKET, false, false);
                }
              else if (i + 1 != argc)
                {
                  strings_processed = 2;
-                 add_path (xstrdup (argv[i + 1]), BRACKET, false);
+                 add_path (xstrdup (argv[i + 1]), BRACKET, false, false);
                }
            }
          else if (argv[i][1] == 'D')
@@ -667,17 +663,13 @@ read_scan_file (in_fname, argc, argv)
     }
 
   if (i < argc)
-    cpp_error (scan_in, DL_ERROR, "invalid option `%s'", argv[i]);
+    cpp_error (scan_in, CPP_DL_ERROR, "invalid option `%s'", argv[i]);
   if (cpp_errors (scan_in))
     exit (FATAL_EXIT_CODE);
 
   register_include_chains (scan_in, NULL /* sysroot */, NULL /* iprefix */,
-                          true /* stdinc */, false /* cxx_stdinc */,
-                          false /* verbose */);
-
-  cpp_rename_file (scan_in, "<built-in>");
-  cpp_init_builtins (scan_in);
-  cpp_rename_file (scan_in, in_fname);
+                          NULL /* imultilib */, true /* stdinc */,
+                          false /* cxx_stdinc */, false /* verbose */);
 
   /* We are scanning a system header, so mark it as such.  */
   cpp_make_system_header (scan_in, 1, 0);
@@ -691,12 +683,12 @@ read_scan_file (in_fname, argc, argv)
   if (special_file_handling == stdio_h
       && (fn = lookup_std_proto ("_filbuf", 7)) != NULL)
     {
-      static const unsigned char getchar_call[] = "getchar();";
+      unsigned char getchar_call[] = "getchar();\n";
       int seen_filbuf = 0;
 
       /* Scan the macro expansion of "getchar();".  */
       cpp_push_buffer (scan_in, getchar_call, sizeof(getchar_call) - 1,
-                      /* from_stage3 */ true, 1);
+                      /* from_stage3 */ true);
       for (;;)
        {
          const cpp_token *t = cpp_get_token (scan_in);
@@ -734,11 +726,7 @@ read_scan_file (in_fname, argc, argv)
        }
     }
 
-  if (required_unseen_count + partial_count + required_other
-#if ADD_MISSING_EXTERN_C
-      + missing_extern_C_count
-#endif
-      == 0)
+  if (required_unseen_count + partial_count + required_other == 0)
     {
       if (verbose)
        fprintf (stderr, "%s: OK, nothing needs to be done.\n", inc_filename);
@@ -754,17 +742,11 @@ read_scan_file (in_fname, argc, argv)
       if (partial_count)
        fprintf (stderr, "%s: %d non-prototype function declarations.\n",
                 inc_filename, partial_count);
-#if ADD_MISSING_EXTERN_C
-      if (missing_extern_C_count)
-       fprintf (stderr,
-                "%s: %d declarations not protected by extern \"C\".\n",
-                inc_filename, missing_extern_C_count);
-#endif
     }
 }
 
 static void
-write_rbrac ()
+write_rbrac (void)
 {
   struct fn_decl *fn;
   const char *cptr;
@@ -891,11 +873,6 @@ write_rbrac ()
       break;
     }
 
-
-#if ADD_MISSING_EXTERN_C
-  if (missing_extern_C_count + required_unseen_count > 0)
-    fprintf (outf, "#ifdef __cplusplus\n}\n#endif\n");
-#endif
 }
 
 /* Returns 1 iff the file is properly protected from multiple inclusion:
@@ -909,8 +886,7 @@ write_rbrac ()
 #define INF_UNGET(c) ((c)!=EOF && inf_ptr--)
 
 static int
-inf_skip_spaces (c)
-     int c;
+inf_skip_spaces (int c)
 {
   for (;;)
     {
@@ -948,9 +924,7 @@ inf_skip_spaces (c)
 /* Read into STR from inf_buffer upto DELIM.  */
 
 static int
-inf_read_upto (str, delim)
-     sstring *str;
-     int delim;
+inf_read_upto (sstring *str, int delim)
 {
   int ch;
   for (;;)
@@ -966,9 +940,7 @@ inf_read_upto (str, delim)
 }
 
 static int
-inf_scan_ident (s, c)
-     sstring *s;
-     int c;
+inf_scan_ident (sstring *s, int c)
 {
   s->ptr = s->base;
   if (ISIDST (c))
@@ -992,8 +964,7 @@ inf_scan_ident (s, c)
    Otherwise return 0.  */
 
 static int
-check_protection (ifndef_line, endif_line)
-     int *ifndef_line, *endif_line;
+check_protection (int *ifndef_line, int *endif_line)
 {
   int c;
   int if_nesting = 1; /* Level of nesting of #if's */
@@ -1094,12 +1065,10 @@ check_protection (ifndef_line, endif_line)
   return 1;
 }
 
-extern int main                        PARAMS ((int, char **));
+extern int main (int, char **);
 
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, char **argv)
 {
   int inf_fd;
   struct stat sbuf;
@@ -1114,6 +1083,7 @@ main (argc, argv)
   long int inf_size;
   struct symbol_list *cur_symbols;
 
+  progname = "fix-header";
   if (argv[0] && argv[0][0])
     {
       char *p;
@@ -1219,7 +1189,7 @@ main (argc, argv)
       exit (FATAL_EXIT_CODE);
     }
   inf_size = sbuf.st_size;
-  inf_buffer = (char *) xmalloc (inf_size + 2);
+  inf_buffer = XNEWVEC (char, inf_size + 2);
   inf_ptr = inf_buffer;
 
   to_read = inf_size;
@@ -1339,26 +1309,3 @@ main (argc, argv)
 
   return 0;
 }
-\f
-
-static void
-v_fatal (str, ap)
-  const char * str;
-  va_list ap;
-{
-  fprintf (stderr, "%s: %s: ", progname, inc_filename);
-  vfprintf (stderr, str, ap);
-  fprintf (stderr, "\n");
-
-  exit (FATAL_EXIT_CODE);
-}
-
-static void
-fatal VPARAMS ((const char *str, ...))
-{
-  VA_OPEN (ap, str);
-  VA_FIXEDARG (ap, const char *, str);
-
-  v_fatal (str, ap);
-  VA_CLOSE (ap);
-}