/* fix-header.c - Make C header file suitable for C++.
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000 Free Software Foundation, Inc.
+ 1999, 2000, 2001 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
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"
directory. (It might be more efficient to do directory pruning
earlier in fixproto, but this is simpler and easier to customize.) */
-static char *files_to_ignore[] = {
+static const char *const files_to_ignore[] = {
"X11/",
FIXPROTO_IGNORE_LIST
0
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 cb_file_change PARAMS ((cpp_reader *, const struct line_map *));
static void
add_symbols (flags, names)
}
struct std_include_entry {
- const char *name;
- symbol_flags flags;
- namelist names;
+ const char *const name;
+ const symbol_flags flags;
+ const namelist names;
};
const char NONE[] = ""; /* The empty namelist. */
/* Special name to indicate a continuation line in std_include_table. */
const char CONTINUED[] = "";
-struct std_include_entry *include_entry;
+const struct std_include_entry *include_entry;
-struct std_include_entry std_include_table [] = {
+const struct std_include_entry std_include_table [] = {
{ "ctype.h", ANSI_SYMBOL,
"isalnum\0isalpha\0iscntrl\0isdigit\0isgraph\0islower\0\
isprint\0ispunct\0isspace\0isupper\0isxdigit\0tolower\0toupper\0" },
/* The following are only used when handling stdlib.h */
int seen_EXIT_FAILURE = 0, seen_EXIT_SUCCESS = 0;
\f
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
struct obstack scan_file_obstack;
/* NOTE: If you edit this, also edit gen-protos.c !! */
int required_unseen_count = 0;
int required_other = 0;
-static void
+static void
write_lbrac ()
{
-
+
#if ADD_MISSING_EXTERN_C
if (missing_extern_C_count + required_unseen_count > 0)
fprintf (outf, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n");
/* If we have a full prototype, we're done. */
if (have_arg_list)
return;
-
+
if (kind == 'I') /* don't edit inline function */
return;
}
static void
-cb_file_change (pfile, fc)
+cb_file_change (pfile, map)
cpp_reader *pfile ATTRIBUTE_UNUSED;
- const cpp_file_change *fc;
+ const struct line_map *map;
{
/* Just keep track of current file name. */
- cur_file = fc->to.filename;
+ cur_file = map->to_file;
}
static void
int argc;
char **argv;
{
- cpp_reader* scan_in;
+ cpp_reader *scan_in;
cpp_callbacks *cb;
cpp_options *options;
struct fn_decl *fn;
int i;
- register struct symbol_list *cur_symbols;
+ struct symbol_list *cur_symbols;
- obstack_init (&scan_file_obstack);
+ obstack_init (&scan_file_obstack);
scan_in = cpp_create_reader (CLK_GNUC89);
cb = cpp_get_callbacks (scan_in);
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))
+ if (i < argc)
+ cpp_error (scan_in, DL_ERROR, "invalid option `%s'", argv[i]);
+ if (cpp_errors (scan_in))
exit (FATAL_EXIT_CODE);
- if (! cpp_start_read (scan_in, in_fname))
+ if (! cpp_read_main_file (scan_in, in_fname, NULL))
exit (FATAL_EXIT_CODE);
+ cpp_finish_options (scan_in);
+
/* We are scanning a system header, so mark it as such. */
cpp_make_system_header (scan_in, 1, 0);
/* Scan the macro expansion of "getchar();". */
cpp_push_buffer (scan_in, getchar_call, sizeof(getchar_call) - 1,
- BUF_BUILTIN, in_fname);
+ /* from_stage3 */ true, 1);
for (;;)
{
- cpp_token t;
+ const cpp_token *t = cpp_get_token (scan_in);
- cpp_get_token (scan_in, &t);
- if (t.type == CPP_EOF)
+ if (t->type == CPP_EOF)
break;
- else if (cpp_ideq (&t, "_filbuf"))
+ else if (cpp_ideq (t, "_filbuf"))
seen_filbuf++;
}
- cpp_pop_buffer (scan_in);
if (seen_filbuf)
{
if (required_unseen_count + partial_count + required_other
#if ADD_MISSING_EXTERN_C
+ missing_extern_C_count
-#endif
+#endif
== 0)
{
if (verbose)
{
struct fn_decl *fn;
const char *cptr;
- register struct symbol_list *cur_symbols;
+ struct symbol_list *cur_symbols;
if (required_unseen_count)
{
static int
inf_scan_ident (s, c)
- register sstring *s;
+ sstring *s;
int c;
{
s->ptr = s->base;
- if (ISALPHA (c) || c == '_')
+ if (ISIDST (c))
{
for (;;)
{
SSTRING_PUT (s, c);
c = INF_GET ();
- if (c == EOF || !(ISALNUM (c) || c == '_'))
+ if (c == EOF || !(ISIDNUM (c)))
break;
}
}
int endif_line;
long to_read;
long int inf_size;
- register struct symbol_list *cur_symbols;
+ struct symbol_list *cur_symbols;
if (argv[0] && argv[0][0])
{
- register char *p;
+ char *p;
progname = 0;
for (p = argv[0]; *p; p++)
- if (*p == '/')
- progname = p;
+ if (*p == '/')
+ progname = p;
progname = progname ? progname+1 : argv[0];
}
#ifdef FIXPROTO_IGNORE_LIST
for (i = 0; files_to_ignore[i] != NULL; i++)
{
- char *ignore_name = files_to_ignore[i];
+ const char *const ignore_name = files_to_ignore[i];
int ignore_len = strlen (ignore_name);
if (strncmp (inc_filename, ignore_name, ignore_len) == 0)
{
exit (SUCCESS_EXIT_CODE);
}
}
-
+
}
#endif
if (include_entry->name != NULL)
{
- struct std_include_entry *entry;
+ const struct std_include_entry *entry;
cur_symbol_table_size = 0;
for (entry = include_entry; ;)
{
else
symbol_table[0].names = NULL;
- /* Count and mark the prototypes required for this include file. */
+ /* Count and mark the prototypes required for this include file. */
for (cur_symbols = &symbol_table[0]; cur_symbols->names; cur_symbols++)
{
int name_len;
}
inf_size = sbuf.st_size;
inf_buffer = (char *) xmalloc (inf_size + 2);
- inf_buffer[inf_size] = '\n';
- inf_buffer[inf_size + 1] = '\0';
- inf_limit = inf_buffer + inf_size;
inf_ptr = inf_buffer;
to_read = inf_size;
close (inf_fd);
+ /* Inf_size may have changed if read was short (as on VMS) */
+ inf_buffer[inf_size] = '\n';
+ inf_buffer[inf_size + 1] = '\0';
+ inf_limit = inf_buffer + inf_size;
+
/* If file doesn't end with '\n', add one. */
if (inf_limit > inf_buffer && inf_limit[-1] != '\n')
inf_limit++;
c = INF_GET ();
if (c == EOF)
break;
- if (ISALPHA (c) || c == '_')
+ if (ISIDST (c))
{
c = inf_scan_ident (&buf, c);
(void) INF_UNGET (c);
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, ...))
{
-#ifndef ANSI_PROTOTYPES
- const char *str;
-#endif
- va_list ap;
-
- VA_START (ap, str);
-
-#ifndef ANSI_PROTOTYPES
- str = va_arg (ap, const char *);
-#endif
+ VA_OPEN (ap, str);
+ VA_FIXEDARG (ap, const char *, str);
v_fatal (str, ap);
- va_end (ap);
+ VA_CLOSE (ap);
}