2004-06-17 01:47:21 +00:00
|
|
|
#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++)
|
2005-09-09 23:16:15 +00:00
|
|
|
*p++ = toupper((uchar)*s);
|
2004-06-17 01:47:21 +00:00
|
|
|
*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;
|
|
|
|
|
}
|