1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull #include <bio.h>
5 bc7cb1a1 2003-11-23 devnull typedef void* pointer;
7 bc7cb1a1 2003-11-23 devnull #define div dcdiv
9 bc7cb1a1 2003-11-23 devnull #define FATAL 0
10 bc7cb1a1 2003-11-23 devnull #define NFATAL 1
11 bc7cb1a1 2003-11-23 devnull #define BLK sizeof(Blk)
12 bc7cb1a1 2003-11-23 devnull #define PTRSZ sizeof(int*)
13 bc7cb1a1 2003-11-23 devnull #define HEADSZ 1024
14 bc7cb1a1 2003-11-23 devnull #define STKSZ 100
15 bc7cb1a1 2003-11-23 devnull #define RDSKSZ 100
16 bc7cb1a1 2003-11-23 devnull #define TBLSZ 256
17 bc7cb1a1 2003-11-23 devnull #define ARRAYST 221
18 bc7cb1a1 2003-11-23 devnull #define MAXIND 2048
19 bc7cb1a1 2003-11-23 devnull #define NL 1
20 bc7cb1a1 2003-11-23 devnull #define NG 2
21 bc7cb1a1 2003-11-23 devnull #define NE 3
22 bc7cb1a1 2003-11-23 devnull #define length(p) ((p)->wt-(p)->beg)
23 bc7cb1a1 2003-11-23 devnull #define rewind(p) (p)->rd=(p)->beg
24 32f69c36 2003-12-11 devnull #undef create
25 bc7cb1a1 2003-11-23 devnull #define create(p) (p)->rd = (p)->wt = (p)->beg
26 bc7cb1a1 2003-11-23 devnull #define fsfile(p) (p)->rd = (p)->wt
27 bc7cb1a1 2003-11-23 devnull #define truncate(p) (p)->wt = (p)->rd
28 bc7cb1a1 2003-11-23 devnull #define sfeof(p) (((p)->rd==(p)->wt)?1:0)
29 bc7cb1a1 2003-11-23 devnull #define sfbeg(p) (((p)->rd==(p)->beg)?1:0)
30 bc7cb1a1 2003-11-23 devnull #define sungetc(p,c) *(--(p)->rd)=c
31 bc7cb1a1 2003-11-23 devnull #define sgetc(p) (((p)->rd==(p)->wt)?-1:*(p)->rd++)
32 bc7cb1a1 2003-11-23 devnull #define skipc(p) {if((p)->rd<(p)->wt)(p)->rd++;}
33 bc7cb1a1 2003-11-23 devnull #define slookc(p) (((p)->rd==(p)->wt)?-1:*(p)->rd)
34 bc7cb1a1 2003-11-23 devnull #define sbackc(p) (((p)->rd==(p)->beg)?-1:*(--(p)->rd))
35 bc7cb1a1 2003-11-23 devnull #define backc(p) {if((p)->rd>(p)->beg) --(p)->rd;}
36 bc7cb1a1 2003-11-23 devnull #define sputc(p,c) {if((p)->wt==(p)->last)more(p);\
37 bc7cb1a1 2003-11-23 devnull *(p)->wt++ = c; }
38 bc7cb1a1 2003-11-23 devnull #define salterc(p,c) {if((p)->rd==(p)->last)more(p);\
39 bc7cb1a1 2003-11-23 devnull *(p)->rd++ = c;\
40 bc7cb1a1 2003-11-23 devnull if((p)->rd>(p)->wt)(p)->wt=(p)->rd;}
41 bc7cb1a1 2003-11-23 devnull #define sunputc(p) (*((p)->rd = --(p)->wt))
42 bc7cb1a1 2003-11-23 devnull #define sclobber(p) ((p)->rd = --(p)->wt)
43 bc7cb1a1 2003-11-23 devnull #define zero(p) for(pp=(p)->beg;pp<(p)->last;)\
44 bc7cb1a1 2003-11-23 devnull *pp++='\0'
45 bc7cb1a1 2003-11-23 devnull #define OUTC(x) {Bputc(&bout,x); if(--count == 0){Bprint(&bout,"\\\n"); count=ll;} }
46 bc7cb1a1 2003-11-23 devnull #define TEST2 {if((count -= 2) <=0){Bprint(&bout,"\\\n");count=ll;}}
47 bc7cb1a1 2003-11-23 devnull #define EMPTY if(stkerr != 0){Bprint(&bout,"stack empty\n"); continue; }
48 bc7cb1a1 2003-11-23 devnull #define EMPTYR(x) if(stkerr!=0){pushp(x);Bprint(&bout,"stack empty\n");continue;}
49 bc7cb1a1 2003-11-23 devnull #define EMPTYS if(stkerr != 0){Bprint(&bout,"stack empty\n"); return(1);}
50 bc7cb1a1 2003-11-23 devnull #define EMPTYSR(x) if(stkerr !=0){Bprint(&bout,"stack empty\n");pushp(x);return(1);}
51 bc7cb1a1 2003-11-23 devnull #define error(p) {Bprint(&bout,p); continue; }
52 bc7cb1a1 2003-11-23 devnull #define errorrt(p) {Bprint(&bout,p); return(1); }
53 bc7cb1a1 2003-11-23 devnull #define LASTFUN 026
55 bc7cb1a1 2003-11-23 devnull typedef struct Blk Blk;
56 bc7cb1a1 2003-11-23 devnull struct Blk
58 bc7cb1a1 2003-11-23 devnull char *rd;
59 bc7cb1a1 2003-11-23 devnull char *wt;
60 bc7cb1a1 2003-11-23 devnull char *beg;
61 bc7cb1a1 2003-11-23 devnull char *last;
63 bc7cb1a1 2003-11-23 devnull typedef struct Sym Sym;
64 bc7cb1a1 2003-11-23 devnull struct Sym
66 bc7cb1a1 2003-11-23 devnull Sym *next;
67 bc7cb1a1 2003-11-23 devnull Blk *val;
69 bc7cb1a1 2003-11-23 devnull typedef struct Wblk Wblk;
70 bc7cb1a1 2003-11-23 devnull struct Wblk
72 bc7cb1a1 2003-11-23 devnull Blk **rdw;
73 bc7cb1a1 2003-11-23 devnull Blk **wtw;
74 bc7cb1a1 2003-11-23 devnull Blk **begw;
75 bc7cb1a1 2003-11-23 devnull Blk **lastw;
78 bc7cb1a1 2003-11-23 devnull Biobuf *curfile, *fsave;
79 bc7cb1a1 2003-11-23 devnull Blk *arg1, *arg2;
80 bc7cb1a1 2003-11-23 devnull uchar savk;
82 bc7cb1a1 2003-11-23 devnull int ifile;
83 bc7cb1a1 2003-11-23 devnull Blk *scalptr, *basptr, *tenptr, *inbas;
84 bc7cb1a1 2003-11-23 devnull Blk *sqtemp, *chptr, *strptr, *divxyz;
85 bc7cb1a1 2003-11-23 devnull Blk *stack[STKSZ];
86 bc7cb1a1 2003-11-23 devnull Blk **stkptr,**stkbeg;
87 bc7cb1a1 2003-11-23 devnull Blk **stkend;
88 bc7cb1a1 2003-11-23 devnull Blk *hfree;
89 bc7cb1a1 2003-11-23 devnull int stkerr;
90 bc7cb1a1 2003-11-23 devnull int lastchar;
91 bc7cb1a1 2003-11-23 devnull Blk *readstk[RDSKSZ];
92 bc7cb1a1 2003-11-23 devnull Blk **readptr;
93 bc7cb1a1 2003-11-23 devnull Blk *rem;
95 bc7cb1a1 2003-11-23 devnull Blk *irem;
96 bc7cb1a1 2003-11-23 devnull int skd,skr;
98 bc7cb1a1 2003-11-23 devnull Sym symlst[TBLSZ];
99 bc7cb1a1 2003-11-23 devnull Sym *stable[TBLSZ];
100 bc7cb1a1 2003-11-23 devnull Sym *sptr, *sfree;
101 bc7cb1a1 2003-11-23 devnull long rel;
102 bc7cb1a1 2003-11-23 devnull long nbytes;
103 bc7cb1a1 2003-11-23 devnull long all;
104 bc7cb1a1 2003-11-23 devnull long headmor;
105 bc7cb1a1 2003-11-23 devnull long obase;
106 bc7cb1a1 2003-11-23 devnull int fw,fw1,ll;
107 bc7cb1a1 2003-11-23 devnull void (*outdit)(Blk *p, int flg);
108 bc7cb1a1 2003-11-23 devnull int logo;
109 bc7cb1a1 2003-11-23 devnull int logten;
110 bc7cb1a1 2003-11-23 devnull int count;
111 bc7cb1a1 2003-11-23 devnull char *pp;
112 bc7cb1a1 2003-11-23 devnull char *dummy;
113 bc7cb1a1 2003-11-23 devnull long longest, maxsize, active;
114 bc7cb1a1 2003-11-23 devnull int lall, lrel, lcopy, lmore, lbytes;
115 bc7cb1a1 2003-11-23 devnull int inside;
116 bc7cb1a1 2003-11-23 devnull Biobuf bin;
117 bc7cb1a1 2003-11-23 devnull Biobuf bout;
119 bc7cb1a1 2003-11-23 devnull void main(int argc, char *argv[]);
120 bc7cb1a1 2003-11-23 devnull void commnds(void);
121 bc7cb1a1 2003-11-23 devnull Blk* readin(void);
122 bc7cb1a1 2003-11-23 devnull Blk* div(Blk *ddivd, Blk *ddivr);
123 bc7cb1a1 2003-11-23 devnull int dscale(void);
124 bc7cb1a1 2003-11-23 devnull Blk* removr(Blk *p, int n);
125 bc7cb1a1 2003-11-23 devnull Blk* dcsqrt(Blk *p);
126 bc7cb1a1 2003-11-23 devnull void init(int argc, char *argv[]);
127 bc7cb1a1 2003-11-23 devnull void onintr(void);
128 bc7cb1a1 2003-11-23 devnull void pushp(Blk *p);
129 bc7cb1a1 2003-11-23 devnull Blk* pop(void);
130 bc7cb1a1 2003-11-23 devnull Blk* readin(void);
131 bc7cb1a1 2003-11-23 devnull Blk* add0(Blk *p, int ct);
132 bc7cb1a1 2003-11-23 devnull Blk* mult(Blk *p, Blk *q);
133 bc7cb1a1 2003-11-23 devnull void chsign(Blk *p);
134 bc7cb1a1 2003-11-23 devnull int readc(void);
135 bc7cb1a1 2003-11-23 devnull void unreadc(char c);
136 bc7cb1a1 2003-11-23 devnull void binop(char c);
137 bc7cb1a1 2003-11-23 devnull void dcprint(Blk *hptr);
138 bc7cb1a1 2003-11-23 devnull Blk* dcexp(Blk *base, Blk *ex);
139 bc7cb1a1 2003-11-23 devnull Blk* getdec(Blk *p, int sc);
140 bc7cb1a1 2003-11-23 devnull void tenot(Blk *p, int sc);
141 bc7cb1a1 2003-11-23 devnull void oneot(Blk *p, int sc, char ch);
142 bc7cb1a1 2003-11-23 devnull void hexot(Blk *p, int flg);
143 bc7cb1a1 2003-11-23 devnull void bigot(Blk *p, int flg);
144 bc7cb1a1 2003-11-23 devnull Blk* add(Blk *a1, Blk *a2);
145 bc7cb1a1 2003-11-23 devnull int eqk(void);
146 bc7cb1a1 2003-11-23 devnull Blk* removc(Blk *p, int n);
147 bc7cb1a1 2003-11-23 devnull Blk* scalint(Blk *p);
148 bc7cb1a1 2003-11-23 devnull Blk* scale(Blk *p, int n);
149 bc7cb1a1 2003-11-23 devnull int subt(void);
150 bc7cb1a1 2003-11-23 devnull int command(void);
151 bc7cb1a1 2003-11-23 devnull int cond(char c);
152 bc7cb1a1 2003-11-23 devnull void load(void);
153 cedbe4a4 2003-11-24 devnull #define log2 dclog2
154 bc7cb1a1 2003-11-23 devnull int log2(long n);
155 bc7cb1a1 2003-11-23 devnull Blk* salloc(int size);
156 bc7cb1a1 2003-11-23 devnull Blk* morehd(void);
157 bc7cb1a1 2003-11-23 devnull Blk* copy(Blk *hptr, int size);
158 bc7cb1a1 2003-11-23 devnull void sdump(char *s1, Blk *hptr);
159 bc7cb1a1 2003-11-23 devnull void seekc(Blk *hptr, int n);
160 bc7cb1a1 2003-11-23 devnull void salterwd(Blk *hptr, Blk *n);
161 bc7cb1a1 2003-11-23 devnull void more(Blk *hptr);
162 bc7cb1a1 2003-11-23 devnull void ospace(char *s);
163 bc7cb1a1 2003-11-23 devnull void garbage(char *s);
164 bc7cb1a1 2003-11-23 devnull void release(Blk *p);
165 bc7cb1a1 2003-11-23 devnull Blk* dcgetwd(Blk *p);
166 bc7cb1a1 2003-11-23 devnull void putwd(Blk *p, Blk *c);
167 bc7cb1a1 2003-11-23 devnull Blk* lookwd(Blk *p);
168 bc7cb1a1 2003-11-23 devnull char* nalloc(char *p, unsigned nbytes);
169 bc7cb1a1 2003-11-23 devnull int getstk(void);
171 bc7cb1a1 2003-11-23 devnull /********debug only**/
173 bc7cb1a1 2003-11-23 devnull tpr(char *cp, Blk *bp)
175 bc7cb1a1 2003-11-23 devnull print("%s-> ", cp);
176 bc7cb1a1 2003-11-23 devnull print("beg: %lx rd: %lx wt: %lx last: %lx\n", bp->beg, bp->rd,
177 bc7cb1a1 2003-11-23 devnull bp->wt, bp->last);
178 bc7cb1a1 2003-11-23 devnull for (cp = bp->beg; cp != bp->wt; cp++) {
179 bc7cb1a1 2003-11-23 devnull print("%d", *cp);
180 bc7cb1a1 2003-11-23 devnull if (cp != bp->wt-1)
181 bc7cb1a1 2003-11-23 devnull print("/");
183 bc7cb1a1 2003-11-23 devnull print("\n");
185 bc7cb1a1 2003-11-23 devnull /************/
188 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
190 bc7cb1a1 2003-11-23 devnull Binit(&bin, 0, OREAD);
191 bc7cb1a1 2003-11-23 devnull Binit(&bout, 1, OWRITE);
192 bc7cb1a1 2003-11-23 devnull init(argc,argv);
193 bc7cb1a1 2003-11-23 devnull commnds();
194 bc7cb1a1 2003-11-23 devnull exits(0);
198 bc7cb1a1 2003-11-23 devnull commnds(void)
200 bc7cb1a1 2003-11-23 devnull Blk *p, *q, **ptr, *s, *t;
202 bc7cb1a1 2003-11-23 devnull Sym *sp;
203 bc7cb1a1 2003-11-23 devnull int sk, sk1, sk2, c, sign, n, d;
205 bc7cb1a1 2003-11-23 devnull while(1) {
206 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
207 bc7cb1a1 2003-11-23 devnull if(((c = readc())>='0' && c <= '9') ||
208 bc7cb1a1 2003-11-23 devnull (c>='A' && c <='F') || c == '.') {
209 bc7cb1a1 2003-11-23 devnull unreadc(c);
210 bc7cb1a1 2003-11-23 devnull p = readin();
211 bc7cb1a1 2003-11-23 devnull pushp(p);
212 bc7cb1a1 2003-11-23 devnull continue;
214 bc7cb1a1 2003-11-23 devnull switch(c) {
215 bc7cb1a1 2003-11-23 devnull case ' ':
216 bc7cb1a1 2003-11-23 devnull case '\n':
217 bc7cb1a1 2003-11-23 devnull case -1:
218 bc7cb1a1 2003-11-23 devnull continue;
219 bc7cb1a1 2003-11-23 devnull case 'Y':
220 bc7cb1a1 2003-11-23 devnull sdump("stk",*stkptr);
221 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "all %ld rel %ld headmor %ld\n",all,rel,headmor);
222 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "nbytes %ld\n",nbytes);
223 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "longest %ld active %ld maxsize %ld\n", longest,
224 bc7cb1a1 2003-11-23 devnull active, maxsize);
225 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "new all %d rel %d copy %d more %d lbytes %d\n",
226 bc7cb1a1 2003-11-23 devnull lall, lrel, lcopy, lmore, lbytes);
227 bc7cb1a1 2003-11-23 devnull lall = lrel = lcopy = lmore = lbytes = 0;
228 bc7cb1a1 2003-11-23 devnull continue;
229 bc7cb1a1 2003-11-23 devnull case '_':
230 bc7cb1a1 2003-11-23 devnull p = readin();
231 bc7cb1a1 2003-11-23 devnull savk = sunputc(p);
232 bc7cb1a1 2003-11-23 devnull chsign(p);
233 bc7cb1a1 2003-11-23 devnull sputc(p,savk);
234 bc7cb1a1 2003-11-23 devnull pushp(p);
235 bc7cb1a1 2003-11-23 devnull continue;
236 bc7cb1a1 2003-11-23 devnull case '-':
238 bc7cb1a1 2003-11-23 devnull continue;
239 bc7cb1a1 2003-11-23 devnull case '+':
240 bc7cb1a1 2003-11-23 devnull if(eqk() != 0)
241 bc7cb1a1 2003-11-23 devnull continue;
242 bc7cb1a1 2003-11-23 devnull binop('+');
243 bc7cb1a1 2003-11-23 devnull continue;
244 bc7cb1a1 2003-11-23 devnull case '*':
245 bc7cb1a1 2003-11-23 devnull arg1 = pop();
247 bc7cb1a1 2003-11-23 devnull arg2 = pop();
248 bc7cb1a1 2003-11-23 devnull EMPTYR(arg1);
249 bc7cb1a1 2003-11-23 devnull sk1 = sunputc(arg1);
250 bc7cb1a1 2003-11-23 devnull sk2 = sunputc(arg2);
251 bc7cb1a1 2003-11-23 devnull savk = sk1+sk2;
252 bc7cb1a1 2003-11-23 devnull binop('*');
253 bc7cb1a1 2003-11-23 devnull p = pop();
254 bc7cb1a1 2003-11-23 devnull if(savk>k && savk>sk1 && savk>sk2) {
255 bc7cb1a1 2003-11-23 devnull sclobber(p);
256 bc7cb1a1 2003-11-23 devnull sk = sk1;
257 bc7cb1a1 2003-11-23 devnull if(sk<sk2)
258 bc7cb1a1 2003-11-23 devnull sk = sk2;
259 bc7cb1a1 2003-11-23 devnull if(sk<k)
261 bc7cb1a1 2003-11-23 devnull p = removc(p,savk-sk);
262 bc7cb1a1 2003-11-23 devnull savk = sk;
263 bc7cb1a1 2003-11-23 devnull sputc(p,savk);
265 bc7cb1a1 2003-11-23 devnull pushp(p);
266 bc7cb1a1 2003-11-23 devnull continue;
267 bc7cb1a1 2003-11-23 devnull case '/':
268 bc7cb1a1 2003-11-23 devnull casediv:
269 bc7cb1a1 2003-11-23 devnull if(dscale() != 0)
270 bc7cb1a1 2003-11-23 devnull continue;
271 bc7cb1a1 2003-11-23 devnull binop('/');
272 bc7cb1a1 2003-11-23 devnull if(irem != 0)
273 bc7cb1a1 2003-11-23 devnull release(irem);
274 bc7cb1a1 2003-11-23 devnull release(rem);
275 bc7cb1a1 2003-11-23 devnull continue;
276 bc7cb1a1 2003-11-23 devnull case '%':
277 bc7cb1a1 2003-11-23 devnull if(dscale() != 0)
278 bc7cb1a1 2003-11-23 devnull continue;
279 bc7cb1a1 2003-11-23 devnull binop('/');
280 bc7cb1a1 2003-11-23 devnull p = pop();
281 bc7cb1a1 2003-11-23 devnull release(p);
282 bc7cb1a1 2003-11-23 devnull if(irem == 0) {
283 bc7cb1a1 2003-11-23 devnull sputc(rem,skr+k);
284 bc7cb1a1 2003-11-23 devnull pushp(rem);
285 bc7cb1a1 2003-11-23 devnull continue;
287 bc7cb1a1 2003-11-23 devnull p = add0(rem,skd-(skr+k));
288 bc7cb1a1 2003-11-23 devnull q = add(p,irem);
289 bc7cb1a1 2003-11-23 devnull release(p);
290 bc7cb1a1 2003-11-23 devnull release(irem);
291 bc7cb1a1 2003-11-23 devnull sputc(q,skd);
292 bc7cb1a1 2003-11-23 devnull pushp(q);
293 bc7cb1a1 2003-11-23 devnull continue;
294 bc7cb1a1 2003-11-23 devnull case 'v':
295 bc7cb1a1 2003-11-23 devnull p = pop();
297 bc7cb1a1 2003-11-23 devnull savk = sunputc(p);
298 bc7cb1a1 2003-11-23 devnull if(length(p) == 0) {
299 bc7cb1a1 2003-11-23 devnull sputc(p,savk);
300 bc7cb1a1 2003-11-23 devnull pushp(p);
301 bc7cb1a1 2003-11-23 devnull continue;
303 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
304 bc7cb1a1 2003-11-23 devnull error("sqrt of neg number\n");
306 bc7cb1a1 2003-11-23 devnull if(k<savk)
307 bc7cb1a1 2003-11-23 devnull n = savk;
309 bc7cb1a1 2003-11-23 devnull n = k*2-savk;
310 bc7cb1a1 2003-11-23 devnull savk = k;
312 bc7cb1a1 2003-11-23 devnull arg1 = add0(p,n);
313 bc7cb1a1 2003-11-23 devnull arg2 = dcsqrt(arg1);
314 bc7cb1a1 2003-11-23 devnull sputc(arg2,savk);
315 bc7cb1a1 2003-11-23 devnull pushp(arg2);
316 bc7cb1a1 2003-11-23 devnull continue;
318 bc7cb1a1 2003-11-23 devnull case '^':
319 bc7cb1a1 2003-11-23 devnull neg = 0;
320 bc7cb1a1 2003-11-23 devnull arg1 = pop();
322 bc7cb1a1 2003-11-23 devnull if(sunputc(arg1) != 0)
323 bc7cb1a1 2003-11-23 devnull error("exp not an integer\n");
324 bc7cb1a1 2003-11-23 devnull arg2 = pop();
325 bc7cb1a1 2003-11-23 devnull EMPTYR(arg1);
326 bc7cb1a1 2003-11-23 devnull if(sfbeg(arg1) == 0 && sbackc(arg1)<0) {
328 bc7cb1a1 2003-11-23 devnull chsign(arg1);
330 bc7cb1a1 2003-11-23 devnull if(length(arg1)>=3) {
331 bc7cb1a1 2003-11-23 devnull error("exp too big\n");
333 bc7cb1a1 2003-11-23 devnull savk = sunputc(arg2);
334 bc7cb1a1 2003-11-23 devnull p = dcexp(arg2,arg1);
335 bc7cb1a1 2003-11-23 devnull release(arg2);
336 bc7cb1a1 2003-11-23 devnull rewind(arg1);
337 bc7cb1a1 2003-11-23 devnull c = sgetc(arg1);
338 bc7cb1a1 2003-11-23 devnull if(c == -1)
341 bc7cb1a1 2003-11-23 devnull if(sfeof(arg1) == 0)
342 bc7cb1a1 2003-11-23 devnull c = sgetc(arg1)*100 + c;
343 bc7cb1a1 2003-11-23 devnull d = c*savk;
344 bc7cb1a1 2003-11-23 devnull release(arg1);
345 bc7cb1a1 2003-11-23 devnull /* if(neg == 0) { removed to fix -exp bug*/
346 bc7cb1a1 2003-11-23 devnull if(k>=savk)
349 bc7cb1a1 2003-11-23 devnull n = savk;
350 bc7cb1a1 2003-11-23 devnull if(n<d) {
351 bc7cb1a1 2003-11-23 devnull q = removc(p,d-n);
352 bc7cb1a1 2003-11-23 devnull sputc(q,n);
353 bc7cb1a1 2003-11-23 devnull pushp(q);
354 bc7cb1a1 2003-11-23 devnull } else {
355 bc7cb1a1 2003-11-23 devnull sputc(p,d);
356 bc7cb1a1 2003-11-23 devnull pushp(p);
358 bc7cb1a1 2003-11-23 devnull /* } else { this is disaster for exp <-127 */
359 bc7cb1a1 2003-11-23 devnull /* sputc(p,d); */
360 bc7cb1a1 2003-11-23 devnull /* pushp(p); */
362 bc7cb1a1 2003-11-23 devnull if(neg == 0)
363 bc7cb1a1 2003-11-23 devnull continue;
364 bc7cb1a1 2003-11-23 devnull p = pop();
365 bc7cb1a1 2003-11-23 devnull q = salloc(2);
366 bc7cb1a1 2003-11-23 devnull sputc(q,1);
367 bc7cb1a1 2003-11-23 devnull sputc(q,0);
368 bc7cb1a1 2003-11-23 devnull pushp(q);
369 bc7cb1a1 2003-11-23 devnull pushp(p);
370 bc7cb1a1 2003-11-23 devnull goto casediv;
371 bc7cb1a1 2003-11-23 devnull case 'z':
372 bc7cb1a1 2003-11-23 devnull p = salloc(2);
373 bc7cb1a1 2003-11-23 devnull n = stkptr - stkbeg;
374 bc7cb1a1 2003-11-23 devnull if(n >= 100) {
375 bc7cb1a1 2003-11-23 devnull sputc(p,n/100);
376 bc7cb1a1 2003-11-23 devnull n %= 100;
378 bc7cb1a1 2003-11-23 devnull sputc(p,n);
379 bc7cb1a1 2003-11-23 devnull sputc(p,0);
380 bc7cb1a1 2003-11-23 devnull pushp(p);
381 bc7cb1a1 2003-11-23 devnull continue;
382 bc7cb1a1 2003-11-23 devnull case 'Z':
383 bc7cb1a1 2003-11-23 devnull p = pop();
385 bc7cb1a1 2003-11-23 devnull n = (length(p)-1)<<1;
386 bc7cb1a1 2003-11-23 devnull fsfile(p);
387 bc7cb1a1 2003-11-23 devnull backc(p);
388 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0) {
389 bc7cb1a1 2003-11-23 devnull if((c = sbackc(p))<0) {
391 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 1)
394 bc7cb1a1 2003-11-23 devnull if((c = sbackc(p)) == 0)
397 bc7cb1a1 2003-11-23 devnull if(c > 90)
401 bc7cb1a1 2003-11-23 devnull if(c < 10)
404 bc7cb1a1 2003-11-23 devnull release(p);
405 bc7cb1a1 2003-11-23 devnull q = salloc(1);
406 bc7cb1a1 2003-11-23 devnull if(n >= 100) {
407 bc7cb1a1 2003-11-23 devnull sputc(q,n%100);
408 bc7cb1a1 2003-11-23 devnull n /= 100;
410 bc7cb1a1 2003-11-23 devnull sputc(q,n);
411 bc7cb1a1 2003-11-23 devnull sputc(q,0);
412 bc7cb1a1 2003-11-23 devnull pushp(q);
413 bc7cb1a1 2003-11-23 devnull continue;
414 bc7cb1a1 2003-11-23 devnull case 'i':
415 bc7cb1a1 2003-11-23 devnull p = pop();
417 bc7cb1a1 2003-11-23 devnull p = scalint(p);
418 bc7cb1a1 2003-11-23 devnull release(inbas);
419 bc7cb1a1 2003-11-23 devnull inbas = p;
420 bc7cb1a1 2003-11-23 devnull continue;
421 bc7cb1a1 2003-11-23 devnull case 'I':
422 bc7cb1a1 2003-11-23 devnull p = copy(inbas,length(inbas)+1);
423 bc7cb1a1 2003-11-23 devnull sputc(p,0);
424 bc7cb1a1 2003-11-23 devnull pushp(p);
425 bc7cb1a1 2003-11-23 devnull continue;
426 bc7cb1a1 2003-11-23 devnull case 'o':
427 bc7cb1a1 2003-11-23 devnull p = pop();
429 bc7cb1a1 2003-11-23 devnull p = scalint(p);
430 bc7cb1a1 2003-11-23 devnull sign = 0;
431 bc7cb1a1 2003-11-23 devnull n = length(p);
432 bc7cb1a1 2003-11-23 devnull q = copy(p,n);
433 bc7cb1a1 2003-11-23 devnull fsfile(q);
434 bc7cb1a1 2003-11-23 devnull l = c = sbackc(q);
435 bc7cb1a1 2003-11-23 devnull if(n != 1) {
436 bc7cb1a1 2003-11-23 devnull if(c<0) {
437 bc7cb1a1 2003-11-23 devnull sign = 1;
438 bc7cb1a1 2003-11-23 devnull chsign(q);
439 bc7cb1a1 2003-11-23 devnull n = length(q);
440 bc7cb1a1 2003-11-23 devnull fsfile(q);
441 bc7cb1a1 2003-11-23 devnull l = c = sbackc(q);
443 bc7cb1a1 2003-11-23 devnull if(n != 1) {
444 bc7cb1a1 2003-11-23 devnull while(sfbeg(q) == 0)
445 bc7cb1a1 2003-11-23 devnull l = l*100+sbackc(q);
448 bc7cb1a1 2003-11-23 devnull logo = log2(l);
449 bc7cb1a1 2003-11-23 devnull obase = l;
450 bc7cb1a1 2003-11-23 devnull release(basptr);
451 bc7cb1a1 2003-11-23 devnull if(sign == 1)
452 bc7cb1a1 2003-11-23 devnull obase = -l;
453 bc7cb1a1 2003-11-23 devnull basptr = p;
454 bc7cb1a1 2003-11-23 devnull outdit = bigot;
455 bc7cb1a1 2003-11-23 devnull if(n == 1 && sign == 0) {
456 bc7cb1a1 2003-11-23 devnull if(c <= 16) {
457 bc7cb1a1 2003-11-23 devnull outdit = hexot;
459 bc7cb1a1 2003-11-23 devnull fw1 = 0;
460 bc7cb1a1 2003-11-23 devnull ll = 70;
461 bc7cb1a1 2003-11-23 devnull release(q);
462 bc7cb1a1 2003-11-23 devnull continue;
466 bc7cb1a1 2003-11-23 devnull if(sign == 1)
468 bc7cb1a1 2003-11-23 devnull p = salloc(1);
469 bc7cb1a1 2003-11-23 devnull sputc(p,-1);
470 bc7cb1a1 2003-11-23 devnull t = add(p,q);
471 bc7cb1a1 2003-11-23 devnull n += length(t)*2;
472 bc7cb1a1 2003-11-23 devnull fsfile(t);
473 bc7cb1a1 2003-11-23 devnull if(sbackc(t)>9)
475 bc7cb1a1 2003-11-23 devnull release(t);
476 bc7cb1a1 2003-11-23 devnull release(q);
477 bc7cb1a1 2003-11-23 devnull release(p);
479 bc7cb1a1 2003-11-23 devnull fw1 = n-1;
480 bc7cb1a1 2003-11-23 devnull ll = 70;
481 bc7cb1a1 2003-11-23 devnull if(fw>=ll)
482 bc7cb1a1 2003-11-23 devnull continue;
483 bc7cb1a1 2003-11-23 devnull ll = (70/fw)*fw;
484 bc7cb1a1 2003-11-23 devnull continue;
485 bc7cb1a1 2003-11-23 devnull case 'O':
486 bc7cb1a1 2003-11-23 devnull p = copy(basptr,length(basptr)+1);
487 bc7cb1a1 2003-11-23 devnull sputc(p,0);
488 bc7cb1a1 2003-11-23 devnull pushp(p);
489 bc7cb1a1 2003-11-23 devnull continue;
490 bc7cb1a1 2003-11-23 devnull case '[':
492 bc7cb1a1 2003-11-23 devnull p = salloc(0);
493 bc7cb1a1 2003-11-23 devnull for(;;) {
494 bc7cb1a1 2003-11-23 devnull if((c = readc()) == ']') {
495 bc7cb1a1 2003-11-23 devnull if(n == 0)
499 bc7cb1a1 2003-11-23 devnull sputc(p,c);
500 bc7cb1a1 2003-11-23 devnull if(c == '[')
503 bc7cb1a1 2003-11-23 devnull pushp(p);
504 bc7cb1a1 2003-11-23 devnull continue;
505 bc7cb1a1 2003-11-23 devnull case 'k':
506 bc7cb1a1 2003-11-23 devnull p = pop();
508 bc7cb1a1 2003-11-23 devnull p = scalint(p);
509 bc7cb1a1 2003-11-23 devnull if(length(p)>1) {
510 bc7cb1a1 2003-11-23 devnull error("scale too big\n");
512 bc7cb1a1 2003-11-23 devnull rewind(p);
514 bc7cb1a1 2003-11-23 devnull if(!sfeof(p))
515 bc7cb1a1 2003-11-23 devnull k = sgetc(p);
516 bc7cb1a1 2003-11-23 devnull release(scalptr);
517 bc7cb1a1 2003-11-23 devnull scalptr = p;
518 bc7cb1a1 2003-11-23 devnull continue;
519 bc7cb1a1 2003-11-23 devnull case 'K':
520 bc7cb1a1 2003-11-23 devnull p = copy(scalptr,length(scalptr)+1);
521 bc7cb1a1 2003-11-23 devnull sputc(p,0);
522 bc7cb1a1 2003-11-23 devnull pushp(p);
523 bc7cb1a1 2003-11-23 devnull continue;
524 bc7cb1a1 2003-11-23 devnull case 'X':
525 bc7cb1a1 2003-11-23 devnull p = pop();
527 bc7cb1a1 2003-11-23 devnull fsfile(p);
528 bc7cb1a1 2003-11-23 devnull n = sbackc(p);
529 bc7cb1a1 2003-11-23 devnull release(p);
530 bc7cb1a1 2003-11-23 devnull p = salloc(2);
531 bc7cb1a1 2003-11-23 devnull sputc(p,n);
532 bc7cb1a1 2003-11-23 devnull sputc(p,0);
533 bc7cb1a1 2003-11-23 devnull pushp(p);
534 bc7cb1a1 2003-11-23 devnull continue;
535 bc7cb1a1 2003-11-23 devnull case 'Q':
536 bc7cb1a1 2003-11-23 devnull p = pop();
538 bc7cb1a1 2003-11-23 devnull if(length(p)>2) {
539 bc7cb1a1 2003-11-23 devnull error("Q?\n");
541 bc7cb1a1 2003-11-23 devnull rewind(p);
542 bc7cb1a1 2003-11-23 devnull if((c = sgetc(p))<0) {
543 bc7cb1a1 2003-11-23 devnull error("neg Q\n");
545 bc7cb1a1 2003-11-23 devnull release(p);
546 bc7cb1a1 2003-11-23 devnull while(c-- > 0) {
547 bc7cb1a1 2003-11-23 devnull if(readptr == &readstk[0]) {
548 bc7cb1a1 2003-11-23 devnull error("readstk?\n");
550 bc7cb1a1 2003-11-23 devnull if(*readptr != 0)
551 bc7cb1a1 2003-11-23 devnull release(*readptr);
552 bc7cb1a1 2003-11-23 devnull readptr--;
554 bc7cb1a1 2003-11-23 devnull continue;
555 bc7cb1a1 2003-11-23 devnull case 'q':
556 bc7cb1a1 2003-11-23 devnull if(readptr <= &readstk[1])
557 bc7cb1a1 2003-11-23 devnull exits(0);
558 bc7cb1a1 2003-11-23 devnull if(*readptr != 0)
559 bc7cb1a1 2003-11-23 devnull release(*readptr);
560 bc7cb1a1 2003-11-23 devnull readptr--;
561 bc7cb1a1 2003-11-23 devnull if(*readptr != 0)
562 bc7cb1a1 2003-11-23 devnull release(*readptr);
563 bc7cb1a1 2003-11-23 devnull readptr--;
564 bc7cb1a1 2003-11-23 devnull continue;
565 bc7cb1a1 2003-11-23 devnull case 'f':
566 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0])
567 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"empty stack\n");
569 bc7cb1a1 2003-11-23 devnull for(ptr = stkptr; ptr > &stack[0];) {
570 bc7cb1a1 2003-11-23 devnull dcprint(*ptr--);
573 bc7cb1a1 2003-11-23 devnull continue;
574 bc7cb1a1 2003-11-23 devnull case 'p':
575 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0])
576 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"empty stack\n");
578 bc7cb1a1 2003-11-23 devnull dcprint(*stkptr);
580 bc7cb1a1 2003-11-23 devnull continue;
581 bc7cb1a1 2003-11-23 devnull case 'P':
582 bc7cb1a1 2003-11-23 devnull p = pop();
584 bc7cb1a1 2003-11-23 devnull sputc(p,0);
585 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%s",p->beg);
586 bc7cb1a1 2003-11-23 devnull release(p);
587 bc7cb1a1 2003-11-23 devnull continue;
588 bc7cb1a1 2003-11-23 devnull case 'd':
589 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0]) {
590 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"empty stack\n");
591 bc7cb1a1 2003-11-23 devnull continue;
593 bc7cb1a1 2003-11-23 devnull q = *stkptr;
594 bc7cb1a1 2003-11-23 devnull n = length(q);
595 bc7cb1a1 2003-11-23 devnull p = copy(*stkptr,n);
596 bc7cb1a1 2003-11-23 devnull pushp(p);
597 bc7cb1a1 2003-11-23 devnull continue;
598 bc7cb1a1 2003-11-23 devnull case 'c':
599 bc7cb1a1 2003-11-23 devnull while(stkerr == 0) {
600 bc7cb1a1 2003-11-23 devnull p = pop();
601 bc7cb1a1 2003-11-23 devnull if(stkerr == 0)
602 bc7cb1a1 2003-11-23 devnull release(p);
604 bc7cb1a1 2003-11-23 devnull continue;
605 bc7cb1a1 2003-11-23 devnull case 'S':
606 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0]) {
607 bc7cb1a1 2003-11-23 devnull error("save: args\n");
609 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
610 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
611 bc7cb1a1 2003-11-23 devnull sp = stable[c] = sfree;
612 bc7cb1a1 2003-11-23 devnull sfree = sfree->next;
613 bc7cb1a1 2003-11-23 devnull if(sfree == 0)
614 bc7cb1a1 2003-11-23 devnull goto sempty;
615 bc7cb1a1 2003-11-23 devnull sp->next = sptr;
616 bc7cb1a1 2003-11-23 devnull p = pop();
618 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
619 bc7cb1a1 2003-11-23 devnull q = copy(p,length(p)+PTRSZ);
620 bc7cb1a1 2003-11-23 devnull for(n = 0;n < PTRSZ;n++) {
621 bc7cb1a1 2003-11-23 devnull sputc(q,0);
623 bc7cb1a1 2003-11-23 devnull release(p);
626 bc7cb1a1 2003-11-23 devnull sp->val = p;
627 bc7cb1a1 2003-11-23 devnull continue;
629 bc7cb1a1 2003-11-23 devnull error("symbol table overflow\n");
630 bc7cb1a1 2003-11-23 devnull case 's':
631 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0]) {
632 bc7cb1a1 2003-11-23 devnull error("save:args\n");
634 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
635 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
636 bc7cb1a1 2003-11-23 devnull if(sptr != 0) {
637 bc7cb1a1 2003-11-23 devnull p = sptr->val;
638 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
639 bc7cb1a1 2003-11-23 devnull rewind(p);
640 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0)
641 bc7cb1a1 2003-11-23 devnull release(dcgetwd(p));
643 bc7cb1a1 2003-11-23 devnull release(p);
644 bc7cb1a1 2003-11-23 devnull } else {
645 bc7cb1a1 2003-11-23 devnull sptr = stable[c] = sfree;
646 bc7cb1a1 2003-11-23 devnull sfree = sfree->next;
647 bc7cb1a1 2003-11-23 devnull if(sfree == 0)
648 bc7cb1a1 2003-11-23 devnull goto sempty;
649 bc7cb1a1 2003-11-23 devnull sptr->next = 0;
651 bc7cb1a1 2003-11-23 devnull p = pop();
652 bc7cb1a1 2003-11-23 devnull sptr->val = p;
653 bc7cb1a1 2003-11-23 devnull continue;
654 bc7cb1a1 2003-11-23 devnull case 'l':
656 bc7cb1a1 2003-11-23 devnull continue;
657 bc7cb1a1 2003-11-23 devnull case 'L':
658 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
659 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
660 bc7cb1a1 2003-11-23 devnull if(sptr == 0) {
661 bc7cb1a1 2003-11-23 devnull error("L?\n");
663 bc7cb1a1 2003-11-23 devnull stable[c] = sptr->next;
664 bc7cb1a1 2003-11-23 devnull sptr->next = sfree;
665 bc7cb1a1 2003-11-23 devnull sfree = sptr;
666 bc7cb1a1 2003-11-23 devnull p = sptr->val;
667 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
668 bc7cb1a1 2003-11-23 devnull rewind(p);
669 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
670 bc7cb1a1 2003-11-23 devnull q = dcgetwd(p);
671 bc7cb1a1 2003-11-23 devnull if(q != 0)
672 bc7cb1a1 2003-11-23 devnull release(q);
675 bc7cb1a1 2003-11-23 devnull pushp(p);
676 bc7cb1a1 2003-11-23 devnull continue;
677 bc7cb1a1 2003-11-23 devnull case ':':
678 bc7cb1a1 2003-11-23 devnull p = pop();
680 bc7cb1a1 2003-11-23 devnull q = scalint(p);
681 bc7cb1a1 2003-11-23 devnull fsfile(q);
683 bc7cb1a1 2003-11-23 devnull if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) {
684 bc7cb1a1 2003-11-23 devnull error("neg index\n");
686 bc7cb1a1 2003-11-23 devnull if(length(q)>2) {
687 bc7cb1a1 2003-11-23 devnull error("index too big\n");
689 bc7cb1a1 2003-11-23 devnull if(sfbeg(q) == 0)
690 bc7cb1a1 2003-11-23 devnull c = c*100+sbackc(q);
691 bc7cb1a1 2003-11-23 devnull if(c >= MAXIND) {
692 bc7cb1a1 2003-11-23 devnull error("index too big\n");
694 bc7cb1a1 2003-11-23 devnull release(q);
695 bc7cb1a1 2003-11-23 devnull n = getstk() & 0377;
696 bc7cb1a1 2003-11-23 devnull sptr = stable[n];
697 bc7cb1a1 2003-11-23 devnull if(sptr == 0) {
698 bc7cb1a1 2003-11-23 devnull sptr = stable[n] = sfree;
699 bc7cb1a1 2003-11-23 devnull sfree = sfree->next;
700 bc7cb1a1 2003-11-23 devnull if(sfree == 0)
701 bc7cb1a1 2003-11-23 devnull goto sempty;
702 bc7cb1a1 2003-11-23 devnull sptr->next = 0;
703 bc7cb1a1 2003-11-23 devnull p = salloc((c+PTRSZ)*PTRSZ);
704 bc7cb1a1 2003-11-23 devnull zero(p);
705 bc7cb1a1 2003-11-23 devnull } else {
706 bc7cb1a1 2003-11-23 devnull p = sptr->val;
707 bc7cb1a1 2003-11-23 devnull if(length(p)-PTRSZ < c*PTRSZ) {
708 bc7cb1a1 2003-11-23 devnull q = copy(p,(c+PTRSZ)*PTRSZ);
709 bc7cb1a1 2003-11-23 devnull release(p);
713 bc7cb1a1 2003-11-23 devnull seekc(p,c*PTRSZ);
714 bc7cb1a1 2003-11-23 devnull q = lookwd(p);
715 bc7cb1a1 2003-11-23 devnull if(q!=0)
716 bc7cb1a1 2003-11-23 devnull release(q);
717 bc7cb1a1 2003-11-23 devnull s = pop();
719 bc7cb1a1 2003-11-23 devnull salterwd(p, s);
720 bc7cb1a1 2003-11-23 devnull sptr->val = p;
721 bc7cb1a1 2003-11-23 devnull continue;
722 bc7cb1a1 2003-11-23 devnull case ';':
723 bc7cb1a1 2003-11-23 devnull p = pop();
725 bc7cb1a1 2003-11-23 devnull q = scalint(p);
726 bc7cb1a1 2003-11-23 devnull fsfile(q);
728 bc7cb1a1 2003-11-23 devnull if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) {
729 bc7cb1a1 2003-11-23 devnull error("neg index\n");
731 bc7cb1a1 2003-11-23 devnull if(length(q)>2) {
732 bc7cb1a1 2003-11-23 devnull error("index too big\n");
734 bc7cb1a1 2003-11-23 devnull if(sfbeg(q) == 0)
735 bc7cb1a1 2003-11-23 devnull c = c*100+sbackc(q);
736 bc7cb1a1 2003-11-23 devnull if(c >= MAXIND) {
737 bc7cb1a1 2003-11-23 devnull error("index too big\n");
739 bc7cb1a1 2003-11-23 devnull release(q);
740 bc7cb1a1 2003-11-23 devnull n = getstk() & 0377;
741 bc7cb1a1 2003-11-23 devnull sptr = stable[n];
742 bc7cb1a1 2003-11-23 devnull if(sptr != 0){
743 bc7cb1a1 2003-11-23 devnull p = sptr->val;
744 bc7cb1a1 2003-11-23 devnull if(length(p)-PTRSZ >= c*PTRSZ) {
745 bc7cb1a1 2003-11-23 devnull seekc(p,c*PTRSZ);
746 bc7cb1a1 2003-11-23 devnull s = dcgetwd(p);
747 bc7cb1a1 2003-11-23 devnull if(s != 0) {
748 bc7cb1a1 2003-11-23 devnull q = copy(s,length(s));
749 bc7cb1a1 2003-11-23 devnull pushp(q);
750 bc7cb1a1 2003-11-23 devnull continue;
754 bc7cb1a1 2003-11-23 devnull q = salloc(1); /*so uninitialized array elt prints as 0*/
755 bc7cb1a1 2003-11-23 devnull sputc(q, 0);
756 bc7cb1a1 2003-11-23 devnull pushp(q);
757 bc7cb1a1 2003-11-23 devnull continue;
758 bc7cb1a1 2003-11-23 devnull case 'x':
759 bc7cb1a1 2003-11-23 devnull execute:
760 bc7cb1a1 2003-11-23 devnull p = pop();
762 bc7cb1a1 2003-11-23 devnull if((readptr != &readstk[0]) && (*readptr != 0)) {
763 bc7cb1a1 2003-11-23 devnull if((*readptr)->rd == (*readptr)->wt)
764 bc7cb1a1 2003-11-23 devnull release(*readptr);
766 bc7cb1a1 2003-11-23 devnull if(readptr++ == &readstk[RDSKSZ]) {
767 bc7cb1a1 2003-11-23 devnull error("nesting depth\n");
771 bc7cb1a1 2003-11-23 devnull readptr++;
772 bc7cb1a1 2003-11-23 devnull *readptr = p;
773 bc7cb1a1 2003-11-23 devnull if(p != 0)
774 bc7cb1a1 2003-11-23 devnull rewind(p);
776 bc7cb1a1 2003-11-23 devnull if((c = readc()) != '\n')
777 bc7cb1a1 2003-11-23 devnull unreadc(c);
779 bc7cb1a1 2003-11-23 devnull continue;
780 bc7cb1a1 2003-11-23 devnull case '?':
781 bc7cb1a1 2003-11-23 devnull if(++readptr == &readstk[RDSKSZ]) {
782 bc7cb1a1 2003-11-23 devnull error("nesting depth\n");
784 bc7cb1a1 2003-11-23 devnull *readptr = 0;
785 bc7cb1a1 2003-11-23 devnull fsave = curfile;
786 bc7cb1a1 2003-11-23 devnull curfile = &bin;
787 bc7cb1a1 2003-11-23 devnull while((c = readc()) == '!')
788 bc7cb1a1 2003-11-23 devnull command();
789 bc7cb1a1 2003-11-23 devnull p = salloc(0);
790 bc7cb1a1 2003-11-23 devnull sputc(p,c);
791 bc7cb1a1 2003-11-23 devnull while((c = readc()) != '\n') {
792 bc7cb1a1 2003-11-23 devnull sputc(p,c);
793 bc7cb1a1 2003-11-23 devnull if(c == '\\')
794 bc7cb1a1 2003-11-23 devnull sputc(p,readc());
796 bc7cb1a1 2003-11-23 devnull curfile = fsave;
797 bc7cb1a1 2003-11-23 devnull *readptr = p;
798 bc7cb1a1 2003-11-23 devnull continue;
799 bc7cb1a1 2003-11-23 devnull case '!':
800 bc7cb1a1 2003-11-23 devnull if(command() == 1)
801 bc7cb1a1 2003-11-23 devnull goto execute;
802 bc7cb1a1 2003-11-23 devnull continue;
803 bc7cb1a1 2003-11-23 devnull case '<':
804 bc7cb1a1 2003-11-23 devnull case '>':
805 bc7cb1a1 2003-11-23 devnull case '=':
806 bc7cb1a1 2003-11-23 devnull if(cond(c) == 1)
807 bc7cb1a1 2003-11-23 devnull goto execute;
808 bc7cb1a1 2003-11-23 devnull continue;
809 bc7cb1a1 2003-11-23 devnull default:
810 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%o is unimplemented\n",c);
816 bc7cb1a1 2003-11-23 devnull div(Blk *ddivd, Blk *ddivr)
818 bc7cb1a1 2003-11-23 devnull int divsign, remsign, offset, divcarry,
819 bc7cb1a1 2003-11-23 devnull carry, dig, magic, d, dd, under, first;
820 bc7cb1a1 2003-11-23 devnull long c, td, cc;
821 bc7cb1a1 2003-11-23 devnull Blk *ps, *px, *p, *divd, *divr;
823 bc7cb1a1 2003-11-23 devnull dig = 0;
824 bc7cb1a1 2003-11-23 devnull under = 0;
825 bc7cb1a1 2003-11-23 devnull divcarry = 0;
826 bc7cb1a1 2003-11-23 devnull rem = 0;
827 bc7cb1a1 2003-11-23 devnull p = salloc(0);
828 bc7cb1a1 2003-11-23 devnull if(length(ddivr) == 0) {
829 bc7cb1a1 2003-11-23 devnull pushp(ddivr);
830 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"divide by 0\n");
831 bc7cb1a1 2003-11-23 devnull return(p);
833 bc7cb1a1 2003-11-23 devnull divsign = remsign = first = 0;
834 bc7cb1a1 2003-11-23 devnull divr = ddivr;
835 bc7cb1a1 2003-11-23 devnull fsfile(divr);
836 bc7cb1a1 2003-11-23 devnull if(sbackc(divr) == -1) {
837 bc7cb1a1 2003-11-23 devnull divr = copy(ddivr,length(ddivr));
838 bc7cb1a1 2003-11-23 devnull chsign(divr);
839 bc7cb1a1 2003-11-23 devnull divsign = ~divsign;
841 bc7cb1a1 2003-11-23 devnull divd = copy(ddivd,length(ddivd));
842 bc7cb1a1 2003-11-23 devnull fsfile(divd);
843 bc7cb1a1 2003-11-23 devnull if(sfbeg(divd) == 0 && sbackc(divd) == -1) {
844 bc7cb1a1 2003-11-23 devnull chsign(divd);
845 bc7cb1a1 2003-11-23 devnull divsign = ~divsign;
846 bc7cb1a1 2003-11-23 devnull remsign = ~remsign;
848 bc7cb1a1 2003-11-23 devnull offset = length(divd) - length(divr);
849 bc7cb1a1 2003-11-23 devnull if(offset < 0)
850 bc7cb1a1 2003-11-23 devnull goto ddone;
851 bc7cb1a1 2003-11-23 devnull seekc(p,offset+1);
852 bc7cb1a1 2003-11-23 devnull sputc(divd,0);
853 bc7cb1a1 2003-11-23 devnull magic = 0;
854 bc7cb1a1 2003-11-23 devnull fsfile(divr);
855 bc7cb1a1 2003-11-23 devnull c = sbackc(divr);
856 bc7cb1a1 2003-11-23 devnull if(c < 10)
857 bc7cb1a1 2003-11-23 devnull magic++;
858 bc7cb1a1 2003-11-23 devnull c = c * 100 + (sfbeg(divr)?0:sbackc(divr));
859 bc7cb1a1 2003-11-23 devnull if(magic>0){
860 bc7cb1a1 2003-11-23 devnull c = (c * 100 +(sfbeg(divr)?0:sbackc(divr)))*2;
861 bc7cb1a1 2003-11-23 devnull c /= 25;
863 bc7cb1a1 2003-11-23 devnull while(offset >= 0) {
864 bc7cb1a1 2003-11-23 devnull first++;
865 bc7cb1a1 2003-11-23 devnull fsfile(divd);
866 bc7cb1a1 2003-11-23 devnull td = sbackc(divd) * 100;
867 bc7cb1a1 2003-11-23 devnull dd = sfbeg(divd)?0:sbackc(divd);
868 bc7cb1a1 2003-11-23 devnull td = (td + dd) * 100;
869 bc7cb1a1 2003-11-23 devnull dd = sfbeg(divd)?0:sbackc(divd);
870 bc7cb1a1 2003-11-23 devnull td = td + dd;
872 bc7cb1a1 2003-11-23 devnull if(offset == 0)
876 bc7cb1a1 2003-11-23 devnull if(magic != 0)
877 bc7cb1a1 2003-11-23 devnull td = td<<3;
878 bc7cb1a1 2003-11-23 devnull dig = td/cc;
879 bc7cb1a1 2003-11-23 devnull under=0;
880 bc7cb1a1 2003-11-23 devnull if(td%cc < 8 && dig > 0 && magic) {
882 bc7cb1a1 2003-11-23 devnull under=1;
884 bc7cb1a1 2003-11-23 devnull rewind(divr);
885 bc7cb1a1 2003-11-23 devnull rewind(divxyz);
886 bc7cb1a1 2003-11-23 devnull carry = 0;
887 bc7cb1a1 2003-11-23 devnull while(sfeof(divr) == 0) {
888 bc7cb1a1 2003-11-23 devnull d = sgetc(divr)*dig+carry;
889 bc7cb1a1 2003-11-23 devnull carry = d / 100;
890 bc7cb1a1 2003-11-23 devnull salterc(divxyz,d%100);
892 bc7cb1a1 2003-11-23 devnull salterc(divxyz,carry);
893 bc7cb1a1 2003-11-23 devnull rewind(divxyz);
894 bc7cb1a1 2003-11-23 devnull seekc(divd,offset);
895 bc7cb1a1 2003-11-23 devnull carry = 0;
896 bc7cb1a1 2003-11-23 devnull while(sfeof(divd) == 0) {
897 bc7cb1a1 2003-11-23 devnull d = slookc(divd);
898 bc7cb1a1 2003-11-23 devnull d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry;
899 bc7cb1a1 2003-11-23 devnull carry = 0;
900 bc7cb1a1 2003-11-23 devnull if(d < 0) {
901 bc7cb1a1 2003-11-23 devnull d += 100;
902 bc7cb1a1 2003-11-23 devnull carry = 1;
904 bc7cb1a1 2003-11-23 devnull salterc(divd,d);
906 bc7cb1a1 2003-11-23 devnull divcarry = carry;
907 bc7cb1a1 2003-11-23 devnull backc(p);
908 bc7cb1a1 2003-11-23 devnull salterc(p,dig);
909 bc7cb1a1 2003-11-23 devnull backc(p);
910 bc7cb1a1 2003-11-23 devnull fsfile(divd);
911 bc7cb1a1 2003-11-23 devnull d=sbackc(divd);
912 bc7cb1a1 2003-11-23 devnull if((d != 0) && /*!divcarry*/ (offset != 0)) {
913 bc7cb1a1 2003-11-23 devnull d = sbackc(divd) + 100;
914 bc7cb1a1 2003-11-23 devnull salterc(divd,d);
916 bc7cb1a1 2003-11-23 devnull if(--offset >= 0)
917 bc7cb1a1 2003-11-23 devnull divd->wt--;
919 bc7cb1a1 2003-11-23 devnull if(under) { /* undershot last - adjust*/
920 bc7cb1a1 2003-11-23 devnull px = copy(divr,length(divr)); /*11/88 don't corrupt ddivr*/
921 bc7cb1a1 2003-11-23 devnull chsign(px);
922 bc7cb1a1 2003-11-23 devnull ps = add(px,divd);
923 bc7cb1a1 2003-11-23 devnull fsfile(ps);
924 bc7cb1a1 2003-11-23 devnull if(length(ps) > 0 && sbackc(ps) < 0) {
925 bc7cb1a1 2003-11-23 devnull release(ps); /*only adjust in really undershot*/
926 bc7cb1a1 2003-11-23 devnull } else {
927 bc7cb1a1 2003-11-23 devnull release(divd);
928 bc7cb1a1 2003-11-23 devnull salterc(p, dig+1);
929 bc7cb1a1 2003-11-23 devnull divd=ps;
932 bc7cb1a1 2003-11-23 devnull if(divcarry != 0) {
933 bc7cb1a1 2003-11-23 devnull salterc(p,dig-1);
934 bc7cb1a1 2003-11-23 devnull salterc(divd,-1);
935 bc7cb1a1 2003-11-23 devnull ps = add(divr,divd);
936 bc7cb1a1 2003-11-23 devnull release(divd);
937 bc7cb1a1 2003-11-23 devnull divd = ps;
940 bc7cb1a1 2003-11-23 devnull rewind(p);
941 bc7cb1a1 2003-11-23 devnull divcarry = 0;
942 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0){
943 bc7cb1a1 2003-11-23 devnull d = slookc(p)+divcarry;
944 bc7cb1a1 2003-11-23 devnull divcarry = 0;
945 bc7cb1a1 2003-11-23 devnull if(d >= 100){
946 bc7cb1a1 2003-11-23 devnull d -= 100;
947 bc7cb1a1 2003-11-23 devnull divcarry = 1;
949 bc7cb1a1 2003-11-23 devnull salterc(p,d);
951 bc7cb1a1 2003-11-23 devnull if(divcarry != 0)salterc(p,divcarry);
952 bc7cb1a1 2003-11-23 devnull fsfile(p);
953 bc7cb1a1 2003-11-23 devnull while(sfbeg(p) == 0) {
954 bc7cb1a1 2003-11-23 devnull if(sbackc(p) != 0)
956 bc7cb1a1 2003-11-23 devnull truncate(p);
958 bc7cb1a1 2003-11-23 devnull if(divsign < 0)
959 bc7cb1a1 2003-11-23 devnull chsign(p);
960 bc7cb1a1 2003-11-23 devnull fsfile(divd);
961 bc7cb1a1 2003-11-23 devnull while(sfbeg(divd) == 0) {
962 bc7cb1a1 2003-11-23 devnull if(sbackc(divd) != 0)
964 bc7cb1a1 2003-11-23 devnull truncate(divd);
967 bc7cb1a1 2003-11-23 devnull if(remsign<0)
968 bc7cb1a1 2003-11-23 devnull chsign(divd);
969 bc7cb1a1 2003-11-23 devnull if(divr != ddivr)
970 bc7cb1a1 2003-11-23 devnull release(divr);
971 bc7cb1a1 2003-11-23 devnull rem = divd;
972 bc7cb1a1 2003-11-23 devnull return(p);
976 bc7cb1a1 2003-11-23 devnull dscale(void)
978 bc7cb1a1 2003-11-23 devnull Blk *dd, *dr, *r;
981 bc7cb1a1 2003-11-23 devnull dr = pop();
983 bc7cb1a1 2003-11-23 devnull dd = pop();
984 bc7cb1a1 2003-11-23 devnull EMPTYSR(dr);
985 bc7cb1a1 2003-11-23 devnull fsfile(dd);
986 bc7cb1a1 2003-11-23 devnull skd = sunputc(dd);
987 bc7cb1a1 2003-11-23 devnull fsfile(dr);
988 bc7cb1a1 2003-11-23 devnull skr = sunputc(dr);
989 bc7cb1a1 2003-11-23 devnull if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)) {
990 bc7cb1a1 2003-11-23 devnull sputc(dr,skr);
991 bc7cb1a1 2003-11-23 devnull pushp(dr);
992 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"divide by 0\n");
993 bc7cb1a1 2003-11-23 devnull return(1);
995 bc7cb1a1 2003-11-23 devnull if(sfbeg(dd) == 1 || (sfbeg(dd) == 0 && sbackc(dd) == 0)) {
996 bc7cb1a1 2003-11-23 devnull sputc(dd,skd);
997 bc7cb1a1 2003-11-23 devnull pushp(dd);
998 bc7cb1a1 2003-11-23 devnull return(1);
1000 bc7cb1a1 2003-11-23 devnull c = k-skd+skr;
1001 bc7cb1a1 2003-11-23 devnull if(c < 0)
1002 bc7cb1a1 2003-11-23 devnull r = removr(dd,-c);
1004 bc7cb1a1 2003-11-23 devnull r = add0(dd,c);
1005 bc7cb1a1 2003-11-23 devnull irem = 0;
1007 bc7cb1a1 2003-11-23 devnull arg1 = r;
1008 bc7cb1a1 2003-11-23 devnull arg2 = dr;
1009 bc7cb1a1 2003-11-23 devnull savk = k;
1010 bc7cb1a1 2003-11-23 devnull return(0);
1014 bc7cb1a1 2003-11-23 devnull removr(Blk *p, int n)
1016 bc7cb1a1 2003-11-23 devnull int nn, neg;
1017 bc7cb1a1 2003-11-23 devnull Blk *q, *s, *r;
1019 bc7cb1a1 2003-11-23 devnull fsfile(p);
1020 bc7cb1a1 2003-11-23 devnull neg = sbackc(p);
1021 bc7cb1a1 2003-11-23 devnull if(neg < 0)
1022 bc7cb1a1 2003-11-23 devnull chsign(p);
1023 bc7cb1a1 2003-11-23 devnull rewind(p);
1024 bc7cb1a1 2003-11-23 devnull nn = (n+1)/2;
1025 bc7cb1a1 2003-11-23 devnull q = salloc(nn);
1026 bc7cb1a1 2003-11-23 devnull while(n>1) {
1027 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1028 bc7cb1a1 2003-11-23 devnull n -= 2;
1030 bc7cb1a1 2003-11-23 devnull r = salloc(2);
1031 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0)
1032 bc7cb1a1 2003-11-23 devnull sputc(r,sgetc(p));
1033 bc7cb1a1 2003-11-23 devnull release(p);
1034 bc7cb1a1 2003-11-23 devnull if(n == 1){
1035 bc7cb1a1 2003-11-23 devnull s = div(r,tenptr);
1036 bc7cb1a1 2003-11-23 devnull release(r);
1037 bc7cb1a1 2003-11-23 devnull rewind(rem);
1038 bc7cb1a1 2003-11-23 devnull if(sfeof(rem) == 0)
1039 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(rem));
1040 bc7cb1a1 2003-11-23 devnull release(rem);
1041 bc7cb1a1 2003-11-23 devnull if(neg < 0){
1042 bc7cb1a1 2003-11-23 devnull chsign(s);
1043 bc7cb1a1 2003-11-23 devnull chsign(q);
1044 bc7cb1a1 2003-11-23 devnull irem = q;
1045 bc7cb1a1 2003-11-23 devnull return(s);
1047 bc7cb1a1 2003-11-23 devnull irem = q;
1048 bc7cb1a1 2003-11-23 devnull return(s);
1050 bc7cb1a1 2003-11-23 devnull if(neg < 0) {
1051 bc7cb1a1 2003-11-23 devnull chsign(r);
1052 bc7cb1a1 2003-11-23 devnull chsign(q);
1053 bc7cb1a1 2003-11-23 devnull irem = q;
1054 bc7cb1a1 2003-11-23 devnull return(r);
1056 bc7cb1a1 2003-11-23 devnull irem = q;
1057 bc7cb1a1 2003-11-23 devnull return(r);
1061 bc7cb1a1 2003-11-23 devnull dcsqrt(Blk *p)
1063 bc7cb1a1 2003-11-23 devnull Blk *t, *r, *q, *s;
1064 bc7cb1a1 2003-11-23 devnull int c, n, nn;
1066 bc7cb1a1 2003-11-23 devnull n = length(p);
1067 bc7cb1a1 2003-11-23 devnull fsfile(p);
1068 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1069 bc7cb1a1 2003-11-23 devnull if((n&1) != 1)
1070 bc7cb1a1 2003-11-23 devnull c = c*100+(sfbeg(p)?0:sbackc(p));
1071 bc7cb1a1 2003-11-23 devnull n = (n+1)>>1;
1072 bc7cb1a1 2003-11-23 devnull r = salloc(n);
1073 bc7cb1a1 2003-11-23 devnull zero(r);
1074 bc7cb1a1 2003-11-23 devnull seekc(r,n);
1076 bc7cb1a1 2003-11-23 devnull while((c -= nn)>=0)
1078 bc7cb1a1 2003-11-23 devnull c=(nn+1)>>1;
1079 bc7cb1a1 2003-11-23 devnull fsfile(r);
1080 bc7cb1a1 2003-11-23 devnull backc(r);
1081 bc7cb1a1 2003-11-23 devnull if(c>=100) {
1082 bc7cb1a1 2003-11-23 devnull c -= 100;
1083 bc7cb1a1 2003-11-23 devnull salterc(r,c);
1084 bc7cb1a1 2003-11-23 devnull sputc(r,1);
1086 bc7cb1a1 2003-11-23 devnull salterc(r,c);
1087 bc7cb1a1 2003-11-23 devnull for(;;){
1088 bc7cb1a1 2003-11-23 devnull q = div(p,r);
1089 bc7cb1a1 2003-11-23 devnull s = add(q,r);
1090 bc7cb1a1 2003-11-23 devnull release(q);
1091 bc7cb1a1 2003-11-23 devnull release(rem);
1092 bc7cb1a1 2003-11-23 devnull q = div(s,sqtemp);
1093 bc7cb1a1 2003-11-23 devnull release(s);
1094 bc7cb1a1 2003-11-23 devnull release(rem);
1095 bc7cb1a1 2003-11-23 devnull s = copy(r,length(r));
1096 bc7cb1a1 2003-11-23 devnull chsign(s);
1097 bc7cb1a1 2003-11-23 devnull t = add(s,q);
1098 bc7cb1a1 2003-11-23 devnull release(s);
1099 bc7cb1a1 2003-11-23 devnull fsfile(t);
1100 bc7cb1a1 2003-11-23 devnull nn = sfbeg(t)?0:sbackc(t);
1101 bc7cb1a1 2003-11-23 devnull if(nn>=0)
1103 bc7cb1a1 2003-11-23 devnull release(r);
1104 bc7cb1a1 2003-11-23 devnull release(t);
1107 bc7cb1a1 2003-11-23 devnull release(t);
1108 bc7cb1a1 2003-11-23 devnull release(q);
1109 bc7cb1a1 2003-11-23 devnull release(p);
1110 bc7cb1a1 2003-11-23 devnull return(r);
1114 bc7cb1a1 2003-11-23 devnull dcexp(Blk *base, Blk *ex)
1116 bc7cb1a1 2003-11-23 devnull Blk *r, *e, *p, *e1, *t, *cp;
1117 bc7cb1a1 2003-11-23 devnull int temp, c, n;
1119 bc7cb1a1 2003-11-23 devnull r = salloc(1);
1120 bc7cb1a1 2003-11-23 devnull sputc(r,1);
1121 bc7cb1a1 2003-11-23 devnull p = copy(base,length(base));
1122 bc7cb1a1 2003-11-23 devnull e = copy(ex,length(ex));
1123 bc7cb1a1 2003-11-23 devnull fsfile(e);
1124 bc7cb1a1 2003-11-23 devnull if(sfbeg(e) != 0)
1125 bc7cb1a1 2003-11-23 devnull goto edone;
1126 bc7cb1a1 2003-11-23 devnull temp=0;
1127 bc7cb1a1 2003-11-23 devnull c = sbackc(e);
1128 bc7cb1a1 2003-11-23 devnull if(c<0) {
1129 bc7cb1a1 2003-11-23 devnull temp++;
1130 bc7cb1a1 2003-11-23 devnull chsign(e);
1132 bc7cb1a1 2003-11-23 devnull while(length(e) != 0) {
1133 bc7cb1a1 2003-11-23 devnull e1=div(e,sqtemp);
1134 bc7cb1a1 2003-11-23 devnull release(e);
1135 bc7cb1a1 2003-11-23 devnull e = e1;
1136 bc7cb1a1 2003-11-23 devnull n = length(rem);
1137 bc7cb1a1 2003-11-23 devnull release(rem);
1138 bc7cb1a1 2003-11-23 devnull if(n != 0) {
1139 bc7cb1a1 2003-11-23 devnull e1=mult(p,r);
1140 bc7cb1a1 2003-11-23 devnull release(r);
1141 bc7cb1a1 2003-11-23 devnull r = e1;
1143 bc7cb1a1 2003-11-23 devnull t = copy(p,length(p));
1144 bc7cb1a1 2003-11-23 devnull cp = mult(p,t);
1145 bc7cb1a1 2003-11-23 devnull release(p);
1146 bc7cb1a1 2003-11-23 devnull release(t);
1147 bc7cb1a1 2003-11-23 devnull p = cp;
1149 bc7cb1a1 2003-11-23 devnull if(temp != 0) {
1150 bc7cb1a1 2003-11-23 devnull if((c = length(base)) == 0) {
1151 bc7cb1a1 2003-11-23 devnull goto edone;
1153 bc7cb1a1 2003-11-23 devnull if(c>1)
1154 bc7cb1a1 2003-11-23 devnull create(r);
1156 bc7cb1a1 2003-11-23 devnull rewind(base);
1157 bc7cb1a1 2003-11-23 devnull if((c = sgetc(base))<=1) {
1158 bc7cb1a1 2003-11-23 devnull create(r);
1159 bc7cb1a1 2003-11-23 devnull sputc(r,c);
1161 bc7cb1a1 2003-11-23 devnull create(r);
1165 bc7cb1a1 2003-11-23 devnull release(p);
1166 bc7cb1a1 2003-11-23 devnull release(e);
1167 bc7cb1a1 2003-11-23 devnull return(r);
1171 bc7cb1a1 2003-11-23 devnull init(int argc, char *argv[])
1173 bc7cb1a1 2003-11-23 devnull Sym *sp;
1174 bc7cb1a1 2003-11-23 devnull Dir *d;
1176 bc7cb1a1 2003-11-23 devnull ARGBEGIN {
1177 bc7cb1a1 2003-11-23 devnull default:
1178 bc7cb1a1 2003-11-23 devnull dbg = 1;
1180 bc7cb1a1 2003-11-23 devnull } ARGEND
1181 bc7cb1a1 2003-11-23 devnull ifile = 1;
1182 bc7cb1a1 2003-11-23 devnull curfile = &bin;
1183 bc7cb1a1 2003-11-23 devnull if(*argv){
1184 bc7cb1a1 2003-11-23 devnull d = dirstat(*argv);
1185 bc7cb1a1 2003-11-23 devnull if(d == nil) {
1186 bc7cb1a1 2003-11-23 devnull fprint(2, "dc: can't open file %s\n", *argv);
1187 bc7cb1a1 2003-11-23 devnull exits("open");
1189 bc7cb1a1 2003-11-23 devnull if(d->mode & DMDIR) {
1190 bc7cb1a1 2003-11-23 devnull fprint(2, "dc: file %s is a directory\n", *argv);
1191 bc7cb1a1 2003-11-23 devnull exits("open");
1193 bc7cb1a1 2003-11-23 devnull free(d);
1194 bc7cb1a1 2003-11-23 devnull if((curfile = Bopen(*argv, OREAD)) == 0) {
1195 bc7cb1a1 2003-11-23 devnull fprint(2,"dc: can't open file %s\n", *argv);
1196 bc7cb1a1 2003-11-23 devnull exits("open");
1199 bc7cb1a1 2003-11-23 devnull /* dummy = malloc(0); *//* prepare for garbage-collection */
1200 bc7cb1a1 2003-11-23 devnull scalptr = salloc(1);
1201 bc7cb1a1 2003-11-23 devnull sputc(scalptr,0);
1202 bc7cb1a1 2003-11-23 devnull basptr = salloc(1);
1203 bc7cb1a1 2003-11-23 devnull sputc(basptr,10);
1204 bc7cb1a1 2003-11-23 devnull obase=10;
1205 bc7cb1a1 2003-11-23 devnull logten=log2(10L);
1209 bc7cb1a1 2003-11-23 devnull tenptr = salloc(1);
1210 bc7cb1a1 2003-11-23 devnull sputc(tenptr,10);
1211 bc7cb1a1 2003-11-23 devnull obase=10;
1212 bc7cb1a1 2003-11-23 devnull inbas = salloc(1);
1213 bc7cb1a1 2003-11-23 devnull sputc(inbas,10);
1214 bc7cb1a1 2003-11-23 devnull sqtemp = salloc(1);
1215 bc7cb1a1 2003-11-23 devnull sputc(sqtemp,2);
1216 bc7cb1a1 2003-11-23 devnull chptr = salloc(0);
1217 bc7cb1a1 2003-11-23 devnull strptr = salloc(0);
1218 bc7cb1a1 2003-11-23 devnull divxyz = salloc(0);
1219 bc7cb1a1 2003-11-23 devnull stkbeg = stkptr = &stack[0];
1220 bc7cb1a1 2003-11-23 devnull stkend = &stack[STKSZ];
1221 bc7cb1a1 2003-11-23 devnull stkerr = 0;
1222 bc7cb1a1 2003-11-23 devnull readptr = &readstk[0];
1224 bc7cb1a1 2003-11-23 devnull sp = sptr = &symlst[0];
1225 bc7cb1a1 2003-11-23 devnull while(sptr < &symlst[TBLSZ]) {
1226 bc7cb1a1 2003-11-23 devnull sptr->next = ++sp;
1227 bc7cb1a1 2003-11-23 devnull sptr++;
1229 bc7cb1a1 2003-11-23 devnull sptr->next=0;
1230 bc7cb1a1 2003-11-23 devnull sfree = &symlst[0];
1234 bc7cb1a1 2003-11-23 devnull pushp(Blk *p)
1236 bc7cb1a1 2003-11-23 devnull if(stkptr == stkend) {
1237 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"out of stack space\n");
1238 bc7cb1a1 2003-11-23 devnull return;
1240 bc7cb1a1 2003-11-23 devnull stkerr=0;
1241 bc7cb1a1 2003-11-23 devnull *++stkptr = p;
1242 bc7cb1a1 2003-11-23 devnull return;
1246 bc7cb1a1 2003-11-23 devnull pop(void)
1248 bc7cb1a1 2003-11-23 devnull if(stkptr == stack) {
1249 bc7cb1a1 2003-11-23 devnull stkerr=1;
1250 bc7cb1a1 2003-11-23 devnull return(0);
1252 bc7cb1a1 2003-11-23 devnull return(*stkptr--);
1256 bc7cb1a1 2003-11-23 devnull readin(void)
1258 bc7cb1a1 2003-11-23 devnull Blk *p, *q;
1259 bc7cb1a1 2003-11-23 devnull int dp, dpct, c;
1261 bc7cb1a1 2003-11-23 devnull dp = dpct=0;
1262 bc7cb1a1 2003-11-23 devnull p = salloc(0);
1263 bc7cb1a1 2003-11-23 devnull for(;;){
1264 bc7cb1a1 2003-11-23 devnull c = readc();
1265 bc7cb1a1 2003-11-23 devnull switch(c) {
1266 bc7cb1a1 2003-11-23 devnull case '.':
1267 bc7cb1a1 2003-11-23 devnull if(dp != 0)
1268 bc7cb1a1 2003-11-23 devnull goto gotnum;
1270 bc7cb1a1 2003-11-23 devnull continue;
1271 bc7cb1a1 2003-11-23 devnull case '\\':
1272 bc7cb1a1 2003-11-23 devnull readc();
1273 bc7cb1a1 2003-11-23 devnull continue;
1274 bc7cb1a1 2003-11-23 devnull default:
1275 bc7cb1a1 2003-11-23 devnull if(c >= 'A' && c <= 'F')
1276 bc7cb1a1 2003-11-23 devnull c = c - 'A' + 10;
1278 bc7cb1a1 2003-11-23 devnull if(c >= '0' && c <= '9')
1279 bc7cb1a1 2003-11-23 devnull c -= '0';
1281 bc7cb1a1 2003-11-23 devnull goto gotnum;
1282 bc7cb1a1 2003-11-23 devnull if(dp != 0) {
1283 bc7cb1a1 2003-11-23 devnull if(dpct >= 99)
1284 bc7cb1a1 2003-11-23 devnull continue;
1285 bc7cb1a1 2003-11-23 devnull dpct++;
1287 bc7cb1a1 2003-11-23 devnull create(chptr);
1288 bc7cb1a1 2003-11-23 devnull if(c != 0)
1289 bc7cb1a1 2003-11-23 devnull sputc(chptr,c);
1290 bc7cb1a1 2003-11-23 devnull q = mult(p,inbas);
1291 bc7cb1a1 2003-11-23 devnull release(p);
1292 bc7cb1a1 2003-11-23 devnull p = add(chptr,q);
1293 bc7cb1a1 2003-11-23 devnull release(q);
1296 bc7cb1a1 2003-11-23 devnull gotnum:
1297 bc7cb1a1 2003-11-23 devnull unreadc(c);
1298 bc7cb1a1 2003-11-23 devnull if(dp == 0) {
1299 bc7cb1a1 2003-11-23 devnull sputc(p,0);
1300 bc7cb1a1 2003-11-23 devnull return(p);
1301 bc7cb1a1 2003-11-23 devnull } else {
1302 bc7cb1a1 2003-11-23 devnull q = scale(p,dpct);
1303 bc7cb1a1 2003-11-23 devnull return(q);
1308 bc7cb1a1 2003-11-23 devnull * returns pointer to struct with ct 0's & p
1311 bc7cb1a1 2003-11-23 devnull add0(Blk *p, int ct)
1313 bc7cb1a1 2003-11-23 devnull Blk *q, *t;
1315 bc7cb1a1 2003-11-23 devnull q = salloc(length(p)+(ct+1)/2);
1316 bc7cb1a1 2003-11-23 devnull while(ct>1) {
1317 bc7cb1a1 2003-11-23 devnull sputc(q,0);
1318 bc7cb1a1 2003-11-23 devnull ct -= 2;
1320 bc7cb1a1 2003-11-23 devnull rewind(p);
1321 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
1322 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1324 bc7cb1a1 2003-11-23 devnull release(p);
1325 bc7cb1a1 2003-11-23 devnull if(ct == 1) {
1326 bc7cb1a1 2003-11-23 devnull t = mult(tenptr,q);
1327 bc7cb1a1 2003-11-23 devnull release(q);
1328 bc7cb1a1 2003-11-23 devnull return(t);
1330 bc7cb1a1 2003-11-23 devnull return(q);
1334 bc7cb1a1 2003-11-23 devnull mult(Blk *p, Blk *q)
1336 bc7cb1a1 2003-11-23 devnull Blk *mp, *mq, *mr;
1337 bc7cb1a1 2003-11-23 devnull int sign, offset, carry;
1338 bc7cb1a1 2003-11-23 devnull int cq, cp, mt, mcr;
1340 bc7cb1a1 2003-11-23 devnull offset = sign = 0;
1341 bc7cb1a1 2003-11-23 devnull fsfile(p);
1342 bc7cb1a1 2003-11-23 devnull mp = p;
1343 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0) {
1344 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
1345 bc7cb1a1 2003-11-23 devnull mp = copy(p,length(p));
1346 bc7cb1a1 2003-11-23 devnull chsign(mp);
1347 bc7cb1a1 2003-11-23 devnull sign = ~sign;
1350 bc7cb1a1 2003-11-23 devnull fsfile(q);
1351 bc7cb1a1 2003-11-23 devnull mq = q;
1352 bc7cb1a1 2003-11-23 devnull if(sfbeg(q) == 0){
1353 bc7cb1a1 2003-11-23 devnull if(sbackc(q)<0) {
1354 bc7cb1a1 2003-11-23 devnull mq = copy(q,length(q));
1355 bc7cb1a1 2003-11-23 devnull chsign(mq);
1356 bc7cb1a1 2003-11-23 devnull sign = ~sign;
1359 bc7cb1a1 2003-11-23 devnull mr = salloc(length(mp)+length(mq));
1360 bc7cb1a1 2003-11-23 devnull zero(mr);
1361 bc7cb1a1 2003-11-23 devnull rewind(mq);
1362 bc7cb1a1 2003-11-23 devnull while(sfeof(mq) == 0) {
1363 bc7cb1a1 2003-11-23 devnull cq = sgetc(mq);
1364 bc7cb1a1 2003-11-23 devnull rewind(mp);
1365 bc7cb1a1 2003-11-23 devnull rewind(mr);
1366 bc7cb1a1 2003-11-23 devnull mr->rd += offset;
1367 bc7cb1a1 2003-11-23 devnull carry=0;
1368 bc7cb1a1 2003-11-23 devnull while(sfeof(mp) == 0) {
1369 bc7cb1a1 2003-11-23 devnull cp = sgetc(mp);
1370 bc7cb1a1 2003-11-23 devnull mcr = sfeof(mr)?0:slookc(mr);
1371 bc7cb1a1 2003-11-23 devnull mt = cp*cq + carry + mcr;
1372 bc7cb1a1 2003-11-23 devnull carry = mt/100;
1373 bc7cb1a1 2003-11-23 devnull salterc(mr,mt%100);
1375 bc7cb1a1 2003-11-23 devnull offset++;
1376 bc7cb1a1 2003-11-23 devnull if(carry != 0) {
1377 bc7cb1a1 2003-11-23 devnull mcr = sfeof(mr)?0:slookc(mr);
1378 bc7cb1a1 2003-11-23 devnull salterc(mr,mcr+carry);
1381 bc7cb1a1 2003-11-23 devnull if(sign < 0) {
1382 bc7cb1a1 2003-11-23 devnull chsign(mr);
1384 bc7cb1a1 2003-11-23 devnull if(mp != p)
1385 bc7cb1a1 2003-11-23 devnull release(mp);
1386 bc7cb1a1 2003-11-23 devnull if(mq != q)
1387 bc7cb1a1 2003-11-23 devnull release(mq);
1388 bc7cb1a1 2003-11-23 devnull return(mr);
1392 bc7cb1a1 2003-11-23 devnull chsign(Blk *p)
1394 bc7cb1a1 2003-11-23 devnull int carry;
1395 bc7cb1a1 2003-11-23 devnull char ct;
1397 bc7cb1a1 2003-11-23 devnull carry=0;
1398 bc7cb1a1 2003-11-23 devnull rewind(p);
1399 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
1400 bc7cb1a1 2003-11-23 devnull ct=100-slookc(p)-carry;
1401 bc7cb1a1 2003-11-23 devnull carry=1;
1402 bc7cb1a1 2003-11-23 devnull if(ct>=100) {
1403 bc7cb1a1 2003-11-23 devnull ct -= 100;
1404 bc7cb1a1 2003-11-23 devnull carry=0;
1406 bc7cb1a1 2003-11-23 devnull salterc(p,ct);
1408 bc7cb1a1 2003-11-23 devnull if(carry != 0) {
1409 bc7cb1a1 2003-11-23 devnull sputc(p,-1);
1410 bc7cb1a1 2003-11-23 devnull fsfile(p);
1411 bc7cb1a1 2003-11-23 devnull backc(p);
1412 bc7cb1a1 2003-11-23 devnull ct = sbackc(p);
1413 bc7cb1a1 2003-11-23 devnull if(ct == 99 /*&& !sfbeg(p)*/) {
1414 bc7cb1a1 2003-11-23 devnull truncate(p);
1415 bc7cb1a1 2003-11-23 devnull sputc(p,-1);
1417 bc7cb1a1 2003-11-23 devnull } else{
1418 bc7cb1a1 2003-11-23 devnull fsfile(p);
1419 bc7cb1a1 2003-11-23 devnull ct = sbackc(p);
1420 bc7cb1a1 2003-11-23 devnull if(ct == 0)
1421 bc7cb1a1 2003-11-23 devnull truncate(p);
1423 bc7cb1a1 2003-11-23 devnull return;
1427 bc7cb1a1 2003-11-23 devnull readc(void)
1430 bc7cb1a1 2003-11-23 devnull if((readptr != &readstk[0]) && (*readptr != 0)) {
1431 bc7cb1a1 2003-11-23 devnull if(sfeof(*readptr) == 0)
1432 bc7cb1a1 2003-11-23 devnull return(lastchar = sgetc(*readptr));
1433 bc7cb1a1 2003-11-23 devnull release(*readptr);
1434 bc7cb1a1 2003-11-23 devnull readptr--;
1435 bc7cb1a1 2003-11-23 devnull goto loop;
1437 bc7cb1a1 2003-11-23 devnull lastchar = Bgetc(curfile);
1438 bc7cb1a1 2003-11-23 devnull if(lastchar != -1)
1439 bc7cb1a1 2003-11-23 devnull return(lastchar);
1440 bc7cb1a1 2003-11-23 devnull if(readptr != &readptr[0]) {
1441 bc7cb1a1 2003-11-23 devnull readptr--;
1442 bc7cb1a1 2003-11-23 devnull if(*readptr == 0)
1443 bc7cb1a1 2003-11-23 devnull curfile = &bin;
1444 bc7cb1a1 2003-11-23 devnull goto loop;
1446 bc7cb1a1 2003-11-23 devnull if(curfile != &bin) {
1447 bc7cb1a1 2003-11-23 devnull Bterm(curfile);
1448 bc7cb1a1 2003-11-23 devnull curfile = &bin;
1449 bc7cb1a1 2003-11-23 devnull goto loop;
1451 bc7cb1a1 2003-11-23 devnull exits(0);
1452 bc7cb1a1 2003-11-23 devnull return 0; /* shut up ken */
1456 bc7cb1a1 2003-11-23 devnull unreadc(char c)
1459 bc7cb1a1 2003-11-23 devnull if((readptr != &readstk[0]) && (*readptr != 0)) {
1460 bc7cb1a1 2003-11-23 devnull sungetc(*readptr,c);
1462 bc7cb1a1 2003-11-23 devnull Bungetc(curfile);
1463 bc7cb1a1 2003-11-23 devnull return;
1467 bc7cb1a1 2003-11-23 devnull binop(char c)
1469 bc7cb1a1 2003-11-23 devnull Blk *r;
1472 bc7cb1a1 2003-11-23 devnull switch(c) {
1473 bc7cb1a1 2003-11-23 devnull case '+':
1474 bc7cb1a1 2003-11-23 devnull r = add(arg1,arg2);
1476 bc7cb1a1 2003-11-23 devnull case '*':
1477 bc7cb1a1 2003-11-23 devnull r = mult(arg1,arg2);
1479 bc7cb1a1 2003-11-23 devnull case '/':
1480 bc7cb1a1 2003-11-23 devnull r = div(arg1,arg2);
1483 bc7cb1a1 2003-11-23 devnull release(arg1);
1484 bc7cb1a1 2003-11-23 devnull release(arg2);
1485 bc7cb1a1 2003-11-23 devnull sputc(r,savk);
1486 bc7cb1a1 2003-11-23 devnull pushp(r);
1490 bc7cb1a1 2003-11-23 devnull dcprint(Blk *hptr)
1492 bc7cb1a1 2003-11-23 devnull Blk *p, *q, *dec;
1493 bc7cb1a1 2003-11-23 devnull int dig, dout, ct, sc;
1495 bc7cb1a1 2003-11-23 devnull rewind(hptr);
1496 bc7cb1a1 2003-11-23 devnull while(sfeof(hptr) == 0) {
1497 bc7cb1a1 2003-11-23 devnull if(sgetc(hptr)>99) {
1498 bc7cb1a1 2003-11-23 devnull rewind(hptr);
1499 bc7cb1a1 2003-11-23 devnull while(sfeof(hptr) == 0) {
1500 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%c",sgetc(hptr));
1502 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1503 bc7cb1a1 2003-11-23 devnull return;
1506 bc7cb1a1 2003-11-23 devnull fsfile(hptr);
1507 bc7cb1a1 2003-11-23 devnull sc = sbackc(hptr);
1508 bc7cb1a1 2003-11-23 devnull if(sfbeg(hptr) != 0) {
1509 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"0\n");
1510 bc7cb1a1 2003-11-23 devnull return;
1512 bc7cb1a1 2003-11-23 devnull count = ll;
1513 bc7cb1a1 2003-11-23 devnull p = copy(hptr,length(hptr));
1514 bc7cb1a1 2003-11-23 devnull sclobber(p);
1515 bc7cb1a1 2003-11-23 devnull fsfile(p);
1516 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
1517 bc7cb1a1 2003-11-23 devnull chsign(p);
1518 bc7cb1a1 2003-11-23 devnull OUTC('-');
1520 bc7cb1a1 2003-11-23 devnull if((obase == 0) || (obase == -1)) {
1521 bc7cb1a1 2003-11-23 devnull oneot(p,sc,'d');
1522 bc7cb1a1 2003-11-23 devnull return;
1524 bc7cb1a1 2003-11-23 devnull if(obase == 1) {
1525 bc7cb1a1 2003-11-23 devnull oneot(p,sc,'1');
1526 bc7cb1a1 2003-11-23 devnull return;
1528 bc7cb1a1 2003-11-23 devnull if(obase == 10) {
1529 bc7cb1a1 2003-11-23 devnull tenot(p,sc);
1530 bc7cb1a1 2003-11-23 devnull return;
1532 bc7cb1a1 2003-11-23 devnull /* sleazy hack to scale top of stack - divide by 1 */
1533 bc7cb1a1 2003-11-23 devnull pushp(p);
1534 bc7cb1a1 2003-11-23 devnull sputc(p, sc);
1535 bc7cb1a1 2003-11-23 devnull p=salloc(0);
1536 bc7cb1a1 2003-11-23 devnull create(p);
1537 bc7cb1a1 2003-11-23 devnull sputc(p, 1);
1538 bc7cb1a1 2003-11-23 devnull sputc(p, 0);
1539 bc7cb1a1 2003-11-23 devnull pushp(p);
1540 bc7cb1a1 2003-11-23 devnull if(dscale() != 0)
1541 bc7cb1a1 2003-11-23 devnull return;
1542 bc7cb1a1 2003-11-23 devnull p = div(arg1, arg2);
1543 bc7cb1a1 2003-11-23 devnull release(arg1);
1544 bc7cb1a1 2003-11-23 devnull release(arg2);
1545 bc7cb1a1 2003-11-23 devnull sc = savk;
1547 bc7cb1a1 2003-11-23 devnull create(strptr);
1548 bc7cb1a1 2003-11-23 devnull dig = logten*sc;
1549 bc7cb1a1 2003-11-23 devnull dout = ((dig/10) + dig) / logo;
1550 bc7cb1a1 2003-11-23 devnull dec = getdec(p,sc);
1551 bc7cb1a1 2003-11-23 devnull p = removc(p,sc);
1552 bc7cb1a1 2003-11-23 devnull while(length(p) != 0) {
1553 bc7cb1a1 2003-11-23 devnull q = div(p,basptr);
1554 bc7cb1a1 2003-11-23 devnull release(p);
1556 bc7cb1a1 2003-11-23 devnull (*outdit)(rem,0);
1558 bc7cb1a1 2003-11-23 devnull release(p);
1559 bc7cb1a1 2003-11-23 devnull fsfile(strptr);
1560 bc7cb1a1 2003-11-23 devnull while(sfbeg(strptr) == 0)
1561 bc7cb1a1 2003-11-23 devnull OUTC(sbackc(strptr));
1562 bc7cb1a1 2003-11-23 devnull if(sc == 0) {
1563 bc7cb1a1 2003-11-23 devnull release(dec);
1564 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1565 bc7cb1a1 2003-11-23 devnull return;
1567 bc7cb1a1 2003-11-23 devnull create(strptr);
1568 bc7cb1a1 2003-11-23 devnull OUTC('.');
1571 bc7cb1a1 2003-11-23 devnull q = mult(basptr,dec);
1572 bc7cb1a1 2003-11-23 devnull release(dec);
1573 bc7cb1a1 2003-11-23 devnull dec = getdec(q,sc);
1574 bc7cb1a1 2003-11-23 devnull p = removc(q,sc);
1575 bc7cb1a1 2003-11-23 devnull (*outdit)(p,1);
1576 bc7cb1a1 2003-11-23 devnull } while(++ct < dout);
1577 bc7cb1a1 2003-11-23 devnull release(dec);
1578 bc7cb1a1 2003-11-23 devnull rewind(strptr);
1579 bc7cb1a1 2003-11-23 devnull while(sfeof(strptr) == 0)
1580 bc7cb1a1 2003-11-23 devnull OUTC(sgetc(strptr));
1581 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1585 bc7cb1a1 2003-11-23 devnull getdec(Blk *p, int sc)
1587 bc7cb1a1 2003-11-23 devnull int cc;
1588 bc7cb1a1 2003-11-23 devnull Blk *q, *t, *s;
1590 bc7cb1a1 2003-11-23 devnull rewind(p);
1591 bc7cb1a1 2003-11-23 devnull if(length(p)*2 < sc) {
1592 bc7cb1a1 2003-11-23 devnull q = copy(p,length(p));
1593 bc7cb1a1 2003-11-23 devnull return(q);
1595 bc7cb1a1 2003-11-23 devnull q = salloc(length(p));
1596 bc7cb1a1 2003-11-23 devnull while(sc >= 1) {
1597 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1598 bc7cb1a1 2003-11-23 devnull sc -= 2;
1600 bc7cb1a1 2003-11-23 devnull if(sc != 0) {
1601 bc7cb1a1 2003-11-23 devnull t = mult(q,tenptr);
1602 bc7cb1a1 2003-11-23 devnull s = salloc(cc = length(q));
1603 bc7cb1a1 2003-11-23 devnull release(q);
1604 bc7cb1a1 2003-11-23 devnull rewind(t);
1605 bc7cb1a1 2003-11-23 devnull while(cc-- > 0)
1606 bc7cb1a1 2003-11-23 devnull sputc(s,sgetc(t));
1607 bc7cb1a1 2003-11-23 devnull sputc(s,0);
1608 bc7cb1a1 2003-11-23 devnull release(t);
1609 bc7cb1a1 2003-11-23 devnull t = div(s,tenptr);
1610 bc7cb1a1 2003-11-23 devnull release(s);
1611 bc7cb1a1 2003-11-23 devnull release(rem);
1612 bc7cb1a1 2003-11-23 devnull return(t);
1614 bc7cb1a1 2003-11-23 devnull return(q);
1618 bc7cb1a1 2003-11-23 devnull tenot(Blk *p, int sc)
1620 bc7cb1a1 2003-11-23 devnull int c, f;
1622 bc7cb1a1 2003-11-23 devnull fsfile(p);
1624 bc7cb1a1 2003-11-23 devnull while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)) {
1625 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1626 bc7cb1a1 2003-11-23 devnull if((c<10) && (f == 1))
1627 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"0%d",c);
1629 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d",c);
1633 bc7cb1a1 2003-11-23 devnull if(sc == 0) {
1634 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1635 bc7cb1a1 2003-11-23 devnull release(p);
1636 bc7cb1a1 2003-11-23 devnull return;
1638 bc7cb1a1 2003-11-23 devnull if((p->rd-p->beg)*2 > sc) {
1639 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1640 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d.",c/10);
1642 bc7cb1a1 2003-11-23 devnull OUTC(c%10 +'0');
1644 bc7cb1a1 2003-11-23 devnull } else {
1645 bc7cb1a1 2003-11-23 devnull OUTC('.');
1647 bc7cb1a1 2003-11-23 devnull while(sc>(p->rd-p->beg)*2) {
1648 bc7cb1a1 2003-11-23 devnull OUTC('0');
1651 bc7cb1a1 2003-11-23 devnull while(sc > 1) {
1652 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1653 bc7cb1a1 2003-11-23 devnull if(c<10)
1654 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"0%d",c);
1656 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d",c);
1657 bc7cb1a1 2003-11-23 devnull sc -= 2;
1660 bc7cb1a1 2003-11-23 devnull if(sc == 1) {
1661 bc7cb1a1 2003-11-23 devnull OUTC(sbackc(p)/10 +'0');
1663 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1664 bc7cb1a1 2003-11-23 devnull release(p);
1668 bc7cb1a1 2003-11-23 devnull oneot(Blk *p, int sc, char ch)
1670 bc7cb1a1 2003-11-23 devnull Blk *q;
1672 bc7cb1a1 2003-11-23 devnull q = removc(p,sc);
1673 bc7cb1a1 2003-11-23 devnull create(strptr);
1674 bc7cb1a1 2003-11-23 devnull sputc(strptr,-1);
1675 bc7cb1a1 2003-11-23 devnull while(length(q)>0) {
1676 bc7cb1a1 2003-11-23 devnull p = add(strptr,q);
1677 bc7cb1a1 2003-11-23 devnull release(q);
1679 bc7cb1a1 2003-11-23 devnull OUTC(ch);
1681 bc7cb1a1 2003-11-23 devnull release(q);
1682 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1686 bc7cb1a1 2003-11-23 devnull hexot(Blk *p, int flg)
1690 bc7cb1a1 2003-11-23 devnull USED(flg);
1691 bc7cb1a1 2003-11-23 devnull rewind(p);
1692 bc7cb1a1 2003-11-23 devnull if(sfeof(p) != 0) {
1693 bc7cb1a1 2003-11-23 devnull sputc(strptr,'0');
1694 bc7cb1a1 2003-11-23 devnull release(p);
1695 bc7cb1a1 2003-11-23 devnull return;
1697 bc7cb1a1 2003-11-23 devnull c = sgetc(p);
1698 bc7cb1a1 2003-11-23 devnull release(p);
1699 bc7cb1a1 2003-11-23 devnull if(c >= 16) {
1700 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"hex digit > 16");
1701 bc7cb1a1 2003-11-23 devnull return;
1703 bc7cb1a1 2003-11-23 devnull sputc(strptr,c<10?c+'0':c-10+'a');
1707 bc7cb1a1 2003-11-23 devnull bigot(Blk *p, int flg)
1709 bc7cb1a1 2003-11-23 devnull Blk *t, *q;
1710 bc7cb1a1 2003-11-23 devnull int neg, l;
1712 bc7cb1a1 2003-11-23 devnull if(flg == 1) {
1713 bc7cb1a1 2003-11-23 devnull t = salloc(0);
1715 bc7cb1a1 2003-11-23 devnull } else {
1716 bc7cb1a1 2003-11-23 devnull t = strptr;
1717 bc7cb1a1 2003-11-23 devnull l = length(strptr)+fw-1;
1720 bc7cb1a1 2003-11-23 devnull if(length(p) != 0) {
1721 bc7cb1a1 2003-11-23 devnull fsfile(p);
1722 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
1724 bc7cb1a1 2003-11-23 devnull chsign(p);
1726 bc7cb1a1 2003-11-23 devnull while(length(p) != 0) {
1727 bc7cb1a1 2003-11-23 devnull q = div(p,tenptr);
1728 bc7cb1a1 2003-11-23 devnull release(p);
1730 bc7cb1a1 2003-11-23 devnull rewind(rem);
1731 bc7cb1a1 2003-11-23 devnull sputc(t,sfeof(rem)?'0':sgetc(rem)+'0');
1732 bc7cb1a1 2003-11-23 devnull release(rem);
1735 bc7cb1a1 2003-11-23 devnull release(p);
1736 bc7cb1a1 2003-11-23 devnull if(flg == 1) {
1737 bc7cb1a1 2003-11-23 devnull l = fw1-length(t);
1738 bc7cb1a1 2003-11-23 devnull if(neg != 0) {
1740 bc7cb1a1 2003-11-23 devnull sputc(strptr,'-');
1742 bc7cb1a1 2003-11-23 devnull fsfile(t);
1743 bc7cb1a1 2003-11-23 devnull while(l-- > 0)
1744 bc7cb1a1 2003-11-23 devnull sputc(strptr,'0');
1745 bc7cb1a1 2003-11-23 devnull while(sfbeg(t) == 0)
1746 bc7cb1a1 2003-11-23 devnull sputc(strptr,sbackc(t));
1747 bc7cb1a1 2003-11-23 devnull release(t);
1748 bc7cb1a1 2003-11-23 devnull } else {
1749 bc7cb1a1 2003-11-23 devnull l -= length(strptr);
1750 bc7cb1a1 2003-11-23 devnull while(l-- > 0)
1751 bc7cb1a1 2003-11-23 devnull sputc(strptr,'0');
1752 bc7cb1a1 2003-11-23 devnull if(neg != 0) {
1753 bc7cb1a1 2003-11-23 devnull sclobber(strptr);
1754 bc7cb1a1 2003-11-23 devnull sputc(strptr,'-');
1757 bc7cb1a1 2003-11-23 devnull sputc(strptr,' ');
1761 bc7cb1a1 2003-11-23 devnull add(Blk *a1, Blk *a2)
1763 bc7cb1a1 2003-11-23 devnull Blk *p;
1764 bc7cb1a1 2003-11-23 devnull int carry, n, size, c, n1, n2;
1766 bc7cb1a1 2003-11-23 devnull size = length(a1)>length(a2)?length(a1):length(a2);
1767 bc7cb1a1 2003-11-23 devnull p = salloc(size);
1768 bc7cb1a1 2003-11-23 devnull rewind(a1);
1769 bc7cb1a1 2003-11-23 devnull rewind(a2);
1770 bc7cb1a1 2003-11-23 devnull carry=0;
1771 bc7cb1a1 2003-11-23 devnull while(--size >= 0) {
1772 bc7cb1a1 2003-11-23 devnull n1 = sfeof(a1)?0:sgetc(a1);
1773 bc7cb1a1 2003-11-23 devnull n2 = sfeof(a2)?0:sgetc(a2);
1774 bc7cb1a1 2003-11-23 devnull n = n1 + n2 + carry;
1775 bc7cb1a1 2003-11-23 devnull if(n>=100) {
1776 bc7cb1a1 2003-11-23 devnull carry=1;
1777 bc7cb1a1 2003-11-23 devnull n -= 100;
1779 bc7cb1a1 2003-11-23 devnull if(n<0) {
1780 bc7cb1a1 2003-11-23 devnull carry = -1;
1781 bc7cb1a1 2003-11-23 devnull n += 100;
1783 bc7cb1a1 2003-11-23 devnull carry = 0;
1784 bc7cb1a1 2003-11-23 devnull sputc(p,n);
1786 bc7cb1a1 2003-11-23 devnull if(carry != 0)
1787 bc7cb1a1 2003-11-23 devnull sputc(p,carry);
1788 bc7cb1a1 2003-11-23 devnull fsfile(p);
1789 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0) {
1791 bc7cb1a1 2003-11-23 devnull while(sfbeg(p) == 0 && (c = sbackc(p)) == 0)
1793 bc7cb1a1 2003-11-23 devnull if(c != 0)
1794 bc7cb1a1 2003-11-23 devnull salterc(p,c);
1795 bc7cb1a1 2003-11-23 devnull truncate(p);
1797 bc7cb1a1 2003-11-23 devnull fsfile(p);
1798 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0 && sbackc(p) == -1) {
1799 bc7cb1a1 2003-11-23 devnull while((c = sbackc(p)) == 99) {
1800 bc7cb1a1 2003-11-23 devnull if(c == -1)
1803 bc7cb1a1 2003-11-23 devnull skipc(p);
1804 bc7cb1a1 2003-11-23 devnull salterc(p,-1);
1805 bc7cb1a1 2003-11-23 devnull truncate(p);
1807 bc7cb1a1 2003-11-23 devnull return(p);
1811 bc7cb1a1 2003-11-23 devnull eqk(void)
1813 bc7cb1a1 2003-11-23 devnull Blk *p, *q;
1814 bc7cb1a1 2003-11-23 devnull int skp, skq;
1816 bc7cb1a1 2003-11-23 devnull p = pop();
1817 bc7cb1a1 2003-11-23 devnull EMPTYS;
1818 bc7cb1a1 2003-11-23 devnull q = pop();
1819 bc7cb1a1 2003-11-23 devnull EMPTYSR(p);
1820 bc7cb1a1 2003-11-23 devnull skp = sunputc(p);
1821 bc7cb1a1 2003-11-23 devnull skq = sunputc(q);
1822 bc7cb1a1 2003-11-23 devnull if(skp == skq) {
1823 bc7cb1a1 2003-11-23 devnull arg1=p;
1824 bc7cb1a1 2003-11-23 devnull arg2=q;
1825 bc7cb1a1 2003-11-23 devnull savk = skp;
1826 bc7cb1a1 2003-11-23 devnull return(0);
1828 bc7cb1a1 2003-11-23 devnull if(skp < skq) {
1829 bc7cb1a1 2003-11-23 devnull savk = skq;
1830 bc7cb1a1 2003-11-23 devnull p = add0(p,skq-skp);
1831 bc7cb1a1 2003-11-23 devnull } else {
1832 bc7cb1a1 2003-11-23 devnull savk = skp;
1833 bc7cb1a1 2003-11-23 devnull q = add0(q,skp-skq);
1835 bc7cb1a1 2003-11-23 devnull arg1=p;
1836 bc7cb1a1 2003-11-23 devnull arg2=q;
1837 bc7cb1a1 2003-11-23 devnull return(0);
1841 bc7cb1a1 2003-11-23 devnull removc(Blk *p, int n)
1843 bc7cb1a1 2003-11-23 devnull Blk *q, *r;
1845 bc7cb1a1 2003-11-23 devnull rewind(p);
1846 bc7cb1a1 2003-11-23 devnull while(n>1) {
1847 bc7cb1a1 2003-11-23 devnull skipc(p);
1848 bc7cb1a1 2003-11-23 devnull n -= 2;
1850 bc7cb1a1 2003-11-23 devnull q = salloc(2);
1851 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0)
1852 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1853 bc7cb1a1 2003-11-23 devnull if(n == 1) {
1854 bc7cb1a1 2003-11-23 devnull r = div(q,tenptr);
1855 bc7cb1a1 2003-11-23 devnull release(q);
1856 bc7cb1a1 2003-11-23 devnull release(rem);
1859 bc7cb1a1 2003-11-23 devnull release(p);
1860 bc7cb1a1 2003-11-23 devnull return(q);
1864 bc7cb1a1 2003-11-23 devnull scalint(Blk *p)
1868 bc7cb1a1 2003-11-23 devnull n = sunputc(p);
1869 bc7cb1a1 2003-11-23 devnull p = removc(p,n);
1870 bc7cb1a1 2003-11-23 devnull return(p);
1874 bc7cb1a1 2003-11-23 devnull scale(Blk *p, int n)
1876 bc7cb1a1 2003-11-23 devnull Blk *q, *s, *t;
1878 bc7cb1a1 2003-11-23 devnull t = add0(p,n);
1879 bc7cb1a1 2003-11-23 devnull q = salloc(1);
1880 bc7cb1a1 2003-11-23 devnull sputc(q,n);
1881 bc7cb1a1 2003-11-23 devnull s = dcexp(inbas,q);
1882 bc7cb1a1 2003-11-23 devnull release(q);
1883 bc7cb1a1 2003-11-23 devnull q = div(t,s);
1884 bc7cb1a1 2003-11-23 devnull release(t);
1885 bc7cb1a1 2003-11-23 devnull release(s);
1886 bc7cb1a1 2003-11-23 devnull release(rem);
1887 bc7cb1a1 2003-11-23 devnull sputc(q,n);
1888 bc7cb1a1 2003-11-23 devnull return(q);
1892 bc7cb1a1 2003-11-23 devnull subt(void)
1894 bc7cb1a1 2003-11-23 devnull arg1=pop();
1895 bc7cb1a1 2003-11-23 devnull EMPTYS;
1896 bc7cb1a1 2003-11-23 devnull savk = sunputc(arg1);
1897 bc7cb1a1 2003-11-23 devnull chsign(arg1);
1898 bc7cb1a1 2003-11-23 devnull sputc(arg1,savk);
1899 bc7cb1a1 2003-11-23 devnull pushp(arg1);
1900 bc7cb1a1 2003-11-23 devnull if(eqk() != 0)
1901 bc7cb1a1 2003-11-23 devnull return(1);
1902 bc7cb1a1 2003-11-23 devnull binop('+');
1903 bc7cb1a1 2003-11-23 devnull return(0);
1907 bc7cb1a1 2003-11-23 devnull command(void)
1909 bc7cb1a1 2003-11-23 devnull char line[100], *sl;
1910 bc7cb1a1 2003-11-23 devnull int pid, p, c;
1912 bc7cb1a1 2003-11-23 devnull switch(c = readc()) {
1913 bc7cb1a1 2003-11-23 devnull case '<':
1914 bc7cb1a1 2003-11-23 devnull return(cond(NL));
1915 bc7cb1a1 2003-11-23 devnull case '>':
1916 bc7cb1a1 2003-11-23 devnull return(cond(NG));
1917 bc7cb1a1 2003-11-23 devnull case '=':
1918 bc7cb1a1 2003-11-23 devnull return(cond(NE));
1919 bc7cb1a1 2003-11-23 devnull default:
1920 bc7cb1a1 2003-11-23 devnull sl = line;
1921 bc7cb1a1 2003-11-23 devnull *sl++ = c;
1922 bc7cb1a1 2003-11-23 devnull while((c = readc()) != '\n')
1923 bc7cb1a1 2003-11-23 devnull *sl++ = c;
1924 bc7cb1a1 2003-11-23 devnull *sl = 0;
1925 bc7cb1a1 2003-11-23 devnull if((pid = fork()) == 0) {
1926 bc7cb1a1 2003-11-23 devnull execl("/bin/rc","rc","-c",line,0);
1927 bc7cb1a1 2003-11-23 devnull exits("shell");
1929 bc7cb1a1 2003-11-23 devnull for(;;) {
1930 bc7cb1a1 2003-11-23 devnull if((p = waitpid()) < 0)
1932 bc7cb1a1 2003-11-23 devnull if(p== pid)
1935 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"!\n");
1936 bc7cb1a1 2003-11-23 devnull return(0);
1941 bc7cb1a1 2003-11-23 devnull cond(char c)
1943 bc7cb1a1 2003-11-23 devnull Blk *p;
1944 bc7cb1a1 2003-11-23 devnull int cc;
1946 bc7cb1a1 2003-11-23 devnull if(subt() != 0)
1947 bc7cb1a1 2003-11-23 devnull return(1);
1948 bc7cb1a1 2003-11-23 devnull p = pop();
1949 bc7cb1a1 2003-11-23 devnull sclobber(p);
1950 bc7cb1a1 2003-11-23 devnull if(length(p) == 0) {
1951 bc7cb1a1 2003-11-23 devnull release(p);
1952 bc7cb1a1 2003-11-23 devnull if(c == '<' || c == '>' || c == NE) {
1953 bc7cb1a1 2003-11-23 devnull getstk();
1954 bc7cb1a1 2003-11-23 devnull return(0);
1956 bc7cb1a1 2003-11-23 devnull load();
1957 bc7cb1a1 2003-11-23 devnull return(1);
1959 bc7cb1a1 2003-11-23 devnull if(c == '='){
1960 bc7cb1a1 2003-11-23 devnull release(p);
1961 bc7cb1a1 2003-11-23 devnull getstk();
1962 bc7cb1a1 2003-11-23 devnull return(0);
1964 bc7cb1a1 2003-11-23 devnull if(c == NE) {
1965 bc7cb1a1 2003-11-23 devnull release(p);
1966 bc7cb1a1 2003-11-23 devnull load();
1967 bc7cb1a1 2003-11-23 devnull return(1);
1969 bc7cb1a1 2003-11-23 devnull fsfile(p);
1970 bc7cb1a1 2003-11-23 devnull cc = sbackc(p);
1971 bc7cb1a1 2003-11-23 devnull release(p);
1972 bc7cb1a1 2003-11-23 devnull if((cc<0 && (c == '<' || c == NG)) ||
1973 bc7cb1a1 2003-11-23 devnull (cc >0) && (c == '>' || c == NL)) {
1974 bc7cb1a1 2003-11-23 devnull getstk();
1975 bc7cb1a1 2003-11-23 devnull return(0);
1977 bc7cb1a1 2003-11-23 devnull load();
1978 bc7cb1a1 2003-11-23 devnull return(1);
1982 bc7cb1a1 2003-11-23 devnull load(void)
1985 bc7cb1a1 2003-11-23 devnull Blk *p, *q, *t, *s;
1987 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
1988 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
1989 bc7cb1a1 2003-11-23 devnull if(sptr != 0) {
1990 bc7cb1a1 2003-11-23 devnull p = sptr->val;
1991 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
1992 bc7cb1a1 2003-11-23 devnull q = salloc(length(p));
1993 bc7cb1a1 2003-11-23 devnull rewind(p);
1994 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
1995 bc7cb1a1 2003-11-23 devnull s = dcgetwd(p);
1996 bc7cb1a1 2003-11-23 devnull if(s == 0) {
1997 bc7cb1a1 2003-11-23 devnull putwd(q, (Blk*)0);
1998 bc7cb1a1 2003-11-23 devnull } else {
1999 bc7cb1a1 2003-11-23 devnull t = copy(s,length(s));
2000 bc7cb1a1 2003-11-23 devnull putwd(q,t);
2003 bc7cb1a1 2003-11-23 devnull pushp(q);
2004 bc7cb1a1 2003-11-23 devnull } else {
2005 bc7cb1a1 2003-11-23 devnull q = copy(p,length(p));
2006 bc7cb1a1 2003-11-23 devnull pushp(q);
2008 bc7cb1a1 2003-11-23 devnull } else {
2009 bc7cb1a1 2003-11-23 devnull q = salloc(1);
2010 bc7cb1a1 2003-11-23 devnull if(c <= LASTFUN) {
2011 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"function %c undefined\n",c+'a'-1);
2012 bc7cb1a1 2003-11-23 devnull sputc(q,'c');
2013 bc7cb1a1 2003-11-23 devnull sputc(q,'0');
2014 bc7cb1a1 2003-11-23 devnull sputc(q,' ');
2015 bc7cb1a1 2003-11-23 devnull sputc(q,'1');
2016 bc7cb1a1 2003-11-23 devnull sputc(q,'Q');
2019 bc7cb1a1 2003-11-23 devnull sputc(q,0);
2020 bc7cb1a1 2003-11-23 devnull pushp(q);
2025 bc7cb1a1 2003-11-23 devnull log2(long n)
2029 bc7cb1a1 2003-11-23 devnull if(n == 0)
2030 bc7cb1a1 2003-11-23 devnull return(0);
2032 bc7cb1a1 2003-11-23 devnull if(n<0)
2033 bc7cb1a1 2003-11-23 devnull return(i);
2034 bc7cb1a1 2003-11-23 devnull while((n= n<<1) >0)
2036 bc7cb1a1 2003-11-23 devnull return i-1;
2040 bc7cb1a1 2003-11-23 devnull salloc(int size)
2042 bc7cb1a1 2003-11-23 devnull Blk *hdr;
2043 bc7cb1a1 2003-11-23 devnull char *ptr;
2046 bc7cb1a1 2003-11-23 devnull lall++;
2047 bc7cb1a1 2003-11-23 devnull if(all - rel > active)
2048 bc7cb1a1 2003-11-23 devnull active = all - rel;
2049 bc7cb1a1 2003-11-23 devnull nbytes += size;
2050 bc7cb1a1 2003-11-23 devnull lbytes += size;
2051 bc7cb1a1 2003-11-23 devnull if(nbytes >maxsize)
2052 bc7cb1a1 2003-11-23 devnull maxsize = nbytes;
2053 bc7cb1a1 2003-11-23 devnull if(size > longest)
2054 bc7cb1a1 2003-11-23 devnull longest = size;
2055 bc7cb1a1 2003-11-23 devnull ptr = malloc((unsigned)size);
2056 bc7cb1a1 2003-11-23 devnull if(ptr == 0){
2057 bc7cb1a1 2003-11-23 devnull garbage("salloc");
2058 bc7cb1a1 2003-11-23 devnull if((ptr = malloc((unsigned)size)) == 0)
2059 bc7cb1a1 2003-11-23 devnull ospace("salloc");
2061 bc7cb1a1 2003-11-23 devnull if((hdr = hfree) == 0)
2062 bc7cb1a1 2003-11-23 devnull hdr = morehd();
2063 bc7cb1a1 2003-11-23 devnull hfree = (Blk *)hdr->rd;
2064 bc7cb1a1 2003-11-23 devnull hdr->rd = hdr->wt = hdr->beg = ptr;
2065 bc7cb1a1 2003-11-23 devnull hdr->last = ptr+size;
2066 bc7cb1a1 2003-11-23 devnull return(hdr);
2070 bc7cb1a1 2003-11-23 devnull morehd(void)
2072 bc7cb1a1 2003-11-23 devnull Blk *h, *kk;
2074 bc7cb1a1 2003-11-23 devnull headmor++;
2075 bc7cb1a1 2003-11-23 devnull nbytes += HEADSZ;
2076 bc7cb1a1 2003-11-23 devnull hfree = h = (Blk *)malloc(HEADSZ);
2077 bc7cb1a1 2003-11-23 devnull if(hfree == 0) {
2078 bc7cb1a1 2003-11-23 devnull garbage("morehd");
2079 bc7cb1a1 2003-11-23 devnull if((hfree = h = (Blk*)malloc(HEADSZ)) == 0)
2080 bc7cb1a1 2003-11-23 devnull ospace("headers");
2082 bc7cb1a1 2003-11-23 devnull kk = h;
2083 bc7cb1a1 2003-11-23 devnull while(h<hfree+(HEADSZ/BLK))
2084 bc7cb1a1 2003-11-23 devnull (h++)->rd = (char*)++kk;
2085 bc7cb1a1 2003-11-23 devnull (h-1)->rd=0;
2086 bc7cb1a1 2003-11-23 devnull return(hfree);
2090 bc7cb1a1 2003-11-23 devnull copy(Blk *hptr, int size)
2092 bc7cb1a1 2003-11-23 devnull Blk *hdr;
2093 bc7cb1a1 2003-11-23 devnull unsigned sz;
2094 bc7cb1a1 2003-11-23 devnull char *ptr;
2097 bc7cb1a1 2003-11-23 devnull lall++;
2098 bc7cb1a1 2003-11-23 devnull lcopy++;
2099 bc7cb1a1 2003-11-23 devnull nbytes += size;
2100 bc7cb1a1 2003-11-23 devnull lbytes += size;
2101 bc7cb1a1 2003-11-23 devnull if(size > longest)
2102 bc7cb1a1 2003-11-23 devnull longest = size;
2103 bc7cb1a1 2003-11-23 devnull if(size > maxsize)
2104 bc7cb1a1 2003-11-23 devnull maxsize = size;
2105 bc7cb1a1 2003-11-23 devnull sz = length(hptr);
2106 bc7cb1a1 2003-11-23 devnull ptr = nalloc(hptr->beg, size);
2107 bc7cb1a1 2003-11-23 devnull if(ptr == 0) {
2108 bc7cb1a1 2003-11-23 devnull garbage("copy");
2109 bc7cb1a1 2003-11-23 devnull if((ptr = nalloc(hptr->beg, size)) == 0) {
2110 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"copy size %d\n",size);
2111 bc7cb1a1 2003-11-23 devnull ospace("copy");
2114 bc7cb1a1 2003-11-23 devnull if((hdr = hfree) == 0)
2115 bc7cb1a1 2003-11-23 devnull hdr = morehd();
2116 bc7cb1a1 2003-11-23 devnull hfree = (Blk *)hdr->rd;
2117 bc7cb1a1 2003-11-23 devnull hdr->rd = hdr->beg = ptr;
2118 bc7cb1a1 2003-11-23 devnull hdr->last = ptr+size;
2119 bc7cb1a1 2003-11-23 devnull hdr->wt = ptr+sz;
2120 bc7cb1a1 2003-11-23 devnull ptr = hdr->wt;
2121 bc7cb1a1 2003-11-23 devnull while(ptr<hdr->last)
2122 bc7cb1a1 2003-11-23 devnull *ptr++ = '\0';
2123 bc7cb1a1 2003-11-23 devnull return(hdr);
2127 bc7cb1a1 2003-11-23 devnull sdump(char *s1, Blk *hptr)
2129 bc7cb1a1 2003-11-23 devnull char *p;
2131 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%s %lx rd %lx wt %lx beg %lx last %lx\n",
2132 bc7cb1a1 2003-11-23 devnull s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last);
2133 bc7cb1a1 2003-11-23 devnull p = hptr->beg;
2134 bc7cb1a1 2003-11-23 devnull while(p < hptr->wt)
2135 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d ",*p++);
2136 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
2140 bc7cb1a1 2003-11-23 devnull seekc(Blk *hptr, int n)
2142 bc7cb1a1 2003-11-23 devnull char *nn,*p;
2144 bc7cb1a1 2003-11-23 devnull nn = hptr->beg+n;
2145 bc7cb1a1 2003-11-23 devnull if(nn > hptr->last) {
2146 bc7cb1a1 2003-11-23 devnull nbytes += nn - hptr->last;
2147 bc7cb1a1 2003-11-23 devnull if(nbytes > maxsize)
2148 bc7cb1a1 2003-11-23 devnull maxsize = nbytes;
2149 bc7cb1a1 2003-11-23 devnull lbytes += nn - hptr->last;
2150 bc7cb1a1 2003-11-23 devnull if(n > longest)
2151 bc7cb1a1 2003-11-23 devnull longest = n;
2152 cbeb0b26 2006-04-01 devnull /* free(hptr->beg); */
2153 bc7cb1a1 2003-11-23 devnull p = realloc(hptr->beg, n);
2154 bc7cb1a1 2003-11-23 devnull if(p == 0) {
2155 bc7cb1a1 2003-11-23 devnull /* hptr->beg = realloc(hptr->beg, hptr->last-hptr->beg);
2156 bc7cb1a1 2003-11-23 devnull ** garbage("seekc");
2157 bc7cb1a1 2003-11-23 devnull ** if((p = realloc(hptr->beg, n)) == 0)
2158 bc7cb1a1 2003-11-23 devnull */ ospace("seekc");
2160 bc7cb1a1 2003-11-23 devnull hptr->beg = p;
2161 bc7cb1a1 2003-11-23 devnull hptr->wt = hptr->last = hptr->rd = p+n;
2162 bc7cb1a1 2003-11-23 devnull return;
2164 bc7cb1a1 2003-11-23 devnull hptr->rd = nn;
2165 bc7cb1a1 2003-11-23 devnull if(nn>hptr->wt)
2166 bc7cb1a1 2003-11-23 devnull hptr->wt = nn;
2170 bc7cb1a1 2003-11-23 devnull salterwd(Blk *ahptr, Blk *n)
2172 bc7cb1a1 2003-11-23 devnull Wblk *hptr;
2174 bc7cb1a1 2003-11-23 devnull hptr = (Wblk*)ahptr;
2175 bc7cb1a1 2003-11-23 devnull if(hptr->rdw == hptr->lastw)
2176 bc7cb1a1 2003-11-23 devnull more(ahptr);
2177 bc7cb1a1 2003-11-23 devnull *hptr->rdw++ = n;
2178 bc7cb1a1 2003-11-23 devnull if(hptr->rdw > hptr->wtw)
2179 bc7cb1a1 2003-11-23 devnull hptr->wtw = hptr->rdw;
2183 bc7cb1a1 2003-11-23 devnull more(Blk *hptr)
2185 bc7cb1a1 2003-11-23 devnull unsigned size;
2186 bc7cb1a1 2003-11-23 devnull char *p;
2188 bc7cb1a1 2003-11-23 devnull if((size=(hptr->last-hptr->beg)*2) == 0)
2189 bc7cb1a1 2003-11-23 devnull size=2;
2190 bc7cb1a1 2003-11-23 devnull nbytes += size/2;
2191 bc7cb1a1 2003-11-23 devnull if(nbytes > maxsize)
2192 bc7cb1a1 2003-11-23 devnull maxsize = nbytes;
2193 bc7cb1a1 2003-11-23 devnull if(size > longest)
2194 bc7cb1a1 2003-11-23 devnull longest = size;
2195 bc7cb1a1 2003-11-23 devnull lbytes += size/2;
2196 bc7cb1a1 2003-11-23 devnull lmore++;
2197 cbeb0b26 2006-04-01 devnull /* free(hptr->beg);*/
2198 bc7cb1a1 2003-11-23 devnull p = realloc(hptr->beg, size);
2200 bc7cb1a1 2003-11-23 devnull if(p == 0) {
2201 bc7cb1a1 2003-11-23 devnull /* hptr->beg = realloc(hptr->beg, (hptr->last-hptr->beg));
2202 bc7cb1a1 2003-11-23 devnull ** garbage("more");
2203 bc7cb1a1 2003-11-23 devnull ** if((p = realloc(hptr->beg,size)) == 0)
2204 bc7cb1a1 2003-11-23 devnull */ ospace("more");
2206 bc7cb1a1 2003-11-23 devnull hptr->rd = p + (hptr->rd - hptr->beg);
2207 bc7cb1a1 2003-11-23 devnull hptr->wt = p + (hptr->wt - hptr->beg);
2208 bc7cb1a1 2003-11-23 devnull hptr->beg = p;
2209 bc7cb1a1 2003-11-23 devnull hptr->last = p+size;
2213 bc7cb1a1 2003-11-23 devnull ospace(char *s)
2215 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"out of space: %s\n",s);
2216 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"all %ld rel %ld headmor %ld\n",all,rel,headmor);
2217 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"nbytes %ld\n",nbytes);
2218 bc7cb1a1 2003-11-23 devnull sdump("stk",*stkptr);
2219 bc7cb1a1 2003-11-23 devnull abort();
2223 bc7cb1a1 2003-11-23 devnull garbage(char *s)
2225 bc7cb1a1 2003-11-23 devnull USED(s);
2229 bc7cb1a1 2003-11-23 devnull release(Blk *p)
2232 bc7cb1a1 2003-11-23 devnull lrel++;
2233 bc7cb1a1 2003-11-23 devnull nbytes -= p->last - p->beg;
2234 bc7cb1a1 2003-11-23 devnull p->rd = (char*)hfree;
2235 bc7cb1a1 2003-11-23 devnull hfree = p;
2236 bc7cb1a1 2003-11-23 devnull free(p->beg);
2240 bc7cb1a1 2003-11-23 devnull dcgetwd(Blk *p)
2242 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2244 bc7cb1a1 2003-11-23 devnull wp = (Wblk*)p;
2245 bc7cb1a1 2003-11-23 devnull if(wp->rdw == wp->wtw)
2246 bc7cb1a1 2003-11-23 devnull return(0);
2247 bc7cb1a1 2003-11-23 devnull return(*wp->rdw++);
2251 bc7cb1a1 2003-11-23 devnull putwd(Blk *p, Blk *c)
2253 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2255 bc7cb1a1 2003-11-23 devnull wp = (Wblk*)p;
2256 bc7cb1a1 2003-11-23 devnull if(wp->wtw == wp->lastw)
2257 bc7cb1a1 2003-11-23 devnull more(p);
2258 bc7cb1a1 2003-11-23 devnull *wp->wtw++ = c;
2262 bc7cb1a1 2003-11-23 devnull lookwd(Blk *p)
2264 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2266 bc7cb1a1 2003-11-23 devnull wp = (Wblk*)p;
2267 bc7cb1a1 2003-11-23 devnull if(wp->rdw == wp->wtw)
2268 bc7cb1a1 2003-11-23 devnull return(0);
2269 bc7cb1a1 2003-11-23 devnull return(*wp->rdw);
2273 bc7cb1a1 2003-11-23 devnull nalloc(char *p, unsigned nbytes)
2275 bc7cb1a1 2003-11-23 devnull char *q, *r;
2277 bc7cb1a1 2003-11-23 devnull q = r = malloc(nbytes);
2278 bc7cb1a1 2003-11-23 devnull if(q==0)
2279 bc7cb1a1 2003-11-23 devnull return(0);
2280 bc7cb1a1 2003-11-23 devnull while(nbytes--)
2281 bc7cb1a1 2003-11-23 devnull *q++ = *p++;
2282 bc7cb1a1 2003-11-23 devnull return(r);
2286 bc7cb1a1 2003-11-23 devnull getstk(void)
2289 bc7cb1a1 2003-11-23 devnull uchar c;
2291 bc7cb1a1 2003-11-23 devnull c = readc();
2292 bc7cb1a1 2003-11-23 devnull if(c != '<')
2293 bc7cb1a1 2003-11-23 devnull return c;
2295 bc7cb1a1 2003-11-23 devnull while(1) {
2296 bc7cb1a1 2003-11-23 devnull c = readc();
2297 bc7cb1a1 2003-11-23 devnull if(c == '>')
2299 bc7cb1a1 2003-11-23 devnull n = n*10+c-'0';
2301 bc7cb1a1 2003-11-23 devnull return n;