/** * Look up for a symbol name, otherwise insert it */ symbol * lookup(char * symbolName) { //printf("SymbolName before: %s\n", symbolName); // % here means AVOID BUFFER OVERFLOW!!! symbol * sym = &(symbolTable[symbolHash(symbolName) % MAX_HASH]); //printf("SymbolName after: %s\n", sym->name); // Counter to track how many looked symbols //int scount = MAX_HASH; //while(--scount >= 0) //{ // Check if already exists if(sym->name && !strcmp(sym->name, symbolName)) return sym; // Ops, no name means empty set //if(!sym->name) //{ sym->name = strdup(symbolName); sym->value = 0; sym->function = NULL; sym->symbols = NULL; return sym; //} // Let's try next hash table entry //if(++sym >= (symbolTable + MAX_HASH)) // sym = symbolTable; // OK, this line is useless!!! //} //yyerror("Symbol Table overflow! Watch out! \n"); //abort(); }
struct Symbol *lookUp( char *sym ){ struct Symbol *sp = &symTable[ symbolHash(sym) % NHASH ]; int scount = NHASH; while( --scount >= 0 ){ if( sp->name && !strcmp( sp->name, sym )){ return sp; } if( !sp->name){ sp->name = strdup(sym); sp->value = 0; sp->func = NULL; sp->syms = NULL; return sp; } if( ++sp >= symTable + NHASH) sp = symTable; } yyerror("symbol table overflow\n"); abort(); }