1 c42a1d3d 2006-02-21 devnull #include "a.h"
4 c42a1d3d 2006-02-21 devnull emalloc(uint n)
8 c42a1d3d 2006-02-21 devnull v = mallocz(n, 1);
9 c42a1d3d 2006-02-21 devnull if(v == nil)
10 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
11 c42a1d3d 2006-02-21 devnull return v;
15 c42a1d3d 2006-02-21 devnull estrdup(char *s)
19 c42a1d3d 2006-02-21 devnull t = strdup(s);
20 c42a1d3d 2006-02-21 devnull if(t == nil)
21 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
22 c42a1d3d 2006-02-21 devnull return t;
26 c42a1d3d 2006-02-21 devnull erunestrdup(Rune *s)
30 c42a1d3d 2006-02-21 devnull t = emalloc(sizeof(Rune)*(runestrlen(s)+1));
31 c42a1d3d 2006-02-21 devnull if(t == nil)
32 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
33 c42a1d3d 2006-02-21 devnull runestrcpy(t, s);
34 c42a1d3d 2006-02-21 devnull return t;
38 c42a1d3d 2006-02-21 devnull erealloc(void *ov, uint n)
42 c42a1d3d 2006-02-21 devnull v = realloc(ov, n);
43 c42a1d3d 2006-02-21 devnull if(v == nil)
44 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
45 c42a1d3d 2006-02-21 devnull return v;
49 c42a1d3d 2006-02-21 devnull erunesmprint(char *fmt, ...)
52 c42a1d3d 2006-02-21 devnull va_list arg;
54 c42a1d3d 2006-02-21 devnull va_start(arg, fmt);
55 c42a1d3d 2006-02-21 devnull s = runevsmprint(fmt, arg);
56 c42a1d3d 2006-02-21 devnull va_end(arg);
57 c42a1d3d 2006-02-21 devnull if(s == nil)
58 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
59 c42a1d3d 2006-02-21 devnull return s;
63 c42a1d3d 2006-02-21 devnull esmprint(char *fmt, ...)
66 c42a1d3d 2006-02-21 devnull va_list arg;
68 c42a1d3d 2006-02-21 devnull va_start(arg, fmt);
69 c42a1d3d 2006-02-21 devnull s = vsmprint(fmt, arg);
70 c42a1d3d 2006-02-21 devnull va_end(arg);
71 c42a1d3d 2006-02-21 devnull if(s == nil)
72 c42a1d3d 2006-02-21 devnull sysfatal("out of memory");
73 c42a1d3d 2006-02-21 devnull return s;
77 c42a1d3d 2006-02-21 devnull warn(char *fmt, ...)
79 c42a1d3d 2006-02-21 devnull va_list arg;
81 c42a1d3d 2006-02-21 devnull fprint(2, "htmlroff: %L: ");
82 c42a1d3d 2006-02-21 devnull va_start(arg, fmt);
83 c42a1d3d 2006-02-21 devnull vfprint(2, fmt, arg);
84 c42a1d3d 2006-02-21 devnull va_end(arg);
85 c42a1d3d 2006-02-21 devnull fprint(2, "\n");
89 c42a1d3d 2006-02-21 devnull * For non-Unicode compilers, so we can say
90 c42a1d3d 2006-02-21 devnull * L("asdf") and get a Rune string. Assumes strings
91 c42a1d3d 2006-02-21 devnull * are identified by their pointers, so no mutable strings!
93 c42a1d3d 2006-02-21 devnull typedef struct Lhash Lhash;
94 c42a1d3d 2006-02-21 devnull struct Lhash
97 c42a1d3d 2006-02-21 devnull Lhash *next;
98 c42a1d3d 2006-02-21 devnull Rune r[1];
100 c42a1d3d 2006-02-21 devnull static Lhash *hash[1127];
103 c42a1d3d 2006-02-21 devnull L(char *s)
105 c42a1d3d 2006-02-21 devnull Rune *p;
106 c42a1d3d 2006-02-21 devnull Lhash *l;
109 c42a1d3d 2006-02-21 devnull h = (uintptr)s%nelem(hash);
110 c42a1d3d 2006-02-21 devnull for(l=hash[h]; l; l=l->next)
111 c42a1d3d 2006-02-21 devnull if(l->s == s)
112 c42a1d3d 2006-02-21 devnull return l->r;
113 c42a1d3d 2006-02-21 devnull l = emalloc(sizeof *l+(utflen(s)+1)*sizeof(Rune));
114 c42a1d3d 2006-02-21 devnull p = l->r;
115 c42a1d3d 2006-02-21 devnull l->s = s;
116 c42a1d3d 2006-02-21 devnull while(*s)
117 c42a1d3d 2006-02-21 devnull s += chartorune(p++, s);
119 c42a1d3d 2006-02-21 devnull l->next = hash[h];
120 c42a1d3d 2006-02-21 devnull hash[h] = l;
121 c42a1d3d 2006-02-21 devnull return l->r;