Blame


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>
4 bc7cb1a1 2003-11-23 devnull
5 bc7cb1a1 2003-11-23 devnull typedef void* pointer;
6 bc7cb1a1 2003-11-23 devnull
7 bc7cb1a1 2003-11-23 devnull #define div dcdiv
8 bc7cb1a1 2003-11-23 devnull
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
54 bc7cb1a1 2003-11-23 devnull
55 bc7cb1a1 2003-11-23 devnull typedef struct Blk Blk;
56 bc7cb1a1 2003-11-23 devnull struct Blk
57 bc7cb1a1 2003-11-23 devnull {
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;
62 bc7cb1a1 2003-11-23 devnull };
63 bc7cb1a1 2003-11-23 devnull typedef struct Sym Sym;
64 bc7cb1a1 2003-11-23 devnull struct Sym
65 bc7cb1a1 2003-11-23 devnull {
66 bc7cb1a1 2003-11-23 devnull Sym *next;
67 bc7cb1a1 2003-11-23 devnull Blk *val;
68 bc7cb1a1 2003-11-23 devnull };
69 bc7cb1a1 2003-11-23 devnull typedef struct Wblk Wblk;
70 bc7cb1a1 2003-11-23 devnull struct Wblk
71 bc7cb1a1 2003-11-23 devnull {
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;
76 bc7cb1a1 2003-11-23 devnull };
77 bc7cb1a1 2003-11-23 devnull
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;
81 bc7cb1a1 2003-11-23 devnull int dbg;
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;
94 bc7cb1a1 2003-11-23 devnull int k;
95 bc7cb1a1 2003-11-23 devnull Blk *irem;
96 bc7cb1a1 2003-11-23 devnull int skd,skr;
97 bc7cb1a1 2003-11-23 devnull int neg;
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;
118 bc7cb1a1 2003-11-23 devnull
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);
170 bc7cb1a1 2003-11-23 devnull
171 bc7cb1a1 2003-11-23 devnull /********debug only**/
172 bc7cb1a1 2003-11-23 devnull void
173 bc7cb1a1 2003-11-23 devnull tpr(char *cp, Blk *bp)
174 bc7cb1a1 2003-11-23 devnull {
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("/");
182 bc7cb1a1 2003-11-23 devnull }
183 bc7cb1a1 2003-11-23 devnull print("\n");
184 bc7cb1a1 2003-11-23 devnull }
185 bc7cb1a1 2003-11-23 devnull /************/
186 bc7cb1a1 2003-11-23 devnull
187 bc7cb1a1 2003-11-23 devnull void
188 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
189 bc7cb1a1 2003-11-23 devnull {
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);
195 bc7cb1a1 2003-11-23 devnull }
196 bc7cb1a1 2003-11-23 devnull
197 bc7cb1a1 2003-11-23 devnull void
198 bc7cb1a1 2003-11-23 devnull commnds(void)
199 bc7cb1a1 2003-11-23 devnull {
200 bc7cb1a1 2003-11-23 devnull Blk *p, *q, **ptr, *s, *t;
201 bc7cb1a1 2003-11-23 devnull long l;
202 bc7cb1a1 2003-11-23 devnull Sym *sp;
203 bc7cb1a1 2003-11-23 devnull int sk, sk1, sk2, c, sign, n, d;
204 bc7cb1a1 2003-11-23 devnull
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;
213 bc7cb1a1 2003-11-23 devnull }
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 '-':
237 bc7cb1a1 2003-11-23 devnull subt();
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();
246 bc7cb1a1 2003-11-23 devnull EMPTY;
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)
260 bc7cb1a1 2003-11-23 devnull 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);
264 bc7cb1a1 2003-11-23 devnull }
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;
286 bc7cb1a1 2003-11-23 devnull }
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();
296 bc7cb1a1 2003-11-23 devnull EMPTY;
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;
302 bc7cb1a1 2003-11-23 devnull }
303 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
304 bc7cb1a1 2003-11-23 devnull error("sqrt of neg number\n");
305 bc7cb1a1 2003-11-23 devnull }
306 bc7cb1a1 2003-11-23 devnull if(k<savk)
307 bc7cb1a1 2003-11-23 devnull n = savk;
308 bc7cb1a1 2003-11-23 devnull else {
309 bc7cb1a1 2003-11-23 devnull n = k*2-savk;
310 bc7cb1a1 2003-11-23 devnull savk = k;
311 bc7cb1a1 2003-11-23 devnull }
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;
317 bc7cb1a1 2003-11-23 devnull
318 bc7cb1a1 2003-11-23 devnull case '^':
319 bc7cb1a1 2003-11-23 devnull neg = 0;
320 bc7cb1a1 2003-11-23 devnull arg1 = pop();
321 bc7cb1a1 2003-11-23 devnull EMPTY;
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) {
327 bc7cb1a1 2003-11-23 devnull neg++;
328 bc7cb1a1 2003-11-23 devnull chsign(arg1);
329 bc7cb1a1 2003-11-23 devnull }
330 bc7cb1a1 2003-11-23 devnull if(length(arg1)>=3) {
331 bc7cb1a1 2003-11-23 devnull error("exp too big\n");
332 bc7cb1a1 2003-11-23 devnull }
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)
339 bc7cb1a1 2003-11-23 devnull c = 0;
340 bc7cb1a1 2003-11-23 devnull else
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)
347 bc7cb1a1 2003-11-23 devnull n = k;
348 bc7cb1a1 2003-11-23 devnull else
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);
357 bc7cb1a1 2003-11-23 devnull }
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); */
361 bc7cb1a1 2003-11-23 devnull /* } */
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;
377 bc7cb1a1 2003-11-23 devnull }
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();
384 bc7cb1a1 2003-11-23 devnull EMPTY;
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) {
390 bc7cb1a1 2003-11-23 devnull n -= 2;
391 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 1)
392 bc7cb1a1 2003-11-23 devnull n++;
393 bc7cb1a1 2003-11-23 devnull else {
394 bc7cb1a1 2003-11-23 devnull if((c = sbackc(p)) == 0)
395 bc7cb1a1 2003-11-23 devnull n++;
396 bc7cb1a1 2003-11-23 devnull else
397 bc7cb1a1 2003-11-23 devnull if(c > 90)
398 bc7cb1a1 2003-11-23 devnull n--;
399 bc7cb1a1 2003-11-23 devnull }
400 bc7cb1a1 2003-11-23 devnull } else
401 bc7cb1a1 2003-11-23 devnull if(c < 10)
402 bc7cb1a1 2003-11-23 devnull n--;
403 bc7cb1a1 2003-11-23 devnull }
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;
409 bc7cb1a1 2003-11-23 devnull }
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();
416 bc7cb1a1 2003-11-23 devnull EMPTY;
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();
428 bc7cb1a1 2003-11-23 devnull EMPTY;
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);
442 bc7cb1a1 2003-11-23 devnull }
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);
446 bc7cb1a1 2003-11-23 devnull }
447 bc7cb1a1 2003-11-23 devnull }
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;
458 bc7cb1a1 2003-11-23 devnull fw = 1;
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;
463 bc7cb1a1 2003-11-23 devnull }
464 bc7cb1a1 2003-11-23 devnull }
465 bc7cb1a1 2003-11-23 devnull n = 0;
466 bc7cb1a1 2003-11-23 devnull if(sign == 1)
467 bc7cb1a1 2003-11-23 devnull n++;
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)
474 bc7cb1a1 2003-11-23 devnull n++;
475 bc7cb1a1 2003-11-23 devnull release(t);
476 bc7cb1a1 2003-11-23 devnull release(q);
477 bc7cb1a1 2003-11-23 devnull release(p);
478 bc7cb1a1 2003-11-23 devnull fw = n;
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 '[':
491 bc7cb1a1 2003-11-23 devnull n = 0;
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)
496 bc7cb1a1 2003-11-23 devnull break;
497 bc7cb1a1 2003-11-23 devnull n--;
498 bc7cb1a1 2003-11-23 devnull }
499 bc7cb1a1 2003-11-23 devnull sputc(p,c);
500 bc7cb1a1 2003-11-23 devnull if(c == '[')
501 bc7cb1a1 2003-11-23 devnull n++;
502 bc7cb1a1 2003-11-23 devnull }
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();
507 bc7cb1a1 2003-11-23 devnull EMPTY;
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");
511 bc7cb1a1 2003-11-23 devnull }
512 bc7cb1a1 2003-11-23 devnull rewind(p);
513 bc7cb1a1 2003-11-23 devnull k = 0;
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();
526 bc7cb1a1 2003-11-23 devnull EMPTY;
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();
537 bc7cb1a1 2003-11-23 devnull EMPTY;
538 bc7cb1a1 2003-11-23 devnull if(length(p)>2) {
539 bc7cb1a1 2003-11-23 devnull error("Q?\n");
540 bc7cb1a1 2003-11-23 devnull }
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");
544 bc7cb1a1 2003-11-23 devnull }
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");
549 bc7cb1a1 2003-11-23 devnull }
550 bc7cb1a1 2003-11-23 devnull if(*readptr != 0)
551 bc7cb1a1 2003-11-23 devnull release(*readptr);
552 bc7cb1a1 2003-11-23 devnull readptr--;
553 bc7cb1a1 2003-11-23 devnull }
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");
568 bc7cb1a1 2003-11-23 devnull else {
569 bc7cb1a1 2003-11-23 devnull for(ptr = stkptr; ptr > &stack[0];) {
570 bc7cb1a1 2003-11-23 devnull dcprint(*ptr--);
571 bc7cb1a1 2003-11-23 devnull }
572 bc7cb1a1 2003-11-23 devnull }
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");
577 bc7cb1a1 2003-11-23 devnull else {
578 bc7cb1a1 2003-11-23 devnull dcprint(*stkptr);
579 bc7cb1a1 2003-11-23 devnull }
580 bc7cb1a1 2003-11-23 devnull continue;
581 bc7cb1a1 2003-11-23 devnull case 'P':
582 bc7cb1a1 2003-11-23 devnull p = pop();
583 bc7cb1a1 2003-11-23 devnull EMPTY;
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;
592 bc7cb1a1 2003-11-23 devnull }
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);
603 bc7cb1a1 2003-11-23 devnull }
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");
608 bc7cb1a1 2003-11-23 devnull }
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();
617 bc7cb1a1 2003-11-23 devnull EMPTY;
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);
622 bc7cb1a1 2003-11-23 devnull }
623 bc7cb1a1 2003-11-23 devnull release(p);
624 bc7cb1a1 2003-11-23 devnull p = q;
625 bc7cb1a1 2003-11-23 devnull }
626 bc7cb1a1 2003-11-23 devnull sp->val = p;
627 bc7cb1a1 2003-11-23 devnull continue;
628 bc7cb1a1 2003-11-23 devnull sempty:
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");
633 bc7cb1a1 2003-11-23 devnull }
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));
642 bc7cb1a1 2003-11-23 devnull }
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;
650 bc7cb1a1 2003-11-23 devnull }
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':
655 bc7cb1a1 2003-11-23 devnull load();
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");
662 bc7cb1a1 2003-11-23 devnull }
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);
673 bc7cb1a1 2003-11-23 devnull }
674 bc7cb1a1 2003-11-23 devnull }
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();
679 bc7cb1a1 2003-11-23 devnull EMPTY;
680 bc7cb1a1 2003-11-23 devnull q = scalint(p);
681 bc7cb1a1 2003-11-23 devnull fsfile(q);
682 bc7cb1a1 2003-11-23 devnull c = 0;
683 bc7cb1a1 2003-11-23 devnull if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) {
684 bc7cb1a1 2003-11-23 devnull error("neg index\n");
685 bc7cb1a1 2003-11-23 devnull }
686 bc7cb1a1 2003-11-23 devnull if(length(q)>2) {
687 bc7cb1a1 2003-11-23 devnull error("index too big\n");
688 bc7cb1a1 2003-11-23 devnull }
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");
693 bc7cb1a1 2003-11-23 devnull }
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);
710 bc7cb1a1 2003-11-23 devnull p = q;
711 bc7cb1a1 2003-11-23 devnull }
712 bc7cb1a1 2003-11-23 devnull }
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();
718 bc7cb1a1 2003-11-23 devnull EMPTY;
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();
724 bc7cb1a1 2003-11-23 devnull EMPTY;
725 bc7cb1a1 2003-11-23 devnull q = scalint(p);
726 bc7cb1a1 2003-11-23 devnull fsfile(q);
727 bc7cb1a1 2003-11-23 devnull c = 0;
728 bc7cb1a1 2003-11-23 devnull if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) {
729 bc7cb1a1 2003-11-23 devnull error("neg index\n");
730 bc7cb1a1 2003-11-23 devnull }
731 bc7cb1a1 2003-11-23 devnull if(length(q)>2) {
732 bc7cb1a1 2003-11-23 devnull error("index too big\n");
733 bc7cb1a1 2003-11-23 devnull }
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");
738 bc7cb1a1 2003-11-23 devnull }
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;
751 bc7cb1a1 2003-11-23 devnull }
752 bc7cb1a1 2003-11-23 devnull }
753 bc7cb1a1 2003-11-23 devnull }
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();
761 bc7cb1a1 2003-11-23 devnull EMPTY;
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);
765 bc7cb1a1 2003-11-23 devnull else {
766 bc7cb1a1 2003-11-23 devnull if(readptr++ == &readstk[RDSKSZ]) {
767 bc7cb1a1 2003-11-23 devnull error("nesting depth\n");
768 bc7cb1a1 2003-11-23 devnull }
769 bc7cb1a1 2003-11-23 devnull }
770 bc7cb1a1 2003-11-23 devnull } else
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);
775 bc7cb1a1 2003-11-23 devnull else {
776 bc7cb1a1 2003-11-23 devnull if((c = readc()) != '\n')
777 bc7cb1a1 2003-11-23 devnull unreadc(c);
778 bc7cb1a1 2003-11-23 devnull }
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");
783 bc7cb1a1 2003-11-23 devnull }
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());
795 bc7cb1a1 2003-11-23 devnull }
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);
811 bc7cb1a1 2003-11-23 devnull }
812 bc7cb1a1 2003-11-23 devnull }
813 bc7cb1a1 2003-11-23 devnull }
814 bc7cb1a1 2003-11-23 devnull
815 bc7cb1a1 2003-11-23 devnull Blk*
816 bc7cb1a1 2003-11-23 devnull div(Blk *ddivd, Blk *ddivr)
817 bc7cb1a1 2003-11-23 devnull {
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;
822 bc7cb1a1 2003-11-23 devnull
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);
832 bc7cb1a1 2003-11-23 devnull }
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;
840 bc7cb1a1 2003-11-23 devnull }
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;
847 bc7cb1a1 2003-11-23 devnull }
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;
862 bc7cb1a1 2003-11-23 devnull }
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;
871 bc7cb1a1 2003-11-23 devnull cc = c;
872 bc7cb1a1 2003-11-23 devnull if(offset == 0)
873 bc7cb1a1 2003-11-23 devnull td++;
874 bc7cb1a1 2003-11-23 devnull else
875 bc7cb1a1 2003-11-23 devnull cc++;
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) {
881 bc7cb1a1 2003-11-23 devnull dig--;
882 bc7cb1a1 2003-11-23 devnull under=1;
883 bc7cb1a1 2003-11-23 devnull }
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);
891 bc7cb1a1 2003-11-23 devnull }
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;
903 bc7cb1a1 2003-11-23 devnull }
904 bc7cb1a1 2003-11-23 devnull salterc(divd,d);
905 bc7cb1a1 2003-11-23 devnull }
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);
915 bc7cb1a1 2003-11-23 devnull }
916 bc7cb1a1 2003-11-23 devnull if(--offset >= 0)
917 bc7cb1a1 2003-11-23 devnull divd->wt--;
918 bc7cb1a1 2003-11-23 devnull }
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;
930 bc7cb1a1 2003-11-23 devnull }
931 bc7cb1a1 2003-11-23 devnull }
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;
938 bc7cb1a1 2003-11-23 devnull }
939 bc7cb1a1 2003-11-23 devnull
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;
948 bc7cb1a1 2003-11-23 devnull }
949 bc7cb1a1 2003-11-23 devnull salterc(p,d);
950 bc7cb1a1 2003-11-23 devnull }
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)
955 bc7cb1a1 2003-11-23 devnull break;
956 bc7cb1a1 2003-11-23 devnull truncate(p);
957 bc7cb1a1 2003-11-23 devnull }
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)
963 bc7cb1a1 2003-11-23 devnull break;
964 bc7cb1a1 2003-11-23 devnull truncate(divd);
965 bc7cb1a1 2003-11-23 devnull }
966 bc7cb1a1 2003-11-23 devnull ddone:
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);
973 bc7cb1a1 2003-11-23 devnull }
974 bc7cb1a1 2003-11-23 devnull
975 bc7cb1a1 2003-11-23 devnull int
976 bc7cb1a1 2003-11-23 devnull dscale(void)
977 bc7cb1a1 2003-11-23 devnull {
978 bc7cb1a1 2003-11-23 devnull Blk *dd, *dr, *r;
979 bc7cb1a1 2003-11-23 devnull int c;
980 bc7cb1a1 2003-11-23 devnull
981 bc7cb1a1 2003-11-23 devnull dr = pop();
982 bc7cb1a1 2003-11-23 devnull EMPTYS;
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);
994 bc7cb1a1 2003-11-23 devnull }
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);
999 bc7cb1a1 2003-11-23 devnull }
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);
1003 bc7cb1a1 2003-11-23 devnull else {
1004 bc7cb1a1 2003-11-23 devnull r = add0(dd,c);
1005 bc7cb1a1 2003-11-23 devnull irem = 0;
1006 bc7cb1a1 2003-11-23 devnull }
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);
1011 bc7cb1a1 2003-11-23 devnull }
1012 bc7cb1a1 2003-11-23 devnull
1013 bc7cb1a1 2003-11-23 devnull Blk*
1014 bc7cb1a1 2003-11-23 devnull removr(Blk *p, int n)
1015 bc7cb1a1 2003-11-23 devnull {
1016 bc7cb1a1 2003-11-23 devnull int nn, neg;
1017 bc7cb1a1 2003-11-23 devnull Blk *q, *s, *r;
1018 bc7cb1a1 2003-11-23 devnull
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;
1029 bc7cb1a1 2003-11-23 devnull }
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);
1046 bc7cb1a1 2003-11-23 devnull }
1047 bc7cb1a1 2003-11-23 devnull irem = q;
1048 bc7cb1a1 2003-11-23 devnull return(s);
1049 bc7cb1a1 2003-11-23 devnull }
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);
1055 bc7cb1a1 2003-11-23 devnull }
1056 bc7cb1a1 2003-11-23 devnull irem = q;
1057 bc7cb1a1 2003-11-23 devnull return(r);
1058 bc7cb1a1 2003-11-23 devnull }
1059 bc7cb1a1 2003-11-23 devnull
1060 bc7cb1a1 2003-11-23 devnull Blk*
1061 bc7cb1a1 2003-11-23 devnull dcsqrt(Blk *p)
1062 bc7cb1a1 2003-11-23 devnull {
1063 bc7cb1a1 2003-11-23 devnull Blk *t, *r, *q, *s;
1064 bc7cb1a1 2003-11-23 devnull int c, n, nn;
1065 bc7cb1a1 2003-11-23 devnull
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);
1075 bc7cb1a1 2003-11-23 devnull nn=1;
1076 bc7cb1a1 2003-11-23 devnull while((c -= nn)>=0)
1077 bc7cb1a1 2003-11-23 devnull nn+=2;
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);
1085 bc7cb1a1 2003-11-23 devnull } else
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)
1102 bc7cb1a1 2003-11-23 devnull break;
1103 bc7cb1a1 2003-11-23 devnull release(r);
1104 bc7cb1a1 2003-11-23 devnull release(t);
1105 bc7cb1a1 2003-11-23 devnull r = q;
1106 bc7cb1a1 2003-11-23 devnull }
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);
1111 bc7cb1a1 2003-11-23 devnull }
1112 bc7cb1a1 2003-11-23 devnull
1113 bc7cb1a1 2003-11-23 devnull Blk*
1114 bc7cb1a1 2003-11-23 devnull dcexp(Blk *base, Blk *ex)
1115 bc7cb1a1 2003-11-23 devnull {
1116 bc7cb1a1 2003-11-23 devnull Blk *r, *e, *p, *e1, *t, *cp;
1117 bc7cb1a1 2003-11-23 devnull int temp, c, n;
1118 bc7cb1a1 2003-11-23 devnull
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);
1131 bc7cb1a1 2003-11-23 devnull }
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;
1142 bc7cb1a1 2003-11-23 devnull }
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;
1148 bc7cb1a1 2003-11-23 devnull }
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;
1152 bc7cb1a1 2003-11-23 devnull }
1153 bc7cb1a1 2003-11-23 devnull if(c>1)
1154 bc7cb1a1 2003-11-23 devnull create(r);
1155 bc7cb1a1 2003-11-23 devnull else {
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);
1160 bc7cb1a1 2003-11-23 devnull } else
1161 bc7cb1a1 2003-11-23 devnull create(r);
1162 bc7cb1a1 2003-11-23 devnull }
1163 bc7cb1a1 2003-11-23 devnull }
1164 bc7cb1a1 2003-11-23 devnull edone:
1165 bc7cb1a1 2003-11-23 devnull release(p);
1166 bc7cb1a1 2003-11-23 devnull release(e);
1167 bc7cb1a1 2003-11-23 devnull return(r);
1168 bc7cb1a1 2003-11-23 devnull }
1169 bc7cb1a1 2003-11-23 devnull
1170 bc7cb1a1 2003-11-23 devnull void
1171 bc7cb1a1 2003-11-23 devnull init(int argc, char *argv[])
1172 bc7cb1a1 2003-11-23 devnull {
1173 bc7cb1a1 2003-11-23 devnull Sym *sp;
1174 bc7cb1a1 2003-11-23 devnull Dir *d;
1175 bc7cb1a1 2003-11-23 devnull
1176 bc7cb1a1 2003-11-23 devnull ARGBEGIN {
1177 bc7cb1a1 2003-11-23 devnull default:
1178 bc7cb1a1 2003-11-23 devnull dbg = 1;
1179 bc7cb1a1 2003-11-23 devnull break;
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");
1188 bc7cb1a1 2003-11-23 devnull }
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");
1192 bc7cb1a1 2003-11-23 devnull }
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");
1197 bc7cb1a1 2003-11-23 devnull }
1198 bc7cb1a1 2003-11-23 devnull }
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);
1206 bc7cb1a1 2003-11-23 devnull ll=70;
1207 bc7cb1a1 2003-11-23 devnull fw=1;
1208 bc7cb1a1 2003-11-23 devnull fw1=0;
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];
1223 bc7cb1a1 2003-11-23 devnull k=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++;
1228 bc7cb1a1 2003-11-23 devnull }
1229 bc7cb1a1 2003-11-23 devnull sptr->next=0;
1230 bc7cb1a1 2003-11-23 devnull sfree = &symlst[0];
1231 bc7cb1a1 2003-11-23 devnull }
1232 bc7cb1a1 2003-11-23 devnull
1233 bc7cb1a1 2003-11-23 devnull void
1234 bc7cb1a1 2003-11-23 devnull pushp(Blk *p)
1235 bc7cb1a1 2003-11-23 devnull {
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;
1239 bc7cb1a1 2003-11-23 devnull }
1240 bc7cb1a1 2003-11-23 devnull stkerr=0;
1241 bc7cb1a1 2003-11-23 devnull *++stkptr = p;
1242 bc7cb1a1 2003-11-23 devnull return;
1243 bc7cb1a1 2003-11-23 devnull }
1244 bc7cb1a1 2003-11-23 devnull
1245 bc7cb1a1 2003-11-23 devnull Blk*
1246 bc7cb1a1 2003-11-23 devnull pop(void)
1247 bc7cb1a1 2003-11-23 devnull {
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);
1251 bc7cb1a1 2003-11-23 devnull }
1252 bc7cb1a1 2003-11-23 devnull return(*stkptr--);
1253 bc7cb1a1 2003-11-23 devnull }
1254 bc7cb1a1 2003-11-23 devnull
1255 bc7cb1a1 2003-11-23 devnull Blk*
1256 bc7cb1a1 2003-11-23 devnull readin(void)
1257 bc7cb1a1 2003-11-23 devnull {
1258 bc7cb1a1 2003-11-23 devnull Blk *p, *q;
1259 bc7cb1a1 2003-11-23 devnull int dp, dpct, c;
1260 bc7cb1a1 2003-11-23 devnull
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;
1269 bc7cb1a1 2003-11-23 devnull dp++;
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;
1277 bc7cb1a1 2003-11-23 devnull else
1278 bc7cb1a1 2003-11-23 devnull if(c >= '0' && c <= '9')
1279 bc7cb1a1 2003-11-23 devnull c -= '0';
1280 bc7cb1a1 2003-11-23 devnull else
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++;
1286 bc7cb1a1 2003-11-23 devnull }
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);
1294 bc7cb1a1 2003-11-23 devnull }
1295 bc7cb1a1 2003-11-23 devnull }
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);
1304 bc7cb1a1 2003-11-23 devnull }
1305 bc7cb1a1 2003-11-23 devnull }
1306 bc7cb1a1 2003-11-23 devnull
1307 bc7cb1a1 2003-11-23 devnull /*
1308 bc7cb1a1 2003-11-23 devnull * returns pointer to struct with ct 0's & p
1309 bc7cb1a1 2003-11-23 devnull */
1310 bc7cb1a1 2003-11-23 devnull Blk*
1311 bc7cb1a1 2003-11-23 devnull add0(Blk *p, int ct)
1312 bc7cb1a1 2003-11-23 devnull {
1313 bc7cb1a1 2003-11-23 devnull Blk *q, *t;
1314 bc7cb1a1 2003-11-23 devnull
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;
1319 bc7cb1a1 2003-11-23 devnull }
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));
1323 bc7cb1a1 2003-11-23 devnull }
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);
1329 bc7cb1a1 2003-11-23 devnull }
1330 bc7cb1a1 2003-11-23 devnull return(q);
1331 bc7cb1a1 2003-11-23 devnull }
1332 bc7cb1a1 2003-11-23 devnull
1333 bc7cb1a1 2003-11-23 devnull Blk*
1334 bc7cb1a1 2003-11-23 devnull mult(Blk *p, Blk *q)
1335 bc7cb1a1 2003-11-23 devnull {
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;
1339 bc7cb1a1 2003-11-23 devnull
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;
1348 bc7cb1a1 2003-11-23 devnull }
1349 bc7cb1a1 2003-11-23 devnull }
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;
1357 bc7cb1a1 2003-11-23 devnull }
1358 bc7cb1a1 2003-11-23 devnull }
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);
1374 bc7cb1a1 2003-11-23 devnull }
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);
1379 bc7cb1a1 2003-11-23 devnull }
1380 bc7cb1a1 2003-11-23 devnull }
1381 bc7cb1a1 2003-11-23 devnull if(sign < 0) {
1382 bc7cb1a1 2003-11-23 devnull chsign(mr);
1383 bc7cb1a1 2003-11-23 devnull }
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);
1389 bc7cb1a1 2003-11-23 devnull }
1390 bc7cb1a1 2003-11-23 devnull
1391 bc7cb1a1 2003-11-23 devnull void
1392 bc7cb1a1 2003-11-23 devnull chsign(Blk *p)
1393 bc7cb1a1 2003-11-23 devnull {
1394 bc7cb1a1 2003-11-23 devnull int carry;
1395 bc7cb1a1 2003-11-23 devnull char ct;
1396 bc7cb1a1 2003-11-23 devnull
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;
1405 bc7cb1a1 2003-11-23 devnull }
1406 bc7cb1a1 2003-11-23 devnull salterc(p,ct);
1407 bc7cb1a1 2003-11-23 devnull }
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);
1416 bc7cb1a1 2003-11-23 devnull }
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);
1422 bc7cb1a1 2003-11-23 devnull }
1423 bc7cb1a1 2003-11-23 devnull return;
1424 bc7cb1a1 2003-11-23 devnull }
1425 bc7cb1a1 2003-11-23 devnull
1426 bc7cb1a1 2003-11-23 devnull int
1427 bc7cb1a1 2003-11-23 devnull readc(void)
1428 bc7cb1a1 2003-11-23 devnull {
1429 bc7cb1a1 2003-11-23 devnull loop:
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;
1436 bc7cb1a1 2003-11-23 devnull }
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;
1445 bc7cb1a1 2003-11-23 devnull }
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;
1450 bc7cb1a1 2003-11-23 devnull }
1451 bc7cb1a1 2003-11-23 devnull exits(0);
1452 bc7cb1a1 2003-11-23 devnull return 0; /* shut up ken */
1453 bc7cb1a1 2003-11-23 devnull }
1454 bc7cb1a1 2003-11-23 devnull
1455 bc7cb1a1 2003-11-23 devnull void
1456 bc7cb1a1 2003-11-23 devnull unreadc(char c)
1457 bc7cb1a1 2003-11-23 devnull {
1458 bc7cb1a1 2003-11-23 devnull
1459 bc7cb1a1 2003-11-23 devnull if((readptr != &readstk[0]) && (*readptr != 0)) {
1460 bc7cb1a1 2003-11-23 devnull sungetc(*readptr,c);
1461 bc7cb1a1 2003-11-23 devnull } else
1462 bc7cb1a1 2003-11-23 devnull Bungetc(curfile);
1463 bc7cb1a1 2003-11-23 devnull return;
1464 bc7cb1a1 2003-11-23 devnull }
1465 bc7cb1a1 2003-11-23 devnull
1466 bc7cb1a1 2003-11-23 devnull void
1467 bc7cb1a1 2003-11-23 devnull binop(char c)
1468 bc7cb1a1 2003-11-23 devnull {
1469 bc7cb1a1 2003-11-23 devnull Blk *r;
1470 bc7cb1a1 2003-11-23 devnull
1471 bc7cb1a1 2003-11-23 devnull r = 0;
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);
1475 bc7cb1a1 2003-11-23 devnull break;
1476 bc7cb1a1 2003-11-23 devnull case '*':
1477 bc7cb1a1 2003-11-23 devnull r = mult(arg1,arg2);
1478 bc7cb1a1 2003-11-23 devnull break;
1479 bc7cb1a1 2003-11-23 devnull case '/':
1480 bc7cb1a1 2003-11-23 devnull r = div(arg1,arg2);
1481 bc7cb1a1 2003-11-23 devnull break;
1482 bc7cb1a1 2003-11-23 devnull }
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);
1487 bc7cb1a1 2003-11-23 devnull }
1488 bc7cb1a1 2003-11-23 devnull
1489 bc7cb1a1 2003-11-23 devnull void
1490 bc7cb1a1 2003-11-23 devnull dcprint(Blk *hptr)
1491 bc7cb1a1 2003-11-23 devnull {
1492 bc7cb1a1 2003-11-23 devnull Blk *p, *q, *dec;
1493 bc7cb1a1 2003-11-23 devnull int dig, dout, ct, sc;
1494 bc7cb1a1 2003-11-23 devnull
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));
1501 bc7cb1a1 2003-11-23 devnull }
1502 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1503 bc7cb1a1 2003-11-23 devnull return;
1504 bc7cb1a1 2003-11-23 devnull }
1505 bc7cb1a1 2003-11-23 devnull }
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;
1511 bc7cb1a1 2003-11-23 devnull }
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('-');
1519 bc7cb1a1 2003-11-23 devnull }
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;
1523 bc7cb1a1 2003-11-23 devnull }
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;
1527 bc7cb1a1 2003-11-23 devnull }
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;
1531 bc7cb1a1 2003-11-23 devnull }
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;
1546 bc7cb1a1 2003-11-23 devnull
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);
1555 bc7cb1a1 2003-11-23 devnull p = q;
1556 bc7cb1a1 2003-11-23 devnull (*outdit)(rem,0);
1557 bc7cb1a1 2003-11-23 devnull }
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;
1566 bc7cb1a1 2003-11-23 devnull }
1567 bc7cb1a1 2003-11-23 devnull create(strptr);
1568 bc7cb1a1 2003-11-23 devnull OUTC('.');
1569 bc7cb1a1 2003-11-23 devnull ct=0;
1570 bc7cb1a1 2003-11-23 devnull do {
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");
1582 bc7cb1a1 2003-11-23 devnull }
1583 bc7cb1a1 2003-11-23 devnull
1584 bc7cb1a1 2003-11-23 devnull Blk*
1585 bc7cb1a1 2003-11-23 devnull getdec(Blk *p, int sc)
1586 bc7cb1a1 2003-11-23 devnull {
1587 bc7cb1a1 2003-11-23 devnull int cc;
1588 bc7cb1a1 2003-11-23 devnull Blk *q, *t, *s;
1589 bc7cb1a1 2003-11-23 devnull
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);
1594 bc7cb1a1 2003-11-23 devnull }
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;
1599 bc7cb1a1 2003-11-23 devnull }
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);
1613 bc7cb1a1 2003-11-23 devnull }
1614 bc7cb1a1 2003-11-23 devnull return(q);
1615 bc7cb1a1 2003-11-23 devnull }
1616 bc7cb1a1 2003-11-23 devnull
1617 bc7cb1a1 2003-11-23 devnull void
1618 bc7cb1a1 2003-11-23 devnull tenot(Blk *p, int sc)
1619 bc7cb1a1 2003-11-23 devnull {
1620 bc7cb1a1 2003-11-23 devnull int c, f;
1621 bc7cb1a1 2003-11-23 devnull
1622 bc7cb1a1 2003-11-23 devnull fsfile(p);
1623 bc7cb1a1 2003-11-23 devnull f=0;
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);
1628 bc7cb1a1 2003-11-23 devnull else
1629 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d",c);
1630 bc7cb1a1 2003-11-23 devnull f=1;
1631 bc7cb1a1 2003-11-23 devnull TEST2;
1632 bc7cb1a1 2003-11-23 devnull }
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;
1637 bc7cb1a1 2003-11-23 devnull }
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);
1641 bc7cb1a1 2003-11-23 devnull TEST2;
1642 bc7cb1a1 2003-11-23 devnull OUTC(c%10 +'0');
1643 bc7cb1a1 2003-11-23 devnull sc--;
1644 bc7cb1a1 2003-11-23 devnull } else {
1645 bc7cb1a1 2003-11-23 devnull OUTC('.');
1646 bc7cb1a1 2003-11-23 devnull }
1647 bc7cb1a1 2003-11-23 devnull while(sc>(p->rd-p->beg)*2) {
1648 bc7cb1a1 2003-11-23 devnull OUTC('0');
1649 bc7cb1a1 2003-11-23 devnull sc--;
1650 bc7cb1a1 2003-11-23 devnull }
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);
1655 bc7cb1a1 2003-11-23 devnull else
1656 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d",c);
1657 bc7cb1a1 2003-11-23 devnull sc -= 2;
1658 bc7cb1a1 2003-11-23 devnull TEST2;
1659 bc7cb1a1 2003-11-23 devnull }
1660 bc7cb1a1 2003-11-23 devnull if(sc == 1) {
1661 bc7cb1a1 2003-11-23 devnull OUTC(sbackc(p)/10 +'0');
1662 bc7cb1a1 2003-11-23 devnull }
1663 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1664 bc7cb1a1 2003-11-23 devnull release(p);
1665 bc7cb1a1 2003-11-23 devnull }
1666 bc7cb1a1 2003-11-23 devnull
1667 bc7cb1a1 2003-11-23 devnull void
1668 bc7cb1a1 2003-11-23 devnull oneot(Blk *p, int sc, char ch)
1669 bc7cb1a1 2003-11-23 devnull {
1670 bc7cb1a1 2003-11-23 devnull Blk *q;
1671 bc7cb1a1 2003-11-23 devnull
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);
1678 bc7cb1a1 2003-11-23 devnull q = p;
1679 bc7cb1a1 2003-11-23 devnull OUTC(ch);
1680 bc7cb1a1 2003-11-23 devnull }
1681 bc7cb1a1 2003-11-23 devnull release(q);
1682 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1683 bc7cb1a1 2003-11-23 devnull }
1684 bc7cb1a1 2003-11-23 devnull
1685 bc7cb1a1 2003-11-23 devnull void
1686 bc7cb1a1 2003-11-23 devnull hexot(Blk *p, int flg)
1687 bc7cb1a1 2003-11-23 devnull {
1688 bc7cb1a1 2003-11-23 devnull int c;
1689 bc7cb1a1 2003-11-23 devnull
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;
1696 bc7cb1a1 2003-11-23 devnull }
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;
1702 bc7cb1a1 2003-11-23 devnull }
1703 bc7cb1a1 2003-11-23 devnull sputc(strptr,c<10?c+'0':c-10+'a');
1704 bc7cb1a1 2003-11-23 devnull }
1705 bc7cb1a1 2003-11-23 devnull
1706 bc7cb1a1 2003-11-23 devnull void
1707 bc7cb1a1 2003-11-23 devnull bigot(Blk *p, int flg)
1708 bc7cb1a1 2003-11-23 devnull {
1709 bc7cb1a1 2003-11-23 devnull Blk *t, *q;
1710 bc7cb1a1 2003-11-23 devnull int neg, l;
1711 bc7cb1a1 2003-11-23 devnull
1712 bc7cb1a1 2003-11-23 devnull if(flg == 1) {
1713 bc7cb1a1 2003-11-23 devnull t = salloc(0);
1714 bc7cb1a1 2003-11-23 devnull l = 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;
1718 bc7cb1a1 2003-11-23 devnull }
1719 bc7cb1a1 2003-11-23 devnull neg=0;
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) {
1723 bc7cb1a1 2003-11-23 devnull neg=1;
1724 bc7cb1a1 2003-11-23 devnull chsign(p);
1725 bc7cb1a1 2003-11-23 devnull }
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);
1729 bc7cb1a1 2003-11-23 devnull p = q;
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);
1733 bc7cb1a1 2003-11-23 devnull }
1734 bc7cb1a1 2003-11-23 devnull }
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) {
1739 bc7cb1a1 2003-11-23 devnull l--;
1740 bc7cb1a1 2003-11-23 devnull sputc(strptr,'-');
1741 bc7cb1a1 2003-11-23 devnull }
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,'-');
1755 bc7cb1a1 2003-11-23 devnull }
1756 bc7cb1a1 2003-11-23 devnull }
1757 bc7cb1a1 2003-11-23 devnull sputc(strptr,' ');
1758 bc7cb1a1 2003-11-23 devnull }
1759 bc7cb1a1 2003-11-23 devnull
1760 bc7cb1a1 2003-11-23 devnull Blk*
1761 bc7cb1a1 2003-11-23 devnull add(Blk *a1, Blk *a2)
1762 bc7cb1a1 2003-11-23 devnull {
1763 bc7cb1a1 2003-11-23 devnull Blk *p;
1764 bc7cb1a1 2003-11-23 devnull int carry, n, size, c, n1, n2;
1765 bc7cb1a1 2003-11-23 devnull
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;
1778 bc7cb1a1 2003-11-23 devnull } else
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;
1782 bc7cb1a1 2003-11-23 devnull } else
1783 bc7cb1a1 2003-11-23 devnull carry = 0;
1784 bc7cb1a1 2003-11-23 devnull sputc(p,n);
1785 bc7cb1a1 2003-11-23 devnull }
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) {
1790 bc7cb1a1 2003-11-23 devnull c = 0;
1791 bc7cb1a1 2003-11-23 devnull while(sfbeg(p) == 0 && (c = sbackc(p)) == 0)
1792 bc7cb1a1 2003-11-23 devnull ;
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);
1796 bc7cb1a1 2003-11-23 devnull }
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)
1801 bc7cb1a1 2003-11-23 devnull break;
1802 bc7cb1a1 2003-11-23 devnull }
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);
1806 bc7cb1a1 2003-11-23 devnull }
1807 bc7cb1a1 2003-11-23 devnull return(p);
1808 bc7cb1a1 2003-11-23 devnull }
1809 bc7cb1a1 2003-11-23 devnull
1810 bc7cb1a1 2003-11-23 devnull int
1811 bc7cb1a1 2003-11-23 devnull eqk(void)
1812 bc7cb1a1 2003-11-23 devnull {
1813 bc7cb1a1 2003-11-23 devnull Blk *p, *q;
1814 bc7cb1a1 2003-11-23 devnull int skp, skq;
1815 bc7cb1a1 2003-11-23 devnull
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);
1827 bc7cb1a1 2003-11-23 devnull }
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);
1834 bc7cb1a1 2003-11-23 devnull }
1835 bc7cb1a1 2003-11-23 devnull arg1=p;
1836 bc7cb1a1 2003-11-23 devnull arg2=q;
1837 bc7cb1a1 2003-11-23 devnull return(0);
1838 bc7cb1a1 2003-11-23 devnull }
1839 bc7cb1a1 2003-11-23 devnull
1840 bc7cb1a1 2003-11-23 devnull Blk*
1841 bc7cb1a1 2003-11-23 devnull removc(Blk *p, int n)
1842 bc7cb1a1 2003-11-23 devnull {
1843 bc7cb1a1 2003-11-23 devnull Blk *q, *r;
1844 bc7cb1a1 2003-11-23 devnull
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;
1849 bc7cb1a1 2003-11-23 devnull }
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);
1857 bc7cb1a1 2003-11-23 devnull q = r;
1858 bc7cb1a1 2003-11-23 devnull }
1859 bc7cb1a1 2003-11-23 devnull release(p);
1860 bc7cb1a1 2003-11-23 devnull return(q);
1861 bc7cb1a1 2003-11-23 devnull }
1862 bc7cb1a1 2003-11-23 devnull
1863 bc7cb1a1 2003-11-23 devnull Blk*
1864 bc7cb1a1 2003-11-23 devnull scalint(Blk *p)
1865 bc7cb1a1 2003-11-23 devnull {
1866 bc7cb1a1 2003-11-23 devnull int n;
1867 bc7cb1a1 2003-11-23 devnull
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);
1871 bc7cb1a1 2003-11-23 devnull }
1872 bc7cb1a1 2003-11-23 devnull
1873 bc7cb1a1 2003-11-23 devnull Blk*
1874 bc7cb1a1 2003-11-23 devnull scale(Blk *p, int n)
1875 bc7cb1a1 2003-11-23 devnull {
1876 bc7cb1a1 2003-11-23 devnull Blk *q, *s, *t;
1877 bc7cb1a1 2003-11-23 devnull
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);
1889 bc7cb1a1 2003-11-23 devnull }
1890 bc7cb1a1 2003-11-23 devnull
1891 bc7cb1a1 2003-11-23 devnull int
1892 bc7cb1a1 2003-11-23 devnull subt(void)
1893 bc7cb1a1 2003-11-23 devnull {
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);
1904 bc7cb1a1 2003-11-23 devnull }
1905 bc7cb1a1 2003-11-23 devnull
1906 bc7cb1a1 2003-11-23 devnull int
1907 bc7cb1a1 2003-11-23 devnull command(void)
1908 bc7cb1a1 2003-11-23 devnull {
1909 bc7cb1a1 2003-11-23 devnull char line[100], *sl;
1910 bc7cb1a1 2003-11-23 devnull int pid, p, c;
1911 bc7cb1a1 2003-11-23 devnull
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");
1928 bc7cb1a1 2003-11-23 devnull }
1929 bc7cb1a1 2003-11-23 devnull for(;;) {
1930 bc7cb1a1 2003-11-23 devnull if((p = waitpid()) < 0)
1931 bc7cb1a1 2003-11-23 devnull break;
1932 bc7cb1a1 2003-11-23 devnull if(p== pid)
1933 bc7cb1a1 2003-11-23 devnull break;
1934 bc7cb1a1 2003-11-23 devnull }
1935 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"!\n");
1936 bc7cb1a1 2003-11-23 devnull return(0);
1937 bc7cb1a1 2003-11-23 devnull }
1938 bc7cb1a1 2003-11-23 devnull }
1939 bc7cb1a1 2003-11-23 devnull
1940 bc7cb1a1 2003-11-23 devnull int
1941 bc7cb1a1 2003-11-23 devnull cond(char c)
1942 bc7cb1a1 2003-11-23 devnull {
1943 bc7cb1a1 2003-11-23 devnull Blk *p;
1944 bc7cb1a1 2003-11-23 devnull int cc;
1945 bc7cb1a1 2003-11-23 devnull
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);
1955 bc7cb1a1 2003-11-23 devnull }
1956 bc7cb1a1 2003-11-23 devnull load();
1957 bc7cb1a1 2003-11-23 devnull return(1);
1958 bc7cb1a1 2003-11-23 devnull }
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);
1963 bc7cb1a1 2003-11-23 devnull }
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);
1968 bc7cb1a1 2003-11-23 devnull }
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);
1976 bc7cb1a1 2003-11-23 devnull }
1977 bc7cb1a1 2003-11-23 devnull load();
1978 bc7cb1a1 2003-11-23 devnull return(1);
1979 bc7cb1a1 2003-11-23 devnull }
1980 bc7cb1a1 2003-11-23 devnull
1981 bc7cb1a1 2003-11-23 devnull void
1982 bc7cb1a1 2003-11-23 devnull load(void)
1983 bc7cb1a1 2003-11-23 devnull {
1984 bc7cb1a1 2003-11-23 devnull int c;
1985 bc7cb1a1 2003-11-23 devnull Blk *p, *q, *t, *s;
1986 bc7cb1a1 2003-11-23 devnull
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);
2001 bc7cb1a1 2003-11-23 devnull }
2002 bc7cb1a1 2003-11-23 devnull }
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);
2007 bc7cb1a1 2003-11-23 devnull }
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');
2017 bc7cb1a1 2003-11-23 devnull }
2018 bc7cb1a1 2003-11-23 devnull else
2019 bc7cb1a1 2003-11-23 devnull sputc(q,0);
2020 bc7cb1a1 2003-11-23 devnull pushp(q);
2021 bc7cb1a1 2003-11-23 devnull }
2022 bc7cb1a1 2003-11-23 devnull }
2023 bc7cb1a1 2003-11-23 devnull
2024 bc7cb1a1 2003-11-23 devnull int
2025 bc7cb1a1 2003-11-23 devnull log2(long n)
2026 bc7cb1a1 2003-11-23 devnull {
2027 bc7cb1a1 2003-11-23 devnull int i;
2028 bc7cb1a1 2003-11-23 devnull
2029 bc7cb1a1 2003-11-23 devnull if(n == 0)
2030 bc7cb1a1 2003-11-23 devnull return(0);
2031 bc7cb1a1 2003-11-23 devnull i=31;
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)
2035 bc7cb1a1 2003-11-23 devnull i--;
2036 bc7cb1a1 2003-11-23 devnull return i-1;
2037 bc7cb1a1 2003-11-23 devnull }
2038 bc7cb1a1 2003-11-23 devnull
2039 bc7cb1a1 2003-11-23 devnull Blk*
2040 bc7cb1a1 2003-11-23 devnull salloc(int size)
2041 bc7cb1a1 2003-11-23 devnull {
2042 bc7cb1a1 2003-11-23 devnull Blk *hdr;
2043 bc7cb1a1 2003-11-23 devnull char *ptr;
2044 bc7cb1a1 2003-11-23 devnull
2045 bc7cb1a1 2003-11-23 devnull all++;
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");
2060 bc7cb1a1 2003-11-23 devnull }
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);
2067 bc7cb1a1 2003-11-23 devnull }
2068 bc7cb1a1 2003-11-23 devnull
2069 bc7cb1a1 2003-11-23 devnull Blk*
2070 bc7cb1a1 2003-11-23 devnull morehd(void)
2071 bc7cb1a1 2003-11-23 devnull {
2072 bc7cb1a1 2003-11-23 devnull Blk *h, *kk;
2073 bc7cb1a1 2003-11-23 devnull
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");
2081 bc7cb1a1 2003-11-23 devnull }
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);
2087 bc7cb1a1 2003-11-23 devnull }
2088 bc7cb1a1 2003-11-23 devnull
2089 bc7cb1a1 2003-11-23 devnull Blk*
2090 bc7cb1a1 2003-11-23 devnull copy(Blk *hptr, int size)
2091 bc7cb1a1 2003-11-23 devnull {
2092 bc7cb1a1 2003-11-23 devnull Blk *hdr;
2093 bc7cb1a1 2003-11-23 devnull unsigned sz;
2094 bc7cb1a1 2003-11-23 devnull char *ptr;
2095 bc7cb1a1 2003-11-23 devnull
2096 bc7cb1a1 2003-11-23 devnull all++;
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");
2112 bc7cb1a1 2003-11-23 devnull }
2113 bc7cb1a1 2003-11-23 devnull }
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);
2124 bc7cb1a1 2003-11-23 devnull }
2125 bc7cb1a1 2003-11-23 devnull
2126 bc7cb1a1 2003-11-23 devnull void
2127 bc7cb1a1 2003-11-23 devnull sdump(char *s1, Blk *hptr)
2128 bc7cb1a1 2003-11-23 devnull {
2129 bc7cb1a1 2003-11-23 devnull char *p;
2130 bc7cb1a1 2003-11-23 devnull
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");
2137 bc7cb1a1 2003-11-23 devnull }
2138 bc7cb1a1 2003-11-23 devnull
2139 bc7cb1a1 2003-11-23 devnull void
2140 bc7cb1a1 2003-11-23 devnull seekc(Blk *hptr, int n)
2141 bc7cb1a1 2003-11-23 devnull {
2142 bc7cb1a1 2003-11-23 devnull char *nn,*p;
2143 bc7cb1a1 2003-11-23 devnull
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 bc7cb1a1 2003-11-23 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");
2159 bc7cb1a1 2003-11-23 devnull }
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;
2163 bc7cb1a1 2003-11-23 devnull }
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;
2167 bc7cb1a1 2003-11-23 devnull }
2168 bc7cb1a1 2003-11-23 devnull
2169 bc7cb1a1 2003-11-23 devnull void
2170 bc7cb1a1 2003-11-23 devnull salterwd(Blk *ahptr, Blk *n)
2171 bc7cb1a1 2003-11-23 devnull {
2172 bc7cb1a1 2003-11-23 devnull Wblk *hptr;
2173 bc7cb1a1 2003-11-23 devnull
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;
2180 bc7cb1a1 2003-11-23 devnull }
2181 bc7cb1a1 2003-11-23 devnull
2182 bc7cb1a1 2003-11-23 devnull void
2183 bc7cb1a1 2003-11-23 devnull more(Blk *hptr)
2184 bc7cb1a1 2003-11-23 devnull {
2185 bc7cb1a1 2003-11-23 devnull unsigned size;
2186 bc7cb1a1 2003-11-23 devnull char *p;
2187 bc7cb1a1 2003-11-23 devnull
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 bc7cb1a1 2003-11-23 devnull /* free(hptr->beg);*//**/
2198 bc7cb1a1 2003-11-23 devnull p = realloc(hptr->beg, size);
2199 bc7cb1a1 2003-11-23 devnull
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");
2205 bc7cb1a1 2003-11-23 devnull }
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;
2210 bc7cb1a1 2003-11-23 devnull }
2211 bc7cb1a1 2003-11-23 devnull
2212 bc7cb1a1 2003-11-23 devnull void
2213 bc7cb1a1 2003-11-23 devnull ospace(char *s)
2214 bc7cb1a1 2003-11-23 devnull {
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();
2220 bc7cb1a1 2003-11-23 devnull }
2221 bc7cb1a1 2003-11-23 devnull
2222 bc7cb1a1 2003-11-23 devnull void
2223 bc7cb1a1 2003-11-23 devnull garbage(char *s)
2224 bc7cb1a1 2003-11-23 devnull {
2225 bc7cb1a1 2003-11-23 devnull USED(s);
2226 bc7cb1a1 2003-11-23 devnull }
2227 bc7cb1a1 2003-11-23 devnull
2228 bc7cb1a1 2003-11-23 devnull void
2229 bc7cb1a1 2003-11-23 devnull release(Blk *p)
2230 bc7cb1a1 2003-11-23 devnull {
2231 bc7cb1a1 2003-11-23 devnull rel++;
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);
2237 bc7cb1a1 2003-11-23 devnull }
2238 bc7cb1a1 2003-11-23 devnull
2239 bc7cb1a1 2003-11-23 devnull Blk*
2240 bc7cb1a1 2003-11-23 devnull dcgetwd(Blk *p)
2241 bc7cb1a1 2003-11-23 devnull {
2242 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2243 bc7cb1a1 2003-11-23 devnull
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++);
2248 bc7cb1a1 2003-11-23 devnull }
2249 bc7cb1a1 2003-11-23 devnull
2250 bc7cb1a1 2003-11-23 devnull void
2251 bc7cb1a1 2003-11-23 devnull putwd(Blk *p, Blk *c)
2252 bc7cb1a1 2003-11-23 devnull {
2253 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2254 bc7cb1a1 2003-11-23 devnull
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;
2259 bc7cb1a1 2003-11-23 devnull }
2260 bc7cb1a1 2003-11-23 devnull
2261 bc7cb1a1 2003-11-23 devnull Blk*
2262 bc7cb1a1 2003-11-23 devnull lookwd(Blk *p)
2263 bc7cb1a1 2003-11-23 devnull {
2264 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2265 bc7cb1a1 2003-11-23 devnull
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);
2270 bc7cb1a1 2003-11-23 devnull }
2271 bc7cb1a1 2003-11-23 devnull
2272 bc7cb1a1 2003-11-23 devnull char*
2273 bc7cb1a1 2003-11-23 devnull nalloc(char *p, unsigned nbytes)
2274 bc7cb1a1 2003-11-23 devnull {
2275 bc7cb1a1 2003-11-23 devnull char *q, *r;
2276 bc7cb1a1 2003-11-23 devnull
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);
2283 bc7cb1a1 2003-11-23 devnull }
2284 bc7cb1a1 2003-11-23 devnull
2285 bc7cb1a1 2003-11-23 devnull int
2286 bc7cb1a1 2003-11-23 devnull getstk(void)
2287 bc7cb1a1 2003-11-23 devnull {
2288 bc7cb1a1 2003-11-23 devnull int n;
2289 bc7cb1a1 2003-11-23 devnull uchar c;
2290 bc7cb1a1 2003-11-23 devnull
2291 bc7cb1a1 2003-11-23 devnull c = readc();
2292 bc7cb1a1 2003-11-23 devnull if(c != '<')
2293 bc7cb1a1 2003-11-23 devnull return c;
2294 bc7cb1a1 2003-11-23 devnull n = 0;
2295 bc7cb1a1 2003-11-23 devnull while(1) {
2296 bc7cb1a1 2003-11-23 devnull c = readc();
2297 bc7cb1a1 2003-11-23 devnull if(c == '>')
2298 bc7cb1a1 2003-11-23 devnull break;
2299 bc7cb1a1 2003-11-23 devnull n = n*10+c-'0';
2300 bc7cb1a1 2003-11-23 devnull }
2301 bc7cb1a1 2003-11-23 devnull return n;
2302 bc7cb1a1 2003-11-23 devnull }