plan9port

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

util.c (1618B)


      1 #include "a.h"
      2 
      3 void*
      4 emalloc(uint n)
      5 {
      6 	void *v;
      7 
      8 	v = mallocz(n, 1);
      9 	if(v == nil)
     10 		sysfatal("out of memory");
     11 	return v;
     12 }
     13 
     14 char*
     15 estrdup(char *s)
     16 {
     17 	char *t;
     18 
     19 	t = strdup(s);
     20 	if(t == nil)
     21 		sysfatal("out of memory");
     22 	return t;
     23 }
     24 
     25 Rune*
     26 erunestrdup(Rune *s)
     27 {
     28 	Rune *t;
     29 
     30 	t = emalloc(sizeof(Rune)*(runestrlen(s)+1));
     31 	if(t == nil)
     32 		sysfatal("out of memory");
     33 	runestrcpy(t, s);
     34 	return t;
     35 }
     36 
     37 void*
     38 erealloc(void *ov, uint n)
     39 {
     40 	void *v;
     41 
     42 	v = realloc(ov, n);
     43 	if(v == nil)
     44 		sysfatal("out of memory");
     45 	return v;
     46 }
     47 
     48 Rune*
     49 erunesmprint(char *fmt, ...)
     50 {
     51 	Rune *s;
     52 	va_list arg;
     53 
     54 	va_start(arg, fmt);
     55 	s = runevsmprint(fmt, arg);
     56 	va_end(arg);
     57 	if(s == nil)
     58 		sysfatal("out of memory");
     59 	return s;
     60 }
     61 
     62 char*
     63 esmprint(char *fmt, ...)
     64 {
     65 	char *s;
     66 	va_list arg;
     67 
     68 	va_start(arg, fmt);
     69 	s = vsmprint(fmt, arg);
     70 	va_end(arg);
     71 	if(s == nil)
     72 		sysfatal("out of memory");
     73 	return s;
     74 }
     75 
     76 void
     77 warn(char *fmt, ...)
     78 {
     79 	va_list arg;
     80 
     81 	fprint(2, "htmlroff: %L: ");
     82 	va_start(arg, fmt);
     83 	vfprint(2, fmt, arg);
     84 	va_end(arg);
     85 	fprint(2, "\n");
     86 }
     87 
     88 /*
     89  * For non-Unicode compilers, so we can say
     90  * L("asdf") and get a Rune string.  Assumes strings
     91  * are identified by their pointers, so no mutable strings!
     92  */
     93 typedef struct Lhash Lhash;
     94 struct Lhash
     95 {
     96 	char *s;
     97 	Lhash *next;
     98 	Rune r[1];
     99 };
    100 static Lhash *hash[1127];
    101 
    102 Rune*
    103 L(char *s)
    104 {
    105 	Rune *p;
    106 	Lhash *l;
    107 	uint h;
    108 
    109 	h = (uintptr)s%nelem(hash);
    110 	for(l=hash[h]; l; l=l->next)
    111 		if(l->s == s)
    112 			return l->r;
    113 	l = emalloc(sizeof *l+(utflen(s)+1)*sizeof(Rune));
    114 	p = l->r;
    115 	l->s = s;
    116 	while(*s)
    117 		s += chartorune(p++, s);
    118 	*p = 0;
    119 	l->next = hash[h];
    120 	hash[h] = l;
    121 	return l->r;
    122 }