/* * Symbol table functions */ #include #include #include #include "glob.h" typedef struct TH { int numsym; int numbyt; int maxbyt; char *data; } TH; #define CHUNK 2000 static TH table; static numSkolem = 0; #define kfree(x) ((x!=NULL) ? (free(x), x=NULL) : x) int NewSymTable() { table.numsym = 0; table.numbyt = 0; table.maxbyt = CHUNK; table.data = malloc(CHUNK); if (table.data == NULL) return 1; return 0; } int EmptySymTable() { kfree(table.data); table.numsym = 0; table.numbyt = 0; /* don't use the first byte in the table */ table.maxbyt = CHUNK; table.data = malloc(CHUNK); if (table.data == NULL) return 1; return 0; } int AddSymbol(char *s) { int i,k; char *d; k = FindSymbol(s); if (k) return k; i = strlen(s); while (table.numbyt+i+1 > table.maxbyt) { d = realloc(table.data,table.maxbyt + CHUNK); if (d == NULL) return 0; /* error occurred */ table.maxbyt += CHUNK; table.data = d; } k = table.numbyt + 1; table.data[k-1] = 0; strcpy(table.data+k,s); table.numbyt += i+1; table.numsym++; return k; } int FindSymbol(char *s) { int k,j,i = 1; char *d; k = table.numbyt; d = table.data; while (i= table.numbyt) return table.data; return table.data+key; } int DeleteSymbol(int key) { table.data[key] = 0; /* storage is not reclaimed */ table.numsym--; return 0; } int NumSymbols() { return table.numsym; } int NumBytes() { return table.numbyt; } int NewSkolem() { return ++numSkolem; } int DumpTable(FILE *f) { int i,k; char *d; k = table.numbyt; d = table.data; if (f==NULL) printf("Table NumSym %d, NumByt %d, MaxByt %d\n", table.numsym,k,table.maxbyt); else fprintf(f,"Table NumSym %d, NumByt %d, MaxByt %d\n", table.numsym,k,table.maxbyt); for (i=1; i