#include #include #include #include #include "mkmk.h" /* * ANSI requires at least 4095 simultanious macro definitions. */ #define Nhash 101 static Symb *Symtab[Nhash]; void setsym(char *name, char *val) { int h; Symb *s; h = hash(name, Nhash); for(s = Symtab[h]; s; s = s->next) if(strcmp(s->name, name) == 0) break; if(s){ free(s->val); s->val = estrdup(val); return; } s = emallocz(sizeof(Symb) +strlen(name) +1, 0); s->name = (char *)&s[1]; strcpy(s->name, name); s->val = estrdup(val); s->next = Symtab[h]; Symtab[h] = s; } char * looksym(char *name, List *incdirs) { int h; Symb *s; char *val; h = hash(name, Nhash); for(s = Symtab[h]; s; s = s->next) if(strcmp(s->name, name) == 0) return s->val; if(incdirs == nil) return nil; return macrohint(name, incdirs); } int rmsym(char *name) { int h; Symb *s, **p; h = hash(name, Nhash); for(p = &Symtab[h], s = Symtab[h]; s; p = &s->next, s = s->next) if(strcmp(s->name, name) == 0) break; if(! s) return -1; *p = s->next; free(s->val); free(s); return 0; } void dumpvars(void) { int h; Symb *s; for(h = 0; h < Nhash; h++) for(s = Symtab[h]; s; s = s->next) fprint(2, "%-20s %s\n", s->name, s->val); }