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 int getstk(void);
169 bc7cb1a1 2003-11-23 devnull
170 bc7cb1a1 2003-11-23 devnull /********debug only**/
171 bc7cb1a1 2003-11-23 devnull void
172 bc7cb1a1 2003-11-23 devnull tpr(char *cp, Blk *bp)
173 bc7cb1a1 2003-11-23 devnull {
174 bc7cb1a1 2003-11-23 devnull print("%s-> ", cp);
175 bc7cb1a1 2003-11-23 devnull print("beg: %lx rd: %lx wt: %lx last: %lx\n", bp->beg, bp->rd,
176 bc7cb1a1 2003-11-23 devnull bp->wt, bp->last);
177 bc7cb1a1 2003-11-23 devnull for (cp = bp->beg; cp != bp->wt; cp++) {
178 bc7cb1a1 2003-11-23 devnull print("%d", *cp);
179 bc7cb1a1 2003-11-23 devnull if (cp != bp->wt-1)
180 bc7cb1a1 2003-11-23 devnull print("/");
181 bc7cb1a1 2003-11-23 devnull }
182 bc7cb1a1 2003-11-23 devnull print("\n");
183 bc7cb1a1 2003-11-23 devnull }
184 bc7cb1a1 2003-11-23 devnull /************/
185 bc7cb1a1 2003-11-23 devnull
186 bc7cb1a1 2003-11-23 devnull void
187 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
188 bc7cb1a1 2003-11-23 devnull {
189 bc7cb1a1 2003-11-23 devnull Binit(&bin, 0, OREAD);
190 bc7cb1a1 2003-11-23 devnull Binit(&bout, 1, OWRITE);
191 bc7cb1a1 2003-11-23 devnull init(argc,argv);
192 bc7cb1a1 2003-11-23 devnull commnds();
193 bc7cb1a1 2003-11-23 devnull exits(0);
194 bc7cb1a1 2003-11-23 devnull }
195 bc7cb1a1 2003-11-23 devnull
196 bc7cb1a1 2003-11-23 devnull void
197 bc7cb1a1 2003-11-23 devnull commnds(void)
198 bc7cb1a1 2003-11-23 devnull {
199 bc7cb1a1 2003-11-23 devnull Blk *p, *q, **ptr, *s, *t;
200 bc7cb1a1 2003-11-23 devnull long l;
201 bc7cb1a1 2003-11-23 devnull Sym *sp;
202 bc7cb1a1 2003-11-23 devnull int sk, sk1, sk2, c, sign, n, d;
203 bc7cb1a1 2003-11-23 devnull
204 bc7cb1a1 2003-11-23 devnull while(1) {
205 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
206 bc7cb1a1 2003-11-23 devnull if(((c = readc())>='0' && c <= '9') ||
207 bc7cb1a1 2003-11-23 devnull (c>='A' && c <='F') || c == '.') {
208 bc7cb1a1 2003-11-23 devnull unreadc(c);
209 bc7cb1a1 2003-11-23 devnull p = readin();
210 bc7cb1a1 2003-11-23 devnull pushp(p);
211 bc7cb1a1 2003-11-23 devnull continue;
212 bc7cb1a1 2003-11-23 devnull }
213 bc7cb1a1 2003-11-23 devnull switch(c) {
214 bc7cb1a1 2003-11-23 devnull case ' ':
215 bc7cb1a1 2003-11-23 devnull case '\n':
216 bc7cb1a1 2003-11-23 devnull case -1:
217 bc7cb1a1 2003-11-23 devnull continue;
218 bc7cb1a1 2003-11-23 devnull case 'Y':
219 bc7cb1a1 2003-11-23 devnull sdump("stk",*stkptr);
220 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "all %ld rel %ld headmor %ld\n",all,rel,headmor);
221 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "nbytes %ld\n",nbytes);
222 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "longest %ld active %ld maxsize %ld\n", longest,
223 bc7cb1a1 2003-11-23 devnull active, maxsize);
224 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "new all %d rel %d copy %d more %d lbytes %d\n",
225 bc7cb1a1 2003-11-23 devnull lall, lrel, lcopy, lmore, lbytes);
226 bc7cb1a1 2003-11-23 devnull lall = lrel = lcopy = lmore = lbytes = 0;
227 bc7cb1a1 2003-11-23 devnull continue;
228 bc7cb1a1 2003-11-23 devnull case '_':
229 bc7cb1a1 2003-11-23 devnull p = readin();
230 bc7cb1a1 2003-11-23 devnull savk = sunputc(p);
231 bc7cb1a1 2003-11-23 devnull chsign(p);
232 bc7cb1a1 2003-11-23 devnull sputc(p,savk);
233 bc7cb1a1 2003-11-23 devnull pushp(p);
234 bc7cb1a1 2003-11-23 devnull continue;
235 bc7cb1a1 2003-11-23 devnull case '-':
236 bc7cb1a1 2003-11-23 devnull subt();
237 bc7cb1a1 2003-11-23 devnull continue;
238 bc7cb1a1 2003-11-23 devnull case '+':
239 bc7cb1a1 2003-11-23 devnull if(eqk() != 0)
240 bc7cb1a1 2003-11-23 devnull continue;
241 bc7cb1a1 2003-11-23 devnull binop('+');
242 bc7cb1a1 2003-11-23 devnull continue;
243 bc7cb1a1 2003-11-23 devnull case '*':
244 bc7cb1a1 2003-11-23 devnull arg1 = pop();
245 bc7cb1a1 2003-11-23 devnull EMPTY;
246 bc7cb1a1 2003-11-23 devnull arg2 = pop();
247 bc7cb1a1 2003-11-23 devnull EMPTYR(arg1);
248 bc7cb1a1 2003-11-23 devnull sk1 = sunputc(arg1);
249 bc7cb1a1 2003-11-23 devnull sk2 = sunputc(arg2);
250 bc7cb1a1 2003-11-23 devnull savk = sk1+sk2;
251 bc7cb1a1 2003-11-23 devnull binop('*');
252 bc7cb1a1 2003-11-23 devnull p = pop();
253 bc7cb1a1 2003-11-23 devnull if(savk>k && savk>sk1 && savk>sk2) {
254 bc7cb1a1 2003-11-23 devnull sclobber(p);
255 bc7cb1a1 2003-11-23 devnull sk = sk1;
256 bc7cb1a1 2003-11-23 devnull if(sk<sk2)
257 bc7cb1a1 2003-11-23 devnull sk = sk2;
258 bc7cb1a1 2003-11-23 devnull if(sk<k)
259 bc7cb1a1 2003-11-23 devnull sk = k;
260 bc7cb1a1 2003-11-23 devnull p = removc(p,savk-sk);
261 bc7cb1a1 2003-11-23 devnull savk = sk;
262 bc7cb1a1 2003-11-23 devnull sputc(p,savk);
263 bc7cb1a1 2003-11-23 devnull }
264 bc7cb1a1 2003-11-23 devnull pushp(p);
265 bc7cb1a1 2003-11-23 devnull continue;
266 bc7cb1a1 2003-11-23 devnull case '/':
267 bc7cb1a1 2003-11-23 devnull casediv:
268 bc7cb1a1 2003-11-23 devnull if(dscale() != 0)
269 bc7cb1a1 2003-11-23 devnull continue;
270 bc7cb1a1 2003-11-23 devnull binop('/');
271 bc7cb1a1 2003-11-23 devnull if(irem != 0)
272 bc7cb1a1 2003-11-23 devnull release(irem);
273 bc7cb1a1 2003-11-23 devnull release(rem);
274 bc7cb1a1 2003-11-23 devnull continue;
275 bc7cb1a1 2003-11-23 devnull case '%':
276 bc7cb1a1 2003-11-23 devnull if(dscale() != 0)
277 bc7cb1a1 2003-11-23 devnull continue;
278 bc7cb1a1 2003-11-23 devnull binop('/');
279 bc7cb1a1 2003-11-23 devnull p = pop();
280 bc7cb1a1 2003-11-23 devnull release(p);
281 bc7cb1a1 2003-11-23 devnull if(irem == 0) {
282 bc7cb1a1 2003-11-23 devnull sputc(rem,skr+k);
283 bc7cb1a1 2003-11-23 devnull pushp(rem);
284 bc7cb1a1 2003-11-23 devnull continue;
285 bc7cb1a1 2003-11-23 devnull }
286 bc7cb1a1 2003-11-23 devnull p = add0(rem,skd-(skr+k));
287 bc7cb1a1 2003-11-23 devnull q = add(p,irem);
288 bc7cb1a1 2003-11-23 devnull release(p);
289 bc7cb1a1 2003-11-23 devnull release(irem);
290 bc7cb1a1 2003-11-23 devnull sputc(q,skd);
291 bc7cb1a1 2003-11-23 devnull pushp(q);
292 bc7cb1a1 2003-11-23 devnull continue;
293 bc7cb1a1 2003-11-23 devnull case 'v':
294 bc7cb1a1 2003-11-23 devnull p = pop();
295 bc7cb1a1 2003-11-23 devnull EMPTY;
296 bc7cb1a1 2003-11-23 devnull savk = sunputc(p);
297 bc7cb1a1 2003-11-23 devnull if(length(p) == 0) {
298 bc7cb1a1 2003-11-23 devnull sputc(p,savk);
299 bc7cb1a1 2003-11-23 devnull pushp(p);
300 bc7cb1a1 2003-11-23 devnull continue;
301 bc7cb1a1 2003-11-23 devnull }
302 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
303 bc7cb1a1 2003-11-23 devnull error("sqrt of neg number\n");
304 bc7cb1a1 2003-11-23 devnull }
305 bc7cb1a1 2003-11-23 devnull if(k<savk)
306 bc7cb1a1 2003-11-23 devnull n = savk;
307 bc7cb1a1 2003-11-23 devnull else {
308 bc7cb1a1 2003-11-23 devnull n = k*2-savk;
309 bc7cb1a1 2003-11-23 devnull savk = k;
310 bc7cb1a1 2003-11-23 devnull }
311 bc7cb1a1 2003-11-23 devnull arg1 = add0(p,n);
312 bc7cb1a1 2003-11-23 devnull arg2 = dcsqrt(arg1);
313 bc7cb1a1 2003-11-23 devnull sputc(arg2,savk);
314 bc7cb1a1 2003-11-23 devnull pushp(arg2);
315 bc7cb1a1 2003-11-23 devnull continue;
316 bc7cb1a1 2003-11-23 devnull
317 bc7cb1a1 2003-11-23 devnull case '^':
318 bc7cb1a1 2003-11-23 devnull neg = 0;
319 bc7cb1a1 2003-11-23 devnull arg1 = pop();
320 bc7cb1a1 2003-11-23 devnull EMPTY;
321 bc7cb1a1 2003-11-23 devnull if(sunputc(arg1) != 0)
322 bc7cb1a1 2003-11-23 devnull error("exp not an integer\n");
323 bc7cb1a1 2003-11-23 devnull arg2 = pop();
324 bc7cb1a1 2003-11-23 devnull EMPTYR(arg1);
325 bc7cb1a1 2003-11-23 devnull if(sfbeg(arg1) == 0 && sbackc(arg1)<0) {
326 bc7cb1a1 2003-11-23 devnull neg++;
327 bc7cb1a1 2003-11-23 devnull chsign(arg1);
328 bc7cb1a1 2003-11-23 devnull }
329 bc7cb1a1 2003-11-23 devnull if(length(arg1)>=3) {
330 bc7cb1a1 2003-11-23 devnull error("exp too big\n");
331 bc7cb1a1 2003-11-23 devnull }
332 bc7cb1a1 2003-11-23 devnull savk = sunputc(arg2);
333 bc7cb1a1 2003-11-23 devnull p = dcexp(arg2,arg1);
334 bc7cb1a1 2003-11-23 devnull release(arg2);
335 bc7cb1a1 2003-11-23 devnull rewind(arg1);
336 bc7cb1a1 2003-11-23 devnull c = sgetc(arg1);
337 bc7cb1a1 2003-11-23 devnull if(c == -1)
338 bc7cb1a1 2003-11-23 devnull c = 0;
339 bc7cb1a1 2003-11-23 devnull else
340 bc7cb1a1 2003-11-23 devnull if(sfeof(arg1) == 0)
341 bc7cb1a1 2003-11-23 devnull c = sgetc(arg1)*100 + c;
342 bc7cb1a1 2003-11-23 devnull d = c*savk;
343 bc7cb1a1 2003-11-23 devnull release(arg1);
344 bc7cb1a1 2003-11-23 devnull /* if(neg == 0) { removed to fix -exp bug*/
345 bc7cb1a1 2003-11-23 devnull if(k>=savk)
346 bc7cb1a1 2003-11-23 devnull n = k;
347 bc7cb1a1 2003-11-23 devnull else
348 bc7cb1a1 2003-11-23 devnull n = savk;
349 bc7cb1a1 2003-11-23 devnull if(n<d) {
350 bc7cb1a1 2003-11-23 devnull q = removc(p,d-n);
351 bc7cb1a1 2003-11-23 devnull sputc(q,n);
352 bc7cb1a1 2003-11-23 devnull pushp(q);
353 bc7cb1a1 2003-11-23 devnull } else {
354 bc7cb1a1 2003-11-23 devnull sputc(p,d);
355 bc7cb1a1 2003-11-23 devnull pushp(p);
356 bc7cb1a1 2003-11-23 devnull }
357 bc7cb1a1 2003-11-23 devnull /* } else { this is disaster for exp <-127 */
358 bc7cb1a1 2003-11-23 devnull /* sputc(p,d); */
359 bc7cb1a1 2003-11-23 devnull /* pushp(p); */
360 bc7cb1a1 2003-11-23 devnull /* } */
361 bc7cb1a1 2003-11-23 devnull if(neg == 0)
362 bc7cb1a1 2003-11-23 devnull continue;
363 bc7cb1a1 2003-11-23 devnull p = pop();
364 bc7cb1a1 2003-11-23 devnull q = salloc(2);
365 bc7cb1a1 2003-11-23 devnull sputc(q,1);
366 bc7cb1a1 2003-11-23 devnull sputc(q,0);
367 bc7cb1a1 2003-11-23 devnull pushp(q);
368 bc7cb1a1 2003-11-23 devnull pushp(p);
369 bc7cb1a1 2003-11-23 devnull goto casediv;
370 bc7cb1a1 2003-11-23 devnull case 'z':
371 bc7cb1a1 2003-11-23 devnull p = salloc(2);
372 bc7cb1a1 2003-11-23 devnull n = stkptr - stkbeg;
373 bc7cb1a1 2003-11-23 devnull if(n >= 100) {
374 bc7cb1a1 2003-11-23 devnull sputc(p,n/100);
375 bc7cb1a1 2003-11-23 devnull n %= 100;
376 bc7cb1a1 2003-11-23 devnull }
377 bc7cb1a1 2003-11-23 devnull sputc(p,n);
378 bc7cb1a1 2003-11-23 devnull sputc(p,0);
379 bc7cb1a1 2003-11-23 devnull pushp(p);
380 bc7cb1a1 2003-11-23 devnull continue;
381 bc7cb1a1 2003-11-23 devnull case 'Z':
382 bc7cb1a1 2003-11-23 devnull p = pop();
383 bc7cb1a1 2003-11-23 devnull EMPTY;
384 bc7cb1a1 2003-11-23 devnull n = (length(p)-1)<<1;
385 bc7cb1a1 2003-11-23 devnull fsfile(p);
386 bc7cb1a1 2003-11-23 devnull backc(p);
387 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0) {
388 bc7cb1a1 2003-11-23 devnull if((c = sbackc(p))<0) {
389 bc7cb1a1 2003-11-23 devnull n -= 2;
390 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 1)
391 bc7cb1a1 2003-11-23 devnull n++;
392 bc7cb1a1 2003-11-23 devnull else {
393 bc7cb1a1 2003-11-23 devnull if((c = sbackc(p)) == 0)
394 bc7cb1a1 2003-11-23 devnull n++;
395 bc7cb1a1 2003-11-23 devnull else
396 bc7cb1a1 2003-11-23 devnull if(c > 90)
397 bc7cb1a1 2003-11-23 devnull n--;
398 bc7cb1a1 2003-11-23 devnull }
399 bc7cb1a1 2003-11-23 devnull } else
400 bc7cb1a1 2003-11-23 devnull if(c < 10)
401 bc7cb1a1 2003-11-23 devnull n--;
402 bc7cb1a1 2003-11-23 devnull }
403 bc7cb1a1 2003-11-23 devnull release(p);
404 bc7cb1a1 2003-11-23 devnull q = salloc(1);
405 bc7cb1a1 2003-11-23 devnull if(n >= 100) {
406 bc7cb1a1 2003-11-23 devnull sputc(q,n%100);
407 bc7cb1a1 2003-11-23 devnull n /= 100;
408 bc7cb1a1 2003-11-23 devnull }
409 bc7cb1a1 2003-11-23 devnull sputc(q,n);
410 bc7cb1a1 2003-11-23 devnull sputc(q,0);
411 bc7cb1a1 2003-11-23 devnull pushp(q);
412 bc7cb1a1 2003-11-23 devnull continue;
413 bc7cb1a1 2003-11-23 devnull case 'i':
414 bc7cb1a1 2003-11-23 devnull p = pop();
415 bc7cb1a1 2003-11-23 devnull EMPTY;
416 bc7cb1a1 2003-11-23 devnull p = scalint(p);
417 bc7cb1a1 2003-11-23 devnull release(inbas);
418 bc7cb1a1 2003-11-23 devnull inbas = p;
419 bc7cb1a1 2003-11-23 devnull continue;
420 bc7cb1a1 2003-11-23 devnull case 'I':
421 bc7cb1a1 2003-11-23 devnull p = copy(inbas,length(inbas)+1);
422 bc7cb1a1 2003-11-23 devnull sputc(p,0);
423 bc7cb1a1 2003-11-23 devnull pushp(p);
424 bc7cb1a1 2003-11-23 devnull continue;
425 bc7cb1a1 2003-11-23 devnull case 'o':
426 bc7cb1a1 2003-11-23 devnull p = pop();
427 bc7cb1a1 2003-11-23 devnull EMPTY;
428 bc7cb1a1 2003-11-23 devnull p = scalint(p);
429 bc7cb1a1 2003-11-23 devnull sign = 0;
430 bc7cb1a1 2003-11-23 devnull n = length(p);
431 bc7cb1a1 2003-11-23 devnull q = copy(p,n);
432 bc7cb1a1 2003-11-23 devnull fsfile(q);
433 bc7cb1a1 2003-11-23 devnull l = c = sbackc(q);
434 bc7cb1a1 2003-11-23 devnull if(n != 1) {
435 bc7cb1a1 2003-11-23 devnull if(c<0) {
436 bc7cb1a1 2003-11-23 devnull sign = 1;
437 bc7cb1a1 2003-11-23 devnull chsign(q);
438 bc7cb1a1 2003-11-23 devnull n = length(q);
439 bc7cb1a1 2003-11-23 devnull fsfile(q);
440 bc7cb1a1 2003-11-23 devnull l = c = sbackc(q);
441 bc7cb1a1 2003-11-23 devnull }
442 bc7cb1a1 2003-11-23 devnull if(n != 1) {
443 bc7cb1a1 2003-11-23 devnull while(sfbeg(q) == 0)
444 bc7cb1a1 2003-11-23 devnull l = l*100+sbackc(q);
445 bc7cb1a1 2003-11-23 devnull }
446 bc7cb1a1 2003-11-23 devnull }
447 bc7cb1a1 2003-11-23 devnull logo = log2(l);
448 bc7cb1a1 2003-11-23 devnull obase = l;
449 bc7cb1a1 2003-11-23 devnull release(basptr);
450 bc7cb1a1 2003-11-23 devnull if(sign == 1)
451 bc7cb1a1 2003-11-23 devnull obase = -l;
452 bc7cb1a1 2003-11-23 devnull basptr = p;
453 bc7cb1a1 2003-11-23 devnull outdit = bigot;
454 bc7cb1a1 2003-11-23 devnull if(n == 1 && sign == 0) {
455 bc7cb1a1 2003-11-23 devnull if(c <= 16) {
456 bc7cb1a1 2003-11-23 devnull outdit = hexot;
457 bc7cb1a1 2003-11-23 devnull fw = 1;
458 bc7cb1a1 2003-11-23 devnull fw1 = 0;
459 bc7cb1a1 2003-11-23 devnull ll = 70;
460 bc7cb1a1 2003-11-23 devnull release(q);
461 bc7cb1a1 2003-11-23 devnull continue;
462 bc7cb1a1 2003-11-23 devnull }
463 bc7cb1a1 2003-11-23 devnull }
464 bc7cb1a1 2003-11-23 devnull n = 0;
465 bc7cb1a1 2003-11-23 devnull if(sign == 1)
466 bc7cb1a1 2003-11-23 devnull n++;
467 bc7cb1a1 2003-11-23 devnull p = salloc(1);
468 bc7cb1a1 2003-11-23 devnull sputc(p,-1);
469 bc7cb1a1 2003-11-23 devnull t = add(p,q);
470 bc7cb1a1 2003-11-23 devnull n += length(t)*2;
471 bc7cb1a1 2003-11-23 devnull fsfile(t);
472 bc7cb1a1 2003-11-23 devnull if(sbackc(t)>9)
473 bc7cb1a1 2003-11-23 devnull n++;
474 bc7cb1a1 2003-11-23 devnull release(t);
475 bc7cb1a1 2003-11-23 devnull release(q);
476 bc7cb1a1 2003-11-23 devnull release(p);
477 bc7cb1a1 2003-11-23 devnull fw = n;
478 bc7cb1a1 2003-11-23 devnull fw1 = n-1;
479 bc7cb1a1 2003-11-23 devnull ll = 70;
480 bc7cb1a1 2003-11-23 devnull if(fw>=ll)
481 bc7cb1a1 2003-11-23 devnull continue;
482 bc7cb1a1 2003-11-23 devnull ll = (70/fw)*fw;
483 bc7cb1a1 2003-11-23 devnull continue;
484 bc7cb1a1 2003-11-23 devnull case 'O':
485 bc7cb1a1 2003-11-23 devnull p = copy(basptr,length(basptr)+1);
486 bc7cb1a1 2003-11-23 devnull sputc(p,0);
487 bc7cb1a1 2003-11-23 devnull pushp(p);
488 bc7cb1a1 2003-11-23 devnull continue;
489 bc7cb1a1 2003-11-23 devnull case '[':
490 bc7cb1a1 2003-11-23 devnull n = 0;
491 bc7cb1a1 2003-11-23 devnull p = salloc(0);
492 bc7cb1a1 2003-11-23 devnull for(;;) {
493 bc7cb1a1 2003-11-23 devnull if((c = readc()) == ']') {
494 bc7cb1a1 2003-11-23 devnull if(n == 0)
495 bc7cb1a1 2003-11-23 devnull break;
496 bc7cb1a1 2003-11-23 devnull n--;
497 bc7cb1a1 2003-11-23 devnull }
498 bc7cb1a1 2003-11-23 devnull sputc(p,c);
499 bc7cb1a1 2003-11-23 devnull if(c == '[')
500 bc7cb1a1 2003-11-23 devnull n++;
501 bc7cb1a1 2003-11-23 devnull }
502 bc7cb1a1 2003-11-23 devnull pushp(p);
503 bc7cb1a1 2003-11-23 devnull continue;
504 bc7cb1a1 2003-11-23 devnull case 'k':
505 bc7cb1a1 2003-11-23 devnull p = pop();
506 bc7cb1a1 2003-11-23 devnull EMPTY;
507 bc7cb1a1 2003-11-23 devnull p = scalint(p);
508 bc7cb1a1 2003-11-23 devnull if(length(p)>1) {
509 bc7cb1a1 2003-11-23 devnull error("scale too big\n");
510 bc7cb1a1 2003-11-23 devnull }
511 bc7cb1a1 2003-11-23 devnull rewind(p);
512 bc7cb1a1 2003-11-23 devnull k = 0;
513 bc7cb1a1 2003-11-23 devnull if(!sfeof(p))
514 bc7cb1a1 2003-11-23 devnull k = sgetc(p);
515 bc7cb1a1 2003-11-23 devnull release(scalptr);
516 bc7cb1a1 2003-11-23 devnull scalptr = p;
517 bc7cb1a1 2003-11-23 devnull continue;
518 bc7cb1a1 2003-11-23 devnull case 'K':
519 bc7cb1a1 2003-11-23 devnull p = copy(scalptr,length(scalptr)+1);
520 bc7cb1a1 2003-11-23 devnull sputc(p,0);
521 bc7cb1a1 2003-11-23 devnull pushp(p);
522 bc7cb1a1 2003-11-23 devnull continue;
523 bc7cb1a1 2003-11-23 devnull case 'X':
524 bc7cb1a1 2003-11-23 devnull p = pop();
525 bc7cb1a1 2003-11-23 devnull EMPTY;
526 bc7cb1a1 2003-11-23 devnull fsfile(p);
527 bc7cb1a1 2003-11-23 devnull n = sbackc(p);
528 bc7cb1a1 2003-11-23 devnull release(p);
529 bc7cb1a1 2003-11-23 devnull p = salloc(2);
530 bc7cb1a1 2003-11-23 devnull sputc(p,n);
531 bc7cb1a1 2003-11-23 devnull sputc(p,0);
532 bc7cb1a1 2003-11-23 devnull pushp(p);
533 bc7cb1a1 2003-11-23 devnull continue;
534 bc7cb1a1 2003-11-23 devnull case 'Q':
535 bc7cb1a1 2003-11-23 devnull p = pop();
536 bc7cb1a1 2003-11-23 devnull EMPTY;
537 bc7cb1a1 2003-11-23 devnull if(length(p)>2) {
538 bc7cb1a1 2003-11-23 devnull error("Q?\n");
539 bc7cb1a1 2003-11-23 devnull }
540 bc7cb1a1 2003-11-23 devnull rewind(p);
541 bc7cb1a1 2003-11-23 devnull if((c = sgetc(p))<0) {
542 bc7cb1a1 2003-11-23 devnull error("neg Q\n");
543 bc7cb1a1 2003-11-23 devnull }
544 bc7cb1a1 2003-11-23 devnull release(p);
545 bc7cb1a1 2003-11-23 devnull while(c-- > 0) {
546 bc7cb1a1 2003-11-23 devnull if(readptr == &readstk[0]) {
547 bc7cb1a1 2003-11-23 devnull error("readstk?\n");
548 bc7cb1a1 2003-11-23 devnull }
549 bc7cb1a1 2003-11-23 devnull if(*readptr != 0)
550 bc7cb1a1 2003-11-23 devnull release(*readptr);
551 bc7cb1a1 2003-11-23 devnull readptr--;
552 bc7cb1a1 2003-11-23 devnull }
553 bc7cb1a1 2003-11-23 devnull continue;
554 bc7cb1a1 2003-11-23 devnull case 'q':
555 bc7cb1a1 2003-11-23 devnull if(readptr <= &readstk[1])
556 bc7cb1a1 2003-11-23 devnull exits(0);
557 bc7cb1a1 2003-11-23 devnull if(*readptr != 0)
558 bc7cb1a1 2003-11-23 devnull release(*readptr);
559 bc7cb1a1 2003-11-23 devnull readptr--;
560 bc7cb1a1 2003-11-23 devnull if(*readptr != 0)
561 bc7cb1a1 2003-11-23 devnull release(*readptr);
562 bc7cb1a1 2003-11-23 devnull readptr--;
563 bc7cb1a1 2003-11-23 devnull continue;
564 bc7cb1a1 2003-11-23 devnull case 'f':
565 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0])
566 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"empty stack\n");
567 bc7cb1a1 2003-11-23 devnull else {
568 bc7cb1a1 2003-11-23 devnull for(ptr = stkptr; ptr > &stack[0];) {
569 bc7cb1a1 2003-11-23 devnull dcprint(*ptr--);
570 bc7cb1a1 2003-11-23 devnull }
571 bc7cb1a1 2003-11-23 devnull }
572 bc7cb1a1 2003-11-23 devnull continue;
573 bc7cb1a1 2003-11-23 devnull case 'p':
574 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0])
575 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"empty stack\n");
576 bc7cb1a1 2003-11-23 devnull else {
577 bc7cb1a1 2003-11-23 devnull dcprint(*stkptr);
578 bc7cb1a1 2003-11-23 devnull }
579 bc7cb1a1 2003-11-23 devnull continue;
580 bc7cb1a1 2003-11-23 devnull case 'P':
581 bc7cb1a1 2003-11-23 devnull p = pop();
582 bc7cb1a1 2003-11-23 devnull EMPTY;
583 bc7cb1a1 2003-11-23 devnull sputc(p,0);
584 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%s",p->beg);
585 bc7cb1a1 2003-11-23 devnull release(p);
586 bc7cb1a1 2003-11-23 devnull continue;
587 bc7cb1a1 2003-11-23 devnull case 'd':
588 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0]) {
589 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"empty stack\n");
590 bc7cb1a1 2003-11-23 devnull continue;
591 bc7cb1a1 2003-11-23 devnull }
592 bc7cb1a1 2003-11-23 devnull q = *stkptr;
593 bc7cb1a1 2003-11-23 devnull n = length(q);
594 bc7cb1a1 2003-11-23 devnull p = copy(*stkptr,n);
595 bc7cb1a1 2003-11-23 devnull pushp(p);
596 bc7cb1a1 2003-11-23 devnull continue;
597 bc7cb1a1 2003-11-23 devnull case 'c':
598 bc7cb1a1 2003-11-23 devnull while(stkerr == 0) {
599 bc7cb1a1 2003-11-23 devnull p = pop();
600 bc7cb1a1 2003-11-23 devnull if(stkerr == 0)
601 bc7cb1a1 2003-11-23 devnull release(p);
602 bc7cb1a1 2003-11-23 devnull }
603 bc7cb1a1 2003-11-23 devnull continue;
604 bc7cb1a1 2003-11-23 devnull case 'S':
605 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0]) {
606 bc7cb1a1 2003-11-23 devnull error("save: args\n");
607 bc7cb1a1 2003-11-23 devnull }
608 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
609 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
610 bc7cb1a1 2003-11-23 devnull sp = stable[c] = sfree;
611 bc7cb1a1 2003-11-23 devnull sfree = sfree->next;
612 bc7cb1a1 2003-11-23 devnull if(sfree == 0)
613 bc7cb1a1 2003-11-23 devnull goto sempty;
614 bc7cb1a1 2003-11-23 devnull sp->next = sptr;
615 bc7cb1a1 2003-11-23 devnull p = pop();
616 bc7cb1a1 2003-11-23 devnull EMPTY;
617 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
618 bc7cb1a1 2003-11-23 devnull q = copy(p,length(p)+PTRSZ);
619 bc7cb1a1 2003-11-23 devnull for(n = 0;n < PTRSZ;n++) {
620 bc7cb1a1 2003-11-23 devnull sputc(q,0);
621 bc7cb1a1 2003-11-23 devnull }
622 bc7cb1a1 2003-11-23 devnull release(p);
623 bc7cb1a1 2003-11-23 devnull p = q;
624 bc7cb1a1 2003-11-23 devnull }
625 bc7cb1a1 2003-11-23 devnull sp->val = p;
626 bc7cb1a1 2003-11-23 devnull continue;
627 bc7cb1a1 2003-11-23 devnull sempty:
628 bc7cb1a1 2003-11-23 devnull error("symbol table overflow\n");
629 bc7cb1a1 2003-11-23 devnull case 's':
630 bc7cb1a1 2003-11-23 devnull if(stkptr == &stack[0]) {
631 bc7cb1a1 2003-11-23 devnull error("save:args\n");
632 bc7cb1a1 2003-11-23 devnull }
633 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
634 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
635 bc7cb1a1 2003-11-23 devnull if(sptr != 0) {
636 bc7cb1a1 2003-11-23 devnull p = sptr->val;
637 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
638 bc7cb1a1 2003-11-23 devnull rewind(p);
639 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0)
640 bc7cb1a1 2003-11-23 devnull release(dcgetwd(p));
641 bc7cb1a1 2003-11-23 devnull }
642 bc7cb1a1 2003-11-23 devnull release(p);
643 bc7cb1a1 2003-11-23 devnull } else {
644 bc7cb1a1 2003-11-23 devnull sptr = stable[c] = sfree;
645 bc7cb1a1 2003-11-23 devnull sfree = sfree->next;
646 bc7cb1a1 2003-11-23 devnull if(sfree == 0)
647 bc7cb1a1 2003-11-23 devnull goto sempty;
648 bc7cb1a1 2003-11-23 devnull sptr->next = 0;
649 bc7cb1a1 2003-11-23 devnull }
650 bc7cb1a1 2003-11-23 devnull p = pop();
651 bc7cb1a1 2003-11-23 devnull sptr->val = p;
652 bc7cb1a1 2003-11-23 devnull continue;
653 bc7cb1a1 2003-11-23 devnull case 'l':
654 bc7cb1a1 2003-11-23 devnull load();
655 bc7cb1a1 2003-11-23 devnull continue;
656 bc7cb1a1 2003-11-23 devnull case 'L':
657 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
658 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
659 bc7cb1a1 2003-11-23 devnull if(sptr == 0) {
660 bc7cb1a1 2003-11-23 devnull error("L?\n");
661 bc7cb1a1 2003-11-23 devnull }
662 bc7cb1a1 2003-11-23 devnull stable[c] = sptr->next;
663 bc7cb1a1 2003-11-23 devnull sptr->next = sfree;
664 bc7cb1a1 2003-11-23 devnull sfree = sptr;
665 bc7cb1a1 2003-11-23 devnull p = sptr->val;
666 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
667 bc7cb1a1 2003-11-23 devnull rewind(p);
668 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
669 bc7cb1a1 2003-11-23 devnull q = dcgetwd(p);
670 bc7cb1a1 2003-11-23 devnull if(q != 0)
671 bc7cb1a1 2003-11-23 devnull release(q);
672 bc7cb1a1 2003-11-23 devnull }
673 bc7cb1a1 2003-11-23 devnull }
674 bc7cb1a1 2003-11-23 devnull pushp(p);
675 bc7cb1a1 2003-11-23 devnull continue;
676 bc7cb1a1 2003-11-23 devnull case ':':
677 bc7cb1a1 2003-11-23 devnull p = pop();
678 bc7cb1a1 2003-11-23 devnull EMPTY;
679 bc7cb1a1 2003-11-23 devnull q = scalint(p);
680 bc7cb1a1 2003-11-23 devnull fsfile(q);
681 bc7cb1a1 2003-11-23 devnull c = 0;
682 bc7cb1a1 2003-11-23 devnull if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) {
683 bc7cb1a1 2003-11-23 devnull error("neg index\n");
684 bc7cb1a1 2003-11-23 devnull }
685 bc7cb1a1 2003-11-23 devnull if(length(q)>2) {
686 bc7cb1a1 2003-11-23 devnull error("index too big\n");
687 bc7cb1a1 2003-11-23 devnull }
688 bc7cb1a1 2003-11-23 devnull if(sfbeg(q) == 0)
689 bc7cb1a1 2003-11-23 devnull c = c*100+sbackc(q);
690 bc7cb1a1 2003-11-23 devnull if(c >= MAXIND) {
691 bc7cb1a1 2003-11-23 devnull error("index too big\n");
692 bc7cb1a1 2003-11-23 devnull }
693 bc7cb1a1 2003-11-23 devnull release(q);
694 bc7cb1a1 2003-11-23 devnull n = getstk() & 0377;
695 bc7cb1a1 2003-11-23 devnull sptr = stable[n];
696 bc7cb1a1 2003-11-23 devnull if(sptr == 0) {
697 bc7cb1a1 2003-11-23 devnull sptr = stable[n] = sfree;
698 bc7cb1a1 2003-11-23 devnull sfree = sfree->next;
699 bc7cb1a1 2003-11-23 devnull if(sfree == 0)
700 bc7cb1a1 2003-11-23 devnull goto sempty;
701 bc7cb1a1 2003-11-23 devnull sptr->next = 0;
702 bc7cb1a1 2003-11-23 devnull p = salloc((c+PTRSZ)*PTRSZ);
703 bc7cb1a1 2003-11-23 devnull zero(p);
704 bc7cb1a1 2003-11-23 devnull } else {
705 bc7cb1a1 2003-11-23 devnull p = sptr->val;
706 bc7cb1a1 2003-11-23 devnull if(length(p)-PTRSZ < c*PTRSZ) {
707 bc7cb1a1 2003-11-23 devnull q = copy(p,(c+PTRSZ)*PTRSZ);
708 bc7cb1a1 2003-11-23 devnull release(p);
709 bc7cb1a1 2003-11-23 devnull p = q;
710 bc7cb1a1 2003-11-23 devnull }
711 bc7cb1a1 2003-11-23 devnull }
712 bc7cb1a1 2003-11-23 devnull seekc(p,c*PTRSZ);
713 bc7cb1a1 2003-11-23 devnull q = lookwd(p);
714 bc7cb1a1 2003-11-23 devnull if(q!=0)
715 bc7cb1a1 2003-11-23 devnull release(q);
716 bc7cb1a1 2003-11-23 devnull s = pop();
717 bc7cb1a1 2003-11-23 devnull EMPTY;
718 bc7cb1a1 2003-11-23 devnull salterwd(p, s);
719 bc7cb1a1 2003-11-23 devnull sptr->val = p;
720 bc7cb1a1 2003-11-23 devnull continue;
721 bc7cb1a1 2003-11-23 devnull case ';':
722 bc7cb1a1 2003-11-23 devnull p = pop();
723 bc7cb1a1 2003-11-23 devnull EMPTY;
724 bc7cb1a1 2003-11-23 devnull q = scalint(p);
725 bc7cb1a1 2003-11-23 devnull fsfile(q);
726 bc7cb1a1 2003-11-23 devnull c = 0;
727 bc7cb1a1 2003-11-23 devnull if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) {
728 bc7cb1a1 2003-11-23 devnull error("neg index\n");
729 bc7cb1a1 2003-11-23 devnull }
730 bc7cb1a1 2003-11-23 devnull if(length(q)>2) {
731 bc7cb1a1 2003-11-23 devnull error("index too big\n");
732 bc7cb1a1 2003-11-23 devnull }
733 bc7cb1a1 2003-11-23 devnull if(sfbeg(q) == 0)
734 bc7cb1a1 2003-11-23 devnull c = c*100+sbackc(q);
735 bc7cb1a1 2003-11-23 devnull if(c >= MAXIND) {
736 bc7cb1a1 2003-11-23 devnull error("index too big\n");
737 bc7cb1a1 2003-11-23 devnull }
738 bc7cb1a1 2003-11-23 devnull release(q);
739 bc7cb1a1 2003-11-23 devnull n = getstk() & 0377;
740 bc7cb1a1 2003-11-23 devnull sptr = stable[n];
741 bc7cb1a1 2003-11-23 devnull if(sptr != 0){
742 bc7cb1a1 2003-11-23 devnull p = sptr->val;
743 bc7cb1a1 2003-11-23 devnull if(length(p)-PTRSZ >= c*PTRSZ) {
744 bc7cb1a1 2003-11-23 devnull seekc(p,c*PTRSZ);
745 bc7cb1a1 2003-11-23 devnull s = dcgetwd(p);
746 bc7cb1a1 2003-11-23 devnull if(s != 0) {
747 bc7cb1a1 2003-11-23 devnull q = copy(s,length(s));
748 bc7cb1a1 2003-11-23 devnull pushp(q);
749 bc7cb1a1 2003-11-23 devnull continue;
750 bc7cb1a1 2003-11-23 devnull }
751 bc7cb1a1 2003-11-23 devnull }
752 bc7cb1a1 2003-11-23 devnull }
753 bc7cb1a1 2003-11-23 devnull q = salloc(1); /*so uninitialized array elt prints as 0*/
754 bc7cb1a1 2003-11-23 devnull sputc(q, 0);
755 bc7cb1a1 2003-11-23 devnull pushp(q);
756 bc7cb1a1 2003-11-23 devnull continue;
757 bc7cb1a1 2003-11-23 devnull case 'x':
758 bc7cb1a1 2003-11-23 devnull execute:
759 bc7cb1a1 2003-11-23 devnull p = pop();
760 bc7cb1a1 2003-11-23 devnull EMPTY;
761 bc7cb1a1 2003-11-23 devnull if((readptr != &readstk[0]) && (*readptr != 0)) {
762 bc7cb1a1 2003-11-23 devnull if((*readptr)->rd == (*readptr)->wt)
763 bc7cb1a1 2003-11-23 devnull release(*readptr);
764 bc7cb1a1 2003-11-23 devnull else {
765 bc7cb1a1 2003-11-23 devnull if(readptr++ == &readstk[RDSKSZ]) {
766 bc7cb1a1 2003-11-23 devnull error("nesting depth\n");
767 bc7cb1a1 2003-11-23 devnull }
768 bc7cb1a1 2003-11-23 devnull }
769 bc7cb1a1 2003-11-23 devnull } else
770 bc7cb1a1 2003-11-23 devnull readptr++;
771 bc7cb1a1 2003-11-23 devnull *readptr = p;
772 bc7cb1a1 2003-11-23 devnull if(p != 0)
773 bc7cb1a1 2003-11-23 devnull rewind(p);
774 bc7cb1a1 2003-11-23 devnull else {
775 bc7cb1a1 2003-11-23 devnull if((c = readc()) != '\n')
776 bc7cb1a1 2003-11-23 devnull unreadc(c);
777 bc7cb1a1 2003-11-23 devnull }
778 bc7cb1a1 2003-11-23 devnull continue;
779 bc7cb1a1 2003-11-23 devnull case '?':
780 bc7cb1a1 2003-11-23 devnull if(++readptr == &readstk[RDSKSZ]) {
781 bc7cb1a1 2003-11-23 devnull error("nesting depth\n");
782 bc7cb1a1 2003-11-23 devnull }
783 bc7cb1a1 2003-11-23 devnull *readptr = 0;
784 bc7cb1a1 2003-11-23 devnull fsave = curfile;
785 bc7cb1a1 2003-11-23 devnull curfile = &bin;
786 bc7cb1a1 2003-11-23 devnull while((c = readc()) == '!')
787 bc7cb1a1 2003-11-23 devnull command();
788 bc7cb1a1 2003-11-23 devnull p = salloc(0);
789 bc7cb1a1 2003-11-23 devnull sputc(p,c);
790 bc7cb1a1 2003-11-23 devnull while((c = readc()) != '\n') {
791 bc7cb1a1 2003-11-23 devnull sputc(p,c);
792 bc7cb1a1 2003-11-23 devnull if(c == '\\')
793 bc7cb1a1 2003-11-23 devnull sputc(p,readc());
794 bc7cb1a1 2003-11-23 devnull }
795 bc7cb1a1 2003-11-23 devnull curfile = fsave;
796 bc7cb1a1 2003-11-23 devnull *readptr = p;
797 bc7cb1a1 2003-11-23 devnull continue;
798 bc7cb1a1 2003-11-23 devnull case '!':
799 bc7cb1a1 2003-11-23 devnull if(command() == 1)
800 bc7cb1a1 2003-11-23 devnull goto execute;
801 bc7cb1a1 2003-11-23 devnull continue;
802 bc7cb1a1 2003-11-23 devnull case '<':
803 bc7cb1a1 2003-11-23 devnull case '>':
804 bc7cb1a1 2003-11-23 devnull case '=':
805 bc7cb1a1 2003-11-23 devnull if(cond(c) == 1)
806 bc7cb1a1 2003-11-23 devnull goto execute;
807 bc7cb1a1 2003-11-23 devnull continue;
808 bc7cb1a1 2003-11-23 devnull default:
809 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%o is unimplemented\n",c);
810 bc7cb1a1 2003-11-23 devnull }
811 bc7cb1a1 2003-11-23 devnull }
812 bc7cb1a1 2003-11-23 devnull }
813 bc7cb1a1 2003-11-23 devnull
814 bc7cb1a1 2003-11-23 devnull Blk*
815 bc7cb1a1 2003-11-23 devnull div(Blk *ddivd, Blk *ddivr)
816 bc7cb1a1 2003-11-23 devnull {
817 bc7cb1a1 2003-11-23 devnull int divsign, remsign, offset, divcarry,
818 bc7cb1a1 2003-11-23 devnull carry, dig, magic, d, dd, under, first;
819 bc7cb1a1 2003-11-23 devnull long c, td, cc;
820 bc7cb1a1 2003-11-23 devnull Blk *ps, *px, *p, *divd, *divr;
821 bc7cb1a1 2003-11-23 devnull
822 bc7cb1a1 2003-11-23 devnull dig = 0;
823 bc7cb1a1 2003-11-23 devnull under = 0;
824 bc7cb1a1 2003-11-23 devnull divcarry = 0;
825 bc7cb1a1 2003-11-23 devnull rem = 0;
826 bc7cb1a1 2003-11-23 devnull p = salloc(0);
827 bc7cb1a1 2003-11-23 devnull if(length(ddivr) == 0) {
828 bc7cb1a1 2003-11-23 devnull pushp(ddivr);
829 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"divide by 0\n");
830 bc7cb1a1 2003-11-23 devnull return(p);
831 bc7cb1a1 2003-11-23 devnull }
832 bc7cb1a1 2003-11-23 devnull divsign = remsign = first = 0;
833 bc7cb1a1 2003-11-23 devnull divr = ddivr;
834 bc7cb1a1 2003-11-23 devnull fsfile(divr);
835 bc7cb1a1 2003-11-23 devnull if(sbackc(divr) == -1) {
836 bc7cb1a1 2003-11-23 devnull divr = copy(ddivr,length(ddivr));
837 bc7cb1a1 2003-11-23 devnull chsign(divr);
838 bc7cb1a1 2003-11-23 devnull divsign = ~divsign;
839 bc7cb1a1 2003-11-23 devnull }
840 bc7cb1a1 2003-11-23 devnull divd = copy(ddivd,length(ddivd));
841 bc7cb1a1 2003-11-23 devnull fsfile(divd);
842 bc7cb1a1 2003-11-23 devnull if(sfbeg(divd) == 0 && sbackc(divd) == -1) {
843 bc7cb1a1 2003-11-23 devnull chsign(divd);
844 bc7cb1a1 2003-11-23 devnull divsign = ~divsign;
845 bc7cb1a1 2003-11-23 devnull remsign = ~remsign;
846 bc7cb1a1 2003-11-23 devnull }
847 bc7cb1a1 2003-11-23 devnull offset = length(divd) - length(divr);
848 bc7cb1a1 2003-11-23 devnull if(offset < 0)
849 bc7cb1a1 2003-11-23 devnull goto ddone;
850 bc7cb1a1 2003-11-23 devnull seekc(p,offset+1);
851 bc7cb1a1 2003-11-23 devnull sputc(divd,0);
852 bc7cb1a1 2003-11-23 devnull magic = 0;
853 bc7cb1a1 2003-11-23 devnull fsfile(divr);
854 bc7cb1a1 2003-11-23 devnull c = sbackc(divr);
855 bc7cb1a1 2003-11-23 devnull if(c < 10)
856 bc7cb1a1 2003-11-23 devnull magic++;
857 bc7cb1a1 2003-11-23 devnull c = c * 100 + (sfbeg(divr)?0:sbackc(divr));
858 bc7cb1a1 2003-11-23 devnull if(magic>0){
859 bc7cb1a1 2003-11-23 devnull c = (c * 100 +(sfbeg(divr)?0:sbackc(divr)))*2;
860 bc7cb1a1 2003-11-23 devnull c /= 25;
861 bc7cb1a1 2003-11-23 devnull }
862 bc7cb1a1 2003-11-23 devnull while(offset >= 0) {
863 bc7cb1a1 2003-11-23 devnull first++;
864 bc7cb1a1 2003-11-23 devnull fsfile(divd);
865 bc7cb1a1 2003-11-23 devnull td = sbackc(divd) * 100;
866 bc7cb1a1 2003-11-23 devnull dd = sfbeg(divd)?0:sbackc(divd);
867 bc7cb1a1 2003-11-23 devnull td = (td + dd) * 100;
868 bc7cb1a1 2003-11-23 devnull dd = sfbeg(divd)?0:sbackc(divd);
869 bc7cb1a1 2003-11-23 devnull td = td + dd;
870 bc7cb1a1 2003-11-23 devnull cc = c;
871 bc7cb1a1 2003-11-23 devnull if(offset == 0)
872 bc7cb1a1 2003-11-23 devnull td++;
873 bc7cb1a1 2003-11-23 devnull else
874 bc7cb1a1 2003-11-23 devnull cc++;
875 bc7cb1a1 2003-11-23 devnull if(magic != 0)
876 bc7cb1a1 2003-11-23 devnull td = td<<3;
877 bc7cb1a1 2003-11-23 devnull dig = td/cc;
878 bc7cb1a1 2003-11-23 devnull under=0;
879 bc7cb1a1 2003-11-23 devnull if(td%cc < 8 && dig > 0 && magic) {
880 bc7cb1a1 2003-11-23 devnull dig--;
881 bc7cb1a1 2003-11-23 devnull under=1;
882 bc7cb1a1 2003-11-23 devnull }
883 bc7cb1a1 2003-11-23 devnull rewind(divr);
884 bc7cb1a1 2003-11-23 devnull rewind(divxyz);
885 bc7cb1a1 2003-11-23 devnull carry = 0;
886 bc7cb1a1 2003-11-23 devnull while(sfeof(divr) == 0) {
887 bc7cb1a1 2003-11-23 devnull d = sgetc(divr)*dig+carry;
888 bc7cb1a1 2003-11-23 devnull carry = d / 100;
889 bc7cb1a1 2003-11-23 devnull salterc(divxyz,d%100);
890 bc7cb1a1 2003-11-23 devnull }
891 bc7cb1a1 2003-11-23 devnull salterc(divxyz,carry);
892 bc7cb1a1 2003-11-23 devnull rewind(divxyz);
893 bc7cb1a1 2003-11-23 devnull seekc(divd,offset);
894 bc7cb1a1 2003-11-23 devnull carry = 0;
895 bc7cb1a1 2003-11-23 devnull while(sfeof(divd) == 0) {
896 bc7cb1a1 2003-11-23 devnull d = slookc(divd);
897 bc7cb1a1 2003-11-23 devnull d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry;
898 bc7cb1a1 2003-11-23 devnull carry = 0;
899 bc7cb1a1 2003-11-23 devnull if(d < 0) {
900 bc7cb1a1 2003-11-23 devnull d += 100;
901 bc7cb1a1 2003-11-23 devnull carry = 1;
902 bc7cb1a1 2003-11-23 devnull }
903 bc7cb1a1 2003-11-23 devnull salterc(divd,d);
904 bc7cb1a1 2003-11-23 devnull }
905 bc7cb1a1 2003-11-23 devnull divcarry = carry;
906 bc7cb1a1 2003-11-23 devnull backc(p);
907 bc7cb1a1 2003-11-23 devnull salterc(p,dig);
908 bc7cb1a1 2003-11-23 devnull backc(p);
909 bc7cb1a1 2003-11-23 devnull fsfile(divd);
910 bc7cb1a1 2003-11-23 devnull d=sbackc(divd);
911 bc7cb1a1 2003-11-23 devnull if((d != 0) && /*!divcarry*/ (offset != 0)) {
912 bc7cb1a1 2003-11-23 devnull d = sbackc(divd) + 100;
913 bc7cb1a1 2003-11-23 devnull salterc(divd,d);
914 bc7cb1a1 2003-11-23 devnull }
915 bc7cb1a1 2003-11-23 devnull if(--offset >= 0)
916 bc7cb1a1 2003-11-23 devnull divd->wt--;
917 bc7cb1a1 2003-11-23 devnull }
918 bc7cb1a1 2003-11-23 devnull if(under) { /* undershot last - adjust*/
919 bc7cb1a1 2003-11-23 devnull px = copy(divr,length(divr)); /*11/88 don't corrupt ddivr*/
920 bc7cb1a1 2003-11-23 devnull chsign(px);
921 bc7cb1a1 2003-11-23 devnull ps = add(px,divd);
922 bc7cb1a1 2003-11-23 devnull fsfile(ps);
923 bc7cb1a1 2003-11-23 devnull if(length(ps) > 0 && sbackc(ps) < 0) {
924 bc7cb1a1 2003-11-23 devnull release(ps); /*only adjust in really undershot*/
925 bc7cb1a1 2003-11-23 devnull } else {
926 bc7cb1a1 2003-11-23 devnull release(divd);
927 bc7cb1a1 2003-11-23 devnull salterc(p, dig+1);
928 bc7cb1a1 2003-11-23 devnull divd=ps;
929 bc7cb1a1 2003-11-23 devnull }
930 bc7cb1a1 2003-11-23 devnull }
931 bc7cb1a1 2003-11-23 devnull if(divcarry != 0) {
932 bc7cb1a1 2003-11-23 devnull salterc(p,dig-1);
933 bc7cb1a1 2003-11-23 devnull salterc(divd,-1);
934 bc7cb1a1 2003-11-23 devnull ps = add(divr,divd);
935 bc7cb1a1 2003-11-23 devnull release(divd);
936 bc7cb1a1 2003-11-23 devnull divd = ps;
937 bc7cb1a1 2003-11-23 devnull }
938 bc7cb1a1 2003-11-23 devnull
939 bc7cb1a1 2003-11-23 devnull rewind(p);
940 bc7cb1a1 2003-11-23 devnull divcarry = 0;
941 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0){
942 bc7cb1a1 2003-11-23 devnull d = slookc(p)+divcarry;
943 bc7cb1a1 2003-11-23 devnull divcarry = 0;
944 bc7cb1a1 2003-11-23 devnull if(d >= 100){
945 bc7cb1a1 2003-11-23 devnull d -= 100;
946 bc7cb1a1 2003-11-23 devnull divcarry = 1;
947 bc7cb1a1 2003-11-23 devnull }
948 bc7cb1a1 2003-11-23 devnull salterc(p,d);
949 bc7cb1a1 2003-11-23 devnull }
950 bc7cb1a1 2003-11-23 devnull if(divcarry != 0)salterc(p,divcarry);
951 bc7cb1a1 2003-11-23 devnull fsfile(p);
952 bc7cb1a1 2003-11-23 devnull while(sfbeg(p) == 0) {
953 bc7cb1a1 2003-11-23 devnull if(sbackc(p) != 0)
954 bc7cb1a1 2003-11-23 devnull break;
955 bc7cb1a1 2003-11-23 devnull truncate(p);
956 bc7cb1a1 2003-11-23 devnull }
957 bc7cb1a1 2003-11-23 devnull if(divsign < 0)
958 bc7cb1a1 2003-11-23 devnull chsign(p);
959 bc7cb1a1 2003-11-23 devnull fsfile(divd);
960 bc7cb1a1 2003-11-23 devnull while(sfbeg(divd) == 0) {
961 bc7cb1a1 2003-11-23 devnull if(sbackc(divd) != 0)
962 bc7cb1a1 2003-11-23 devnull break;
963 bc7cb1a1 2003-11-23 devnull truncate(divd);
964 bc7cb1a1 2003-11-23 devnull }
965 bc7cb1a1 2003-11-23 devnull ddone:
966 bc7cb1a1 2003-11-23 devnull if(remsign<0)
967 bc7cb1a1 2003-11-23 devnull chsign(divd);
968 bc7cb1a1 2003-11-23 devnull if(divr != ddivr)
969 bc7cb1a1 2003-11-23 devnull release(divr);
970 bc7cb1a1 2003-11-23 devnull rem = divd;
971 bc7cb1a1 2003-11-23 devnull return(p);
972 bc7cb1a1 2003-11-23 devnull }
973 bc7cb1a1 2003-11-23 devnull
974 bc7cb1a1 2003-11-23 devnull int
975 bc7cb1a1 2003-11-23 devnull dscale(void)
976 bc7cb1a1 2003-11-23 devnull {
977 bc7cb1a1 2003-11-23 devnull Blk *dd, *dr, *r;
978 bc7cb1a1 2003-11-23 devnull int c;
979 bc7cb1a1 2003-11-23 devnull
980 bc7cb1a1 2003-11-23 devnull dr = pop();
981 bc7cb1a1 2003-11-23 devnull EMPTYS;
982 bc7cb1a1 2003-11-23 devnull dd = pop();
983 bc7cb1a1 2003-11-23 devnull EMPTYSR(dr);
984 bc7cb1a1 2003-11-23 devnull fsfile(dd);
985 bc7cb1a1 2003-11-23 devnull skd = sunputc(dd);
986 bc7cb1a1 2003-11-23 devnull fsfile(dr);
987 bc7cb1a1 2003-11-23 devnull skr = sunputc(dr);
988 bc7cb1a1 2003-11-23 devnull if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)) {
989 bc7cb1a1 2003-11-23 devnull sputc(dr,skr);
990 bc7cb1a1 2003-11-23 devnull pushp(dr);
991 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"divide by 0\n");
992 bc7cb1a1 2003-11-23 devnull return(1);
993 bc7cb1a1 2003-11-23 devnull }
994 bc7cb1a1 2003-11-23 devnull if(sfbeg(dd) == 1 || (sfbeg(dd) == 0 && sbackc(dd) == 0)) {
995 bc7cb1a1 2003-11-23 devnull sputc(dd,skd);
996 bc7cb1a1 2003-11-23 devnull pushp(dd);
997 bc7cb1a1 2003-11-23 devnull return(1);
998 bc7cb1a1 2003-11-23 devnull }
999 bc7cb1a1 2003-11-23 devnull c = k-skd+skr;
1000 bc7cb1a1 2003-11-23 devnull if(c < 0)
1001 bc7cb1a1 2003-11-23 devnull r = removr(dd,-c);
1002 bc7cb1a1 2003-11-23 devnull else {
1003 bc7cb1a1 2003-11-23 devnull r = add0(dd,c);
1004 bc7cb1a1 2003-11-23 devnull irem = 0;
1005 bc7cb1a1 2003-11-23 devnull }
1006 bc7cb1a1 2003-11-23 devnull arg1 = r;
1007 bc7cb1a1 2003-11-23 devnull arg2 = dr;
1008 bc7cb1a1 2003-11-23 devnull savk = k;
1009 bc7cb1a1 2003-11-23 devnull return(0);
1010 bc7cb1a1 2003-11-23 devnull }
1011 bc7cb1a1 2003-11-23 devnull
1012 bc7cb1a1 2003-11-23 devnull Blk*
1013 bc7cb1a1 2003-11-23 devnull removr(Blk *p, int n)
1014 bc7cb1a1 2003-11-23 devnull {
1015 bc7cb1a1 2003-11-23 devnull int nn, neg;
1016 bc7cb1a1 2003-11-23 devnull Blk *q, *s, *r;
1017 bc7cb1a1 2003-11-23 devnull
1018 bc7cb1a1 2003-11-23 devnull fsfile(p);
1019 bc7cb1a1 2003-11-23 devnull neg = sbackc(p);
1020 bc7cb1a1 2003-11-23 devnull if(neg < 0)
1021 bc7cb1a1 2003-11-23 devnull chsign(p);
1022 bc7cb1a1 2003-11-23 devnull rewind(p);
1023 bc7cb1a1 2003-11-23 devnull nn = (n+1)/2;
1024 bc7cb1a1 2003-11-23 devnull q = salloc(nn);
1025 bc7cb1a1 2003-11-23 devnull while(n>1) {
1026 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1027 bc7cb1a1 2003-11-23 devnull n -= 2;
1028 bc7cb1a1 2003-11-23 devnull }
1029 bc7cb1a1 2003-11-23 devnull r = salloc(2);
1030 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0)
1031 bc7cb1a1 2003-11-23 devnull sputc(r,sgetc(p));
1032 bc7cb1a1 2003-11-23 devnull release(p);
1033 bc7cb1a1 2003-11-23 devnull if(n == 1){
1034 bc7cb1a1 2003-11-23 devnull s = div(r,tenptr);
1035 bc7cb1a1 2003-11-23 devnull release(r);
1036 bc7cb1a1 2003-11-23 devnull rewind(rem);
1037 bc7cb1a1 2003-11-23 devnull if(sfeof(rem) == 0)
1038 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(rem));
1039 bc7cb1a1 2003-11-23 devnull release(rem);
1040 bc7cb1a1 2003-11-23 devnull if(neg < 0){
1041 bc7cb1a1 2003-11-23 devnull chsign(s);
1042 bc7cb1a1 2003-11-23 devnull chsign(q);
1043 bc7cb1a1 2003-11-23 devnull irem = q;
1044 bc7cb1a1 2003-11-23 devnull return(s);
1045 bc7cb1a1 2003-11-23 devnull }
1046 bc7cb1a1 2003-11-23 devnull irem = q;
1047 bc7cb1a1 2003-11-23 devnull return(s);
1048 bc7cb1a1 2003-11-23 devnull }
1049 bc7cb1a1 2003-11-23 devnull if(neg < 0) {
1050 bc7cb1a1 2003-11-23 devnull chsign(r);
1051 bc7cb1a1 2003-11-23 devnull chsign(q);
1052 bc7cb1a1 2003-11-23 devnull irem = q;
1053 bc7cb1a1 2003-11-23 devnull return(r);
1054 bc7cb1a1 2003-11-23 devnull }
1055 bc7cb1a1 2003-11-23 devnull irem = q;
1056 bc7cb1a1 2003-11-23 devnull return(r);
1057 bc7cb1a1 2003-11-23 devnull }
1058 bc7cb1a1 2003-11-23 devnull
1059 bc7cb1a1 2003-11-23 devnull Blk*
1060 bc7cb1a1 2003-11-23 devnull dcsqrt(Blk *p)
1061 bc7cb1a1 2003-11-23 devnull {
1062 bc7cb1a1 2003-11-23 devnull Blk *t, *r, *q, *s;
1063 bc7cb1a1 2003-11-23 devnull int c, n, nn;
1064 bc7cb1a1 2003-11-23 devnull
1065 bc7cb1a1 2003-11-23 devnull n = length(p);
1066 bc7cb1a1 2003-11-23 devnull fsfile(p);
1067 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1068 bc7cb1a1 2003-11-23 devnull if((n&1) != 1)
1069 bc7cb1a1 2003-11-23 devnull c = c*100+(sfbeg(p)?0:sbackc(p));
1070 bc7cb1a1 2003-11-23 devnull n = (n+1)>>1;
1071 bc7cb1a1 2003-11-23 devnull r = salloc(n);
1072 bc7cb1a1 2003-11-23 devnull zero(r);
1073 bc7cb1a1 2003-11-23 devnull seekc(r,n);
1074 bc7cb1a1 2003-11-23 devnull nn=1;
1075 bc7cb1a1 2003-11-23 devnull while((c -= nn)>=0)
1076 bc7cb1a1 2003-11-23 devnull nn+=2;
1077 bc7cb1a1 2003-11-23 devnull c=(nn+1)>>1;
1078 bc7cb1a1 2003-11-23 devnull fsfile(r);
1079 bc7cb1a1 2003-11-23 devnull backc(r);
1080 bc7cb1a1 2003-11-23 devnull if(c>=100) {
1081 bc7cb1a1 2003-11-23 devnull c -= 100;
1082 bc7cb1a1 2003-11-23 devnull salterc(r,c);
1083 bc7cb1a1 2003-11-23 devnull sputc(r,1);
1084 bc7cb1a1 2003-11-23 devnull } else
1085 bc7cb1a1 2003-11-23 devnull salterc(r,c);
1086 bc7cb1a1 2003-11-23 devnull for(;;){
1087 bc7cb1a1 2003-11-23 devnull q = div(p,r);
1088 bc7cb1a1 2003-11-23 devnull s = add(q,r);
1089 bc7cb1a1 2003-11-23 devnull release(q);
1090 bc7cb1a1 2003-11-23 devnull release(rem);
1091 bc7cb1a1 2003-11-23 devnull q = div(s,sqtemp);
1092 bc7cb1a1 2003-11-23 devnull release(s);
1093 bc7cb1a1 2003-11-23 devnull release(rem);
1094 bc7cb1a1 2003-11-23 devnull s = copy(r,length(r));
1095 bc7cb1a1 2003-11-23 devnull chsign(s);
1096 bc7cb1a1 2003-11-23 devnull t = add(s,q);
1097 bc7cb1a1 2003-11-23 devnull release(s);
1098 bc7cb1a1 2003-11-23 devnull fsfile(t);
1099 bc7cb1a1 2003-11-23 devnull nn = sfbeg(t)?0:sbackc(t);
1100 bc7cb1a1 2003-11-23 devnull if(nn>=0)
1101 bc7cb1a1 2003-11-23 devnull break;
1102 bc7cb1a1 2003-11-23 devnull release(r);
1103 bc7cb1a1 2003-11-23 devnull release(t);
1104 bc7cb1a1 2003-11-23 devnull r = q;
1105 bc7cb1a1 2003-11-23 devnull }
1106 bc7cb1a1 2003-11-23 devnull release(t);
1107 bc7cb1a1 2003-11-23 devnull release(q);
1108 bc7cb1a1 2003-11-23 devnull release(p);
1109 bc7cb1a1 2003-11-23 devnull return(r);
1110 bc7cb1a1 2003-11-23 devnull }
1111 bc7cb1a1 2003-11-23 devnull
1112 bc7cb1a1 2003-11-23 devnull Blk*
1113 bc7cb1a1 2003-11-23 devnull dcexp(Blk *base, Blk *ex)
1114 bc7cb1a1 2003-11-23 devnull {
1115 bc7cb1a1 2003-11-23 devnull Blk *r, *e, *p, *e1, *t, *cp;
1116 bc7cb1a1 2003-11-23 devnull int temp, c, n;
1117 bc7cb1a1 2003-11-23 devnull
1118 bc7cb1a1 2003-11-23 devnull r = salloc(1);
1119 bc7cb1a1 2003-11-23 devnull sputc(r,1);
1120 bc7cb1a1 2003-11-23 devnull p = copy(base,length(base));
1121 bc7cb1a1 2003-11-23 devnull e = copy(ex,length(ex));
1122 bc7cb1a1 2003-11-23 devnull fsfile(e);
1123 bc7cb1a1 2003-11-23 devnull if(sfbeg(e) != 0)
1124 bc7cb1a1 2003-11-23 devnull goto edone;
1125 bc7cb1a1 2003-11-23 devnull temp=0;
1126 bc7cb1a1 2003-11-23 devnull c = sbackc(e);
1127 bc7cb1a1 2003-11-23 devnull if(c<0) {
1128 bc7cb1a1 2003-11-23 devnull temp++;
1129 bc7cb1a1 2003-11-23 devnull chsign(e);
1130 bc7cb1a1 2003-11-23 devnull }
1131 bc7cb1a1 2003-11-23 devnull while(length(e) != 0) {
1132 bc7cb1a1 2003-11-23 devnull e1=div(e,sqtemp);
1133 bc7cb1a1 2003-11-23 devnull release(e);
1134 bc7cb1a1 2003-11-23 devnull e = e1;
1135 bc7cb1a1 2003-11-23 devnull n = length(rem);
1136 bc7cb1a1 2003-11-23 devnull release(rem);
1137 bc7cb1a1 2003-11-23 devnull if(n != 0) {
1138 bc7cb1a1 2003-11-23 devnull e1=mult(p,r);
1139 bc7cb1a1 2003-11-23 devnull release(r);
1140 bc7cb1a1 2003-11-23 devnull r = e1;
1141 bc7cb1a1 2003-11-23 devnull }
1142 bc7cb1a1 2003-11-23 devnull t = copy(p,length(p));
1143 bc7cb1a1 2003-11-23 devnull cp = mult(p,t);
1144 bc7cb1a1 2003-11-23 devnull release(p);
1145 bc7cb1a1 2003-11-23 devnull release(t);
1146 bc7cb1a1 2003-11-23 devnull p = cp;
1147 bc7cb1a1 2003-11-23 devnull }
1148 bc7cb1a1 2003-11-23 devnull if(temp != 0) {
1149 bc7cb1a1 2003-11-23 devnull if((c = length(base)) == 0) {
1150 bc7cb1a1 2003-11-23 devnull goto edone;
1151 bc7cb1a1 2003-11-23 devnull }
1152 bc7cb1a1 2003-11-23 devnull if(c>1)
1153 bc7cb1a1 2003-11-23 devnull create(r);
1154 bc7cb1a1 2003-11-23 devnull else {
1155 bc7cb1a1 2003-11-23 devnull rewind(base);
1156 bc7cb1a1 2003-11-23 devnull if((c = sgetc(base))<=1) {
1157 bc7cb1a1 2003-11-23 devnull create(r);
1158 bc7cb1a1 2003-11-23 devnull sputc(r,c);
1159 bc7cb1a1 2003-11-23 devnull } else
1160 bc7cb1a1 2003-11-23 devnull create(r);
1161 bc7cb1a1 2003-11-23 devnull }
1162 bc7cb1a1 2003-11-23 devnull }
1163 bc7cb1a1 2003-11-23 devnull edone:
1164 bc7cb1a1 2003-11-23 devnull release(p);
1165 bc7cb1a1 2003-11-23 devnull release(e);
1166 bc7cb1a1 2003-11-23 devnull return(r);
1167 bc7cb1a1 2003-11-23 devnull }
1168 bc7cb1a1 2003-11-23 devnull
1169 bc7cb1a1 2003-11-23 devnull void
1170 bc7cb1a1 2003-11-23 devnull init(int argc, char *argv[])
1171 bc7cb1a1 2003-11-23 devnull {
1172 bc7cb1a1 2003-11-23 devnull Sym *sp;
1173 bc7cb1a1 2003-11-23 devnull Dir *d;
1174 bc7cb1a1 2003-11-23 devnull
1175 bc7cb1a1 2003-11-23 devnull ARGBEGIN {
1176 bc7cb1a1 2003-11-23 devnull default:
1177 bc7cb1a1 2003-11-23 devnull dbg = 1;
1178 bc7cb1a1 2003-11-23 devnull break;
1179 bc7cb1a1 2003-11-23 devnull } ARGEND
1180 bc7cb1a1 2003-11-23 devnull ifile = 1;
1181 bc7cb1a1 2003-11-23 devnull curfile = &bin;
1182 bc7cb1a1 2003-11-23 devnull if(*argv){
1183 bc7cb1a1 2003-11-23 devnull d = dirstat(*argv);
1184 bc7cb1a1 2003-11-23 devnull if(d == nil) {
1185 bc7cb1a1 2003-11-23 devnull fprint(2, "dc: can't open file %s\n", *argv);
1186 bc7cb1a1 2003-11-23 devnull exits("open");
1187 bc7cb1a1 2003-11-23 devnull }
1188 bc7cb1a1 2003-11-23 devnull if(d->mode & DMDIR) {
1189 bc7cb1a1 2003-11-23 devnull fprint(2, "dc: file %s is a directory\n", *argv);
1190 bc7cb1a1 2003-11-23 devnull exits("open");
1191 bc7cb1a1 2003-11-23 devnull }
1192 bc7cb1a1 2003-11-23 devnull free(d);
1193 bc7cb1a1 2003-11-23 devnull if((curfile = Bopen(*argv, OREAD)) == 0) {
1194 bc7cb1a1 2003-11-23 devnull fprint(2,"dc: can't open file %s\n", *argv);
1195 bc7cb1a1 2003-11-23 devnull exits("open");
1196 bc7cb1a1 2003-11-23 devnull }
1197 bc7cb1a1 2003-11-23 devnull }
1198 bc7cb1a1 2003-11-23 devnull /* dummy = malloc(0); *//* prepare for garbage-collection */
1199 bc7cb1a1 2003-11-23 devnull scalptr = salloc(1);
1200 bc7cb1a1 2003-11-23 devnull sputc(scalptr,0);
1201 bc7cb1a1 2003-11-23 devnull basptr = salloc(1);
1202 bc7cb1a1 2003-11-23 devnull sputc(basptr,10);
1203 bc7cb1a1 2003-11-23 devnull obase=10;
1204 bc7cb1a1 2003-11-23 devnull logten=log2(10L);
1205 bc7cb1a1 2003-11-23 devnull ll=70;
1206 bc7cb1a1 2003-11-23 devnull fw=1;
1207 bc7cb1a1 2003-11-23 devnull fw1=0;
1208 bc7cb1a1 2003-11-23 devnull tenptr = salloc(1);
1209 bc7cb1a1 2003-11-23 devnull sputc(tenptr,10);
1210 bc7cb1a1 2003-11-23 devnull obase=10;
1211 bc7cb1a1 2003-11-23 devnull inbas = salloc(1);
1212 bc7cb1a1 2003-11-23 devnull sputc(inbas,10);
1213 bc7cb1a1 2003-11-23 devnull sqtemp = salloc(1);
1214 bc7cb1a1 2003-11-23 devnull sputc(sqtemp,2);
1215 bc7cb1a1 2003-11-23 devnull chptr = salloc(0);
1216 bc7cb1a1 2003-11-23 devnull strptr = salloc(0);
1217 bc7cb1a1 2003-11-23 devnull divxyz = salloc(0);
1218 bc7cb1a1 2003-11-23 devnull stkbeg = stkptr = &stack[0];
1219 bc7cb1a1 2003-11-23 devnull stkend = &stack[STKSZ];
1220 bc7cb1a1 2003-11-23 devnull stkerr = 0;
1221 bc7cb1a1 2003-11-23 devnull readptr = &readstk[0];
1222 bc7cb1a1 2003-11-23 devnull k=0;
1223 bc7cb1a1 2003-11-23 devnull sp = sptr = &symlst[0];
1224 272c1fb2 2008-12-07 rsc while(sptr < &symlst[TBLSZ-1]) {
1225 bc7cb1a1 2003-11-23 devnull sptr->next = ++sp;
1226 bc7cb1a1 2003-11-23 devnull sptr++;
1227 bc7cb1a1 2003-11-23 devnull }
1228 bc7cb1a1 2003-11-23 devnull sptr->next=0;
1229 bc7cb1a1 2003-11-23 devnull sfree = &symlst[0];
1230 bc7cb1a1 2003-11-23 devnull }
1231 bc7cb1a1 2003-11-23 devnull
1232 bc7cb1a1 2003-11-23 devnull void
1233 bc7cb1a1 2003-11-23 devnull pushp(Blk *p)
1234 bc7cb1a1 2003-11-23 devnull {
1235 bc7cb1a1 2003-11-23 devnull if(stkptr == stkend) {
1236 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"out of stack space\n");
1237 bc7cb1a1 2003-11-23 devnull return;
1238 bc7cb1a1 2003-11-23 devnull }
1239 bc7cb1a1 2003-11-23 devnull stkerr=0;
1240 bc7cb1a1 2003-11-23 devnull *++stkptr = p;
1241 bc7cb1a1 2003-11-23 devnull return;
1242 bc7cb1a1 2003-11-23 devnull }
1243 bc7cb1a1 2003-11-23 devnull
1244 bc7cb1a1 2003-11-23 devnull Blk*
1245 bc7cb1a1 2003-11-23 devnull pop(void)
1246 bc7cb1a1 2003-11-23 devnull {
1247 bc7cb1a1 2003-11-23 devnull if(stkptr == stack) {
1248 bc7cb1a1 2003-11-23 devnull stkerr=1;
1249 bc7cb1a1 2003-11-23 devnull return(0);
1250 bc7cb1a1 2003-11-23 devnull }
1251 bc7cb1a1 2003-11-23 devnull return(*stkptr--);
1252 bc7cb1a1 2003-11-23 devnull }
1253 bc7cb1a1 2003-11-23 devnull
1254 bc7cb1a1 2003-11-23 devnull Blk*
1255 bc7cb1a1 2003-11-23 devnull readin(void)
1256 bc7cb1a1 2003-11-23 devnull {
1257 bc7cb1a1 2003-11-23 devnull Blk *p, *q;
1258 bc7cb1a1 2003-11-23 devnull int dp, dpct, c;
1259 bc7cb1a1 2003-11-23 devnull
1260 bc7cb1a1 2003-11-23 devnull dp = dpct=0;
1261 bc7cb1a1 2003-11-23 devnull p = salloc(0);
1262 bc7cb1a1 2003-11-23 devnull for(;;){
1263 bc7cb1a1 2003-11-23 devnull c = readc();
1264 bc7cb1a1 2003-11-23 devnull switch(c) {
1265 bc7cb1a1 2003-11-23 devnull case '.':
1266 bc7cb1a1 2003-11-23 devnull if(dp != 0)
1267 bc7cb1a1 2003-11-23 devnull goto gotnum;
1268 bc7cb1a1 2003-11-23 devnull dp++;
1269 bc7cb1a1 2003-11-23 devnull continue;
1270 bc7cb1a1 2003-11-23 devnull case '\\':
1271 bc7cb1a1 2003-11-23 devnull readc();
1272 bc7cb1a1 2003-11-23 devnull continue;
1273 bc7cb1a1 2003-11-23 devnull default:
1274 bc7cb1a1 2003-11-23 devnull if(c >= 'A' && c <= 'F')
1275 bc7cb1a1 2003-11-23 devnull c = c - 'A' + 10;
1276 bc7cb1a1 2003-11-23 devnull else
1277 bc7cb1a1 2003-11-23 devnull if(c >= '0' && c <= '9')
1278 bc7cb1a1 2003-11-23 devnull c -= '0';
1279 bc7cb1a1 2003-11-23 devnull else
1280 bc7cb1a1 2003-11-23 devnull goto gotnum;
1281 bc7cb1a1 2003-11-23 devnull if(dp != 0) {
1282 bc7cb1a1 2003-11-23 devnull if(dpct >= 99)
1283 bc7cb1a1 2003-11-23 devnull continue;
1284 bc7cb1a1 2003-11-23 devnull dpct++;
1285 bc7cb1a1 2003-11-23 devnull }
1286 bc7cb1a1 2003-11-23 devnull create(chptr);
1287 bc7cb1a1 2003-11-23 devnull if(c != 0)
1288 bc7cb1a1 2003-11-23 devnull sputc(chptr,c);
1289 bc7cb1a1 2003-11-23 devnull q = mult(p,inbas);
1290 bc7cb1a1 2003-11-23 devnull release(p);
1291 bc7cb1a1 2003-11-23 devnull p = add(chptr,q);
1292 bc7cb1a1 2003-11-23 devnull release(q);
1293 bc7cb1a1 2003-11-23 devnull }
1294 bc7cb1a1 2003-11-23 devnull }
1295 bc7cb1a1 2003-11-23 devnull gotnum:
1296 bc7cb1a1 2003-11-23 devnull unreadc(c);
1297 bc7cb1a1 2003-11-23 devnull if(dp == 0) {
1298 bc7cb1a1 2003-11-23 devnull sputc(p,0);
1299 bc7cb1a1 2003-11-23 devnull return(p);
1300 bc7cb1a1 2003-11-23 devnull } else {
1301 bc7cb1a1 2003-11-23 devnull q = scale(p,dpct);
1302 bc7cb1a1 2003-11-23 devnull return(q);
1303 bc7cb1a1 2003-11-23 devnull }
1304 bc7cb1a1 2003-11-23 devnull }
1305 bc7cb1a1 2003-11-23 devnull
1306 bc7cb1a1 2003-11-23 devnull /*
1307 bc7cb1a1 2003-11-23 devnull * returns pointer to struct with ct 0's & p
1308 bc7cb1a1 2003-11-23 devnull */
1309 bc7cb1a1 2003-11-23 devnull Blk*
1310 bc7cb1a1 2003-11-23 devnull add0(Blk *p, int ct)
1311 bc7cb1a1 2003-11-23 devnull {
1312 bc7cb1a1 2003-11-23 devnull Blk *q, *t;
1313 bc7cb1a1 2003-11-23 devnull
1314 bc7cb1a1 2003-11-23 devnull q = salloc(length(p)+(ct+1)/2);
1315 bc7cb1a1 2003-11-23 devnull while(ct>1) {
1316 bc7cb1a1 2003-11-23 devnull sputc(q,0);
1317 bc7cb1a1 2003-11-23 devnull ct -= 2;
1318 bc7cb1a1 2003-11-23 devnull }
1319 bc7cb1a1 2003-11-23 devnull rewind(p);
1320 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
1321 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1322 bc7cb1a1 2003-11-23 devnull }
1323 bc7cb1a1 2003-11-23 devnull release(p);
1324 bc7cb1a1 2003-11-23 devnull if(ct == 1) {
1325 bc7cb1a1 2003-11-23 devnull t = mult(tenptr,q);
1326 bc7cb1a1 2003-11-23 devnull release(q);
1327 bc7cb1a1 2003-11-23 devnull return(t);
1328 bc7cb1a1 2003-11-23 devnull }
1329 bc7cb1a1 2003-11-23 devnull return(q);
1330 bc7cb1a1 2003-11-23 devnull }
1331 bc7cb1a1 2003-11-23 devnull
1332 bc7cb1a1 2003-11-23 devnull Blk*
1333 bc7cb1a1 2003-11-23 devnull mult(Blk *p, Blk *q)
1334 bc7cb1a1 2003-11-23 devnull {
1335 bc7cb1a1 2003-11-23 devnull Blk *mp, *mq, *mr;
1336 bc7cb1a1 2003-11-23 devnull int sign, offset, carry;
1337 bc7cb1a1 2003-11-23 devnull int cq, cp, mt, mcr;
1338 bc7cb1a1 2003-11-23 devnull
1339 bc7cb1a1 2003-11-23 devnull offset = sign = 0;
1340 bc7cb1a1 2003-11-23 devnull fsfile(p);
1341 bc7cb1a1 2003-11-23 devnull mp = p;
1342 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0) {
1343 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
1344 bc7cb1a1 2003-11-23 devnull mp = copy(p,length(p));
1345 bc7cb1a1 2003-11-23 devnull chsign(mp);
1346 bc7cb1a1 2003-11-23 devnull sign = ~sign;
1347 bc7cb1a1 2003-11-23 devnull }
1348 bc7cb1a1 2003-11-23 devnull }
1349 bc7cb1a1 2003-11-23 devnull fsfile(q);
1350 bc7cb1a1 2003-11-23 devnull mq = q;
1351 bc7cb1a1 2003-11-23 devnull if(sfbeg(q) == 0){
1352 bc7cb1a1 2003-11-23 devnull if(sbackc(q)<0) {
1353 bc7cb1a1 2003-11-23 devnull mq = copy(q,length(q));
1354 bc7cb1a1 2003-11-23 devnull chsign(mq);
1355 bc7cb1a1 2003-11-23 devnull sign = ~sign;
1356 bc7cb1a1 2003-11-23 devnull }
1357 bc7cb1a1 2003-11-23 devnull }
1358 bc7cb1a1 2003-11-23 devnull mr = salloc(length(mp)+length(mq));
1359 bc7cb1a1 2003-11-23 devnull zero(mr);
1360 bc7cb1a1 2003-11-23 devnull rewind(mq);
1361 bc7cb1a1 2003-11-23 devnull while(sfeof(mq) == 0) {
1362 bc7cb1a1 2003-11-23 devnull cq = sgetc(mq);
1363 bc7cb1a1 2003-11-23 devnull rewind(mp);
1364 bc7cb1a1 2003-11-23 devnull rewind(mr);
1365 bc7cb1a1 2003-11-23 devnull mr->rd += offset;
1366 bc7cb1a1 2003-11-23 devnull carry=0;
1367 bc7cb1a1 2003-11-23 devnull while(sfeof(mp) == 0) {
1368 bc7cb1a1 2003-11-23 devnull cp = sgetc(mp);
1369 bc7cb1a1 2003-11-23 devnull mcr = sfeof(mr)?0:slookc(mr);
1370 bc7cb1a1 2003-11-23 devnull mt = cp*cq + carry + mcr;
1371 bc7cb1a1 2003-11-23 devnull carry = mt/100;
1372 bc7cb1a1 2003-11-23 devnull salterc(mr,mt%100);
1373 bc7cb1a1 2003-11-23 devnull }
1374 bc7cb1a1 2003-11-23 devnull offset++;
1375 bc7cb1a1 2003-11-23 devnull if(carry != 0) {
1376 bc7cb1a1 2003-11-23 devnull mcr = sfeof(mr)?0:slookc(mr);
1377 bc7cb1a1 2003-11-23 devnull salterc(mr,mcr+carry);
1378 bc7cb1a1 2003-11-23 devnull }
1379 bc7cb1a1 2003-11-23 devnull }
1380 bc7cb1a1 2003-11-23 devnull if(sign < 0) {
1381 bc7cb1a1 2003-11-23 devnull chsign(mr);
1382 bc7cb1a1 2003-11-23 devnull }
1383 bc7cb1a1 2003-11-23 devnull if(mp != p)
1384 bc7cb1a1 2003-11-23 devnull release(mp);
1385 bc7cb1a1 2003-11-23 devnull if(mq != q)
1386 bc7cb1a1 2003-11-23 devnull release(mq);
1387 bc7cb1a1 2003-11-23 devnull return(mr);
1388 bc7cb1a1 2003-11-23 devnull }
1389 bc7cb1a1 2003-11-23 devnull
1390 bc7cb1a1 2003-11-23 devnull void
1391 bc7cb1a1 2003-11-23 devnull chsign(Blk *p)
1392 bc7cb1a1 2003-11-23 devnull {
1393 bc7cb1a1 2003-11-23 devnull int carry;
1394 bc7cb1a1 2003-11-23 devnull char ct;
1395 bc7cb1a1 2003-11-23 devnull
1396 bc7cb1a1 2003-11-23 devnull carry=0;
1397 bc7cb1a1 2003-11-23 devnull rewind(p);
1398 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
1399 bc7cb1a1 2003-11-23 devnull ct=100-slookc(p)-carry;
1400 bc7cb1a1 2003-11-23 devnull carry=1;
1401 bc7cb1a1 2003-11-23 devnull if(ct>=100) {
1402 bc7cb1a1 2003-11-23 devnull ct -= 100;
1403 bc7cb1a1 2003-11-23 devnull carry=0;
1404 bc7cb1a1 2003-11-23 devnull }
1405 bc7cb1a1 2003-11-23 devnull salterc(p,ct);
1406 bc7cb1a1 2003-11-23 devnull }
1407 bc7cb1a1 2003-11-23 devnull if(carry != 0) {
1408 bc7cb1a1 2003-11-23 devnull sputc(p,-1);
1409 bc7cb1a1 2003-11-23 devnull fsfile(p);
1410 bc7cb1a1 2003-11-23 devnull backc(p);
1411 bc7cb1a1 2003-11-23 devnull ct = sbackc(p);
1412 bc7cb1a1 2003-11-23 devnull if(ct == 99 /*&& !sfbeg(p)*/) {
1413 bc7cb1a1 2003-11-23 devnull truncate(p);
1414 bc7cb1a1 2003-11-23 devnull sputc(p,-1);
1415 bc7cb1a1 2003-11-23 devnull }
1416 bc7cb1a1 2003-11-23 devnull } else{
1417 bc7cb1a1 2003-11-23 devnull fsfile(p);
1418 bc7cb1a1 2003-11-23 devnull ct = sbackc(p);
1419 bc7cb1a1 2003-11-23 devnull if(ct == 0)
1420 bc7cb1a1 2003-11-23 devnull truncate(p);
1421 bc7cb1a1 2003-11-23 devnull }
1422 bc7cb1a1 2003-11-23 devnull return;
1423 bc7cb1a1 2003-11-23 devnull }
1424 bc7cb1a1 2003-11-23 devnull
1425 bc7cb1a1 2003-11-23 devnull int
1426 bc7cb1a1 2003-11-23 devnull readc(void)
1427 bc7cb1a1 2003-11-23 devnull {
1428 bc7cb1a1 2003-11-23 devnull loop:
1429 bc7cb1a1 2003-11-23 devnull if((readptr != &readstk[0]) && (*readptr != 0)) {
1430 bc7cb1a1 2003-11-23 devnull if(sfeof(*readptr) == 0)
1431 bc7cb1a1 2003-11-23 devnull return(lastchar = sgetc(*readptr));
1432 bc7cb1a1 2003-11-23 devnull release(*readptr);
1433 bc7cb1a1 2003-11-23 devnull readptr--;
1434 bc7cb1a1 2003-11-23 devnull goto loop;
1435 bc7cb1a1 2003-11-23 devnull }
1436 bc7cb1a1 2003-11-23 devnull lastchar = Bgetc(curfile);
1437 bc7cb1a1 2003-11-23 devnull if(lastchar != -1)
1438 bc7cb1a1 2003-11-23 devnull return(lastchar);
1439 bc7cb1a1 2003-11-23 devnull if(readptr != &readptr[0]) {
1440 bc7cb1a1 2003-11-23 devnull readptr--;
1441 bc7cb1a1 2003-11-23 devnull if(*readptr == 0)
1442 bc7cb1a1 2003-11-23 devnull curfile = &bin;
1443 bc7cb1a1 2003-11-23 devnull goto loop;
1444 bc7cb1a1 2003-11-23 devnull }
1445 bc7cb1a1 2003-11-23 devnull if(curfile != &bin) {
1446 bc7cb1a1 2003-11-23 devnull Bterm(curfile);
1447 bc7cb1a1 2003-11-23 devnull curfile = &bin;
1448 bc7cb1a1 2003-11-23 devnull goto loop;
1449 bc7cb1a1 2003-11-23 devnull }
1450 bc7cb1a1 2003-11-23 devnull exits(0);
1451 bc7cb1a1 2003-11-23 devnull return 0; /* shut up ken */
1452 bc7cb1a1 2003-11-23 devnull }
1453 bc7cb1a1 2003-11-23 devnull
1454 bc7cb1a1 2003-11-23 devnull void
1455 bc7cb1a1 2003-11-23 devnull unreadc(char c)
1456 bc7cb1a1 2003-11-23 devnull {
1457 bc7cb1a1 2003-11-23 devnull
1458 bc7cb1a1 2003-11-23 devnull if((readptr != &readstk[0]) && (*readptr != 0)) {
1459 bc7cb1a1 2003-11-23 devnull sungetc(*readptr,c);
1460 bc7cb1a1 2003-11-23 devnull } else
1461 bc7cb1a1 2003-11-23 devnull Bungetc(curfile);
1462 bc7cb1a1 2003-11-23 devnull return;
1463 bc7cb1a1 2003-11-23 devnull }
1464 bc7cb1a1 2003-11-23 devnull
1465 bc7cb1a1 2003-11-23 devnull void
1466 bc7cb1a1 2003-11-23 devnull binop(char c)
1467 bc7cb1a1 2003-11-23 devnull {
1468 bc7cb1a1 2003-11-23 devnull Blk *r;
1469 bc7cb1a1 2003-11-23 devnull
1470 bc7cb1a1 2003-11-23 devnull r = 0;
1471 bc7cb1a1 2003-11-23 devnull switch(c) {
1472 bc7cb1a1 2003-11-23 devnull case '+':
1473 bc7cb1a1 2003-11-23 devnull r = add(arg1,arg2);
1474 bc7cb1a1 2003-11-23 devnull break;
1475 bc7cb1a1 2003-11-23 devnull case '*':
1476 bc7cb1a1 2003-11-23 devnull r = mult(arg1,arg2);
1477 bc7cb1a1 2003-11-23 devnull break;
1478 bc7cb1a1 2003-11-23 devnull case '/':
1479 bc7cb1a1 2003-11-23 devnull r = div(arg1,arg2);
1480 bc7cb1a1 2003-11-23 devnull break;
1481 bc7cb1a1 2003-11-23 devnull }
1482 bc7cb1a1 2003-11-23 devnull release(arg1);
1483 bc7cb1a1 2003-11-23 devnull release(arg2);
1484 bc7cb1a1 2003-11-23 devnull sputc(r,savk);
1485 bc7cb1a1 2003-11-23 devnull pushp(r);
1486 bc7cb1a1 2003-11-23 devnull }
1487 bc7cb1a1 2003-11-23 devnull
1488 bc7cb1a1 2003-11-23 devnull void
1489 bc7cb1a1 2003-11-23 devnull dcprint(Blk *hptr)
1490 bc7cb1a1 2003-11-23 devnull {
1491 bc7cb1a1 2003-11-23 devnull Blk *p, *q, *dec;
1492 bc7cb1a1 2003-11-23 devnull int dig, dout, ct, sc;
1493 bc7cb1a1 2003-11-23 devnull
1494 bc7cb1a1 2003-11-23 devnull rewind(hptr);
1495 bc7cb1a1 2003-11-23 devnull while(sfeof(hptr) == 0) {
1496 bc7cb1a1 2003-11-23 devnull if(sgetc(hptr)>99) {
1497 bc7cb1a1 2003-11-23 devnull rewind(hptr);
1498 bc7cb1a1 2003-11-23 devnull while(sfeof(hptr) == 0) {
1499 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%c",sgetc(hptr));
1500 bc7cb1a1 2003-11-23 devnull }
1501 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1502 bc7cb1a1 2003-11-23 devnull return;
1503 bc7cb1a1 2003-11-23 devnull }
1504 bc7cb1a1 2003-11-23 devnull }
1505 bc7cb1a1 2003-11-23 devnull fsfile(hptr);
1506 bc7cb1a1 2003-11-23 devnull sc = sbackc(hptr);
1507 bc7cb1a1 2003-11-23 devnull if(sfbeg(hptr) != 0) {
1508 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"0\n");
1509 bc7cb1a1 2003-11-23 devnull return;
1510 bc7cb1a1 2003-11-23 devnull }
1511 bc7cb1a1 2003-11-23 devnull count = ll;
1512 bc7cb1a1 2003-11-23 devnull p = copy(hptr,length(hptr));
1513 bc7cb1a1 2003-11-23 devnull sclobber(p);
1514 bc7cb1a1 2003-11-23 devnull fsfile(p);
1515 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
1516 bc7cb1a1 2003-11-23 devnull chsign(p);
1517 bc7cb1a1 2003-11-23 devnull OUTC('-');
1518 bc7cb1a1 2003-11-23 devnull }
1519 bc7cb1a1 2003-11-23 devnull if((obase == 0) || (obase == -1)) {
1520 bc7cb1a1 2003-11-23 devnull oneot(p,sc,'d');
1521 bc7cb1a1 2003-11-23 devnull return;
1522 bc7cb1a1 2003-11-23 devnull }
1523 bc7cb1a1 2003-11-23 devnull if(obase == 1) {
1524 bc7cb1a1 2003-11-23 devnull oneot(p,sc,'1');
1525 bc7cb1a1 2003-11-23 devnull return;
1526 bc7cb1a1 2003-11-23 devnull }
1527 bc7cb1a1 2003-11-23 devnull if(obase == 10) {
1528 bc7cb1a1 2003-11-23 devnull tenot(p,sc);
1529 bc7cb1a1 2003-11-23 devnull return;
1530 bc7cb1a1 2003-11-23 devnull }
1531 bc7cb1a1 2003-11-23 devnull /* sleazy hack to scale top of stack - divide by 1 */
1532 bc7cb1a1 2003-11-23 devnull pushp(p);
1533 bc7cb1a1 2003-11-23 devnull sputc(p, sc);
1534 bc7cb1a1 2003-11-23 devnull p=salloc(0);
1535 bc7cb1a1 2003-11-23 devnull create(p);
1536 bc7cb1a1 2003-11-23 devnull sputc(p, 1);
1537 bc7cb1a1 2003-11-23 devnull sputc(p, 0);
1538 bc7cb1a1 2003-11-23 devnull pushp(p);
1539 bc7cb1a1 2003-11-23 devnull if(dscale() != 0)
1540 bc7cb1a1 2003-11-23 devnull return;
1541 bc7cb1a1 2003-11-23 devnull p = div(arg1, arg2);
1542 bc7cb1a1 2003-11-23 devnull release(arg1);
1543 bc7cb1a1 2003-11-23 devnull release(arg2);
1544 bc7cb1a1 2003-11-23 devnull sc = savk;
1545 bc7cb1a1 2003-11-23 devnull
1546 bc7cb1a1 2003-11-23 devnull create(strptr);
1547 bc7cb1a1 2003-11-23 devnull dig = logten*sc;
1548 bc7cb1a1 2003-11-23 devnull dout = ((dig/10) + dig) / logo;
1549 bc7cb1a1 2003-11-23 devnull dec = getdec(p,sc);
1550 bc7cb1a1 2003-11-23 devnull p = removc(p,sc);
1551 bc7cb1a1 2003-11-23 devnull while(length(p) != 0) {
1552 bc7cb1a1 2003-11-23 devnull q = div(p,basptr);
1553 bc7cb1a1 2003-11-23 devnull release(p);
1554 bc7cb1a1 2003-11-23 devnull p = q;
1555 bc7cb1a1 2003-11-23 devnull (*outdit)(rem,0);
1556 bc7cb1a1 2003-11-23 devnull }
1557 bc7cb1a1 2003-11-23 devnull release(p);
1558 bc7cb1a1 2003-11-23 devnull fsfile(strptr);
1559 bc7cb1a1 2003-11-23 devnull while(sfbeg(strptr) == 0)
1560 bc7cb1a1 2003-11-23 devnull OUTC(sbackc(strptr));
1561 bc7cb1a1 2003-11-23 devnull if(sc == 0) {
1562 bc7cb1a1 2003-11-23 devnull release(dec);
1563 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1564 bc7cb1a1 2003-11-23 devnull return;
1565 bc7cb1a1 2003-11-23 devnull }
1566 bc7cb1a1 2003-11-23 devnull create(strptr);
1567 bc7cb1a1 2003-11-23 devnull OUTC('.');
1568 bc7cb1a1 2003-11-23 devnull ct=0;
1569 bc7cb1a1 2003-11-23 devnull do {
1570 bc7cb1a1 2003-11-23 devnull q = mult(basptr,dec);
1571 bc7cb1a1 2003-11-23 devnull release(dec);
1572 bc7cb1a1 2003-11-23 devnull dec = getdec(q,sc);
1573 bc7cb1a1 2003-11-23 devnull p = removc(q,sc);
1574 bc7cb1a1 2003-11-23 devnull (*outdit)(p,1);
1575 bc7cb1a1 2003-11-23 devnull } while(++ct < dout);
1576 bc7cb1a1 2003-11-23 devnull release(dec);
1577 bc7cb1a1 2003-11-23 devnull rewind(strptr);
1578 bc7cb1a1 2003-11-23 devnull while(sfeof(strptr) == 0)
1579 bc7cb1a1 2003-11-23 devnull OUTC(sgetc(strptr));
1580 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1581 bc7cb1a1 2003-11-23 devnull }
1582 bc7cb1a1 2003-11-23 devnull
1583 bc7cb1a1 2003-11-23 devnull Blk*
1584 bc7cb1a1 2003-11-23 devnull getdec(Blk *p, int sc)
1585 bc7cb1a1 2003-11-23 devnull {
1586 bc7cb1a1 2003-11-23 devnull int cc;
1587 bc7cb1a1 2003-11-23 devnull Blk *q, *t, *s;
1588 bc7cb1a1 2003-11-23 devnull
1589 bc7cb1a1 2003-11-23 devnull rewind(p);
1590 bc7cb1a1 2003-11-23 devnull if(length(p)*2 < sc) {
1591 bc7cb1a1 2003-11-23 devnull q = copy(p,length(p));
1592 bc7cb1a1 2003-11-23 devnull return(q);
1593 bc7cb1a1 2003-11-23 devnull }
1594 bc7cb1a1 2003-11-23 devnull q = salloc(length(p));
1595 bc7cb1a1 2003-11-23 devnull while(sc >= 1) {
1596 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1597 bc7cb1a1 2003-11-23 devnull sc -= 2;
1598 bc7cb1a1 2003-11-23 devnull }
1599 bc7cb1a1 2003-11-23 devnull if(sc != 0) {
1600 bc7cb1a1 2003-11-23 devnull t = mult(q,tenptr);
1601 bc7cb1a1 2003-11-23 devnull s = salloc(cc = length(q));
1602 bc7cb1a1 2003-11-23 devnull release(q);
1603 bc7cb1a1 2003-11-23 devnull rewind(t);
1604 bc7cb1a1 2003-11-23 devnull while(cc-- > 0)
1605 bc7cb1a1 2003-11-23 devnull sputc(s,sgetc(t));
1606 bc7cb1a1 2003-11-23 devnull sputc(s,0);
1607 bc7cb1a1 2003-11-23 devnull release(t);
1608 bc7cb1a1 2003-11-23 devnull t = div(s,tenptr);
1609 bc7cb1a1 2003-11-23 devnull release(s);
1610 bc7cb1a1 2003-11-23 devnull release(rem);
1611 bc7cb1a1 2003-11-23 devnull return(t);
1612 bc7cb1a1 2003-11-23 devnull }
1613 bc7cb1a1 2003-11-23 devnull return(q);
1614 bc7cb1a1 2003-11-23 devnull }
1615 bc7cb1a1 2003-11-23 devnull
1616 bc7cb1a1 2003-11-23 devnull void
1617 bc7cb1a1 2003-11-23 devnull tenot(Blk *p, int sc)
1618 bc7cb1a1 2003-11-23 devnull {
1619 bc7cb1a1 2003-11-23 devnull int c, f;
1620 bc7cb1a1 2003-11-23 devnull
1621 bc7cb1a1 2003-11-23 devnull fsfile(p);
1622 bc7cb1a1 2003-11-23 devnull f=0;
1623 bc7cb1a1 2003-11-23 devnull while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)) {
1624 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1625 bc7cb1a1 2003-11-23 devnull if((c<10) && (f == 1))
1626 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"0%d",c);
1627 bc7cb1a1 2003-11-23 devnull else
1628 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d",c);
1629 bc7cb1a1 2003-11-23 devnull f=1;
1630 bc7cb1a1 2003-11-23 devnull TEST2;
1631 bc7cb1a1 2003-11-23 devnull }
1632 bc7cb1a1 2003-11-23 devnull if(sc == 0) {
1633 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1634 bc7cb1a1 2003-11-23 devnull release(p);
1635 bc7cb1a1 2003-11-23 devnull return;
1636 bc7cb1a1 2003-11-23 devnull }
1637 bc7cb1a1 2003-11-23 devnull if((p->rd-p->beg)*2 > sc) {
1638 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1639 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d.",c/10);
1640 bc7cb1a1 2003-11-23 devnull TEST2;
1641 bc7cb1a1 2003-11-23 devnull OUTC(c%10 +'0');
1642 bc7cb1a1 2003-11-23 devnull sc--;
1643 bc7cb1a1 2003-11-23 devnull } else {
1644 bc7cb1a1 2003-11-23 devnull OUTC('.');
1645 bc7cb1a1 2003-11-23 devnull }
1646 bc7cb1a1 2003-11-23 devnull while(sc>(p->rd-p->beg)*2) {
1647 bc7cb1a1 2003-11-23 devnull OUTC('0');
1648 bc7cb1a1 2003-11-23 devnull sc--;
1649 bc7cb1a1 2003-11-23 devnull }
1650 bc7cb1a1 2003-11-23 devnull while(sc > 1) {
1651 bc7cb1a1 2003-11-23 devnull c = sbackc(p);
1652 bc7cb1a1 2003-11-23 devnull if(c<10)
1653 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"0%d",c);
1654 bc7cb1a1 2003-11-23 devnull else
1655 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d",c);
1656 bc7cb1a1 2003-11-23 devnull sc -= 2;
1657 bc7cb1a1 2003-11-23 devnull TEST2;
1658 bc7cb1a1 2003-11-23 devnull }
1659 bc7cb1a1 2003-11-23 devnull if(sc == 1) {
1660 bc7cb1a1 2003-11-23 devnull OUTC(sbackc(p)/10 +'0');
1661 bc7cb1a1 2003-11-23 devnull }
1662 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1663 bc7cb1a1 2003-11-23 devnull release(p);
1664 bc7cb1a1 2003-11-23 devnull }
1665 bc7cb1a1 2003-11-23 devnull
1666 bc7cb1a1 2003-11-23 devnull void
1667 bc7cb1a1 2003-11-23 devnull oneot(Blk *p, int sc, char ch)
1668 bc7cb1a1 2003-11-23 devnull {
1669 bc7cb1a1 2003-11-23 devnull Blk *q;
1670 bc7cb1a1 2003-11-23 devnull
1671 bc7cb1a1 2003-11-23 devnull q = removc(p,sc);
1672 bc7cb1a1 2003-11-23 devnull create(strptr);
1673 bc7cb1a1 2003-11-23 devnull sputc(strptr,-1);
1674 bc7cb1a1 2003-11-23 devnull while(length(q)>0) {
1675 bc7cb1a1 2003-11-23 devnull p = add(strptr,q);
1676 bc7cb1a1 2003-11-23 devnull release(q);
1677 bc7cb1a1 2003-11-23 devnull q = p;
1678 bc7cb1a1 2003-11-23 devnull OUTC(ch);
1679 bc7cb1a1 2003-11-23 devnull }
1680 bc7cb1a1 2003-11-23 devnull release(q);
1681 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
1682 bc7cb1a1 2003-11-23 devnull }
1683 bc7cb1a1 2003-11-23 devnull
1684 bc7cb1a1 2003-11-23 devnull void
1685 bc7cb1a1 2003-11-23 devnull hexot(Blk *p, int flg)
1686 bc7cb1a1 2003-11-23 devnull {
1687 bc7cb1a1 2003-11-23 devnull int c;
1688 bc7cb1a1 2003-11-23 devnull
1689 bc7cb1a1 2003-11-23 devnull USED(flg);
1690 bc7cb1a1 2003-11-23 devnull rewind(p);
1691 bc7cb1a1 2003-11-23 devnull if(sfeof(p) != 0) {
1692 bc7cb1a1 2003-11-23 devnull sputc(strptr,'0');
1693 bc7cb1a1 2003-11-23 devnull release(p);
1694 bc7cb1a1 2003-11-23 devnull return;
1695 bc7cb1a1 2003-11-23 devnull }
1696 bc7cb1a1 2003-11-23 devnull c = sgetc(p);
1697 bc7cb1a1 2003-11-23 devnull release(p);
1698 bc7cb1a1 2003-11-23 devnull if(c >= 16) {
1699 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"hex digit > 16");
1700 bc7cb1a1 2003-11-23 devnull return;
1701 bc7cb1a1 2003-11-23 devnull }
1702 bc7cb1a1 2003-11-23 devnull sputc(strptr,c<10?c+'0':c-10+'a');
1703 bc7cb1a1 2003-11-23 devnull }
1704 bc7cb1a1 2003-11-23 devnull
1705 bc7cb1a1 2003-11-23 devnull void
1706 bc7cb1a1 2003-11-23 devnull bigot(Blk *p, int flg)
1707 bc7cb1a1 2003-11-23 devnull {
1708 bc7cb1a1 2003-11-23 devnull Blk *t, *q;
1709 bc7cb1a1 2003-11-23 devnull int neg, l;
1710 bc7cb1a1 2003-11-23 devnull
1711 bc7cb1a1 2003-11-23 devnull if(flg == 1) {
1712 bc7cb1a1 2003-11-23 devnull t = salloc(0);
1713 bc7cb1a1 2003-11-23 devnull l = 0;
1714 bc7cb1a1 2003-11-23 devnull } else {
1715 bc7cb1a1 2003-11-23 devnull t = strptr;
1716 bc7cb1a1 2003-11-23 devnull l = length(strptr)+fw-1;
1717 bc7cb1a1 2003-11-23 devnull }
1718 bc7cb1a1 2003-11-23 devnull neg=0;
1719 bc7cb1a1 2003-11-23 devnull if(length(p) != 0) {
1720 bc7cb1a1 2003-11-23 devnull fsfile(p);
1721 bc7cb1a1 2003-11-23 devnull if(sbackc(p)<0) {
1722 bc7cb1a1 2003-11-23 devnull neg=1;
1723 bc7cb1a1 2003-11-23 devnull chsign(p);
1724 bc7cb1a1 2003-11-23 devnull }
1725 bc7cb1a1 2003-11-23 devnull while(length(p) != 0) {
1726 bc7cb1a1 2003-11-23 devnull q = div(p,tenptr);
1727 bc7cb1a1 2003-11-23 devnull release(p);
1728 bc7cb1a1 2003-11-23 devnull p = q;
1729 bc7cb1a1 2003-11-23 devnull rewind(rem);
1730 bc7cb1a1 2003-11-23 devnull sputc(t,sfeof(rem)?'0':sgetc(rem)+'0');
1731 bc7cb1a1 2003-11-23 devnull release(rem);
1732 bc7cb1a1 2003-11-23 devnull }
1733 bc7cb1a1 2003-11-23 devnull }
1734 bc7cb1a1 2003-11-23 devnull release(p);
1735 bc7cb1a1 2003-11-23 devnull if(flg == 1) {
1736 bc7cb1a1 2003-11-23 devnull l = fw1-length(t);
1737 bc7cb1a1 2003-11-23 devnull if(neg != 0) {
1738 bc7cb1a1 2003-11-23 devnull l--;
1739 bc7cb1a1 2003-11-23 devnull sputc(strptr,'-');
1740 bc7cb1a1 2003-11-23 devnull }
1741 bc7cb1a1 2003-11-23 devnull fsfile(t);
1742 bc7cb1a1 2003-11-23 devnull while(l-- > 0)
1743 bc7cb1a1 2003-11-23 devnull sputc(strptr,'0');
1744 bc7cb1a1 2003-11-23 devnull while(sfbeg(t) == 0)
1745 bc7cb1a1 2003-11-23 devnull sputc(strptr,sbackc(t));
1746 bc7cb1a1 2003-11-23 devnull release(t);
1747 bc7cb1a1 2003-11-23 devnull } else {
1748 bc7cb1a1 2003-11-23 devnull l -= length(strptr);
1749 bc7cb1a1 2003-11-23 devnull while(l-- > 0)
1750 bc7cb1a1 2003-11-23 devnull sputc(strptr,'0');
1751 bc7cb1a1 2003-11-23 devnull if(neg != 0) {
1752 bc7cb1a1 2003-11-23 devnull sclobber(strptr);
1753 bc7cb1a1 2003-11-23 devnull sputc(strptr,'-');
1754 bc7cb1a1 2003-11-23 devnull }
1755 bc7cb1a1 2003-11-23 devnull }
1756 bc7cb1a1 2003-11-23 devnull sputc(strptr,' ');
1757 bc7cb1a1 2003-11-23 devnull }
1758 bc7cb1a1 2003-11-23 devnull
1759 bc7cb1a1 2003-11-23 devnull Blk*
1760 bc7cb1a1 2003-11-23 devnull add(Blk *a1, Blk *a2)
1761 bc7cb1a1 2003-11-23 devnull {
1762 bc7cb1a1 2003-11-23 devnull Blk *p;
1763 bc7cb1a1 2003-11-23 devnull int carry, n, size, c, n1, n2;
1764 bc7cb1a1 2003-11-23 devnull
1765 bc7cb1a1 2003-11-23 devnull size = length(a1)>length(a2)?length(a1):length(a2);
1766 bc7cb1a1 2003-11-23 devnull p = salloc(size);
1767 bc7cb1a1 2003-11-23 devnull rewind(a1);
1768 bc7cb1a1 2003-11-23 devnull rewind(a2);
1769 bc7cb1a1 2003-11-23 devnull carry=0;
1770 bc7cb1a1 2003-11-23 devnull while(--size >= 0) {
1771 bc7cb1a1 2003-11-23 devnull n1 = sfeof(a1)?0:sgetc(a1);
1772 bc7cb1a1 2003-11-23 devnull n2 = sfeof(a2)?0:sgetc(a2);
1773 bc7cb1a1 2003-11-23 devnull n = n1 + n2 + carry;
1774 bc7cb1a1 2003-11-23 devnull if(n>=100) {
1775 bc7cb1a1 2003-11-23 devnull carry=1;
1776 bc7cb1a1 2003-11-23 devnull n -= 100;
1777 bc7cb1a1 2003-11-23 devnull } else
1778 bc7cb1a1 2003-11-23 devnull if(n<0) {
1779 bc7cb1a1 2003-11-23 devnull carry = -1;
1780 bc7cb1a1 2003-11-23 devnull n += 100;
1781 bc7cb1a1 2003-11-23 devnull } else
1782 bc7cb1a1 2003-11-23 devnull carry = 0;
1783 bc7cb1a1 2003-11-23 devnull sputc(p,n);
1784 bc7cb1a1 2003-11-23 devnull }
1785 bc7cb1a1 2003-11-23 devnull if(carry != 0)
1786 bc7cb1a1 2003-11-23 devnull sputc(p,carry);
1787 bc7cb1a1 2003-11-23 devnull fsfile(p);
1788 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0) {
1789 bc7cb1a1 2003-11-23 devnull c = 0;
1790 bc7cb1a1 2003-11-23 devnull while(sfbeg(p) == 0 && (c = sbackc(p)) == 0)
1791 bc7cb1a1 2003-11-23 devnull ;
1792 bc7cb1a1 2003-11-23 devnull if(c != 0)
1793 bc7cb1a1 2003-11-23 devnull salterc(p,c);
1794 bc7cb1a1 2003-11-23 devnull truncate(p);
1795 bc7cb1a1 2003-11-23 devnull }
1796 bc7cb1a1 2003-11-23 devnull fsfile(p);
1797 bc7cb1a1 2003-11-23 devnull if(sfbeg(p) == 0 && sbackc(p) == -1) {
1798 bc7cb1a1 2003-11-23 devnull while((c = sbackc(p)) == 99) {
1799 bc7cb1a1 2003-11-23 devnull if(c == -1)
1800 bc7cb1a1 2003-11-23 devnull break;
1801 bc7cb1a1 2003-11-23 devnull }
1802 bc7cb1a1 2003-11-23 devnull skipc(p);
1803 bc7cb1a1 2003-11-23 devnull salterc(p,-1);
1804 bc7cb1a1 2003-11-23 devnull truncate(p);
1805 bc7cb1a1 2003-11-23 devnull }
1806 bc7cb1a1 2003-11-23 devnull return(p);
1807 bc7cb1a1 2003-11-23 devnull }
1808 bc7cb1a1 2003-11-23 devnull
1809 bc7cb1a1 2003-11-23 devnull int
1810 bc7cb1a1 2003-11-23 devnull eqk(void)
1811 bc7cb1a1 2003-11-23 devnull {
1812 bc7cb1a1 2003-11-23 devnull Blk *p, *q;
1813 bc7cb1a1 2003-11-23 devnull int skp, skq;
1814 bc7cb1a1 2003-11-23 devnull
1815 bc7cb1a1 2003-11-23 devnull p = pop();
1816 bc7cb1a1 2003-11-23 devnull EMPTYS;
1817 bc7cb1a1 2003-11-23 devnull q = pop();
1818 bc7cb1a1 2003-11-23 devnull EMPTYSR(p);
1819 bc7cb1a1 2003-11-23 devnull skp = sunputc(p);
1820 bc7cb1a1 2003-11-23 devnull skq = sunputc(q);
1821 bc7cb1a1 2003-11-23 devnull if(skp == skq) {
1822 bc7cb1a1 2003-11-23 devnull arg1=p;
1823 bc7cb1a1 2003-11-23 devnull arg2=q;
1824 bc7cb1a1 2003-11-23 devnull savk = skp;
1825 bc7cb1a1 2003-11-23 devnull return(0);
1826 bc7cb1a1 2003-11-23 devnull }
1827 bc7cb1a1 2003-11-23 devnull if(skp < skq) {
1828 bc7cb1a1 2003-11-23 devnull savk = skq;
1829 bc7cb1a1 2003-11-23 devnull p = add0(p,skq-skp);
1830 bc7cb1a1 2003-11-23 devnull } else {
1831 bc7cb1a1 2003-11-23 devnull savk = skp;
1832 bc7cb1a1 2003-11-23 devnull q = add0(q,skp-skq);
1833 bc7cb1a1 2003-11-23 devnull }
1834 bc7cb1a1 2003-11-23 devnull arg1=p;
1835 bc7cb1a1 2003-11-23 devnull arg2=q;
1836 bc7cb1a1 2003-11-23 devnull return(0);
1837 bc7cb1a1 2003-11-23 devnull }
1838 bc7cb1a1 2003-11-23 devnull
1839 bc7cb1a1 2003-11-23 devnull Blk*
1840 bc7cb1a1 2003-11-23 devnull removc(Blk *p, int n)
1841 bc7cb1a1 2003-11-23 devnull {
1842 bc7cb1a1 2003-11-23 devnull Blk *q, *r;
1843 bc7cb1a1 2003-11-23 devnull
1844 bc7cb1a1 2003-11-23 devnull rewind(p);
1845 bc7cb1a1 2003-11-23 devnull while(n>1) {
1846 bc7cb1a1 2003-11-23 devnull skipc(p);
1847 bc7cb1a1 2003-11-23 devnull n -= 2;
1848 bc7cb1a1 2003-11-23 devnull }
1849 bc7cb1a1 2003-11-23 devnull q = salloc(2);
1850 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0)
1851 bc7cb1a1 2003-11-23 devnull sputc(q,sgetc(p));
1852 bc7cb1a1 2003-11-23 devnull if(n == 1) {
1853 bc7cb1a1 2003-11-23 devnull r = div(q,tenptr);
1854 bc7cb1a1 2003-11-23 devnull release(q);
1855 bc7cb1a1 2003-11-23 devnull release(rem);
1856 bc7cb1a1 2003-11-23 devnull q = r;
1857 bc7cb1a1 2003-11-23 devnull }
1858 bc7cb1a1 2003-11-23 devnull release(p);
1859 bc7cb1a1 2003-11-23 devnull return(q);
1860 bc7cb1a1 2003-11-23 devnull }
1861 bc7cb1a1 2003-11-23 devnull
1862 bc7cb1a1 2003-11-23 devnull Blk*
1863 bc7cb1a1 2003-11-23 devnull scalint(Blk *p)
1864 bc7cb1a1 2003-11-23 devnull {
1865 bc7cb1a1 2003-11-23 devnull int n;
1866 bc7cb1a1 2003-11-23 devnull
1867 bc7cb1a1 2003-11-23 devnull n = sunputc(p);
1868 bc7cb1a1 2003-11-23 devnull p = removc(p,n);
1869 bc7cb1a1 2003-11-23 devnull return(p);
1870 bc7cb1a1 2003-11-23 devnull }
1871 bc7cb1a1 2003-11-23 devnull
1872 bc7cb1a1 2003-11-23 devnull Blk*
1873 bc7cb1a1 2003-11-23 devnull scale(Blk *p, int n)
1874 bc7cb1a1 2003-11-23 devnull {
1875 bc7cb1a1 2003-11-23 devnull Blk *q, *s, *t;
1876 bc7cb1a1 2003-11-23 devnull
1877 bc7cb1a1 2003-11-23 devnull t = add0(p,n);
1878 bc7cb1a1 2003-11-23 devnull q = salloc(1);
1879 bc7cb1a1 2003-11-23 devnull sputc(q,n);
1880 bc7cb1a1 2003-11-23 devnull s = dcexp(inbas,q);
1881 bc7cb1a1 2003-11-23 devnull release(q);
1882 bc7cb1a1 2003-11-23 devnull q = div(t,s);
1883 bc7cb1a1 2003-11-23 devnull release(t);
1884 bc7cb1a1 2003-11-23 devnull release(s);
1885 bc7cb1a1 2003-11-23 devnull release(rem);
1886 bc7cb1a1 2003-11-23 devnull sputc(q,n);
1887 bc7cb1a1 2003-11-23 devnull return(q);
1888 bc7cb1a1 2003-11-23 devnull }
1889 bc7cb1a1 2003-11-23 devnull
1890 bc7cb1a1 2003-11-23 devnull int
1891 bc7cb1a1 2003-11-23 devnull subt(void)
1892 bc7cb1a1 2003-11-23 devnull {
1893 bc7cb1a1 2003-11-23 devnull arg1=pop();
1894 bc7cb1a1 2003-11-23 devnull EMPTYS;
1895 bc7cb1a1 2003-11-23 devnull savk = sunputc(arg1);
1896 bc7cb1a1 2003-11-23 devnull chsign(arg1);
1897 bc7cb1a1 2003-11-23 devnull sputc(arg1,savk);
1898 bc7cb1a1 2003-11-23 devnull pushp(arg1);
1899 bc7cb1a1 2003-11-23 devnull if(eqk() != 0)
1900 bc7cb1a1 2003-11-23 devnull return(1);
1901 bc7cb1a1 2003-11-23 devnull binop('+');
1902 bc7cb1a1 2003-11-23 devnull return(0);
1903 bc7cb1a1 2003-11-23 devnull }
1904 bc7cb1a1 2003-11-23 devnull
1905 bc7cb1a1 2003-11-23 devnull int
1906 bc7cb1a1 2003-11-23 devnull command(void)
1907 bc7cb1a1 2003-11-23 devnull {
1908 bc7cb1a1 2003-11-23 devnull char line[100], *sl;
1909 bc7cb1a1 2003-11-23 devnull int pid, p, c;
1910 bc7cb1a1 2003-11-23 devnull
1911 bc7cb1a1 2003-11-23 devnull switch(c = readc()) {
1912 bc7cb1a1 2003-11-23 devnull case '<':
1913 bc7cb1a1 2003-11-23 devnull return(cond(NL));
1914 bc7cb1a1 2003-11-23 devnull case '>':
1915 bc7cb1a1 2003-11-23 devnull return(cond(NG));
1916 bc7cb1a1 2003-11-23 devnull case '=':
1917 bc7cb1a1 2003-11-23 devnull return(cond(NE));
1918 bc7cb1a1 2003-11-23 devnull default:
1919 bc7cb1a1 2003-11-23 devnull sl = line;
1920 bc7cb1a1 2003-11-23 devnull *sl++ = c;
1921 bc7cb1a1 2003-11-23 devnull while((c = readc()) != '\n')
1922 bc7cb1a1 2003-11-23 devnull *sl++ = c;
1923 bc7cb1a1 2003-11-23 devnull *sl = 0;
1924 bc7cb1a1 2003-11-23 devnull if((pid = fork()) == 0) {
1925 bc7cb1a1 2003-11-23 devnull execl("/bin/rc","rc","-c",line,0);
1926 bc7cb1a1 2003-11-23 devnull exits("shell");
1927 bc7cb1a1 2003-11-23 devnull }
1928 bc7cb1a1 2003-11-23 devnull for(;;) {
1929 bc7cb1a1 2003-11-23 devnull if((p = waitpid()) < 0)
1930 bc7cb1a1 2003-11-23 devnull break;
1931 bc7cb1a1 2003-11-23 devnull if(p== pid)
1932 bc7cb1a1 2003-11-23 devnull break;
1933 bc7cb1a1 2003-11-23 devnull }
1934 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"!\n");
1935 bc7cb1a1 2003-11-23 devnull return(0);
1936 bc7cb1a1 2003-11-23 devnull }
1937 bc7cb1a1 2003-11-23 devnull }
1938 bc7cb1a1 2003-11-23 devnull
1939 bc7cb1a1 2003-11-23 devnull int
1940 bc7cb1a1 2003-11-23 devnull cond(char c)
1941 bc7cb1a1 2003-11-23 devnull {
1942 bc7cb1a1 2003-11-23 devnull Blk *p;
1943 bc7cb1a1 2003-11-23 devnull int cc;
1944 bc7cb1a1 2003-11-23 devnull
1945 bc7cb1a1 2003-11-23 devnull if(subt() != 0)
1946 bc7cb1a1 2003-11-23 devnull return(1);
1947 bc7cb1a1 2003-11-23 devnull p = pop();
1948 bc7cb1a1 2003-11-23 devnull sclobber(p);
1949 bc7cb1a1 2003-11-23 devnull if(length(p) == 0) {
1950 bc7cb1a1 2003-11-23 devnull release(p);
1951 bc7cb1a1 2003-11-23 devnull if(c == '<' || c == '>' || c == NE) {
1952 bc7cb1a1 2003-11-23 devnull getstk();
1953 bc7cb1a1 2003-11-23 devnull return(0);
1954 bc7cb1a1 2003-11-23 devnull }
1955 bc7cb1a1 2003-11-23 devnull load();
1956 bc7cb1a1 2003-11-23 devnull return(1);
1957 bc7cb1a1 2003-11-23 devnull }
1958 bc7cb1a1 2003-11-23 devnull if(c == '='){
1959 bc7cb1a1 2003-11-23 devnull release(p);
1960 bc7cb1a1 2003-11-23 devnull getstk();
1961 bc7cb1a1 2003-11-23 devnull return(0);
1962 bc7cb1a1 2003-11-23 devnull }
1963 bc7cb1a1 2003-11-23 devnull if(c == NE) {
1964 bc7cb1a1 2003-11-23 devnull release(p);
1965 bc7cb1a1 2003-11-23 devnull load();
1966 bc7cb1a1 2003-11-23 devnull return(1);
1967 bc7cb1a1 2003-11-23 devnull }
1968 bc7cb1a1 2003-11-23 devnull fsfile(p);
1969 bc7cb1a1 2003-11-23 devnull cc = sbackc(p);
1970 bc7cb1a1 2003-11-23 devnull release(p);
1971 bc7cb1a1 2003-11-23 devnull if((cc<0 && (c == '<' || c == NG)) ||
1972 bc7cb1a1 2003-11-23 devnull (cc >0) && (c == '>' || c == NL)) {
1973 bc7cb1a1 2003-11-23 devnull getstk();
1974 bc7cb1a1 2003-11-23 devnull return(0);
1975 bc7cb1a1 2003-11-23 devnull }
1976 bc7cb1a1 2003-11-23 devnull load();
1977 bc7cb1a1 2003-11-23 devnull return(1);
1978 bc7cb1a1 2003-11-23 devnull }
1979 bc7cb1a1 2003-11-23 devnull
1980 bc7cb1a1 2003-11-23 devnull void
1981 bc7cb1a1 2003-11-23 devnull load(void)
1982 bc7cb1a1 2003-11-23 devnull {
1983 bc7cb1a1 2003-11-23 devnull int c;
1984 bc7cb1a1 2003-11-23 devnull Blk *p, *q, *t, *s;
1985 bc7cb1a1 2003-11-23 devnull
1986 bc7cb1a1 2003-11-23 devnull c = getstk() & 0377;
1987 bc7cb1a1 2003-11-23 devnull sptr = stable[c];
1988 bc7cb1a1 2003-11-23 devnull if(sptr != 0) {
1989 bc7cb1a1 2003-11-23 devnull p = sptr->val;
1990 bc7cb1a1 2003-11-23 devnull if(c >= ARRAYST) {
1991 bc7cb1a1 2003-11-23 devnull q = salloc(length(p));
1992 bc7cb1a1 2003-11-23 devnull rewind(p);
1993 bc7cb1a1 2003-11-23 devnull while(sfeof(p) == 0) {
1994 bc7cb1a1 2003-11-23 devnull s = dcgetwd(p);
1995 bc7cb1a1 2003-11-23 devnull if(s == 0) {
1996 bc7cb1a1 2003-11-23 devnull putwd(q, (Blk*)0);
1997 bc7cb1a1 2003-11-23 devnull } else {
1998 bc7cb1a1 2003-11-23 devnull t = copy(s,length(s));
1999 bc7cb1a1 2003-11-23 devnull putwd(q,t);
2000 bc7cb1a1 2003-11-23 devnull }
2001 bc7cb1a1 2003-11-23 devnull }
2002 bc7cb1a1 2003-11-23 devnull pushp(q);
2003 bc7cb1a1 2003-11-23 devnull } else {
2004 bc7cb1a1 2003-11-23 devnull q = copy(p,length(p));
2005 bc7cb1a1 2003-11-23 devnull pushp(q);
2006 bc7cb1a1 2003-11-23 devnull }
2007 bc7cb1a1 2003-11-23 devnull } else {
2008 bc7cb1a1 2003-11-23 devnull q = salloc(1);
2009 bc7cb1a1 2003-11-23 devnull if(c <= LASTFUN) {
2010 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"function %c undefined\n",c+'a'-1);
2011 bc7cb1a1 2003-11-23 devnull sputc(q,'c');
2012 bc7cb1a1 2003-11-23 devnull sputc(q,'0');
2013 bc7cb1a1 2003-11-23 devnull sputc(q,' ');
2014 bc7cb1a1 2003-11-23 devnull sputc(q,'1');
2015 bc7cb1a1 2003-11-23 devnull sputc(q,'Q');
2016 bc7cb1a1 2003-11-23 devnull }
2017 bc7cb1a1 2003-11-23 devnull else
2018 bc7cb1a1 2003-11-23 devnull sputc(q,0);
2019 bc7cb1a1 2003-11-23 devnull pushp(q);
2020 bc7cb1a1 2003-11-23 devnull }
2021 bc7cb1a1 2003-11-23 devnull }
2022 bc7cb1a1 2003-11-23 devnull
2023 bc7cb1a1 2003-11-23 devnull int
2024 bc7cb1a1 2003-11-23 devnull log2(long n)
2025 bc7cb1a1 2003-11-23 devnull {
2026 bc7cb1a1 2003-11-23 devnull int i;
2027 bc7cb1a1 2003-11-23 devnull
2028 bc7cb1a1 2003-11-23 devnull if(n == 0)
2029 bc7cb1a1 2003-11-23 devnull return(0);
2030 bc7cb1a1 2003-11-23 devnull i=31;
2031 bc7cb1a1 2003-11-23 devnull if(n<0)
2032 bc7cb1a1 2003-11-23 devnull return(i);
2033 bc7cb1a1 2003-11-23 devnull while((n= n<<1) >0)
2034 bc7cb1a1 2003-11-23 devnull i--;
2035 bc7cb1a1 2003-11-23 devnull return i-1;
2036 bc7cb1a1 2003-11-23 devnull }
2037 bc7cb1a1 2003-11-23 devnull
2038 bc7cb1a1 2003-11-23 devnull Blk*
2039 bc7cb1a1 2003-11-23 devnull salloc(int size)
2040 bc7cb1a1 2003-11-23 devnull {
2041 bc7cb1a1 2003-11-23 devnull Blk *hdr;
2042 bc7cb1a1 2003-11-23 devnull char *ptr;
2043 bc7cb1a1 2003-11-23 devnull
2044 bc7cb1a1 2003-11-23 devnull all++;
2045 bc7cb1a1 2003-11-23 devnull lall++;
2046 bc7cb1a1 2003-11-23 devnull if(all - rel > active)
2047 bc7cb1a1 2003-11-23 devnull active = all - rel;
2048 bc7cb1a1 2003-11-23 devnull nbytes += size;
2049 bc7cb1a1 2003-11-23 devnull lbytes += size;
2050 bc7cb1a1 2003-11-23 devnull if(nbytes >maxsize)
2051 bc7cb1a1 2003-11-23 devnull maxsize = nbytes;
2052 bc7cb1a1 2003-11-23 devnull if(size > longest)
2053 bc7cb1a1 2003-11-23 devnull longest = size;
2054 bc7cb1a1 2003-11-23 devnull ptr = malloc((unsigned)size);
2055 bc7cb1a1 2003-11-23 devnull if(ptr == 0){
2056 bc7cb1a1 2003-11-23 devnull garbage("salloc");
2057 bc7cb1a1 2003-11-23 devnull if((ptr = malloc((unsigned)size)) == 0)
2058 bc7cb1a1 2003-11-23 devnull ospace("salloc");
2059 bc7cb1a1 2003-11-23 devnull }
2060 bc7cb1a1 2003-11-23 devnull if((hdr = hfree) == 0)
2061 bc7cb1a1 2003-11-23 devnull hdr = morehd();
2062 bc7cb1a1 2003-11-23 devnull hfree = (Blk *)hdr->rd;
2063 bc7cb1a1 2003-11-23 devnull hdr->rd = hdr->wt = hdr->beg = ptr;
2064 bc7cb1a1 2003-11-23 devnull hdr->last = ptr+size;
2065 bc7cb1a1 2003-11-23 devnull return(hdr);
2066 bc7cb1a1 2003-11-23 devnull }
2067 bc7cb1a1 2003-11-23 devnull
2068 bc7cb1a1 2003-11-23 devnull Blk*
2069 bc7cb1a1 2003-11-23 devnull morehd(void)
2070 bc7cb1a1 2003-11-23 devnull {
2071 bc7cb1a1 2003-11-23 devnull Blk *h, *kk;
2072 bc7cb1a1 2003-11-23 devnull
2073 bc7cb1a1 2003-11-23 devnull headmor++;
2074 bc7cb1a1 2003-11-23 devnull nbytes += HEADSZ;
2075 bc7cb1a1 2003-11-23 devnull hfree = h = (Blk *)malloc(HEADSZ);
2076 bc7cb1a1 2003-11-23 devnull if(hfree == 0) {
2077 bc7cb1a1 2003-11-23 devnull garbage("morehd");
2078 bc7cb1a1 2003-11-23 devnull if((hfree = h = (Blk*)malloc(HEADSZ)) == 0)
2079 bc7cb1a1 2003-11-23 devnull ospace("headers");
2080 bc7cb1a1 2003-11-23 devnull }
2081 bc7cb1a1 2003-11-23 devnull kk = h;
2082 bc7cb1a1 2003-11-23 devnull while(h<hfree+(HEADSZ/BLK))
2083 bc7cb1a1 2003-11-23 devnull (h++)->rd = (char*)++kk;
2084 bc7cb1a1 2003-11-23 devnull (h-1)->rd=0;
2085 bc7cb1a1 2003-11-23 devnull return(hfree);
2086 bc7cb1a1 2003-11-23 devnull }
2087 bc7cb1a1 2003-11-23 devnull
2088 bc7cb1a1 2003-11-23 devnull Blk*
2089 bc7cb1a1 2003-11-23 devnull copy(Blk *hptr, int size)
2090 bc7cb1a1 2003-11-23 devnull {
2091 bc7cb1a1 2003-11-23 devnull Blk *hdr;
2092 bc7cb1a1 2003-11-23 devnull unsigned sz;
2093 bc7cb1a1 2003-11-23 devnull char *ptr;
2094 bc7cb1a1 2003-11-23 devnull
2095 bc7cb1a1 2003-11-23 devnull all++;
2096 bc7cb1a1 2003-11-23 devnull lall++;
2097 bc7cb1a1 2003-11-23 devnull lcopy++;
2098 bc7cb1a1 2003-11-23 devnull nbytes += size;
2099 bc7cb1a1 2003-11-23 devnull lbytes += size;
2100 bc7cb1a1 2003-11-23 devnull if(size > longest)
2101 bc7cb1a1 2003-11-23 devnull longest = size;
2102 bc7cb1a1 2003-11-23 devnull if(size > maxsize)
2103 bc7cb1a1 2003-11-23 devnull maxsize = size;
2104 bc7cb1a1 2003-11-23 devnull sz = length(hptr);
2105 ab937b56 2008-12-06 rsc ptr = malloc(size);
2106 ab937b56 2008-12-06 rsc if(ptr == 0) {
2107 ab937b56 2008-12-06 rsc Bprint(&bout,"copy size %d\n",size);
2108 ab937b56 2008-12-06 rsc ospace("copy");
2109 bc7cb1a1 2003-11-23 devnull }
2110 ab937b56 2008-12-06 rsc memmove(ptr, hptr->beg, sz);
2111 ab937b56 2008-12-06 rsc memset(ptr+sz, 0, size-sz);
2112 bc7cb1a1 2003-11-23 devnull if((hdr = hfree) == 0)
2113 bc7cb1a1 2003-11-23 devnull hdr = morehd();
2114 bc7cb1a1 2003-11-23 devnull hfree = (Blk *)hdr->rd;
2115 bc7cb1a1 2003-11-23 devnull hdr->rd = hdr->beg = ptr;
2116 bc7cb1a1 2003-11-23 devnull hdr->last = ptr+size;
2117 bc7cb1a1 2003-11-23 devnull hdr->wt = ptr+sz;
2118 bc7cb1a1 2003-11-23 devnull ptr = hdr->wt;
2119 bc7cb1a1 2003-11-23 devnull while(ptr<hdr->last)
2120 bc7cb1a1 2003-11-23 devnull *ptr++ = '\0';
2121 bc7cb1a1 2003-11-23 devnull return(hdr);
2122 bc7cb1a1 2003-11-23 devnull }
2123 bc7cb1a1 2003-11-23 devnull
2124 bc7cb1a1 2003-11-23 devnull void
2125 bc7cb1a1 2003-11-23 devnull sdump(char *s1, Blk *hptr)
2126 bc7cb1a1 2003-11-23 devnull {
2127 bc7cb1a1 2003-11-23 devnull char *p;
2128 bc7cb1a1 2003-11-23 devnull
2129 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%s %lx rd %lx wt %lx beg %lx last %lx\n",
2130 bc7cb1a1 2003-11-23 devnull s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last);
2131 bc7cb1a1 2003-11-23 devnull p = hptr->beg;
2132 bc7cb1a1 2003-11-23 devnull while(p < hptr->wt)
2133 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"%d ",*p++);
2134 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"\n");
2135 bc7cb1a1 2003-11-23 devnull }
2136 bc7cb1a1 2003-11-23 devnull
2137 bc7cb1a1 2003-11-23 devnull void
2138 bc7cb1a1 2003-11-23 devnull seekc(Blk *hptr, int n)
2139 bc7cb1a1 2003-11-23 devnull {
2140 bc7cb1a1 2003-11-23 devnull char *nn,*p;
2141 bc7cb1a1 2003-11-23 devnull
2142 bc7cb1a1 2003-11-23 devnull nn = hptr->beg+n;
2143 bc7cb1a1 2003-11-23 devnull if(nn > hptr->last) {
2144 bc7cb1a1 2003-11-23 devnull nbytes += nn - hptr->last;
2145 bc7cb1a1 2003-11-23 devnull if(nbytes > maxsize)
2146 bc7cb1a1 2003-11-23 devnull maxsize = nbytes;
2147 bc7cb1a1 2003-11-23 devnull lbytes += nn - hptr->last;
2148 bc7cb1a1 2003-11-23 devnull if(n > longest)
2149 bc7cb1a1 2003-11-23 devnull longest = n;
2150 cbeb0b26 2006-04-01 devnull /* free(hptr->beg); */
2151 bc7cb1a1 2003-11-23 devnull p = realloc(hptr->beg, n);
2152 bc7cb1a1 2003-11-23 devnull if(p == 0) {
2153 bc7cb1a1 2003-11-23 devnull /* hptr->beg = realloc(hptr->beg, hptr->last-hptr->beg);
2154 bc7cb1a1 2003-11-23 devnull ** garbage("seekc");
2155 bc7cb1a1 2003-11-23 devnull ** if((p = realloc(hptr->beg, n)) == 0)
2156 bc7cb1a1 2003-11-23 devnull */ ospace("seekc");
2157 bc7cb1a1 2003-11-23 devnull }
2158 bc7cb1a1 2003-11-23 devnull hptr->beg = p;
2159 bc7cb1a1 2003-11-23 devnull hptr->wt = hptr->last = hptr->rd = p+n;
2160 bc7cb1a1 2003-11-23 devnull return;
2161 bc7cb1a1 2003-11-23 devnull }
2162 bc7cb1a1 2003-11-23 devnull hptr->rd = nn;
2163 bc7cb1a1 2003-11-23 devnull if(nn>hptr->wt)
2164 bc7cb1a1 2003-11-23 devnull hptr->wt = nn;
2165 bc7cb1a1 2003-11-23 devnull }
2166 bc7cb1a1 2003-11-23 devnull
2167 bc7cb1a1 2003-11-23 devnull void
2168 bc7cb1a1 2003-11-23 devnull salterwd(Blk *ahptr, Blk *n)
2169 bc7cb1a1 2003-11-23 devnull {
2170 bc7cb1a1 2003-11-23 devnull Wblk *hptr;
2171 bc7cb1a1 2003-11-23 devnull
2172 bc7cb1a1 2003-11-23 devnull hptr = (Wblk*)ahptr;
2173 bc7cb1a1 2003-11-23 devnull if(hptr->rdw == hptr->lastw)
2174 bc7cb1a1 2003-11-23 devnull more(ahptr);
2175 bc7cb1a1 2003-11-23 devnull *hptr->rdw++ = n;
2176 bc7cb1a1 2003-11-23 devnull if(hptr->rdw > hptr->wtw)
2177 bc7cb1a1 2003-11-23 devnull hptr->wtw = hptr->rdw;
2178 bc7cb1a1 2003-11-23 devnull }
2179 bc7cb1a1 2003-11-23 devnull
2180 bc7cb1a1 2003-11-23 devnull void
2181 bc7cb1a1 2003-11-23 devnull more(Blk *hptr)
2182 bc7cb1a1 2003-11-23 devnull {
2183 bc7cb1a1 2003-11-23 devnull unsigned size;
2184 bc7cb1a1 2003-11-23 devnull char *p;
2185 bc7cb1a1 2003-11-23 devnull
2186 bc7cb1a1 2003-11-23 devnull if((size=(hptr->last-hptr->beg)*2) == 0)
2187 bc7cb1a1 2003-11-23 devnull size=2;
2188 bc7cb1a1 2003-11-23 devnull nbytes += size/2;
2189 bc7cb1a1 2003-11-23 devnull if(nbytes > maxsize)
2190 bc7cb1a1 2003-11-23 devnull maxsize = nbytes;
2191 bc7cb1a1 2003-11-23 devnull if(size > longest)
2192 bc7cb1a1 2003-11-23 devnull longest = size;
2193 bc7cb1a1 2003-11-23 devnull lbytes += size/2;
2194 bc7cb1a1 2003-11-23 devnull lmore++;
2195 cbeb0b26 2006-04-01 devnull /* free(hptr->beg);*/
2196 bc7cb1a1 2003-11-23 devnull p = realloc(hptr->beg, size);
2197 bc7cb1a1 2003-11-23 devnull
2198 bc7cb1a1 2003-11-23 devnull if(p == 0) {
2199 bc7cb1a1 2003-11-23 devnull /* hptr->beg = realloc(hptr->beg, (hptr->last-hptr->beg));
2200 bc7cb1a1 2003-11-23 devnull ** garbage("more");
2201 bc7cb1a1 2003-11-23 devnull ** if((p = realloc(hptr->beg,size)) == 0)
2202 bc7cb1a1 2003-11-23 devnull */ ospace("more");
2203 bc7cb1a1 2003-11-23 devnull }
2204 bc7cb1a1 2003-11-23 devnull hptr->rd = p + (hptr->rd - hptr->beg);
2205 bc7cb1a1 2003-11-23 devnull hptr->wt = p + (hptr->wt - hptr->beg);
2206 bc7cb1a1 2003-11-23 devnull hptr->beg = p;
2207 bc7cb1a1 2003-11-23 devnull hptr->last = p+size;
2208 bc7cb1a1 2003-11-23 devnull }
2209 bc7cb1a1 2003-11-23 devnull
2210 bc7cb1a1 2003-11-23 devnull void
2211 bc7cb1a1 2003-11-23 devnull ospace(char *s)
2212 bc7cb1a1 2003-11-23 devnull {
2213 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"out of space: %s\n",s);
2214 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"all %ld rel %ld headmor %ld\n",all,rel,headmor);
2215 bc7cb1a1 2003-11-23 devnull Bprint(&bout,"nbytes %ld\n",nbytes);
2216 bc7cb1a1 2003-11-23 devnull sdump("stk",*stkptr);
2217 bc7cb1a1 2003-11-23 devnull abort();
2218 bc7cb1a1 2003-11-23 devnull }
2219 bc7cb1a1 2003-11-23 devnull
2220 bc7cb1a1 2003-11-23 devnull void
2221 bc7cb1a1 2003-11-23 devnull garbage(char *s)
2222 bc7cb1a1 2003-11-23 devnull {
2223 bc7cb1a1 2003-11-23 devnull USED(s);
2224 bc7cb1a1 2003-11-23 devnull }
2225 bc7cb1a1 2003-11-23 devnull
2226 bc7cb1a1 2003-11-23 devnull void
2227 bc7cb1a1 2003-11-23 devnull release(Blk *p)
2228 bc7cb1a1 2003-11-23 devnull {
2229 bc7cb1a1 2003-11-23 devnull rel++;
2230 bc7cb1a1 2003-11-23 devnull lrel++;
2231 bc7cb1a1 2003-11-23 devnull nbytes -= p->last - p->beg;
2232 bc7cb1a1 2003-11-23 devnull p->rd = (char*)hfree;
2233 bc7cb1a1 2003-11-23 devnull hfree = p;
2234 bc7cb1a1 2003-11-23 devnull free(p->beg);
2235 bc7cb1a1 2003-11-23 devnull }
2236 bc7cb1a1 2003-11-23 devnull
2237 bc7cb1a1 2003-11-23 devnull Blk*
2238 bc7cb1a1 2003-11-23 devnull dcgetwd(Blk *p)
2239 bc7cb1a1 2003-11-23 devnull {
2240 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2241 bc7cb1a1 2003-11-23 devnull
2242 bc7cb1a1 2003-11-23 devnull wp = (Wblk*)p;
2243 bc7cb1a1 2003-11-23 devnull if(wp->rdw == wp->wtw)
2244 bc7cb1a1 2003-11-23 devnull return(0);
2245 bc7cb1a1 2003-11-23 devnull return(*wp->rdw++);
2246 bc7cb1a1 2003-11-23 devnull }
2247 bc7cb1a1 2003-11-23 devnull
2248 bc7cb1a1 2003-11-23 devnull void
2249 bc7cb1a1 2003-11-23 devnull putwd(Blk *p, Blk *c)
2250 bc7cb1a1 2003-11-23 devnull {
2251 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2252 bc7cb1a1 2003-11-23 devnull
2253 bc7cb1a1 2003-11-23 devnull wp = (Wblk*)p;
2254 bc7cb1a1 2003-11-23 devnull if(wp->wtw == wp->lastw)
2255 bc7cb1a1 2003-11-23 devnull more(p);
2256 bc7cb1a1 2003-11-23 devnull *wp->wtw++ = c;
2257 bc7cb1a1 2003-11-23 devnull }
2258 bc7cb1a1 2003-11-23 devnull
2259 bc7cb1a1 2003-11-23 devnull Blk*
2260 bc7cb1a1 2003-11-23 devnull lookwd(Blk *p)
2261 bc7cb1a1 2003-11-23 devnull {
2262 bc7cb1a1 2003-11-23 devnull Wblk *wp;
2263 bc7cb1a1 2003-11-23 devnull
2264 bc7cb1a1 2003-11-23 devnull wp = (Wblk*)p;
2265 bc7cb1a1 2003-11-23 devnull if(wp->rdw == wp->wtw)
2266 bc7cb1a1 2003-11-23 devnull return(0);
2267 bc7cb1a1 2003-11-23 devnull return(*wp->rdw);
2268 bc7cb1a1 2003-11-23 devnull }
2269 bc7cb1a1 2003-11-23 devnull
2270 bc7cb1a1 2003-11-23 devnull int
2271 bc7cb1a1 2003-11-23 devnull getstk(void)
2272 bc7cb1a1 2003-11-23 devnull {
2273 bc7cb1a1 2003-11-23 devnull int n;
2274 bc7cb1a1 2003-11-23 devnull uchar c;
2275 bc7cb1a1 2003-11-23 devnull
2276 bc7cb1a1 2003-11-23 devnull c = readc();
2277 bc7cb1a1 2003-11-23 devnull if(c != '<')
2278 bc7cb1a1 2003-11-23 devnull return c;
2279 bc7cb1a1 2003-11-23 devnull n = 0;
2280 bc7cb1a1 2003-11-23 devnull while(1) {
2281 bc7cb1a1 2003-11-23 devnull c = readc();
2282 bc7cb1a1 2003-11-23 devnull if(c == '>')
2283 bc7cb1a1 2003-11-23 devnull break;
2284 bc7cb1a1 2003-11-23 devnull n = n*10+c-'0';
2285 bc7cb1a1 2003-11-23 devnull }
2286 bc7cb1a1 2003-11-23 devnull return n;
2287 bc7cb1a1 2003-11-23 devnull }