symbol.c (763B)
1 #include "symbol.h" 2 #include <stdbool.h> 3 #include <assert.h> 4 #include <string.h> 5 6 static char **db = NULL; 7 static size_t cap = 0; 8 static size_t len = 0; 9 static bool initialized = false; 10 11 void 12 initialize(void) 13 { 14 cap = 1; 15 db = malloc(cap * sizeof(char*)); 16 initialized = true; 17 } 18 19 symbol 20 append(char *name) 21 { 22 assert(initialized); 23 if (len == cap) 24 db = realloc(db, (cap *= 2)*sizeof(char*)); 25 assert(db); 26 db[len] = malloc(sizeof(char)*strlen(name)); 27 assert(db[len]); 28 strcpy(db[len], name); 29 return len++; 30 } 31 32 symbol 33 intern(char *name) 34 { 35 if (!initialized) initialize(); 36 for (size_t i = 0; i < len; i++) 37 if (strcmp(name, db[i]) == 0) 38 return i; 39 return append(name); 40 } 41 42 char* 43 repr(symbol s) 44 { 45 if (!initialized) initialize(); 46 return db[s]; 47 }