diff options
Diffstat (limited to 'src/cmd/9660/util.c')
-rw-r--r-- | src/cmd/9660/util.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/cmd/9660/util.c b/src/cmd/9660/util.c new file mode 100644 index 00000000..16fb21f3 --- /dev/null +++ b/src/cmd/9660/util.c @@ -0,0 +1,98 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include <libsec.h> +#include <ctype.h> + +#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; +} |