#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);}
#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<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);
}
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; i<NHASH; i++)
for(s = hash[i]; s != S; s = s->link)
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);
}