📄 symtab.c
字号:
/* 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 modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with Bison; see the file COPYING. If not, write tothe 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;inthash(key)char *key;{ register char *cp; register int k; cp = key; k = 0; while (*cp) k = ((k << 1) ^ (*cp++)) & 0x3fff; return (k % TABSIZE);}char *copys(s)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);}voidtabinit(){/* register int i; JF unused */ symtab = NEW2(TABSIZE, bucket *); firstsymbol = NULL; lastsymbol = NULL;}bucket *getsym(key)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->class = SUNKNOWN; if (firstsymbol == NULL) { firstsymbol = bp; lastsymbol = bp; } else { lastsymbol->next = bp; lastsymbol = bp; } symtab[hashval] = bp; } return (bp);}voidfree_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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -