1426d2b71SDavid du Colombier #include "a.h"
2426d2b71SDavid du Colombier
3426d2b71SDavid du Colombier void*
emalloc(uint n)4426d2b71SDavid du Colombier emalloc(uint n)
5426d2b71SDavid du Colombier {
6426d2b71SDavid du Colombier void *v;
7426d2b71SDavid du Colombier
8426d2b71SDavid du Colombier v = mallocz(n, 1);
9426d2b71SDavid du Colombier if(v == nil)
10426d2b71SDavid du Colombier sysfatal("out of memory");
11426d2b71SDavid du Colombier return v;
12426d2b71SDavid du Colombier }
13426d2b71SDavid du Colombier
14426d2b71SDavid du Colombier char*
estrdup(char * s)15426d2b71SDavid du Colombier estrdup(char *s)
16426d2b71SDavid du Colombier {
17426d2b71SDavid du Colombier char *t;
18426d2b71SDavid du Colombier
19426d2b71SDavid du Colombier t = strdup(s);
20426d2b71SDavid du Colombier if(t == nil)
21426d2b71SDavid du Colombier sysfatal("out of memory");
22426d2b71SDavid du Colombier return t;
23426d2b71SDavid du Colombier }
24426d2b71SDavid du Colombier
25426d2b71SDavid du Colombier Rune*
erunestrdup(Rune * s)26426d2b71SDavid du Colombier erunestrdup(Rune *s)
27426d2b71SDavid du Colombier {
28426d2b71SDavid du Colombier Rune *t;
29426d2b71SDavid du Colombier
30426d2b71SDavid du Colombier t = emalloc(sizeof(Rune)*(runestrlen(s)+1));
31426d2b71SDavid du Colombier if(t == nil)
32426d2b71SDavid du Colombier sysfatal("out of memory");
33426d2b71SDavid du Colombier runestrcpy(t, s);
34426d2b71SDavid du Colombier return t;
35426d2b71SDavid du Colombier }
36426d2b71SDavid du Colombier
37426d2b71SDavid du Colombier void*
erealloc(void * ov,uint n)38426d2b71SDavid du Colombier erealloc(void *ov, uint n)
39426d2b71SDavid du Colombier {
40426d2b71SDavid du Colombier void *v;
41426d2b71SDavid du Colombier
42426d2b71SDavid du Colombier v = realloc(ov, n);
43426d2b71SDavid du Colombier if(v == nil)
44426d2b71SDavid du Colombier sysfatal("out of memory");
45426d2b71SDavid du Colombier return v;
46426d2b71SDavid du Colombier }
47426d2b71SDavid du Colombier
48426d2b71SDavid du Colombier Rune*
erunesmprint(char * fmt,...)49426d2b71SDavid du Colombier erunesmprint(char *fmt, ...)
50426d2b71SDavid du Colombier {
51426d2b71SDavid du Colombier Rune *s;
52426d2b71SDavid du Colombier va_list arg;
53426d2b71SDavid du Colombier
54426d2b71SDavid du Colombier va_start(arg, fmt);
55426d2b71SDavid du Colombier s = runevsmprint(fmt, arg);
56426d2b71SDavid du Colombier va_end(arg);
57426d2b71SDavid du Colombier if(s == nil)
58426d2b71SDavid du Colombier sysfatal("out of memory");
59426d2b71SDavid du Colombier return s;
60426d2b71SDavid du Colombier }
61426d2b71SDavid du Colombier
62426d2b71SDavid du Colombier char*
esmprint(char * fmt,...)63426d2b71SDavid du Colombier esmprint(char *fmt, ...)
64426d2b71SDavid du Colombier {
65426d2b71SDavid du Colombier char *s;
66426d2b71SDavid du Colombier va_list arg;
67426d2b71SDavid du Colombier
68426d2b71SDavid du Colombier va_start(arg, fmt);
69426d2b71SDavid du Colombier s = vsmprint(fmt, arg);
70426d2b71SDavid du Colombier va_end(arg);
71426d2b71SDavid du Colombier if(s == nil)
72426d2b71SDavid du Colombier sysfatal("out of memory");
73426d2b71SDavid du Colombier return s;
74426d2b71SDavid du Colombier }
75426d2b71SDavid du Colombier
76426d2b71SDavid du Colombier void
warn(char * fmt,...)77426d2b71SDavid du Colombier warn(char *fmt, ...)
78426d2b71SDavid du Colombier {
79426d2b71SDavid du Colombier va_list arg;
80426d2b71SDavid du Colombier
81*2cca75a1SDavid du Colombier fprint(2, "htmlroff: %L: ");
82426d2b71SDavid du Colombier va_start(arg, fmt);
83426d2b71SDavid du Colombier vfprint(2, fmt, arg);
84426d2b71SDavid du Colombier va_end(arg);
85426d2b71SDavid du Colombier fprint(2, "\n");
86426d2b71SDavid du Colombier }
87426d2b71SDavid du Colombier
88426d2b71SDavid du Colombier /*
89426d2b71SDavid du Colombier * For non-Unicode compilers, so we can say
90426d2b71SDavid du Colombier * L("asdf") and get a Rune string. Assumes strings
91426d2b71SDavid du Colombier * are identified by their pointers, so no mutable strings!
92426d2b71SDavid du Colombier */
93426d2b71SDavid du Colombier typedef struct Lhash Lhash;
94426d2b71SDavid du Colombier struct Lhash
95426d2b71SDavid du Colombier {
96426d2b71SDavid du Colombier char *s;
97426d2b71SDavid du Colombier Lhash *next;
98426d2b71SDavid du Colombier Rune r[1];
99426d2b71SDavid du Colombier };
100426d2b71SDavid du Colombier static Lhash *hash[1127];
101426d2b71SDavid du Colombier
102426d2b71SDavid du Colombier Rune*
L(char * s)103426d2b71SDavid du Colombier L(char *s)
104426d2b71SDavid du Colombier {
105426d2b71SDavid du Colombier Rune *p;
106426d2b71SDavid du Colombier Lhash *l;
107426d2b71SDavid du Colombier uint h;
108426d2b71SDavid du Colombier
109426d2b71SDavid du Colombier h = (uintptr)s%nelem(hash);
110426d2b71SDavid du Colombier for(l=hash[h]; l; l=l->next)
111426d2b71SDavid du Colombier if(l->s == s)
112426d2b71SDavid du Colombier return l->r;
113426d2b71SDavid du Colombier l = emalloc(sizeof *l+(utflen(s)+1)*sizeof(Rune));
114426d2b71SDavid du Colombier p = l->r;
115426d2b71SDavid du Colombier l->s = s;
116426d2b71SDavid du Colombier while(*s)
117426d2b71SDavid du Colombier s += chartorune(p++, s);
118426d2b71SDavid du Colombier *p = 0;
119426d2b71SDavid du Colombier l->next = hash[h];
120426d2b71SDavid du Colombier hash[h] = l;
121426d2b71SDavid du Colombier return l->r;
122426d2b71SDavid du Colombier }
123426d2b71SDavid du Colombier
124