summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/fix-header.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/fix-header.c')
-rw-r--r--contrib/gcc/fix-header.c207
1 files changed, 97 insertions, 110 deletions
diff --git a/contrib/gcc/fix-header.c b/contrib/gcc/fix-header.c
index bce334d..88390e3 100644
--- a/contrib/gcc/fix-header.c
+++ b/contrib/gcc/fix-header.c
@@ -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 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002, 2003, 2004 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
@@ -67,18 +67,22 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
* INFILE.H is a full pathname for the input file (e.g. /usr/include/stdio.h)
* OUTFILE.H is the full pathname for where to write the output file,
if anything needs to be done. (e.g. ./include/stdio.h)
- * OPTIONS are such as you would pass to cpp.
+ * OPTIONS can be -D or -I switches as you would pass to cpp.
Written by Per Bothner <bothner@cygnus.com>, July 1993. */
-#include "hconfig.h"
+#include "bconfig.h"
#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
#include "obstack.h"
#include "scan.h"
#include "cpplib.h"
+#include "c-incpath.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;
+static void v_fatal (const char *, va_list)
+ ATTRIBUTE_PRINTF (1,0) ATTRIBUTE_NORETURN;
+static void fatal (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
sstring buf;
@@ -86,10 +90,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
@@ -188,23 +188,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;
@@ -377,9 +375,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;
@@ -410,14 +406,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");
@@ -445,8 +435,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));
@@ -495,8 +484,7 @@ recognized_macro (fname)
}
void
-recognized_extern (name)
- const cpp_token *name;
+recognized_extern (const cpp_token *name)
{
switch (special_file_handling)
{
@@ -516,19 +504,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));
@@ -563,8 +544,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;
@@ -581,9 +561,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)
@@ -596,30 +574,26 @@ 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;
cpp_options *options;
struct fn_decl *fn;
- int i;
+ int i, strings_processed;
struct symbol_list *cur_symbols;
obstack_init (&scan_file_obstack);
- scan_in = cpp_create_reader (CLK_GNUC89);
+ scan_in = cpp_create_reader (CLK_GNUC89, NULL);
cb = cpp_get_callbacks (scan_in);
cb->file_change = cb_file_change;
@@ -628,17 +602,55 @@ 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);
- i = cpp_handle_options (scan_in, argc, argv);
- if (i < argc)
- cpp_error (scan_in, DL_ERROR, "invalid option `%s'", argv[i]);
- if (cpp_errors (scan_in))
+ if (!cpp_read_main_file (scan_in, in_fname))
exit (FATAL_EXIT_CODE);
- if (! cpp_read_main_file (scan_in, in_fname, NULL))
+ 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;
+ if (argv[i][0] == '-')
+ {
+ if (argv[i][1] == 'I')
+ {
+ if (argv[i][2] != '\0')
+ {
+ strings_processed = 1;
+ add_path (xstrdup (argv[i] + 2), BRACKET, false);
+ }
+ else if (i + 1 != argc)
+ {
+ strings_processed = 2;
+ add_path (xstrdup (argv[i + 1]), BRACKET, false);
+ }
+ }
+ else if (argv[i][1] == 'D')
+ {
+ if (argv[i][2] != '\0')
+ strings_processed = 1, cpp_define (scan_in, argv[i] + 2);
+ else if (i + 1 != argc)
+ strings_processed = 2, cpp_define (scan_in, argv[i + 1]);
+ }
+ }
+
+ if (strings_processed == 0)
+ break;
+ }
+
+ if (i < argc)
+ cpp_error (scan_in, CPP_DL_ERROR, "invalid option `%s'", argv[i]);
+ if (cpp_errors (scan_in))
exit (FATAL_EXIT_CODE);
- cpp_finish_options (scan_in);
+ register_include_chains (scan_in, NULL /* sysroot */, NULL /* iprefix */,
+ 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);
@@ -652,12 +664,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);
@@ -695,11 +707,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);
@@ -715,17 +723,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;
@@ -852,11 +854,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:
@@ -870,8 +867,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 (;;)
{
@@ -909,9 +905,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 (;;)
@@ -927,9 +921,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))
@@ -953,8 +945,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 */
@@ -1055,12 +1046,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;
@@ -1180,7 +1169,7 @@ main (argc, argv)
exit (FATAL_EXIT_CODE);
}
inf_size = sbuf.st_size;
- inf_buffer = (char *) xmalloc (inf_size + 2);
+ inf_buffer = xmalloc (inf_size + 2);
inf_ptr = inf_buffer;
to_read = inf_size;
@@ -1303,9 +1292,7 @@ main (argc, argv)
static void
-v_fatal (str, ap)
- const char * str;
- va_list ap;
+v_fatal (const char *str, va_list ap)
{
fprintf (stderr, "%s: %s: ", progname, inc_filename);
vfprintf (stderr, str, ap);
@@ -1315,11 +1302,11 @@ v_fatal (str, ap)
}
static void
-fatal VPARAMS ((const char *str, ...))
+fatal (const char *str, ...)
{
- VA_OPEN (ap, str);
- VA_FIXEDARG (ap, const char *, str);
-
+ va_list ap;
+
+ va_start (ap, str);
v_fatal (str, ap);
- VA_CLOSE (ap);
+ va_end (ap);
}
OpenPOWER on IntegriCloud