#include "l.h" static usize nhunk; static usize tothunk; static char* hunk; void diag(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(); } } void errorexit(void) { if(nerrors) { if(cout >= 0) remove(outfile); exits("error"); } exits(0); } void prasm(Prog *p) { print("%P\n", p); } int Sconv(Fmt *fp) { int i, c; char str[STRINGSZ], *p, *a; a = va_arg(fp->args, char*); p = str; for(i=0; i= '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); } void nopstat(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); } void xdefine(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; } } void undef(void) { int i; Sym *s; for(i=0; ilink) if(s->type == SXREF) diag("%s: not defined", s->name); } vlong atolwhex(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; } vlong rnd(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; } void gethunk(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; } long hunkspace(void) { return tothunk; } void strnput(char *s, int n) { for(; *s; s++){ cput(*s); n--; } for(; n > 0; n--) cput(0); } void cput(int c) { cbp[0] = c; cbp++; cbc--; if(cbc <= 0) cflush(); } void cflush(void) { int n; n = sizeof(buf.cbuf) - cbc; if(n) write(cout, buf.cbuf, n); cbp = buf.cbuf; cbc = sizeof(buf.cbuf); }