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