X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d7913476c462b480f11e14b6829942f2691c6c01..dc2825ae898c526ea3619450112b2ea44f437151:/src/symtab.c diff --git a/src/symtab.c b/src/symtab.c index b264f080..84479da2 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 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; @@ -43,30 +43,35 @@ hash (const char *key) return k % TABSIZE; } +/*--------------------------------------------------------------. +| Create a new symbol, named TAG, which hash value is HASHVAL. | +`--------------------------------------------------------------*/ - -static char * -copys (const char *s) +static bucket * +bucket_new (const char *tag, int hashval) { - 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; + bucket *res = XMALLOC (bucket, 1); + + res->link = symtab[hashval]; + res->next = NULL; + res->tag = xstrdup (tag); + res->type_name = NULL; + res->value = 0; + res->prec = 0; + res->assoc = right_assoc; + res->user_token_number = 0; + res->alias = NULL; + res->class = unknown_sym; + + nsyms++; + + return res; } void tabinit (void) { -/* register int i; JF unused */ - symtab = XCALLOC (bucket *, TABSIZE); firstsymbol = NULL; @@ -74,20 +79,25 @@ tabinit (void) } +/*----------------------------------------------------------------. +| Find the symbol named KEY, and return it. If it does not exist | +| yet, create it. | +`----------------------------------------------------------------*/ + 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; @@ -95,13 +105,7 @@ getsym (const char *key) if (found == 0) { - nsyms++; - - bp = XCALLOC (bucket, 1); - bp->link = symtab[hashval]; - bp->next = NULL; - bp->tag = copys(key); - bp->class = SUNKNOWN; + bp = bucket_new (key, hashval); if (firstsymbol == NULL) { @@ -124,8 +128,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 +137,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); }