plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

util.c (1300B)


      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
     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*
     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*
     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*
     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*
     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*
     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
     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 }