#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; }