#include #include #include #include #include #include "symbol-table.h" #define TABLE_SIZE 256 symtab *hash_table[TABLE_SIZE]; extern int linenumber; int HASH(char *str) { int idx = 0; while (*str) { idx = idx << 1; idx += *str; str++; } return (idx & (TABLE_SIZE-1)); } /* returns the symbol table entry if found else NULL */ symtab *lookup(char *name) { int hash_key; symtab *symptr; if (!name) return NULL; hash_key = HASH(name); symptr = hash_table[hash_key]; while (symptr) { if (!(strcmp(name, symptr->lexeme))) return symptr; symptr = symptr->front; } return NULL; } void insertID(char *name) { int hash_key; symtab *ptr; symtab *symptr = malloc(sizeof(symtab)); hash_key = HASH(name); ptr = hash_table[hash_key]; if (ptr == NULL) { /* first entry for this hash_key */ hash_table[hash_key] = symptr; symptr->front = NULL; symptr->back = symptr; } else { symptr->front = ptr; ptr->back = symptr; symptr->back = symptr; hash_table[hash_key] = symptr; } strcpy(symptr->lexeme, name); symptr->line = linenumber; symptr->counter = 1; } void printSym(symtab *ptr) { printf(" Name = %s \n", ptr->lexeme); printf(" References = %d \n", ptr->counter); } void printSymTab(void) { puts("----- Symbol Table ---------"); for (int i = 0; i < TABLE_SIZE; i++) { symtab *symptr; symptr = hash_table[i]; while (symptr != NULL) { printf("====> index = %d\n", i); printSym(symptr); symptr = symptr->front; } } } symtab **fillTab(int *len) { int cnt = 0; for (int i = 0; i < TABLE_SIZE; i++) { symtab *symptr = hash_table[i]; while (symptr != NULL) { cnt++; symptr = symptr->front; } } symtab **tp = malloc(sizeof(symtab*)*cnt); cnt = 0; for (int i = 0; i < TABLE_SIZE; i++) { symtab *symptr = hash_table[i]; while (symptr != NULL) { tp[cnt++] = symptr; symptr = symptr->front; } } *len = cnt; return tp; } // vim: set sw=4 ts=4 sts=4 et: