diff options
Diffstat (limited to 'tools/bison++/symtab.cc')
-rw-r--r-- | tools/bison++/symtab.cc | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/tools/bison++/symtab.cc b/tools/bison++/symtab.cc new file mode 100644 index 000000000..33d3f8b5a --- /dev/null +++ b/tools/bison++/symtab.cc @@ -0,0 +1,147 @@ +/* Symbol table manager for Bison, + Copyright (C) 1984, 1989 Free Software Foundation, Inc. + +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 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +#include <stdio.h> +#include "system.h" +#include "new.h" +#include "symtab.h" +#include "gram.h" + + +bucket **symtab; +bucket *firstsymbol; +bucket *lastsymbol; + + + +int +hash(char* key) +{ + register char *cp; + register int k; + + cp = key; + k = 0; + while (*cp) + k = ((k << 1) ^ (*cp++)) & 0x3fff; + + return (k % TABSIZE); +} + + + +char * +copys(char* s) +{ + register int i; + register char *cp; + register char *result; + + i = 1; + for (cp = s; *cp; cp++) + i++; + + result = xmalloc((unsigned int)i); + strcpy(result, s); + return (result); +} + + +void +tabinit() +{ +/* register int i; JF unused */ + + symtab = NEW2(TABSIZE, bucket *); + + firstsymbol = NULL; + lastsymbol = NULL; +} + + +bucket * +getsym(char* key) +{ + register int hashval; + register bucket *bp; + register int found; + + hashval = hash(key); + bp = symtab[hashval]; + + found = 0; + while (bp != NULL && found == 0) + { + if (strcmp(key, bp->tag) == 0) + found = 1; + else + bp = bp->link; + } + + if (found == 0) + { + nsyms++; + + bp = NEW(bucket); + bp->link = symtab[hashval]; + bp->next = NULL; + bp->tag = copys(key); + bp->internalClass = SUNKNOWN; + + if (firstsymbol == NULL) + { + firstsymbol = bp; + lastsymbol = bp; + } + else + { + lastsymbol->next = bp; + lastsymbol = bp; + } + + symtab[hashval] = bp; + } + + return (bp); +} + + +void +free_symtab() +{ + register int i; + register bucket *bp,*bptmp;/* JF don't use ptr after free */ + + for (i = 0; i < TABSIZE; i++) + { + bp = symtab[i]; + while (bp) + { + bptmp = bp->link; +#if 0 /* This causes crashes because one string can appear more than once. */ + if (bp->type_name) + FREE(bp->type_name); +#endif + FREE(bp); + bp = bptmp; + } + } + FREE(symtab); +} |