132 lines · 2.0 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #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;} voidwarn(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;}