X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ffix-header.c;h=8d801281d456fa2085d2da2dc9d7d3b2d2ebf34e;hb=97b330ca3e32dc8619baac1c75cdf0feb101cbf6;hp=f6cc5e8d6d974e2e937466a106f3e454826a32d6;hpb=1486870d76c8ec5ab28664fa7dcadd8ccc5e9723;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/fix-header.c b/gcc/fix-header.c index f6cc5e8d6d9..8d801281d45 100644 --- a/gcc/fix-header.c +++ b/gcc/fix-header.c @@ -1,5 +1,6 @@ /* fix-header.c - Make C header file suitable for C++. - Copyright (C) 1993, 94-97, 1998 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000 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 @@ -75,17 +76,9 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "obstack.h" #include "scan.h" #include "cpplib.h" -#include "gansidecl.h" -#ifndef O_RDONLY -#define O_RDONLY 0 -#endif - -extern void cpp_fatal (); - -#if !__STDC__ && !defined(const) -#define const /* nothing */ -#endif +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; sstring buf; @@ -121,15 +114,28 @@ static char *files_to_ignore[] = { char *inf_buffer; char *inf_limit; char *inf_ptr; +static const char *cur_file; /* Certain standard files get extra treatment */ enum special_file { no_special, +#ifdef errno_h +#undef errno_h +#endif errno_h, +#ifdef stdio_h +#undef stdio_h +#endif stdio_h, +#ifdef stdlib_h +#undef stdlib_h +#endif stdlib_h, +#ifdef sys_stat_h +#undef sys_stat_h +#endif sys_stat_h }; @@ -182,7 +188,20 @@ struct symbol_list { struct symbol_list symbol_table[SYMBOL_TABLE_SIZE]; int cur_symbol_table_size; -void +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 cpp_file_change *)); + +static void add_symbols (flags, names) symbol_flags flags; namelist names; @@ -331,7 +350,7 @@ setgid\0setpgid\0setsid\0setuid\0sleep\0sysconf\0tcgetpgrp\0tcsetpgrp\0\ ttyname\0unlink\0write\0" }, { CONTINUED, POSIX2_SYMBOL, "getopt\0" }, { CONTINUED, XOPEN_EXTENDED_SYMBOL, - "lockf\0gethostid\0gethostname\0readlink\0" }, + "lockf\0gethostid\0gethostname\0readlink\0symlink\0" }, { "utime.h", POSIX1_SYMBOL, "utime\0" }, @@ -353,37 +372,18 @@ int seen_errno = 0; /* The following are only used when handling stdlib.h */ int seen_EXIT_FAILURE = 0, seen_EXIT_SUCCESS = 0; -/* Wrapper around free, to avoid prototype clashes. */ - -void -xfree (ptr) - char *ptr; -{ - free (ptr); -} - -/* Avoid error if config defines abort as fancy_abort. - It's not worth "really" implementing this because ordinary - compiler users never run fix-header. */ - -void -fancy_abort () -{ - abort (); -} - #define obstack_chunk_alloc xmalloc -#define obstack_chunk_free xfree +#define obstack_chunk_free free struct obstack scan_file_obstack; /* NOTE: If you edit this, also edit gen-protos.c !! */ -struct fn_decl * +static struct fn_decl * lookup_std_proto (name, name_length) const char *name; int name_length; { - int i = hashf (name, name_length, HASH_SIZE); + int i = hashstr (name, name_length) % HASH_SIZE; int i0 = i; for (;;) { @@ -391,7 +391,7 @@ lookup_std_proto (name, name_length) if (hash_tab[i] == 0) return NULL; fn = &std_protos[hash_tab[i]]; - if (strlen (fn->fname) == name_length + if ((int) strlen (fn->fname) == name_length && strncmp (fn->fname, name, name_length) == 0) return fn; i = (i+1) % HASH_SIZE; @@ -402,7 +402,7 @@ lookup_std_proto (name, name_length) char *inc_filename; int inc_filename_length; -char *progname = "fix-header"; +const char *progname = "fix-header"; FILE *outf; sstring line; @@ -411,7 +411,7 @@ int lbrac_line, rbrac_line; int required_unseen_count = 0; int required_other = 0; -void +static void write_lbrac () { @@ -434,8 +434,6 @@ write_lbrac () struct partial_proto { struct partial_proto *next; - char *fname; /* name of function */ - char *rtype; /* return type */ struct fn_decl *fn; int line_seen; }; @@ -448,9 +446,9 @@ struct partial_proto required_dummy_proto, seen_dummy_proto; #define SET_SEEN(FN) ((FN)->partial = &seen_dummy_proto) #define SEEN(FN) ((FN)->partial == &seen_dummy_proto) -void +static void recognized_macro (fname) - char *fname; + const char *fname; { /* The original include file defines fname as a macro. */ struct fn_decl *fn = lookup_std_proto (fname, strlen (fname)); @@ -499,15 +497,13 @@ recognized_macro (fname) } void -recognized_extern (name, name_length, type, type_length) - char *name; - char *type; - int name_length, type_length; +recognized_extern (name) + const cpp_token *name; { switch (special_file_handling) { case errno_h: - if (name_length == 5 && strncmp (name, "errno", 5) == 0 && !seen_errno) + if (cpp_ideq (name, "errno")) seen_errno = 1, required_other--; break; @@ -517,25 +513,16 @@ recognized_extern (name, name_length, type, type_length) } /* Called by scan_decls if it saw a function definition for a function - named FNAME, with return type RTYPE, and argument list ARGS, - in source file FILE_SEEN on line LINE_SEEN. - KIND is 'I' for an inline function; - 'F' if a normal function declaration preceded by 'extern "C"' - (or nested inside 'extern "C"' braces); or - 'f' for other function declarations. */ + named FNAME. KIND is 'I' for an inline function; 'F' if a normal + function declaration preceded by 'extern "C"' (or nested inside + 'extern "C"' braces); or 'f' for other function declarations. */ void -recognized_function (fname, fname_length, - kind, rtype, rtype_length, - have_arg_list, file_seen, line_seen) - char *fname; - int fname_length; +recognized_function (fname, line, kind, have_arg_list) + const cpp_token *fname; + unsigned int line; int kind; /* One of 'f' 'F' or 'I' */ - char *rtype; - int rtype_length; int have_arg_list; - char *file_seen; - int line_seen; { struct partial_proto *partial; int i; @@ -545,7 +532,8 @@ recognized_function (fname, fname_length, missing_extern_C_count++; #endif - fn = lookup_std_proto (fname, fname_length); + fn = lookup_std_proto ((const char *) NODE_NAME (fname->val.node), + NODE_LEN (fname->val.node)); /* Remove the function from the list of required function. */ if (fn) @@ -564,14 +552,14 @@ recognized_function (fname, fname_length, /* If the partial prototype was included from some other file, we don't need to patch it up (in this run). */ - i = strlen (file_seen); + i = strlen (cur_file); if (i < inc_filename_length - || strcmp (inc_filename, file_seen + (i - inc_filename_length)) != 0) + || strcmp (inc_filename, cur_file + (i - inc_filename_length)) != 0) return; if (fn == NULL) return; - if (fn->params[0] == '\0' || strcmp (fn->params, "void") == 0) + if (fn->params[0] == '\0') return; /* We only have a partial function declaration, @@ -579,12 +567,7 @@ recognized_function (fname, fname_length, partial_count++; partial = (struct partial_proto *) obstack_alloc (&scan_file_obstack, sizeof (struct partial_proto)); - partial->fname = obstack_alloc (&scan_file_obstack, fname_length + 1); - bcopy (fname, partial->fname, fname_length); - partial->fname[fname_length] = 0; - partial->rtype = obstack_alloc (&scan_file_obstack, rtype_length + 1); - sprintf (partial->rtype, "%.*s", rtype_length, rtype); - partial->line_seen = line_seen; + partial->line_seen = line; partial->fn = fn; fn->partial = partial; partial->next = partial_proto_list; @@ -592,91 +575,102 @@ recognized_function (fname, fname_length, if (verbose) { fprintf (stderr, "(%s: %s non-prototype function declaration.)\n", - inc_filename, partial->fname); + inc_filename, fn->fname); } } /* For any name in NAMES that is defined as a macro, call recognized_macro on it. */ -void +static void check_macro_names (pfile, names) cpp_reader *pfile; namelist names; { + size_t len; while (*names) { - if (cpp_lookup (pfile, names, -1, -1)) + len = strlen (names); + if (cpp_defined (pfile, (const unsigned char *)names, len)) recognized_macro (names); - names += strlen (names) + 1; + names += len + 1; } } -void +static void +cb_file_change (pfile, fc) + cpp_reader *pfile ATTRIBUTE_UNUSED; + const cpp_file_change *fc; +{ + /* Just keep track of current file name. */ + cur_file = fc->to.filename; +} + +static void read_scan_file (in_fname, argc, argv) char *in_fname; int argc; char **argv; { - cpp_reader scan_in; - cpp_options scan_options; + cpp_reader* scan_in; + cpp_callbacks *cb; + cpp_options *options; struct fn_decl *fn; int i; register struct symbol_list *cur_symbols; obstack_init (&scan_file_obstack); - cpp_reader_init (&scan_in); - scan_in.data = &scan_options; - cpp_options_init (&scan_options); - i = cpp_handle_options (&scan_in, argc, argv); - if (i < argc && ! CPP_FATAL_ERRORS (&scan_in)) - cpp_fatal (&scan_in, "Invalid option `%s'", argv[i]); - if (CPP_FATAL_ERRORS (&scan_in)) + scan_in = cpp_create_reader (NULL, CLK_GNUC89); + cb = cpp_get_callbacks (scan_in); + cb->file_change = cb_file_change; + + /* We are going to be scanning a header file out of its proper context, + so ignore warnings and errors. */ + options = cpp_get_options (scan_in); + options->inhibit_warnings = 1; + options->inhibit_errors = 1; + + i = cpp_handle_options (scan_in, argc, argv); + if (i < argc && ! CPP_FATAL_ERRORS (scan_in)) + cpp_fatal (scan_in, "Invalid option `%s'", argv[i]); + cpp_post_options (scan_in); + if (CPP_FATAL_ERRORS (scan_in)) exit (FATAL_EXIT_CODE); - if (! cpp_start_read (&scan_in, in_fname)) + if (! cpp_start_read (scan_in, in_fname)) exit (FATAL_EXIT_CODE); - CPP_OPTIONS (&scan_in)->no_line_commands = 1; - scan_decls (&scan_in, argc, argv); - for (cur_symbols = &symbol_table[0]; cur_symbols->names; cur_symbols++) - check_macro_names (&scan_in, cur_symbols->names); + /* We are scanning a system header, so mark it as such. */ + cpp_make_system_header (scan_in, 1, 0); - if (verbose && (scan_in.errors + warnings) > 0) - fprintf (stderr, "(%s: %d errors and %d warnings from cpp)\n", - inc_filename, scan_in.errors, warnings); - if (scan_in.errors) - exit (SUCCESS_EXIT_CODE); + scan_decls (scan_in, argc, argv); + for (cur_symbols = &symbol_table[0]; cur_symbols->names; cur_symbols++) + check_macro_names (scan_in, cur_symbols->names); /* Traditionally, getc and putc are defined in terms of _filbuf and _flsbuf. If so, those functions are also required. */ if (special_file_handling == stdio_h && (fn = lookup_std_proto ("_filbuf", 7)) != NULL) { - static char getchar_call[] = "getchar();"; - cpp_buffer *buf - = cpp_push_buffer (&scan_in, getchar_call, sizeof(getchar_call) - 1); - int old_written = CPP_WRITTEN (&scan_in); + static const unsigned char getchar_call[] = "getchar();"; int seen_filbuf = 0; /* Scan the macro expansion of "getchar();". */ + cpp_push_buffer (scan_in, getchar_call, sizeof(getchar_call) - 1, + BUF_BUILTIN, in_fname); for (;;) { - enum cpp_token token = cpp_get_token (&scan_in); - int length = CPP_WRITTEN (&scan_in) - old_written; - CPP_SET_WRITTEN (&scan_in, old_written); - if (token == CPP_EOF) /* Should not happen ... */ + cpp_token t; + + cpp_get_token (scan_in, &t); + if (t.type == CPP_EOF) break; - if (token == CPP_POP && CPP_BUFFER (&scan_in) == buf) - { - cpp_pop_buffer (&scan_in); - break; - } - if (token == CPP_NAME && length == 7 - && strcmp ("_filbuf", scan_in.token_buffer + old_written) == 0) + else if (cpp_ideq (&t, "_filbuf")) seen_filbuf++; } + cpp_pop_buffer (scan_in); + if (seen_filbuf) { int need_filbuf = !SEEN (fn) && !REQUIRED (fn); @@ -687,12 +681,12 @@ read_scan_file (in_fname, argc, argv) /* Append "_filbuf" and/or "_flsbuf" to the required functions. */ if (need_filbuf + need_flsbuf) { - char *new_list; + const char *new_list; if (need_filbuf) SET_REQUIRED (fn); if (need_flsbuf) SET_REQUIRED (flsbuf_fn); - if (need_flsbuf + need_filbuf == 2) + if (need_flsbuf && need_filbuf) new_list = "_filbuf\0_flsbuf\0"; else if (need_flsbuf) new_list = "_flsbuf\0"; @@ -733,7 +727,7 @@ read_scan_file (in_fname, argc, argv) } } -void +static void write_rbrac () { struct fn_decl *fn; @@ -797,10 +791,13 @@ write_rbrac () /* In the case of memmove, protect in case the application defines it as a macro before including the header. */ if (!strcmp (fn->fname, "memmove") + || !strcmp (fn->fname, "putc") + || !strcmp (fn->fname, "getc") || !strcmp (fn->fname, "vprintf") || !strcmp (fn->fname, "vfprintf") || !strcmp (fn->fname, "vsprintf") - || !strcmp (fn->fname, "rewinddir")) + || !strcmp (fn->fname, "rewinddir") + || !strcmp (fn->fname, "abort")) macro_protect = 1; if (macro_protect) @@ -865,15 +862,6 @@ write_rbrac () #endif } -char * -xstrdup (str) - char *str; -{ - char *copy = (char *) xmalloc (strlen (str) + 1); - strcpy (copy, str); - return copy; -} - /* Returns 1 iff the file is properly protected from multiple inclusion: #ifndef PROTECT_NAME #define PROTECT_NAME @@ -884,7 +872,7 @@ xstrdup (str) #define INF_GET() (inf_ptr < inf_limit ? *(unsigned char *) inf_ptr++ : EOF) #define INF_UNGET(c) ((c)!=EOF && inf_ptr--) -int +static int inf_skip_spaces (c) int c; { @@ -923,7 +911,7 @@ inf_skip_spaces (c) /* Read into STR from inf_buffer upto DELIM. */ -int +static int inf_read_upto (str, delim) sstring *str; int delim; @@ -941,19 +929,19 @@ inf_read_upto (str, delim) return ch; } -int +static int inf_scan_ident (s, c) register sstring *s; int c; { s->ptr = s->base; - if (isalpha (c) || c == '_') + if (ISALPHA (c) || c == '_') { for (;;) { SSTRING_PUT (s, c); c = INF_GET (); - if (c == EOF || !(isalnum (c) || c == '_')) + if (c == EOF || !(ISALNUM (c) || c == '_')) break; } } @@ -967,7 +955,7 @@ inf_scan_ident (s, c) and setting *endif_line to the final #endif. Otherwise return 0. */ -int +static int check_protection (ifndef_line, endif_line) int *ifndef_line, *endif_line; { @@ -1037,8 +1025,6 @@ check_protection (ifndef_line, endif_line) } else if (!strcmp (buf.base, "define")) { - if (if_nesting != 1) - goto skip_to_eol; c = inf_skip_spaces (c); c = inf_scan_ident (&buf, c); if (buf.base[0] > 0 && strcmp (buf.base, protect_name) == 0) @@ -1072,6 +1058,8 @@ check_protection (ifndef_line, endif_line) return 1; } +extern int main PARAMS ((int, char **)); + int main (argc, argv) int argc; @@ -1140,7 +1128,7 @@ main (argc, argv) special_file_handling = stdio_h; include_entry = std_include_table; while (include_entry->name != NULL - && (include_entry->name == CONTINUED + && ((strcmp (include_entry->name, CONTINUED) == 0) || strcmp (inc_filename, include_entry->name) != 0)) include_entry++; @@ -1153,7 +1141,7 @@ main (argc, argv) if (entry->flags) add_symbols (entry->flags, entry->names); entry++; - if (entry->name != CONTINUED) + if (!entry->name || strcmp (entry->name, CONTINUED) != 0) break; } } @@ -1264,7 +1252,7 @@ main (argc, argv) c = INF_GET (); if (c == EOF) break; - if (isalpha (c) || c == '_') + if (ISALPHA (c) || c == '_') { c = inf_scan_ident (&buf, c); (void) INF_UNGET (c); @@ -1314,71 +1302,33 @@ main (argc, argv) return 0; } -/* Stub error functions. These replace cpperror.c, - because we want to suppress error messages. */ - -void -cpp_file_line_for_message (filename, line, column) - char *filename; - int line, column; -{ - if (!verbose) - return; - if (column > 0) - fprintf (stderr, "%s:%d:%d: ", filename, line, column); - else - fprintf (stderr, "%s:%d: ", filename, line); -} - -void -cpp_print_containing_files (pfile) - cpp_reader *pfile; -{ -} - -/* IS_ERROR is 2 for fatal error, 1 for error, 0 for warning */ - -void cpp_message (pfile, is_error, msg, arg1, arg2, arg3) - int is_error; - cpp_reader *pfile; - char *msg; - char *arg1, *arg2, *arg3; -{ - if (is_error == 1) - pfile->errors++; - else if (is_error > 1) - pfile->errors = CPP_FATAL_LIMIT; - if (!verbose) - return; - if (!is_error) - fprintf (stderr, "warning: "); - fprintf (stderr, msg, arg1, arg2, arg3); - fprintf (stderr, "\n"); -} -void -fatal (str, arg) - char *str, *arg; +static void +v_fatal (str, ap) + const char * str; + va_list ap; { fprintf (stderr, "%s: %s: ", progname, inc_filename); - fprintf (stderr, str, arg); + vfprintf (stderr, str, ap); fprintf (stderr, "\n"); + exit (FATAL_EXIT_CODE); } -void -cpp_fatal (pfile, str, arg) - cpp_reader *pfile; - char *str, *arg; +static void +fatal VPARAMS ((const char *str, ...)) { - fatal (str, arg); -} +#ifndef ANSI_PROTOTYPES + const char *str; +#endif + va_list ap; + + VA_START (ap, str); -void -cpp_pfatal_with_name (pfile, name) - cpp_reader *pfile; - char *name; -{ - cpp_perror_with_name (pfile, name); - exit (FATAL_EXIT_CODE); +#ifndef ANSI_PROTOTYPES + str = va_arg (ap, const char *); +#endif + + v_fatal (str, ap); + va_end (ap); }