gen-protos.c (overrides): New static local.

* gen-protos.c (overrides): New static local.
	(add_hash,parse_fn_proto): New static functions.
	(main): Add prototypes from SYS_PROTO_OVERRIDES to hash table before
	parsing sys-protos.h.  Reserve entry 0 in std_protos.
	* alpha/alpha.h (SYS_PROTO_OVERRIDES): Define.

From-SVN: r12598
This commit is contained in:
Doug Evans 1996-08-06 18:25:30 +00:00
parent d50014aec6
commit 3d348653e0
2 changed files with 162 additions and 92 deletions

View File

@ -2253,3 +2253,7 @@ do { \
#define HAS_INIT_SECTION #define HAS_INIT_SECTION
#define LD_INIT_SWITCH "-init" #define LD_INIT_SWITCH "-init"
#define LD_FINI_SWITCH "-fini" #define LD_FINI_SWITCH "-fini"
/* Define gethostid in unistd.h as returning an int, not a long. */
#define SYS_PROTO_OVERRIDES \
"extern int gethostid (void);",

View File

@ -1,5 +1,5 @@
/* gen-protos.c - massages a list of prototypes, for use by fixproto. /* gen-protos.c - massages a list of prototypes, for use by fixproto.
Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License as published by the
@ -22,9 +22,23 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "cpplib.h" #include "cpplib.h"
#include "cpphash.h" #include "cpphash.h"
#define HASH_SIZE 2503 /* a prime */ int verbose = 0;
char *progname;
int /* Table of prototypes that override sys-protos.h. */
static char *overrides[] =
{
#ifdef SYS_PROTO_OVERRIDES
SYS_PROTO_OVERRIDES
#endif
0
};
#define HASH_SIZE 2503 /* a prime */
int hash_tab[HASH_SIZE];
int next_index;
static int
hashf (name, len, hashsize) hashf (name, len, hashsize)
register U_CHAR *name; register U_CHAR *name;
register int len; register int len;
@ -38,67 +52,58 @@ hashf (name, len, hashsize)
return MAKE_POS (r) % hashsize; return MAKE_POS (r) % hashsize;
} }
int hash_tab[HASH_SIZE]; static void
int verbose = 0; add_hash (fname)
char *progname; char *fname;
sstring linebuf;
/* 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 ();
}
int
main (argc, argv)
int argc;
char **argv;
{
FILE *inf = stdin;
FILE *outf = stdout;
int next_index = 0;
int i, i0; int i, i0;
i = strlen (argv[0]); /* NOTE: If you edit this, also edit lookup_std_proto in fix-header.c !! */
while (i > 0 && argv[0][i-1] != '/') --i; i = hashf (fname, strlen (fname), HASH_SIZE);
progname = &argv[0][i]; i0 = i;
if (hash_tab[i] != 0)
fprintf (outf, "struct fn_decl std_protos[] = {\n"); {
for (;;) for (;;)
{ {
int c = skip_spaces (inf, ' '); i = (i+1) % HASH_SIZE;
int param_nesting = 1; if (i == i0)
char *param_start, *param_end, *decl_start, abort ();
*name_start, *name_end; if (hash_tab[i] == 0)
register char *ptr;
if (c == EOF)
break; break;
linebuf.ptr = linebuf.base; }
ungetc (c, inf); }
c = read_upto (inf, &linebuf, '\n'); hash_tab[i] = next_index;
if (linebuf.base[0] == '#') /* skip cpp command */
continue;
if (linebuf.base[0] == '\0') /* skip empty line */
continue;
ptr = linebuf.ptr - 1; next_index++;
}
/* Given a function prototype, fill in the fields of FN.
The result is a boolean indicating if a function prototype was found.
The input string is modified (trailing NULs are inserted).
The fields of FN point to the input string. */
static int
parse_fn_proto (start, end, fn)
char *start, *end;
struct fn_decl *fn;
{
register char *ptr;
int param_nesting = 1;
char *param_start, *param_end, *decl_start, *name_start, *name_end;
ptr = end - 1;
while (*ptr == ' ' || *ptr == '\t') ptr--; while (*ptr == ' ' || *ptr == '\t') ptr--;
if (*ptr-- != ';') if (*ptr-- != ';')
{ {
fprintf (stderr, "Funny input line: %s\n", linebuf.base); fprintf (stderr, "Funny input line: %s\n", start);
continue; return 0;
} }
while (*ptr == ' ' || *ptr == '\t') ptr--; while (*ptr == ' ' || *ptr == '\t') ptr--;
if (*ptr != ')') if (*ptr != ')')
{ {
fprintf (stderr, "Funny input line: %s\n", linebuf.base); fprintf (stderr, "Funny input line: %s\n", start);
continue; return 0;
} }
param_end = ptr; param_end = ptr;
for (;;) for (;;)
@ -118,8 +123,8 @@ main (argc, argv)
{ {
if (verbose) if (verbose)
fprintf (stderr, "%s: Can't handle this complex prototype: %s\n", fprintf (stderr, "%s: Can't handle this complex prototype: %s\n",
argv[0], linebuf.base); progname, start);
continue; return 0;
} }
name_end = ptr+1; name_end = ptr+1;
@ -127,38 +132,89 @@ main (argc, argv)
name_start = ptr+1; name_start = ptr+1;
while (*ptr == ' ' || *ptr == '\t') ptr--; while (*ptr == ' ' || *ptr == '\t') ptr--;
ptr[1] = 0; ptr[1] = 0;
*name_end = 0;
*param_end = 0; *param_end = 0;
*name_end = 0; *name_end = 0;
decl_start = linebuf.base; decl_start = start;
if (strncmp (decl_start, "typedef ", 8) == 0) if (strncmp (decl_start, "typedef ", 8) == 0)
continue; return 0;
if (strncmp (decl_start, "extern ", 7) == 0) if (strncmp (decl_start, "extern ", 7) == 0)
decl_start += 7; decl_start += 7;
fn->fname = name_start;
fn->rtype = decl_start;
fn->params = param_start;
return 1;
}
/* NOTE: If you edit this, int
also edit lookup_std_proto in fix-header.c !! */ main (argc, argv)
i = hashf (name_start, name_end - name_start, HASH_SIZE); int argc;
i0 = i; char **argv;
if (hash_tab[i] != 0)
{ {
for (;;) FILE *inf = stdin;
FILE *outf = stdout;
int i;
sstring linebuf;
char **optr;
struct fn_decl fn_decl;
i = strlen (argv[0]);
while (i > 0 && argv[0][i-1] != '/') --i;
progname = &argv[0][i];
INIT_SSTRING (&linebuf);
fprintf (outf, "struct fn_decl std_protos[] = {\n");
/* A hash table entry of 0 means "unused" so reserve it. */
fprintf (outf, " {\"\", \"\", \"\"},\n");
next_index = 1;
/* Output the overriding prototypes first so fix-header will use them
in preference to the default ones. */
/* ??? Two copies of the prototype are output. This doesn't cause any
problems, but one might wish to avoid outputting the second one. */
for (optr = overrides; *optr; ++optr)
{ {
i = (i+1) % HASH_SIZE; /* Using sstring's here may be overkill but parse_fn_proto modifies
if (i == i0) the input string. */
abort (); linebuf.ptr = linebuf.base;
if (hash_tab[i] == 0) make_sstring_space (&linebuf, strlen (*optr) + 1);
break; strcpy (linebuf.base, *optr);
} linebuf.ptr = linebuf.base + strlen (*optr);
}
hash_tab[i] = next_index; if (! parse_fn_proto (linebuf.base, linebuf.ptr, &fn_decl))
continue;
add_hash (fn_decl.fname);
fprintf (outf, " {\"%s\", \"%s\", \"%s\"},\n", fprintf (outf, " {\"%s\", \"%s\", \"%s\"},\n",
name_start, decl_start, param_start); fn_decl.fname, fn_decl.rtype, fn_decl.params);
}
next_index++; for (;;)
{
int c = skip_spaces (inf, ' ');
if (c == EOF)
break;
linebuf.ptr = linebuf.base;
ungetc (c, inf);
c = read_upto (inf, &linebuf, '\n');
if (linebuf.base[0] == '#') /* skip cpp command */
continue;
if (linebuf.base[0] == '\0') /* skip empty line */
continue;
if (! parse_fn_proto (linebuf.base, linebuf.ptr, &fn_decl))
continue;
add_hash (fn_decl.fname);
fprintf (outf, " {\"%s\", \"%s\", \"%s\"},\n",
fn_decl.fname, fn_decl.rtype, fn_decl.params);
if (c == EOF) if (c == EOF)
break; break;
@ -175,6 +231,16 @@ main (argc, argv)
return 0; return 0;
} }
/* 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 ();
}
void void
fatal (s) fatal (s)
char *s; char *s;