Blob


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