124 lines
1.6 KiB
C
124 lines
1.6 KiB
C
#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;
|
|
}
|
|
|