From 95e36146a5be4c921c14f82ab80e3612866c4518 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 2 Oct 2000 09:01:19 +0000 Subject: [PATCH] * 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. --- ChangeLog | 9 ++++++ lib/Makefile.am | 2 +- lib/xstrdup.c | 46 +++++++++++++++++++++++++++++ src/reader.c | 26 ++++------------- src/symtab.c | 78 +++++++++++++++++++------------------------------ 5 files changed, 92 insertions(+), 69 deletions(-) create mode 100644 lib/xstrdup.c diff --git a/ChangeLog b/ChangeLog index 3c019536..63736de1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2000-10-02 Akim Demaille + + * 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 * src/gram.h (associativity): New enum type which replaces the diff --git a/lib/Makefile.am b/lib/Makefile.am index b5317f22..03df9e52 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -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@ diff --git a/lib/xstrdup.c b/lib/xstrdup.c new file mode 100644 index 00000000..38674cab --- /dev/null +++ b/lib/xstrdup.c @@ -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 +#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 +#else +# include +#endif + +#include + +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); +} diff --git a/src/reader.c b/src/reader.c index bd13e044..b22f42d1 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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 (;;) { diff --git a/src/symtab.c b/src/symtab.c index 1bc2c377..08361539 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -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); } -- 2.47.2