#include "a.h" | |
void* | |
emalloc(uint n) | |
{ | |
void *v; | |
v = mallocz(n, 1); | |
if(v == nil) | |
sysfatal("out of memory"); | |
return v; | |
} | |
char* | |
estrdup(char *s) | |
{ | |
char *t; | |
t = strdup(s); | |
if(t == nil) | |
sysfatal("out of memory"); | |
return t; | |
} | |
Rune* | |
erunestrdup(Rune *s) | |
{ | |
Rune *t; | |
t = emalloc(sizeof(Rune)*(runestrlen(s)+1)); | |
if(t == nil) | |
sysfatal("out of memory"); | |
runestrcpy(t, s); | |
return t; | |
} | |
void* | |
erealloc(void *ov, uint n) | |
{ | |
void *v; | |
v = realloc(ov, n); | |
if(v == nil) | |
sysfatal("out of memory"); | |
return v; | |
} | |
Rune* | |
erunesmprint(char *fmt, ...) | |
{ | |
Rune *s; | |
va_list arg; | |
va_start(arg, fmt); | |
s = runevsmprint(fmt, arg); | |
va_end(arg); | |
if(s == nil) | |
sysfatal("out of memory"); | |
return s; | |
} | |
char* | |
esmprint(char *fmt, ...) | |
{ | |
char *s; | |
va_list arg; | |
va_start(arg, fmt); | |
s = vsmprint(fmt, arg); | |
va_end(arg); | |
if(s == nil) | |
sysfatal("out of memory"); | |
return s; | |
} | |
void | |
warn(char *fmt, ...) | |
{ | |
va_list arg; | |
fprint(2, "htmlroff: %L: "); | |
va_start(arg, fmt); | |
vfprint(2, fmt, arg); | |
va_end(arg); | |
fprint(2, "\n"); | |
} | |
/* | |
* For non-Unicode compilers, so we can say | |
* L("asdf") and get a Rune string. Assumes strings | |
* are identified by their pointers, so no mutable strings! | |
*/ | |
typedef struct Lhash Lhash; | |
struct Lhash | |
{ | |
char *s; | |
Lhash *next; | |
Rune r[1]; | |
}; | |
static Lhash *hash[1127]; | |
Rune* | |
L(char *s) | |
{ | |
Rune *p; | |
Lhash *l; | |
uint h; | |
h = (uintptr)s%nelem(hash); | |
for(l=hash[h]; l; l=l->next) | |
if(l->s == s) | |
return l->r; | |
l = emalloc(sizeof *l+(utflen(s)+1)*sizeof(Rune)); | |
p = l->r; | |
l->s = s; | |
while(*s) | |
s += chartorune(p++, s); | |
*p = 0; | |
l->next = hash[h]; | |
hash[h] = l; | |
return l->r; | |
} | |