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

View File

@@ -1,22 +1,22 @@
/* 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
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.
Bison 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.
Bison 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.
Bison 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 Bison; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "system.h"
@@ -32,8 +32,8 @@ static bucket **symtab;
static int
hash (const char *key)
{
register const char *cp;
register int k;
const char *cp;
int k;
cp = key;
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
tabinit (void)
{
/* register int i; JF unused */
symtab = XCALLOC (bucket *, TABSIZE);
firstsymbol = NULL;
@@ -77,17 +57,17 @@ tabinit (void)
bucket *
getsym (const char *key)
{
register int hashval;
register bucket *bp;
register int found;
int hashval;
bucket *bp;
int found;
hashval = hash(key);
hashval = hash (key);
bp = symtab[hashval];
found = 0;
while (bp != NULL && found == 0)
{
if (strcmp(key, bp->tag) == 0)
if (strcmp (key, bp->tag) == 0)
found = 1;
else
bp = bp->link;
@@ -100,7 +80,7 @@ getsym (const char *key)
bp = XCALLOC (bucket, 1);
bp->link = symtab[hashval];
bp->next = NULL;
bp->tag = copys(key);
bp->tag = xstrdup (key);
bp->class = unknown_sym;
if (firstsymbol == NULL)
@@ -124,8 +104,8 @@ getsym (const char *key)
void
free_symtab (void)
{
register int i;
register bucket *bp,*bptmp;/* JF don't use ptr after free */
int i;
bucket *bp, *bptmp; /* JF don't use ptr after free */
for (i = 0; i < TABSIZE; i++)
{
@@ -133,13 +113,15 @@ free_symtab (void)
while (bp)
{
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)
XFREE(bp->type_name);
XFREE (bp->type_name);
#endif
XFREE(bp);
XFREE (bp);
bp = bptmp;
}
}
XFREE(symtab);
XFREE (symtab);
}