* lib/xstrdup.c: New file, from the fileutils.

* src/reader.c (parse_token_decl, get_type_name, parse_type_decl)
(parse_assoc_decl, parse_thong_decl, get_type): Use `xstrdup'
instead of strlen + xmalloc + strcpy.
* src/symtab.c (copys): Remove, use xstrdup instead.
This commit is contained in:
Akim Demaille
2000-10-02 09:01:19 +00:00
parent d7020c2078
commit 95e36146a5
5 changed files with 92 additions and 69 deletions

View File

@@ -1,3 +1,12 @@
2000-10-02 Akim Demaille <akim@epita.fr>
* lib/xstrdup.c: New file, from the fileutils.
* src/reader.c (parse_token_decl, get_type_name, parse_type_decl)
(parse_assoc_decl, parse_thong_decl, get_type): Use `xstrdup'
instead of strlen + xmalloc + strcpy.
* src/symtab.c (copys): Remove, use xstrdup instead.
2000-10-02 Akim Demaille <akim@epita.fr> 2000-10-02 Akim Demaille <akim@epita.fr>
* src/gram.h (associativity): New enum type which replaces the * src/gram.h (associativity): New enum type which replaces the

View File

@@ -6,7 +6,7 @@ noinst_LIBRARIES = libbison.a
INCLUDES = -I.. -I$(srcdir) -I../intl INCLUDES = -I.. -I$(srcdir) -I../intl
libbison_a_SOURCES = getopt.c getopt1.c xmalloc.c libbison_a_SOURCES = getopt.c getopt1.c xmalloc.c xstrdup.c
noinst_HEADERS = getopt.h xalloc.h noinst_HEADERS = getopt.h xalloc.h
libbison_a_LIBADD = @LIBOBJS@ @ALLOCA@ libbison_a_LIBADD = @LIBOBJS@ @ALLOCA@

46
lib/xstrdup.c Normal file
View File

@@ -0,0 +1,46 @@
/* xstrdup.c -- copy a string with out of memory checking
Copyright (C) 1990, 1996, 1998 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 Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
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,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#if HAVE_CONFIG_H
# include <config.h>
#endif
#ifndef PARAMS
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
# define PARAMS(Args) Args
# else
# define PARAMS(Args) ()
# endif
#endif
#if STDC_HEADERS || HAVE_STRING_H
# include <string.h>
#else
# include <strings.h>
#endif
#include <sys/types.h>
char *xmalloc PARAMS ((size_t n));
/* Return a newly allocated copy of STRING. */
char *
xstrdup (const char *string)
{
return strcpy (xmalloc (strlen (string) + 1), string);
}

View File

@@ -351,7 +351,6 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not)
int token = 0; int token = 0;
char *typename = 0; char *typename = 0;
struct bucket *symbol = NULL; /* pts to symbol being defined */ struct bucket *symbol = NULL; /* pts to symbol being defined */
int k;
for (;;) for (;;)
{ {
@@ -370,9 +369,7 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not)
} }
if (token == TYPENAME) if (token == TYPENAME)
{ {
k = strlen (token_buffer); typename = xstrdup (token_buffer);
typename = XCALLOC (char, k + 1);
strcpy (typename, token_buffer);
value_components_used = 1; value_components_used = 1;
symbol = NULL; symbol = NULL;
} }
@@ -488,7 +485,6 @@ get_type_name (int n, symbol_list * rule)
static void static void
parse_type_decl (void) parse_type_decl (void)
{ {
int k;
char *name; char *name;
if (lex () != TYPENAME) if (lex () != TYPENAME)
@@ -498,9 +494,7 @@ parse_type_decl (void)
return; return;
} }
k = strlen (token_buffer); name = xstrdup (token_buffer);
name = XCALLOC (char, k + 1);
strcpy (name, token_buffer);
for (;;) for (;;)
{ {
@@ -547,7 +541,6 @@ parse_type_decl (void)
static void static void
parse_assoc_decl (associativity assoc) parse_assoc_decl (associativity assoc)
{ {
int k;
char *name = NULL; char *name = NULL;
int prev = 0; int prev = 0;
@@ -567,11 +560,8 @@ parse_assoc_decl (associativity assoc)
switch (t) switch (t)
{ {
case TYPENAME: case TYPENAME:
k = strlen (token_buffer); name = xstrdup (token_buffer);
name = XCALLOC (char, k + 1);
strcpy (name, token_buffer);
break; break;
case COMMA: case COMMA:
@@ -757,15 +747,13 @@ parse_thong_decl (void)
int token; int token;
struct bucket *symbol; struct bucket *symbol;
char *typename = 0; char *typename = 0;
int k, usrtoknum; int usrtoknum;
translations = 1; translations = 1;
token = lex (); /* fetch typename or first token */ token = lex (); /* fetch typename or first token */
if (token == TYPENAME) if (token == TYPENAME)
{ {
k = strlen (token_buffer); typename = xstrdup (token_buffer);
typename = XCALLOC (char, k + 1);
strcpy (typename, token_buffer);
value_components_used = 1; value_components_used = 1;
token = lex (); /* fetch first token */ token = lex (); /* fetch first token */
} }
@@ -1253,9 +1241,7 @@ get_type (void)
return t; return t;
} }
k = strlen (token_buffer); name = xstrdup (token_buffer);
name = XCALLOC (char, k + 1);
strcpy (name, token_buffer);
for (;;) for (;;)
{ {

View File

@@ -1,22 +1,22 @@
/* Symbol table manager for Bison, /* Symbol table manager for Bison,
Copyright (C) 1984, 1989 Free Software Foundation, Inc. Copyright (C) 1984, 1989, 2000 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
Bison is free software; you can redistribute it and/or modify Bison is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option) the Free Software Foundation; either version 2, or (at your option)
any later version. any later version.
Bison is distributed in the hope that it will be useful, Bison is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to along with Bison; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include "system.h" #include "system.h"
@@ -32,8 +32,8 @@ static bucket **symtab;
static int static int
hash (const char *key) hash (const char *key)
{ {
register const char *cp; const char *cp;
register int k; int k;
cp = key; cp = key;
k = 0; k = 0;
@@ -44,29 +44,9 @@ hash (const char *key)
} }
static char *
copys (const char *s)
{
register int i;
register const char *cp;
register char *result;
i = 1;
for (cp = s; *cp; cp++)
i++;
result = XMALLOC(char, i);
strcpy(result, s);
return result;
}
void void
tabinit (void) tabinit (void)
{ {
/* register int i; JF unused */
symtab = XCALLOC (bucket *, TABSIZE); symtab = XCALLOC (bucket *, TABSIZE);
firstsymbol = NULL; firstsymbol = NULL;
@@ -77,17 +57,17 @@ tabinit (void)
bucket * bucket *
getsym (const char *key) getsym (const char *key)
{ {
register int hashval; int hashval;
register bucket *bp; bucket *bp;
register int found; int found;
hashval = hash(key); hashval = hash (key);
bp = symtab[hashval]; bp = symtab[hashval];
found = 0; found = 0;
while (bp != NULL && found == 0) while (bp != NULL && found == 0)
{ {
if (strcmp(key, bp->tag) == 0) if (strcmp (key, bp->tag) == 0)
found = 1; found = 1;
else else
bp = bp->link; bp = bp->link;
@@ -100,7 +80,7 @@ getsym (const char *key)
bp = XCALLOC (bucket, 1); bp = XCALLOC (bucket, 1);
bp->link = symtab[hashval]; bp->link = symtab[hashval];
bp->next = NULL; bp->next = NULL;
bp->tag = copys(key); bp->tag = xstrdup (key);
bp->class = unknown_sym; bp->class = unknown_sym;
if (firstsymbol == NULL) if (firstsymbol == NULL)
@@ -124,8 +104,8 @@ getsym (const char *key)
void void
free_symtab (void) free_symtab (void)
{ {
register int i; int i;
register bucket *bp,*bptmp;/* JF don't use ptr after free */ bucket *bp, *bptmp; /* JF don't use ptr after free */
for (i = 0; i < TABSIZE; i++) for (i = 0; i < TABSIZE; i++)
{ {
@@ -133,13 +113,15 @@ free_symtab (void)
while (bp) while (bp)
{ {
bptmp = bp->link; bptmp = bp->link;
#if 0 /* This causes crashes because one string can appear more than once. */ #if 0
/* This causes crashes because one string can appear more
than once. */
if (bp->type_name) if (bp->type_name)
XFREE(bp->type_name); XFREE (bp->type_name);
#endif #endif
XFREE(bp); XFREE (bp);
bp = bptmp; bp = bptmp;
} }
} }
XFREE(symtab); XFREE (symtab);
} }