Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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