xref: /plan9/sys/src/cmd/htmlroff/util.c (revision 2cca75a1b2b8c6083390679d69d5c50cf66d9a01)
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