#include #include #include #include #include #include "iso9660.h" typedef struct Stringtab Stringtab; struct Stringtab { Stringtab *link; char *str; }; static Stringtab *stab[1024]; static uint hash(char *s) { uint h; uchar *p; h = 0; for(p=(uchar*)s; *p; p++) h = h*37 + *p; return h; } static char* estrdup(char *s) { if((s = strdup(s)) == nil) sysfatal("strdup(%.10s): out of memory", s); return s; } char* atom(char *str) { uint h; Stringtab *tab; h = hash(str) % nelem(stab); for(tab=stab[h]; tab; tab=tab->link) if(strcmp(str, tab->str) == 0) return tab->str; tab = emalloc(sizeof *tab); tab->str = estrdup(str); tab->link = stab[h]; stab[h] = tab; return tab->str; } void* emalloc(ulong n) { void *p; if((p = malloc(n)) == nil) sysfatal("malloc(%lud): out of memory", n); memset(p, 0, n); return p; } void* erealloc(void *v, ulong n) { if((v = realloc(v, n)) == nil) sysfatal("realloc(%p, %lud): out of memory", v, n); return v; } char* struprcpy(char *p, char *s) { char *op; op = p; for(; *s; s++) *p++ = toupper(*s); *p = '\0'; return op; } int chat(char *fmt, ...) { va_list arg; if(!chatty) return 0; va_start(arg, fmt); vfprint(2, fmt, arg); va_end(arg); return 1; }