xref: /plan9/sys/src/cmd/disk/9660/util.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
180ee5cbfSDavid du Colombier #include <u.h>
280ee5cbfSDavid du Colombier #include <libc.h>
380ee5cbfSDavid du Colombier #include <bio.h>
480ee5cbfSDavid du Colombier #include <libsec.h>
580ee5cbfSDavid du Colombier #include <ctype.h>
680ee5cbfSDavid du Colombier 
780ee5cbfSDavid du Colombier #include "iso9660.h"
880ee5cbfSDavid du Colombier 
980ee5cbfSDavid du Colombier typedef struct Stringtab	Stringtab;
1080ee5cbfSDavid du Colombier struct Stringtab {
1180ee5cbfSDavid du Colombier 	Stringtab *link;
1280ee5cbfSDavid du Colombier 	char *str;
1380ee5cbfSDavid du Colombier };
1480ee5cbfSDavid du Colombier 
1580ee5cbfSDavid du Colombier static Stringtab *stab[1024];
1680ee5cbfSDavid du Colombier 
1780ee5cbfSDavid du Colombier static uint
hash(char * s)1880ee5cbfSDavid du Colombier hash(char *s)
1980ee5cbfSDavid du Colombier {
2080ee5cbfSDavid du Colombier 	uint h;
2180ee5cbfSDavid du Colombier 	uchar *p;
2280ee5cbfSDavid du Colombier 
2380ee5cbfSDavid du Colombier 	h = 0;
2480ee5cbfSDavid du Colombier 	for(p=(uchar*)s; *p; p++)
2580ee5cbfSDavid du Colombier 		h = h*37 + *p;
2680ee5cbfSDavid du Colombier 	return h;
2780ee5cbfSDavid du Colombier }
2880ee5cbfSDavid du Colombier 
2980ee5cbfSDavid du Colombier static char*
estrdup(char * s)3080ee5cbfSDavid du Colombier estrdup(char *s)
3180ee5cbfSDavid du Colombier {
3280ee5cbfSDavid du Colombier 	if((s = strdup(s)) == nil)
3380ee5cbfSDavid du Colombier 		sysfatal("strdup(%.10s): out of memory", s);
3480ee5cbfSDavid du Colombier 	return s;
3580ee5cbfSDavid du Colombier }
3680ee5cbfSDavid du Colombier 
3780ee5cbfSDavid du Colombier char*
atom(char * str)3880ee5cbfSDavid du Colombier atom(char *str)
3980ee5cbfSDavid du Colombier {
4080ee5cbfSDavid du Colombier 	uint h;
4180ee5cbfSDavid du Colombier 	Stringtab *tab;
4280ee5cbfSDavid du Colombier 
4380ee5cbfSDavid du Colombier 	h = hash(str) % nelem(stab);
4480ee5cbfSDavid du Colombier 	for(tab=stab[h]; tab; tab=tab->link)
4580ee5cbfSDavid du Colombier 		if(strcmp(str, tab->str) == 0)
4680ee5cbfSDavid du Colombier 			return tab->str;
4780ee5cbfSDavid du Colombier 
4880ee5cbfSDavid du Colombier 	tab = emalloc(sizeof *tab);
4980ee5cbfSDavid du Colombier 	tab->str = estrdup(str);
5080ee5cbfSDavid du Colombier 	tab->link = stab[h];
5180ee5cbfSDavid du Colombier 	stab[h] = tab;
5280ee5cbfSDavid du Colombier 	return tab->str;
5380ee5cbfSDavid du Colombier }
5480ee5cbfSDavid du Colombier 
5580ee5cbfSDavid du Colombier void*
emalloc(ulong n)5680ee5cbfSDavid du Colombier emalloc(ulong n)
5780ee5cbfSDavid du Colombier {
5880ee5cbfSDavid du Colombier 	void *p;
5980ee5cbfSDavid du Colombier 
6080ee5cbfSDavid du Colombier 	if((p = malloc(n)) == nil)
6180ee5cbfSDavid du Colombier 		sysfatal("malloc(%lud): out of memory", n);
6280ee5cbfSDavid du Colombier 	memset(p, 0, n);
6380ee5cbfSDavid du Colombier 	return p;
6480ee5cbfSDavid du Colombier }
6580ee5cbfSDavid du Colombier 
6680ee5cbfSDavid du Colombier void*
erealloc(void * v,ulong n)6780ee5cbfSDavid du Colombier erealloc(void *v, ulong n)
6880ee5cbfSDavid du Colombier {
6980ee5cbfSDavid du Colombier 	if((v = realloc(v, n)) == nil)
7080ee5cbfSDavid du Colombier 		sysfatal("realloc(%p, %lud): out of memory", v, n);
7180ee5cbfSDavid du Colombier 	return v;
7280ee5cbfSDavid du Colombier }
7380ee5cbfSDavid du Colombier 
7480ee5cbfSDavid du Colombier char*
struprcpy(char * p,char * s)7580ee5cbfSDavid du Colombier struprcpy(char *p, char *s)
7680ee5cbfSDavid du Colombier {
7780ee5cbfSDavid du Colombier 	char *op;
7880ee5cbfSDavid du Colombier 
7980ee5cbfSDavid du Colombier 	op = p;
8080ee5cbfSDavid du Colombier 	for(; *s; s++)
8180ee5cbfSDavid du Colombier 		*p++ = toupper(*s);
8280ee5cbfSDavid du Colombier 	*p = '\0';
8380ee5cbfSDavid du Colombier 
8480ee5cbfSDavid du Colombier 	return op;
8580ee5cbfSDavid du Colombier }
8680ee5cbfSDavid du Colombier 
8780ee5cbfSDavid du Colombier int
chat(char * fmt,...)8880ee5cbfSDavid du Colombier chat(char *fmt, ...)
8980ee5cbfSDavid du Colombier {
90*9a747e4fSDavid du Colombier 	va_list arg;
9180ee5cbfSDavid du Colombier 
9280ee5cbfSDavid du Colombier 	if(!chatty)
9380ee5cbfSDavid du Colombier 		return 0;
94*9a747e4fSDavid du Colombier 	va_start(arg, fmt);
95*9a747e4fSDavid du Colombier 	vfprint(2, fmt, arg);
96*9a747e4fSDavid du Colombier 	va_end(arg);
97*9a747e4fSDavid du Colombier 	return 1;
9880ee5cbfSDavid du Colombier }
99