1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <libsec.h>
5 #include <ctype.h>
6
7 #include "iso9660.h"
8
9 typedef struct Stringtab Stringtab;
10 struct Stringtab {
11 Stringtab *link;
12 char *str;
13 };
14
15 static Stringtab *stab[1024];
16
17 static uint
hash(char * s)18 hash(char *s)
19 {
20 uint h;
21 uchar *p;
22
23 h = 0;
24 for(p=(uchar*)s; *p; p++)
25 h = h*37 + *p;
26 return h;
27 }
28
29 static char*
estrdup(char * s)30 estrdup(char *s)
31 {
32 if((s = strdup(s)) == nil)
33 sysfatal("strdup(%.10s): out of memory", s);
34 return s;
35 }
36
37 char*
atom(char * str)38 atom(char *str)
39 {
40 uint h;
41 Stringtab *tab;
42
43 h = hash(str) % nelem(stab);
44 for(tab=stab[h]; tab; tab=tab->link)
45 if(strcmp(str, tab->str) == 0)
46 return tab->str;
47
48 tab = emalloc(sizeof *tab);
49 tab->str = estrdup(str);
50 tab->link = stab[h];
51 stab[h] = tab;
52 return tab->str;
53 }
54
55 void*
emalloc(ulong n)56 emalloc(ulong n)
57 {
58 void *p;
59
60 if((p = malloc(n)) == nil)
61 sysfatal("malloc(%lud): out of memory", n);
62 memset(p, 0, n);
63 return p;
64 }
65
66 void*
erealloc(void * v,ulong n)67 erealloc(void *v, ulong n)
68 {
69 if((v = realloc(v, n)) == nil)
70 sysfatal("realloc(%p, %lud): out of memory", v, n);
71 return v;
72 }
73
74 char*
struprcpy(char * p,char * s)75 struprcpy(char *p, char *s)
76 {
77 char *op;
78
79 op = p;
80 for(; *s; s++)
81 *p++ = toupper((uchar)*s);
82 *p = '\0';
83
84 return op;
85 }
86
87 int
chat(char * fmt,...)88 chat(char *fmt, ...)
89 {
90 va_list arg;
91
92 if(!chatty)
93 return 0;
94 va_start(arg, fmt);
95 vfprint(2, fmt, arg);
96 va_end(arg);
97 return 1;
98 }
99