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