1*40d01547SDavid du Colombier #include "l.h"
2*40d01547SDavid du Colombier
3*40d01547SDavid du Colombier static usize nhunk;
4*40d01547SDavid du Colombier static usize tothunk;
5*40d01547SDavid du Colombier static char* hunk;
6*40d01547SDavid du Colombier
7*40d01547SDavid du Colombier void
diag(char * fmt,...)8*40d01547SDavid du Colombier diag(char *fmt, ...)
9*40d01547SDavid du Colombier {
10*40d01547SDavid du Colombier char buf[STRINGSZ], *tn;
11*40d01547SDavid du Colombier va_list arg;
12*40d01547SDavid du Colombier
13*40d01547SDavid du Colombier tn = "??none??";
14*40d01547SDavid du Colombier if(curtext != P && curtext->from.sym != S)
15*40d01547SDavid du Colombier tn = curtext->from.sym->name;
16*40d01547SDavid du Colombier va_start(arg, fmt);
17*40d01547SDavid du Colombier vseprint(buf, buf+sizeof(buf), fmt, arg);
18*40d01547SDavid du Colombier va_end(arg);
19*40d01547SDavid du Colombier print("%s: %s\n", tn, buf);
20*40d01547SDavid du Colombier
21*40d01547SDavid du Colombier nerrors++;
22*40d01547SDavid du Colombier if(nerrors > 10) {
23*40d01547SDavid du Colombier print("too many errors\n");
24*40d01547SDavid du Colombier errorexit();
25*40d01547SDavid du Colombier }
26*40d01547SDavid du Colombier }
27*40d01547SDavid du Colombier
28*40d01547SDavid du Colombier void
errorexit(void)29*40d01547SDavid du Colombier errorexit(void)
30*40d01547SDavid du Colombier {
31*40d01547SDavid du Colombier
32*40d01547SDavid du Colombier if(nerrors) {
33*40d01547SDavid du Colombier if(cout >= 0)
34*40d01547SDavid du Colombier remove(outfile);
35*40d01547SDavid du Colombier exits("error");
36*40d01547SDavid du Colombier }
37*40d01547SDavid du Colombier exits(0);
38*40d01547SDavid du Colombier }
39*40d01547SDavid du Colombier
40*40d01547SDavid du Colombier void
prasm(Prog * p)41*40d01547SDavid du Colombier prasm(Prog *p)
42*40d01547SDavid du Colombier {
43*40d01547SDavid du Colombier print("%P\n", p);
44*40d01547SDavid du Colombier }
45*40d01547SDavid du Colombier
46*40d01547SDavid du Colombier int
Sconv(Fmt * fp)47*40d01547SDavid du Colombier Sconv(Fmt *fp)
48*40d01547SDavid du Colombier {
49*40d01547SDavid du Colombier int i, c;
50*40d01547SDavid du Colombier char str[STRINGSZ], *p, *a;
51*40d01547SDavid du Colombier
52*40d01547SDavid du Colombier a = va_arg(fp->args, char*);
53*40d01547SDavid du Colombier p = str;
54*40d01547SDavid du Colombier for(i=0; i<sizeof(long); i++) {
55*40d01547SDavid du Colombier c = a[i] & 0xff;
56*40d01547SDavid du Colombier if(c >= 'a' && c <= 'z' ||
57*40d01547SDavid du Colombier c >= 'A' && c <= 'Z' ||
58*40d01547SDavid du Colombier c >= '0' && c <= '9' ||
59*40d01547SDavid du Colombier c == ' ' || c == '%') {
60*40d01547SDavid du Colombier *p++ = c;
61*40d01547SDavid du Colombier continue;
62*40d01547SDavid du Colombier }
63*40d01547SDavid du Colombier *p++ = '\\';
64*40d01547SDavid du Colombier switch(c) {
65*40d01547SDavid du Colombier case 0:
66*40d01547SDavid du Colombier *p++ = 'z';
67*40d01547SDavid du Colombier continue;
68*40d01547SDavid du Colombier case '\\':
69*40d01547SDavid du Colombier case '"':
70*40d01547SDavid du Colombier *p++ = c;
71*40d01547SDavid du Colombier continue;
72*40d01547SDavid du Colombier case '\n':
73*40d01547SDavid du Colombier *p++ = 'n';
74*40d01547SDavid du Colombier continue;
75*40d01547SDavid du Colombier case '\t':
76*40d01547SDavid du Colombier *p++ = 't';
77*40d01547SDavid du Colombier continue;
78*40d01547SDavid du Colombier }
79*40d01547SDavid du Colombier *p++ = (c>>6) + '0';
80*40d01547SDavid du Colombier *p++ = ((c>>3) & 7) + '0';
81*40d01547SDavid du Colombier *p++ = (c & 7) + '0';
82*40d01547SDavid du Colombier }
83*40d01547SDavid du Colombier *p = 0;
84*40d01547SDavid du Colombier return fmtstrcpy(fp, str);
85*40d01547SDavid du Colombier }
86*40d01547SDavid du Colombier
87*40d01547SDavid du Colombier void
nopstat(char * f,Count * c)88*40d01547SDavid du Colombier nopstat(char *f, Count *c)
89*40d01547SDavid du Colombier {
90*40d01547SDavid du Colombier if(c->outof)
91*40d01547SDavid du Colombier Bprint(&bso, "%s delay %ld/%ld (%.2f)\n", f,
92*40d01547SDavid du Colombier c->outof - c->count, c->outof,
93*40d01547SDavid du Colombier (double)(c->outof - c->count)/c->outof);
94*40d01547SDavid du Colombier }
95*40d01547SDavid du Colombier
96*40d01547SDavid du Colombier void
xdefine(char * p,int t,vlong v)97*40d01547SDavid du Colombier xdefine(char *p, int t, vlong v)
98*40d01547SDavid du Colombier {
99*40d01547SDavid du Colombier Sym *s;
100*40d01547SDavid du Colombier
101*40d01547SDavid du Colombier s = lookup(p, 0);
102*40d01547SDavid du Colombier if(s->type == 0 || s->type == SXREF) {
103*40d01547SDavid du Colombier s->type = t;
104*40d01547SDavid du Colombier s->value = v;
105*40d01547SDavid du Colombier }
106*40d01547SDavid du Colombier }
107*40d01547SDavid du Colombier
108*40d01547SDavid du Colombier void
undef(void)109*40d01547SDavid du Colombier undef(void)
110*40d01547SDavid du Colombier {
111*40d01547SDavid du Colombier int i;
112*40d01547SDavid du Colombier Sym *s;
113*40d01547SDavid du Colombier
114*40d01547SDavid du Colombier for(i=0; i<NHASH; i++)
115*40d01547SDavid du Colombier for(s = hash[i]; s != S; s = s->link)
116*40d01547SDavid du Colombier if(s->type == SXREF)
117*40d01547SDavid du Colombier diag("%s: not defined", s->name);
118*40d01547SDavid du Colombier }
119*40d01547SDavid du Colombier
120*40d01547SDavid du Colombier vlong
atolwhex(char * s)121*40d01547SDavid du Colombier atolwhex(char *s)
122*40d01547SDavid du Colombier {
123*40d01547SDavid du Colombier vlong n;
124*40d01547SDavid du Colombier int f;
125*40d01547SDavid du Colombier
126*40d01547SDavid du Colombier n = 0;
127*40d01547SDavid du Colombier f = 0;
128*40d01547SDavid du Colombier while(*s == ' ' || *s == '\t')
129*40d01547SDavid du Colombier s++;
130*40d01547SDavid du Colombier if(*s == '-' || *s == '+') {
131*40d01547SDavid du Colombier if(*s++ == '-')
132*40d01547SDavid du Colombier f = 1;
133*40d01547SDavid du Colombier while(*s == ' ' || *s == '\t')
134*40d01547SDavid du Colombier s++;
135*40d01547SDavid du Colombier }
136*40d01547SDavid du Colombier if(s[0]=='0' && s[1]){
137*40d01547SDavid du Colombier if(s[1]=='x' || s[1]=='X'){
138*40d01547SDavid du Colombier s += 2;
139*40d01547SDavid du Colombier for(;;){
140*40d01547SDavid du Colombier if(*s >= '0' && *s <= '9')
141*40d01547SDavid du Colombier n = n*16 + *s++ - '0';
142*40d01547SDavid du Colombier else if(*s >= 'a' && *s <= 'f')
143*40d01547SDavid du Colombier n = n*16 + *s++ - 'a' + 10;
144*40d01547SDavid du Colombier else if(*s >= 'A' && *s <= 'F')
145*40d01547SDavid du Colombier n = n*16 + *s++ - 'A' + 10;
146*40d01547SDavid du Colombier else
147*40d01547SDavid du Colombier break;
148*40d01547SDavid du Colombier }
149*40d01547SDavid du Colombier } else
150*40d01547SDavid du Colombier while(*s >= '0' && *s <= '7')
151*40d01547SDavid du Colombier n = n*8 + *s++ - '0';
152*40d01547SDavid du Colombier } else
153*40d01547SDavid du Colombier while(*s >= '0' && *s <= '9')
154*40d01547SDavid du Colombier n = n*10 + *s++ - '0';
155*40d01547SDavid du Colombier if(f)
156*40d01547SDavid du Colombier n = -n;
157*40d01547SDavid du Colombier return n;
158*40d01547SDavid du Colombier }
159*40d01547SDavid du Colombier
160*40d01547SDavid du Colombier vlong
rnd(vlong v,long r)161*40d01547SDavid du Colombier rnd(vlong v, long r)
162*40d01547SDavid du Colombier {
163*40d01547SDavid du Colombier long c;
164*40d01547SDavid du Colombier
165*40d01547SDavid du Colombier if(r <= 0)
166*40d01547SDavid du Colombier return v;
167*40d01547SDavid du Colombier v += r - 1;
168*40d01547SDavid du Colombier c = v % r;
169*40d01547SDavid du Colombier if(c < 0)
170*40d01547SDavid du Colombier c += r;
171*40d01547SDavid du Colombier v -= c;
172*40d01547SDavid du Colombier return v;
173*40d01547SDavid du Colombier }
174*40d01547SDavid du Colombier
175*40d01547SDavid du Colombier Prog*
prg(void)176*40d01547SDavid du Colombier prg(void)
177*40d01547SDavid du Colombier {
178*40d01547SDavid du Colombier Prog *p;
179*40d01547SDavid du Colombier
180*40d01547SDavid du Colombier while(nhunk < sizeof(Prog))
181*40d01547SDavid du Colombier gethunk();
182*40d01547SDavid du Colombier p = (Prog*)hunk;
183*40d01547SDavid du Colombier nhunk -= sizeof(Prog);
184*40d01547SDavid du Colombier hunk += sizeof(Prog);
185*40d01547SDavid du Colombier
186*40d01547SDavid du Colombier *p = zprg;
187*40d01547SDavid du Colombier return p;
188*40d01547SDavid du Colombier }
189*40d01547SDavid du Colombier
190*40d01547SDavid du Colombier void*
halloc(usize n)191*40d01547SDavid du Colombier halloc(usize n)
192*40d01547SDavid du Colombier {
193*40d01547SDavid du Colombier void *p;
194*40d01547SDavid du Colombier
195*40d01547SDavid du Colombier n = (n+7)&~7;
196*40d01547SDavid du Colombier while(nhunk < n)
197*40d01547SDavid du Colombier gethunk();
198*40d01547SDavid du Colombier p = hunk;
199*40d01547SDavid du Colombier nhunk -= n;
200*40d01547SDavid du Colombier hunk += n;
201*40d01547SDavid du Colombier return p;
202*40d01547SDavid du Colombier }
203*40d01547SDavid du Colombier
204*40d01547SDavid du Colombier void
gethunk(void)205*40d01547SDavid du Colombier gethunk(void)
206*40d01547SDavid du Colombier {
207*40d01547SDavid du Colombier char *h;
208*40d01547SDavid du Colombier long nh;
209*40d01547SDavid du Colombier
210*40d01547SDavid du Colombier nh = NHUNK;
211*40d01547SDavid du Colombier if(tothunk >= 5L*NHUNK) {
212*40d01547SDavid du Colombier nh = 5L*NHUNK;
213*40d01547SDavid du Colombier if(tothunk >= 25L*NHUNK)
214*40d01547SDavid du Colombier nh = 25L*NHUNK;
215*40d01547SDavid du Colombier }
216*40d01547SDavid du Colombier h = mysbrk(nh);
217*40d01547SDavid du Colombier if(h == (void*)-1) {
218*40d01547SDavid du Colombier diag("out of memory");
219*40d01547SDavid du Colombier errorexit();
220*40d01547SDavid du Colombier }
221*40d01547SDavid du Colombier
222*40d01547SDavid du Colombier hunk = h;
223*40d01547SDavid du Colombier nhunk = nh;
224*40d01547SDavid du Colombier tothunk += nh;
225*40d01547SDavid du Colombier }
226*40d01547SDavid du Colombier
227*40d01547SDavid du Colombier long
hunkspace(void)228*40d01547SDavid du Colombier hunkspace(void)
229*40d01547SDavid du Colombier {
230*40d01547SDavid du Colombier return tothunk;
231*40d01547SDavid du Colombier }
232*40d01547SDavid du Colombier
233*40d01547SDavid du Colombier void
strnput(char * s,int n)234*40d01547SDavid du Colombier strnput(char *s, int n)
235*40d01547SDavid du Colombier {
236*40d01547SDavid du Colombier for(; *s; s++){
237*40d01547SDavid du Colombier cput(*s);
238*40d01547SDavid du Colombier n--;
239*40d01547SDavid du Colombier }
240*40d01547SDavid du Colombier for(; n > 0; n--)
241*40d01547SDavid du Colombier cput(0);
242*40d01547SDavid du Colombier }
243*40d01547SDavid du Colombier
244*40d01547SDavid du Colombier void
cput(int c)245*40d01547SDavid du Colombier cput(int c)
246*40d01547SDavid du Colombier {
247*40d01547SDavid du Colombier cbp[0] = c;
248*40d01547SDavid du Colombier cbp++;
249*40d01547SDavid du Colombier cbc--;
250*40d01547SDavid du Colombier if(cbc <= 0)
251*40d01547SDavid du Colombier cflush();
252*40d01547SDavid du Colombier }
253*40d01547SDavid du Colombier
254*40d01547SDavid du Colombier void
cflush(void)255*40d01547SDavid du Colombier cflush(void)
256*40d01547SDavid du Colombier {
257*40d01547SDavid du Colombier int n;
258*40d01547SDavid du Colombier
259*40d01547SDavid du Colombier n = sizeof(buf.cbuf) - cbc;
260*40d01547SDavid du Colombier if(n)
261*40d01547SDavid du Colombier write(cout, buf.cbuf, n);
262*40d01547SDavid du Colombier cbp = buf.cbuf;
263*40d01547SDavid du Colombier cbc = sizeof(buf.cbuf);
264*40d01547SDavid du Colombier }
265