aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/9660/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/9660/util.c')
-rw-r--r--src/cmd/9660/util.c98
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;
+}