Charles Forsythcommon ld functions5f4810412 years agoHistory
264 lines · 3.3 KB · C
RawDownload
#include	"l.h" static	usize	nhunk;static	usize	tothunk;static	char*	hunk; voiddiag(char *fmt, ...){	char buf[STRINGSZ], *tn;	va_list arg; 	tn = "??none??";	if(curtext != P && curtext->from.sym != S)		tn = curtext->from.sym->name;	va_start(arg, fmt);	vseprint(buf, buf+sizeof(buf), fmt, arg);	va_end(arg);	print("%s: %s\n", tn, buf); 	nerrors++;	if(nerrors > 10) {		print("too many errors\n");		errorexit();	}} voiderrorexit(void){ 	if(nerrors) {		if(cout >= 0)			remove(outfile);		exits("error");	}	exits(0);} voidprasm(Prog *p){	print("%P\n", p);} intSconv(Fmt *fp){	int i, c;	char str[STRINGSZ], *p, *a; 	a = va_arg(fp->args, char*);	p = str;	for(i=0; i<sizeof(long); i++) {		c = a[i] & 0xff;		if(c >= 'a' && c <= 'z' ||		   c >= 'A' && c <= 'Z' ||		   c >= '0' && c <= '9' ||		   c == ' ' || c == '%') {			*p++ = c;			continue;		}		*p++ = '\\';		switch(c) {		case 0:			*p++ = 'z';			continue;		case '\\':		case '"':			*p++ = c;			continue;		case '\n':			*p++ = 'n';			continue;		case '\t':			*p++ = 't';			continue;		}		*p++ = (c>>6) + '0';		*p++ = ((c>>3) & 7) + '0';		*p++ = (c & 7) + '0';	}	*p = 0;	return fmtstrcpy(fp, str);} voidnopstat(char *f, Count *c){	if(c->outof)	Bprint(&bso, "%s delay %ld/%ld (%.2f)\n", f,		c->outof - c->count, c->outof,		(double)(c->outof - c->count)/c->outof);} voidxdefine(char *p, int t, vlong v){	Sym *s; 	s = lookup(p, 0);	if(s->type == 0 || s->type == SXREF) {		s->type = t;		s->value = v;	}} voidundef(void){	int i;	Sym *s; 	for(i=0; i<NHASH; i++)	for(s = hash[i]; s != S; s = s->link)		if(s->type == SXREF)			diag("%s: not defined", s->name);} vlongatolwhex(char *s){	vlong n;	int f; 	n = 0;	f = 0;	while(*s == ' ' || *s == '\t')		s++;	if(*s == '-' || *s == '+') {		if(*s++ == '-')			f = 1;		while(*s == ' ' || *s == '\t')			s++;	}	if(s[0]=='0' && s[1]){		if(s[1]=='x' || s[1]=='X'){			s += 2;			for(;;){				if(*s >= '0' && *s <= '9')					n = n*16 + *s++ - '0';				else if(*s >= 'a' && *s <= 'f')					n = n*16 + *s++ - 'a' + 10;				else if(*s >= 'A' && *s <= 'F')					n = n*16 + *s++ - 'A' + 10;				else					break;			}		} else			while(*s >= '0' && *s <= '7')				n = n*8 + *s++ - '0';	} else		while(*s >= '0' && *s <= '9')			n = n*10 + *s++ - '0';	if(f)		n = -n;	return n;} vlongrnd(vlong v, long r){	long c; 	if(r <= 0)		return v;	v += r - 1;	c = v % r;	if(c < 0)		c += r;	v -= c;	return v;} Prog*prg(void){	Prog *p; 	while(nhunk < sizeof(Prog))		gethunk();	p = (Prog*)hunk;	nhunk -= sizeof(Prog);	hunk += sizeof(Prog); 	*p = zprg;	return p;} void*halloc(usize n){	void *p; 	n = (n+7)&~7;	while(nhunk < n)		gethunk();	p = hunk;	nhunk -= n;	hunk += n;	return p;} voidgethunk(void){	char *h;	long nh; 	nh = NHUNK;	if(tothunk >= 5L*NHUNK) {		nh = 5L*NHUNK;		if(tothunk >= 25L*NHUNK)			nh = 25L*NHUNK;	}	h = mysbrk(nh);	if(h == (void*)-1) {		diag("out of memory");		errorexit();	} 	hunk = h;	nhunk = nh;	tothunk += nh;} longhunkspace(void){	return tothunk;} voidstrnput(char *s, int n){	for(; *s; s++){		cput(*s);		n--;	}	for(; n > 0; n--)		cput(0);} voidcput(int c){	cbp[0] = c;	cbp++;	cbc--;	if(cbc <= 0)		cflush();} voidcflush(void){	int n; 	n = sizeof(buf.cbuf) - cbc;	if(n)		write(cout, buf.cbuf, n);	cbp = buf.cbuf;	cbc = sizeof(buf.cbuf);}