Research V7 development
[unix-history] / usr / src / cmd / dc / dc.c
CommitLineData
de0fee78
LC
1#include <stdio.h>
2#include <signal.h>
3#include "dc.h"
4main(argc,argv)
5int argc;
6char *argv[];
7{
8 init(argc,argv);
9 commnds();
10}
11commnds(){
12 register int c;
13 register struct blk *p,*q;
14 long l;
15 int sign;
16 struct blk **ptr,*s,*t;
17 struct sym *sp;
18 int sk,sk1,sk2;
19 int n,d;
20
21 while(1){
22 if(((c = readc())>='0' && c <= '9')|| (c>='A' && c <='F') || c == '.'){
23 unreadc(c);
24 p = readin();
25 pushp(p);
26 continue;
27 }
28 switch(c){
29 case ' ':
30 case '\n':
31 case 0377:
32 case EOF:
33 continue;
34 case 'Y':
35 sdump("stk",*stkptr);
36 printf("all %ld rel %ld headmor %ld\n",all,rel,headmor);
37 printf("nbytes %ld\n",nbytes);
38 continue;
39 case '_':
40 p = readin();
41 savk = sunputc(p);
42 chsign(p);
43 sputc(p,savk);
44 pushp(p);
45 continue;
46 case '-':
47 subt();
48 continue;
49 case '+':
50 if(eqk() != 0)continue;
51 binop('+');
52 continue;
53 case '*':
54 arg1 = pop();
55 EMPTY;
56 arg2 = pop();
57 EMPTYR(arg1);
58 sk1 = sunputc(arg1);
59 sk2 = sunputc(arg2);
60 binop('*');
61 p = pop();
62 sunputc(p);
63 savk = sk1+sk2;
64 if(savk>k && savk>sk1 && savk>sk2){
65 sk = sk1;
66 if(sk<sk2)sk = sk2;
67 if(sk<k)sk = k;
68 p = removc(p,savk-sk);
69 savk = sk;
70 }
71 sputc(p,savk);
72 pushp(p);
73 continue;
74 case '/':
75casediv:
76 if(dscale() != 0)continue;
77 binop('/');
78 if(irem != 0)release(irem);
79 release(rem);
80 continue;
81 case '%':
82 if(dscale() != 0)continue;
83 binop('/');
84 p = pop();
85 release(p);
86 if(irem == 0){
87 sputc(rem,skr+k);
88 pushp(rem);
89 continue;
90 }
91 p = add0(rem,skd-(skr+k));
92 q = add(p,irem);
93 release(p);
94 release(irem);
95 sputc(q,skd);
96 pushp(q);
97 continue;
98 case 'v':
99 p = pop();
100 EMPTY;
101 savk = sunputc(p);
102 if(length(p) == 0){
103 sputc(p,savk);
104 pushp(p);
105 continue;
106 }
107 if((c = sbackc(p))<0){
108 error("sqrt of neg number\n");
109 }
110 if(k<savk)n = savk;
111 else{
112 n = k*2-savk;
113 savk = k;
114 }
115 arg1 = add0(p,n);
116 arg2 = sqrt(arg1);
117 sputc(arg2,savk);
118 pushp(arg2);
119 continue;
120 case '^':
121 neg = 0;
122 arg1 = pop();
123 EMPTY;
124 if(sunputc(arg1) != 0)error("exp not an integer\n");
125 arg2 = pop();
126 EMPTYR(arg1);
127 if(sfbeg(arg1) == 0 && sbackc(arg1)<0){
128 neg++;
129 chsign(arg1);
130 }
131 if(length(arg1)>=3){
132 error("exp too big\n");
133 }
134 savk = sunputc(arg2);
135 p = exp(arg2,arg1);
136 release(arg2);
137 rewind(arg1);
138 c = sgetc(arg1);
139 if(sfeof(arg1) == 0)
140 c = sgetc(arg1)*100 + c;
141 d = c*savk;
142 release(arg1);
143 if(neg == 0){
144 if(k>=savk)n = k;
145 else n = savk;
146 if(n<d){
147 q = removc(p,d-n);
148 sputc(q,n);
149 pushp(q);
150 }
151 else {
152 sputc(p,d);
153 pushp(p);
154 }
155 }
156 else {
157 sputc(p,d);
158 pushp(p);
159 }
160 if(neg == 0)continue;
161 p = pop();
162 q = salloc(2);
163 sputc(q,1);
164 sputc(q,0);
165 pushp(q);
166 pushp(p);
167 goto casediv;
168 case 'z':
169 p = salloc(2);
170 n = stkptr - stkbeg;
171 if(n >= 100){
172 sputc(p,n/100);
173 n %= 100;
174 }
175 sputc(p,n);
176 sputc(p,0);
177 pushp(p);
178 continue;
179 case 'Z':
180 p = pop();
181 EMPTY;
182 n = (length(p)-1)<<1;
183 fsfile(p);
184 sbackc(p);
185 if(sfbeg(p) == 0){
186 if((c = sbackc(p))<0){
187 n -= 2;
188 if(sfbeg(p) == 1)n += 1;
189 else {
190 if((c = sbackc(p)) == 0)n += 1;
191 else if(c > 90)n -= 1;
192 }
193 }
194 else if(c < 10) n -= 1;
195 }
196 release(p);
197 q = salloc(1);
198 if(n >= 100){
199 sputc(q,n%100);
200 n /= 100;
201 }
202 sputc(q,n);
203 sputc(q,0);
204 pushp(q);
205 continue;
206 case 'i':
207 p = pop();
208 EMPTY;
209 p = scalint(p);
210 release(inbas);
211 inbas = p;
212 continue;
213 case 'I':
214 p = copy(inbas,length(inbas)+1);
215 sputc(p,0);
216 pushp(p);
217 continue;
218 case 'o':
219 p = pop();
220 EMPTY;
221 p = scalint(p);
222 sign = 0;
223 n = length(p);
224 q = copy(p,n);
225 fsfile(q);
226 l = c = sbackc(q);
227 if(n != 1){
228 if(c<0){
229 sign = 1;
230 chsign(q);
231 n = length(q);
232 fsfile(q);
233 l = c = sbackc(q);
234 }
235 if(n != 1){
236 while(sfbeg(q) == 0)l = l*100+sbackc(q);
237 }
238 }
239 logo = log2(l);
240 obase = l;
241 release(basptr);
242 if(sign == 1)obase = -l;
243 basptr = p;
244 outdit = bigot;
245 if(n == 1 && sign == 0){
246 if(c <= 16){
247 outdit = hexot;
248 fw = 1;
249 fw1 = 0;
250 ll = 70;
251 release(q);
252 continue;
253 }
254 }
255 n = 0;
256 if(sign == 1)n++;
257 p = salloc(1);
258 sputc(p,-1);
259 t = add(p,q);
260 n += length(t)*2;
261 fsfile(t);
262 if((c = sbackc(t))>9)n++;
263 release(t);
264 release(q);
265 release(p);
266 fw = n;
267 fw1 = n-1;
268 ll = 70;
269 if(fw>=ll)continue;
270 ll = (70/fw)*fw;
271 continue;
272 case 'O':
273 p = copy(basptr,length(basptr)+1);
274 sputc(p,0);
275 pushp(p);
276 continue;
277 case '[':
278 n = 0;
279 p = salloc(0);
280 while(1){
281 if((c = readc()) == ']'){
282 if(n == 0)break;
283 n--;
284 }
285 sputc(p,c);
286 if(c == '[')n++;
287 }
288 pushp(p);
289 continue;
290 case 'k':
291 p = pop();
292 EMPTY;
293 p = scalint(p);
294 if(length(p)>1){
295 error("scale too big\n");
296 }
297 rewind(p);
298 k = sfeof(p)?0:sgetc(p);
299 release(scalptr);
300 scalptr = p;
301 continue;
302 case 'K':
303 p = copy(scalptr,length(scalptr)+1);
304 sputc(p,0);
305 pushp(p);
306 continue;
307 case 'X':
308 p = pop();
309 EMPTY;
310 fsfile(p);
311 n = sbackc(p);
312 release(p);
313 p = salloc(2);
314 sputc(p,n);
315 sputc(p,0);
316 pushp(p);
317 continue;
318 case 'Q':
319 p = pop();
320 EMPTY;
321 if(length(p)>2){
322 error("Q?\n");
323 }
324 rewind(p);
325 if((c = sgetc(p))<0){
326 error("neg Q\n");
327 }
328 release(p);
329 while(c-- > 0){
330 if(readptr == &readstk[0]){
331 error("readstk?\n");
332 }
333 if(*readptr != 0)release(*readptr);
334 readptr--;
335 }
336 continue;
337 case 'q':
338 if(readptr <= &readstk[1])exit(0);
339 if(*readptr != 0)release(*readptr);
340 readptr--;
341 if(*readptr != 0)release(*readptr);
342 readptr--;
343 continue;
344 case 'f':
345 if(stkptr == &stack[0])printf("empty stack\n");
346 else {
347 for(ptr = stkptr; ptr > &stack[0];){
348 print(*ptr--);
349 }
350 }
351 continue;
352 case 'p':
353 if(stkptr == &stack[0])printf("empty stack\n");
354 else{
355 print(*stkptr);
356 }
357 continue;
358 case 'P':
359 p = pop();
360 EMPTY;
361 sputc(p,0);
362 printf("%s",p->beg);
363 release(p);
364 continue;
365 case 'd':
366 if(stkptr == &stack[0]){
367 printf("empty stack\n");
368 continue;
369 }
370 q = *stkptr;
371 n = length(q);
372 p = copy(*stkptr,n);
373 pushp(p);
374 continue;
375 case 'c':
376 while(stkerr == 0){
377 p = pop();
378 if(stkerr == 0)release(p);
379 }
380 continue;
381 case 'S':
382 if(stkptr == &stack[0]){
383 error("save: args\n");
384 }
385 c = readc() & 0377;
386 sptr = stable[c];
387 sp = stable[c] = sfree;
388 sfree = sfree->next;
389 if(sfree == 0)goto sempty;
390 sp->next = sptr;
391 p = pop();
392 EMPTY;
393 if(c >= ARRAYST){
394 q = copy(p,PTRSZ);
395 for(n = 0;n < PTRSZ-1;n++)sputc(q,0);
396 release(p);
397 p = q;
398 }
399 sp->val = p;
400 continue;
401sempty:
402 error("symbol table overflow\n");
403 case 's':
404 if(stkptr == &stack[0]){
405 error("save:args\n");
406 }
407 c = readc() & 0377;
408 sptr = stable[c];
409 if(sptr != 0){
410 p = sptr->val;
411 if(c >= ARRAYST){
412 rewind(p);
413 while(sfeof(p) == 0)release(getwd(p));
414 }
415 release(p);
416 }
417 else{
418 sptr = stable[c] = sfree;
419 sfree = sfree->next;
420 if(sfree == 0)goto sempty;
421 sptr->next = 0;
422 }
423 p = pop();
424 sptr->val = p;
425 continue;
426 case 'l':
427 load();
428 continue;
429 case 'L':
430 c = readc() & 0377;
431 sptr = stable[c];
432 if(sptr == 0){
433 error("L?\n");
434 }
435 stable[c] = sptr->next;
436 sptr->next = sfree;
437 sfree = sptr;
438 p = sptr->val;
439 if(c >= ARRAYST){
440 rewind(p);
441 while(sfeof(p) == 0){
442 q = getwd(p);
443 if(q != 0)release(q);
444 }
445 }
446 pushp(p);
447 continue;
448 case ':':
449 p = pop();
450 EMPTY;
451 q = scalint(p);
452 fsfile(q);
453 c = 0;
454 if((sfbeg(q) == 0) && ((c = sbackc(q))<0)){
455 error("neg index\n");
456 }
457 if(length(q)>2){
458 error("index too big\n");
459 }
460 if(sfbeg(q) == 0)c = c*100+sbackc(q);
461 if(c >= MAXIND){
462 error("index too big\n");
463 }
464 release(q);
465 n = readc() & 0377;
466 sptr = stable[n];
467 if(sptr == 0){
468 sptr = stable[n] = sfree;
469 sfree = sfree->next;
470 if(sfree == 0)goto sempty;
471 sptr->next = 0;
472 p = salloc((c+PTRSZ)*PTRSZ);
473 zero(p);
474 }
475 else{
476 p = sptr->val;
477 if(length(p)-PTRSZ < c*PTRSZ){
478 q = copy(p,(c+PTRSZ)*PTRSZ);
479 release(p);
480 p = q;
481 }
482 }
483 seekc(p,c*PTRSZ);
484 q = lookwd(p);
485 if (q!=NULL) release(q);
486 s = pop();
487 EMPTY;
488 salterwd(p,s);
489 sptr->val = p;
490 continue;
491 case ';':
492 p = pop();
493 EMPTY;
494 q = scalint(p);
495 fsfile(q);
496 c = 0;
497 if((sfbeg(q) == 0) && ((c = sbackc(q))<0)){
498 error("neg index\n");
499 }
500 if(length(q)>2){
501 error("index too big\n");
502 }
503 if(sfbeg(q) == 0)c = c*100+sbackc(q);
504 if(c >= MAXIND){
505 error("index too big\n");
506 }
507 release(q);
508 n = readc() & 0377;
509 sptr = stable[n];
510 if(sptr != 0){
511 p = sptr->val;
512 if(length(p)-PTRSZ >= c*PTRSZ){
513 seekc(p,c*PTRSZ);
514 s = getwd(p);
515 if(s != 0){
516 q = copy(s,length(s));
517 pushp(q);
518 continue;
519 }
520 }
521 }
522 q = salloc(PTRSZ);
523 putwd(q, (struct blk *)0);
524 pushp(q);
525 continue;
526 case 'x':
527execute:
528 p = pop();
529 EMPTY;
530 if((readptr != &readstk[0]) && (*readptr != 0)){
531 if((*readptr)->rd == (*readptr)->wt)
532 release(*readptr);
533 else{
534 if(readptr++ == &readstk[RDSKSZ]){
535 error("nesting depth\n");
536 }
537 }
538 }
539 else readptr++;
540 *readptr = p;
541 if(p != 0)rewind(p);
542 else{
543 if((c = readc()) != '\n')unreadc(c);
544 }
545 continue;
546 case '?':
547 if(++readptr == &readstk[RDSKSZ]){
548 error("nesting depth\n");
549 }
550 *readptr = 0;
551 fsave = curfile;
552 curfile = stdin;
553 while((c = readc()) == '!')command();
554 p = salloc(0);
555 sputc(p,c);
556 while((c = readc()) != '\n'){
557 sputc(p,c);
558 if(c == '\\')sputc(p,readc());
559 }
560 curfile = fsave;
561 *readptr = p;
562 continue;
563 case '!':
564 if(command() == 1)goto execute;
565 continue;
566 case '<':
567 case '>':
568 case '=':
569 if(cond(c) == 1)goto execute;
570 continue;
571 default:
572 printf("%o is unimplemented\n",c);
573 }
574 }
575}
576struct blk *
577div(ddivd,ddivr)
578struct blk *ddivd,*ddivr;
579{
580 int divsign,remsign,offset,divcarry;
581 int carry, dig,magic,d,dd;
582 long c,td,cc;
583 struct blk *ps;
584 register struct blk *p,*divd,*divr;
585
586 rem = 0;
587 p = salloc(0);
588 if(length(ddivr) == 0){
589 pushp(ddivr);
590 errorrt("divide by 0\n");
591 }
592 divsign = remsign = 0;
593 divr = ddivr;
594 fsfile(divr);
595 if(sbackc(divr) == -1){
596 divr = copy(ddivr,length(ddivr));
597 chsign(divr);
598 divsign = ~divsign;
599 }
600 divd = copy(ddivd,length(ddivd));
601 fsfile(divd);
602 if(sfbeg(divd) == 0 && sbackc(divd) == -1){
603 chsign(divd);
604 divsign = ~divsign;
605 remsign = ~remsign;
606 }
607 offset = length(divd) - length(divr);
608 if(offset < 0)goto ddone;
609 seekc(p,offset+1);
610 sputc(divd,0);
611 magic = 0;
612 fsfile(divr);
613 c = sbackc(divr);
614 if(c<10)magic++;
615 c = c*100 + (sfbeg(divr)?0:sbackc(divr));
616 if(magic>0){
617 c = (c*100 +(sfbeg(divr)?0:sbackc(divr)))*2;
618 c /= 25;
619 }
620 while(offset >= 0){
621 fsfile(divd);
622 td = sbackc(divd)*100;
623 dd = sfbeg(divd)?0:sbackc(divd);
624 td = (td+dd)*100;
625 dd = sfbeg(divd)?0:sbackc(divd);
626 td = td+dd;
627 cc = c;
628 if(offset == 0)td += 1;
629 else cc += 1;
630 if(magic != 0)td = td<<3;
631 dig = td/cc;
632 rewind(divr);
633 rewind(divxyz);
634 carry = 0;
635 while(sfeof(divr) == 0){
636 d = sgetc(divr)*dig+carry;
637 carry = d / 100;
638 salterc(divxyz,d%100);
639 }
640 salterc(divxyz,carry);
641 rewind(divxyz);
642 seekc(divd,offset);
643 carry = 0;
644 while(sfeof(divd) == 0){
645 d = slookc(divd);
646 d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry;
647 carry = 0;
648 if(d < 0){
649 d += 100;
650 carry = 1;
651 }
652 salterc(divd,d);
653 }
654 divcarry = carry;
655 sbackc(p);
656 salterc(p,dig);
657 sbackc(p);
658 if(--offset >= 0)divd->wt--;
659 }
660 if(divcarry != 0){
661 salterc(p,dig-1);
662 salterc(divd,-1);
663 ps = add(divr,divd);
664 release(divd);
665 divd = ps;
666 }
667
668 rewind(p);
669 divcarry = 0;
670 while(sfeof(p) == 0){
671 d = slookc(p)+divcarry;
672 divcarry = 0;
673 if(d >= 100){
674 d -= 100;
675 divcarry = 1;
676 }
677 salterc(p,d);
678 }
679 if(divcarry != 0)salterc(p,divcarry);
680 fsfile(p);
681 while(sfbeg(p) == 0){
682 if(sbackc(p) == 0)truncate(p);
683 else break;
684 }
685 if(divsign < 0)chsign(p);
686 fsfile(divd);
687 while(sfbeg(divd) == 0){
688 if(sbackc(divd) == 0)truncate(divd);
689 else break;
690 }
691ddone:
692 if(remsign<0)chsign(divd);
693 if(divr != ddivr)release(divr);
694 rem = divd;
695 return(p);
696}
697dscale(){
698 register struct blk *dd,*dr;
699 register struct blk *r;
700 int c;
701
702 dr = pop();
703 EMPTYS;
704 dd = pop();
705 EMPTYSR(dr);
706 fsfile(dd);
707 skd = sunputc(dd);
708 fsfile(dr);
709 skr = sunputc(dr);
710 if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)){
711 sputc(dr,skr);
712 pushp(dr);
713 errorrt("divide by 0\n");
714 }
715 c = k-skd+skr;
716 if(c < 0)r = removr(dd,-c);
717 else {
718 r = add0(dd,c);
719 irem = 0;
720 }
721 arg1 = r;
722 arg2 = dr;
723 savk = k;
724 return(0);
725}
726struct blk *
727removr(p,n)
728struct blk *p;
729{
730 int nn;
731 register struct blk *q,*s,*r;
732
733 rewind(p);
734 nn = (n+1)/2;
735 q = salloc(nn);
736 while(n>1){
737 sputc(q,sgetc(p));
738 n -= 2;
739 }
740 r = salloc(2);
741 while(sfeof(p) == 0)sputc(r,sgetc(p));
742 release(p);
743 if(n == 1){
744 s = div(r,tenptr);
745 release(r);
746 rewind(rem);
747 if(sfeof(rem) == 0)sputc(q,sgetc(rem));
748 release(rem);
749 irem = q;
750 return(s);
751 }
752 irem = q;
753 return(r);
754}
755struct blk *
756sqrt(p)
757struct blk *p;
758{
759 struct blk *t;
760 struct blk *r,*q,*s;
761 int c,n,nn;
762
763 n = length(p);
764 fsfile(p);
765 c = sbackc(p);
766 if((n&1) != 1)c = c*100+(sfbeg(p)?0:sbackc(p));
767 n = (n+1)>>1;
768 r = salloc(n);
769 zero(r);
770 seekc(r,n);
771 nn=1;
772 while((c -= nn)>=0)nn+=2;
773 c=(nn+1)>>1;
774 fsfile(r);
775 sbackc(r);
776 if(c>=100){
777 c -= 100;
778 salterc(r,c);
779 sputc(r,1);
780 }
781 else salterc(r,c);
782 while(1){
783 q = div(p,r);
784 s = add(q,r);
785 release(q);
786 release(rem);
787 q = div(s,sqtemp);
788 release(s);
789 release(rem);
790 s = copy(r,length(r));
791 chsign(s);
792 t = add(s,q);
793 release(s);
794 fsfile(t);
795 nn = sfbeg(t)?0:sbackc(t);
796 if(nn>=0)break;
797 release(r);
798 release(t);
799 r = q;
800 }
801 release(t);
802 release(q);
803 release(p);
804 return(r);
805}
806struct blk *
807exp(base,ex)
808struct blk *base,*ex;
809{
810 register struct blk *r,*e,*p;
811 struct blk *e1,*t,*cp;
812 int temp,c,n;
813 r = salloc(1);
814 sputc(r,1);
815 p = copy(base,length(base));
816 e = copy(ex,length(ex));
817 fsfile(e);
818 if(sfbeg(e) != 0)goto edone;
819 temp=0;
820 c = sbackc(e);
821 if(c<0){
822 temp++;
823 chsign(e);
824 }
825 while(length(e) != 0){
826 e1=div(e,sqtemp);
827 release(e);
828 e = e1;
829 n = length(rem);
830 release(rem);
831 if(n != 0){
832 e1=mult(p,r);
833 release(r);
834 r = e1;
835 }
836 t = copy(p,length(p));
837 cp = mult(p,t);
838 release(p);
839 release(t);
840 p = cp;
841 }
842 if(temp != 0){
843 if((c = length(base)) == 0){
844 goto edone;
845 }
846 if(c>1)create(r);
847 else{
848 rewind(base);
849 if((c = sgetc(base))<=1){
850 create(r);
851 sputc(r,c);
852 }
853 else create(r);
854 }
855 }
856edone:
857 release(p);
858 release(e);
859 return(r);
860}
861init(argc,argv)
862int argc;
863char *argv[];
864{
865 register struct sym *sp;
866
867 if (signal(SIGINT, SIG_IGN) != SIG_IGN)
868 signal(SIGINT,onintr);
869 setbuf(stdout,(char *)NULL);
870 svargc = --argc;
871 svargv = argv;
872 while(svargc>0 && svargv[1][0] == '-'){
873 switch(svargv[1][1]){
874 default:
875 dbg=1;
876 }
877 svargc--;
878 svargv++;
879 }
880 ifile=1;
881 if(svargc<=0)curfile = stdin;
882 else if((curfile = fopen(svargv[1],"r")) == NULL){
883 printf("can't open file %s\n",svargv[1]);
884 exit(1);
885 }
886 dummy = malloc(1);
887 scalptr = salloc(1);
888 sputc(scalptr,0);
889 basptr = salloc(1);
890 sputc(basptr,10);
891 obase=10;
892 log10=log2(10L);
893 ll=70;
894 fw=1;
895 fw1=0;
896 tenptr = salloc(1);
897 sputc(tenptr,10);
898 obase=10;
899 inbas = salloc(1);
900 sputc(inbas,10);
901 sqtemp = salloc(1);
902 sputc(sqtemp,2);
903 chptr = salloc(0);
904 strptr = salloc(0);
905 divxyz = salloc(0);
906 stkbeg = stkptr = &stack[0];
907 stkend = &stack[STKSZ];
908 stkerr = 0;
909 readptr = &readstk[0];
910 k=0;
911 sp = sptr = &symlst[0];
912 while(sptr < &symlst[TBLSZ]){
913 sptr->next = ++sp;
914 sptr++;
915 }
916 sptr->next=0;
917 sfree = &symlst[0];
918 return;
919}
920onintr(){
921
922 signal(SIGINT,onintr);
923 while(readptr != &readstk[0]){
924 if(*readptr != 0){release(*readptr);}
925 readptr--;
926 }
927 curfile = stdin;
928 commnds();
929}
930pushp(p)
931struct blk *p;
932{
933 if(stkptr == stkend){
934 printf("out of stack space\n");
935 return;
936 }
937 stkerr=0;
938 *++stkptr = p;
939 return;
940}
941struct blk *
942pop(){
943 if(stkptr == stack){
944 stkerr=1;
945 return(0);
946 }
947 return(*stkptr--);
948}
949struct blk *
950readin(){
951 register struct blk *p,*q;
952 int dp,dpct;
953 register int c;
954
955 dp = dpct=0;
956 p = salloc(0);
957 while(1){
958 c = readc();
959 switch(c){
960 case '.':
961 if(dp != 0){
962 unreadc(c);
963 break;
964 }
965 dp++;
966 continue;
967 case '\\':
968 readc();
969 continue;
970 default:
971 if(c >= 'A' && c <= 'F')c = c - 'A' + 10;
972 else if(c >= '0' && c <= '9')c -= '0';
973 else goto gotnum;
974 if(dp != 0){
975 if(dpct >= 99)continue;
976 dpct++;
977 }
978 create(chptr);
979 if(c != 0)sputc(chptr,c);
980 q = mult(p,inbas);
981 release(p);
982 p = add(chptr,q);
983 release(q);
984 }
985 }
986gotnum:
987 unreadc(c);
988 if(dp == 0){
989 sputc(p,0);
990 return(p);
991 }
992 else{
993 q = scale(p,dpct);
994 return(q);
995 }
996}
997struct blk *
998add0(p,ct)
999int ct;
1000struct blk *p;
1001{
1002 /* returns pointer to struct with ct 0's & p */
1003 register struct blk *q,*t;
1004
1005 q = salloc(length(p)+(ct+1)/2);
1006 while(ct>1){
1007 sputc(q,0);
1008 ct -= 2;
1009 }
1010 rewind(p);
1011 while(sfeof(p) == 0){
1012 sputc(q,sgetc(p));
1013 }
1014 release(p);
1015 if(ct == 1){
1016 t = mult(tenptr,q);
1017 release(q);
1018 return(t);
1019 }
1020 return(q);
1021}
1022struct blk *
1023mult(p,q)
1024struct blk *p,*q;
1025{
1026 register struct blk *mp,*mq,*mr;
1027 int sign,offset,carry;
1028 int cq,cp,mt,mcr;
1029
1030 offset = sign = 0;
1031 fsfile(p);
1032 mp = p;
1033 if(sfbeg(p) == 0){
1034 if(sbackc(p)<0){
1035 mp = copy(p,length(p));
1036 chsign(mp);
1037 sign = ~sign;
1038 }
1039 }
1040 fsfile(q);
1041 mq = q;
1042 if(sfbeg(q) == 0){
1043 if(sbackc(q)<0){
1044 mq = copy(q,length(q));
1045 chsign(mq);
1046 sign = ~sign;
1047 }
1048 }
1049 mr = salloc(length(mp)+length(mq));
1050 zero(mr);
1051 rewind(mq);
1052 while(sfeof(mq) == 0){
1053 cq = sgetc(mq);
1054 rewind(mp);
1055 rewind(mr);
1056 mr->rd += offset;
1057 carry=0;
1058 while(sfeof(mp) == 0){
1059 cp = sgetc(mp);
1060 mcr = sfeof(mr)?0:slookc(mr);
1061 mt = cp*cq + carry + mcr;
1062 carry = mt/100;
1063 salterc(mr,mt%100);
1064 }
1065 offset++;
1066 if(carry != 0){
1067 mcr = sfeof(mr)?0:slookc(mr);
1068 salterc(mr,mcr+carry);
1069 }
1070 }
1071 if(sign < 0){
1072 chsign(mr);
1073 }
1074 if(mp != p)release(mp);
1075 if(mq != q)release(mq);
1076 return(mr);
1077}
1078chsign(p)
1079struct blk *p;
1080{
1081 register int carry;
1082 register char ct;
1083
1084 carry=0;
1085 rewind(p);
1086 while(sfeof(p) == 0){
1087 ct=100-slookc(p)-carry;
1088 carry=1;
1089 if(ct>=100){
1090 ct -= 100;
1091 carry=0;
1092 }
1093 salterc(p,ct);
1094 }
1095 if(carry != 0){
1096 sputc(p,-1);
1097 fsfile(p);
1098 sbackc(p);
1099 ct = sbackc(p);
1100 if(ct == 99){
1101 truncate(p);
1102 sputc(p,-1);
1103 }
1104 }
1105 else{
1106 fsfile(p);
1107 ct = sbackc(p);
1108 if(ct == 0)truncate(p);
1109 }
1110 return;
1111}
1112readc(){
1113loop:
1114 if((readptr != &readstk[0]) && (*readptr != 0)){
1115 if(sfeof(*readptr) == 0)return(lastchar = sgetc(*readptr));
1116 release(*readptr);
1117 readptr--;
1118 goto loop;
1119 }
1120 lastchar = getc(curfile);
1121 if(lastchar != EOF)return(lastchar);
1122 if(readptr != &readptr[0]){
1123 readptr--;
1124 if(*readptr == 0)curfile = stdin;
1125 goto loop;
1126 }
1127 if(curfile != stdin){
1128 fclose(curfile);
1129 curfile = stdin;
1130 goto loop;
1131 }
1132 exit(0);
1133}
1134unreadc(c)
1135char c;
1136{
1137
1138 if((readptr != &readstk[0]) && (*readptr != 0)){
1139 sungetc(*readptr,c);
1140 }
1141 else ungetc(c,curfile);
1142 return;
1143}
1144binop(c)
1145char c;
1146{
1147 register struct blk *r;
1148
1149 switch(c){
1150 case '+':
1151 r = add(arg1,arg2);
1152 break;
1153 case '*':
1154 r = mult(arg1,arg2);
1155 break;
1156 case '/':
1157 r = div(arg1,arg2);
1158 break;
1159 }
1160 release(arg1);
1161 release(arg2);
1162 sputc(r,savk);
1163 pushp(r);
1164 return;
1165}
1166print(hptr)
1167struct blk *hptr;
1168{
1169 int sc;
1170 register struct blk *p,*q,*dec;
1171 int dig,dout,ct;
1172
1173 rewind(hptr);
1174 while(sfeof(hptr) == 0){
1175 if(sgetc(hptr)>99){
1176 rewind(hptr);
1177 while(sfeof(hptr) == 0){
1178 printf("%c",sgetc(hptr));
1179 }
1180 printf("\n");
1181 return;
1182 }
1183 }
1184 fsfile(hptr);
1185 sc = sbackc(hptr);
1186 if(sfbeg(hptr) != 0){
1187 printf("0\n");
1188 return;
1189 }
1190 count = ll;
1191 p = copy(hptr,length(hptr));
1192 sunputc(p);
1193 fsfile(p);
1194 if(sbackc(p)<0){
1195 chsign(p);
1196 OUTC('-');
1197 }
1198 if((obase == 0) || (obase == -1)){
1199 oneot(p,sc,'d');
1200 return;
1201 }
1202 if(obase == 1){
1203 oneot(p,sc,'1');
1204 return;
1205 }
1206 if(obase == 10){
1207 tenot(p,sc);
1208 return;
1209 }
1210 create(strptr);
1211 dig = log10*sc;
1212 dout = ((dig/10) + dig) /logo;
1213 dec = getdec(p,sc);
1214 p = removc(p,sc);
1215 while(length(p) != 0){
1216 q = div(p,basptr);
1217 release(p);
1218 p = q;
1219 (*outdit)(rem,0);
1220 }
1221 release(p);
1222 fsfile(strptr);
1223 while(sfbeg(strptr) == 0)OUTC(sbackc(strptr));
1224 if(sc == 0){
1225 release(dec);
1226 printf("\n");
1227 return;
1228 }
1229 create(strptr);
1230 OUTC('.');
1231 ct=0;
1232 do{
1233 q = mult(basptr,dec);
1234 release(dec);
1235 dec = getdec(q,sc);
1236 p = removc(q,sc);
1237 (*outdit)(p,1);
1238 }while(++ct < dout);
1239 release(dec);
1240 rewind(strptr);
1241 while(sfeof(strptr) == 0)OUTC(sgetc(strptr));
1242 printf("\n");
1243 return;
1244}
1245
1246struct blk *
1247getdec(p,sc)
1248struct blk *p;
1249{
1250 int cc;
1251 register struct blk *q,*t,*s;
1252
1253 rewind(p);
1254 if(length(p)*2 < sc){
1255 q = copy(p,length(p));
1256 return(q);
1257 }
1258 q = salloc(length(p));
1259 while(sc >= 1){
1260 sputc(q,sgetc(p));
1261 sc -= 2;
1262 }
1263 if(sc != 0){
1264 t = mult(q,tenptr);
1265 s = salloc(cc = length(q));
1266 release(q);
1267 rewind(t);
1268 while(cc-- > 0)sputc(s,sgetc(t));
1269 sputc(s,0);
1270 release(t);
1271 t = div(s,tenptr);
1272 release(s);
1273 release(rem);
1274 return(t);
1275 }
1276 return(q);
1277}
1278tenot(p,sc)
1279struct blk *p;
1280{
1281 register int c,f;
1282
1283 fsfile(p);
1284 f=0;
1285 while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)){
1286 c = sbackc(p);
1287 if((c<10) && (f == 1))printf("0%d",c);
1288 else printf("%d",c);
1289 f=1;
1290 TEST2;
1291 }
1292 if(sc == 0){
1293 printf("\n");
1294 release(p);
1295 return;
1296 }
1297 if((p->rd-p->beg)*2 > sc){
1298 c = sbackc(p);
1299 printf("%d.",c/10);
1300 TEST2;
1301 OUTC(c%10 +'0');
1302 sc--;
1303 }
1304 else {
1305 OUTC('.');
1306 }
1307 if(sc > (p->rd-p->beg)*2){
1308 while(sc>(p->rd-p->beg)*2){
1309 OUTC('0');
1310 sc--;
1311 }
1312 }
1313 while(sc > 1){
1314 c = sbackc(p);
1315 if(c<10)printf("0%d",c);
1316 else printf("%d",c);
1317 sc -= 2;
1318 TEST2;
1319 }
1320 if(sc == 1){
1321 OUTC(sbackc(p)/10 +'0');
1322 }
1323 printf("\n");
1324 release(p);
1325 return;
1326}
1327oneot(p,sc,ch)
1328struct blk *p;
1329char ch;
1330{
1331 register struct blk *q;
1332
1333 q = removc(p,sc);
1334 create(strptr);
1335 sputc(strptr,-1);
1336 while(length(q)>0){
1337 p = add(strptr,q);
1338 release(q);
1339 q = p;
1340 OUTC(ch);
1341 }
1342 release(q);
1343 printf("\n");
1344 return;
1345}
1346hexot(p,flg)
1347struct blk *p;
1348{
1349 register int c;
1350 rewind(p);
1351 if(sfeof(p) != 0){
1352 sputc(strptr,'0');
1353 release(p);
1354 return;
1355 }
1356 c = sgetc(p);
1357 release(p);
1358 if(c >= 16){
1359 printf("hex digit > 16");
1360 return;
1361 }
1362 sputc(strptr,c<10?c+'0':c-10+'A');
1363 return;
1364}
1365bigot(p,flg)
1366struct blk *p;
1367{
1368 register struct blk *t,*q;
1369 register int l;
1370 int neg;
1371
1372 if(flg == 1)t = salloc(0);
1373 else{
1374 t = strptr;
1375 l = length(strptr)+fw-1;
1376 }
1377 neg=0;
1378 if(length(p) != 0){
1379 fsfile(p);
1380 if(sbackc(p)<0){
1381 neg=1;
1382 chsign(p);
1383 }
1384 while(length(p) != 0){
1385 q = div(p,tenptr);
1386 release(p);
1387 p = q;
1388 rewind(rem);
1389 sputc(t,sfeof(rem)?'0':sgetc(rem)+'0');
1390 release(rem);
1391 }
1392 }
1393 release(p);
1394 if(flg == 1){
1395 l = fw1-length(t);
1396 if(neg != 0){
1397 l--;
1398 sputc(strptr,'-');
1399 }
1400 fsfile(t);
1401 while(l-- > 0)sputc(strptr,'0');
1402 while(sfbeg(t) == 0)sputc(strptr,sbackc(t));
1403 release(t);
1404 }
1405 else{
1406 l -= length(strptr);
1407 while(l-- > 0)sputc(strptr,'0');
1408 if(neg != 0){
1409 sunputc(strptr);
1410 sputc(strptr,'-');
1411 }
1412 }
1413 sputc(strptr,' ');
1414 return;
1415}
1416struct blk *
1417add(a1,a2)
1418struct blk *a1,*a2;
1419{
1420 register struct blk *p;
1421 register int carry,n;
1422 int size;
1423 int c,n1,n2;
1424
1425 size = length(a1)>length(a2)?length(a1):length(a2);
1426 p = salloc(size);
1427 rewind(a1);
1428 rewind(a2);
1429 carry=0;
1430 while(--size >= 0){
1431 n1 = sfeof(a1)?0:sgetc(a1);
1432 n2 = sfeof(a2)?0:sgetc(a2);
1433 n = n1 + n2 + carry;
1434 if(n>=100){
1435 carry=1;
1436 n -= 100;
1437 }
1438 else if(n<0){
1439 carry = -1;
1440 n += 100;
1441 }
1442 else carry = 0;
1443 sputc(p,n);
1444 }
1445 if(carry != 0)sputc(p,carry);
1446 fsfile(p);
1447 if(sfbeg(p) == 0){
1448 while(sfbeg(p) == 0 && (c = sbackc(p)) == 0);
1449 if(c != 0)salterc(p,c);
1450 truncate(p);
1451 }
1452 fsfile(p);
1453 if(sfbeg(p) == 0 && sbackc(p) == -1){
1454 while((c = sbackc(p)) == 99){
1455 if(c == EOF)break;
1456 }
1457 sgetc(p);
1458 salterc(p,-1);
1459 truncate(p);
1460 }
1461 return(p);
1462}
1463eqk(){
1464 register struct blk *p,*q;
1465 register int skp;
1466 int skq;
1467
1468 p = pop();
1469 EMPTYS;
1470 q = pop();
1471 EMPTYSR(p);
1472 skp = sunputc(p);
1473 skq = sunputc(q);
1474 if(skp == skq){
1475 arg1=p;
1476 arg2=q;
1477 savk = skp;
1478 return(0);
1479 }
1480 else if(skp < skq){
1481 savk = skq;
1482 p = add0(p,skq-skp);
1483 }
1484 else {
1485 savk = skp;
1486 q = add0(q,skp-skq);
1487 }
1488 arg1=p;
1489 arg2=q;
1490 return(0);
1491}
1492struct blk *
1493removc(p,n)
1494struct blk *p;
1495{
1496 register struct blk *q,*r;
1497
1498 rewind(p);
1499 while(n>1){
1500 sgetc(p);
1501 n -= 2;
1502 }
1503 q = salloc(2);
1504 while(sfeof(p) == 0)sputc(q,sgetc(p));
1505 if(n == 1){
1506 r = div(q,tenptr);
1507 release(q);
1508 release(rem);
1509 q = r;
1510 }
1511 release(p);
1512 return(q);
1513}
1514struct blk *
1515scalint(p)
1516struct blk *p;
1517{
1518 register int n;
1519 n = sunputc(p);
1520 p = removc(p,n);
1521 return(p);
1522}
1523struct blk *
1524scale(p,n)
1525struct blk *p;
1526{
1527 register struct blk *q,*s,*t;
1528
1529 t = add0(p,n);
1530 q = salloc(1);
1531 sputc(q,n);
1532 s = exp(inbas,q);
1533 release(q);
1534 q = div(t,s);
1535 release(t);
1536 release(s);
1537 release(rem);
1538 sputc(q,n);
1539 return(q);
1540}
1541subt(){
1542 arg1=pop();
1543 EMPTYS;
1544 savk = sunputc(arg1);
1545 chsign(arg1);
1546 sputc(arg1,savk);
1547 pushp(arg1);
1548 if(eqk() != 0)return(1);
1549 binop('+');
1550 return(0);
1551}
1552command(){
1553 int c;
1554 char line[100],*sl;
1555 register (*savint)(),pid,rpid;
1556 int retcode;
1557
1558 switch(c = readc()){
1559 case '<':
1560 return(cond(NL));
1561 case '>':
1562 return(cond(NG));
1563 case '=':
1564 return(cond(NE));
1565 default:
1566 sl = line;
1567 *sl++ = c;
1568 while((c = readc()) != '\n')*sl++ = c;
1569 *sl = 0;
1570 if((pid = fork()) == 0){
1571 execl("/bin/sh","sh","-c",line,0);
1572 exit(0100);
1573 }
1574 savint = signal(SIGINT, SIG_IGN);
1575 while((rpid = wait(&retcode)) != pid && rpid != -1);
1576 signal(SIGINT,savint);
1577 printf("!\n");
1578 return(0);
1579 }
1580}
1581cond(c)
1582char c;
1583{
1584 register struct blk *p;
1585 register char cc;
1586
1587 if(subt() != 0)return(1);
1588 p = pop();
1589 sunputc(p);
1590 if(length(p) == 0){
1591 release(p);
1592 if(c == '<' || c == '>' || c == NE){
1593 readc();
1594 return(0);
1595 }
1596 load();
1597 return(1);
1598 }
1599 else {
1600 if(c == '='){
1601 release(p);
1602 readc();
1603 return(0);
1604 }
1605 }
1606 if(c == NE){
1607 release(p);
1608 load();
1609 return(1);
1610 }
1611 fsfile(p);
1612 cc = sbackc(p);
1613 release(p);
1614 if((cc<0 && (c == '<' || c == NG)) ||
1615 (cc >0) && (c == '>' || c == NL)){
1616 readc();
1617 return(0);
1618 }
1619 load();
1620 return(1);
1621}
1622load(){
1623 register int c;
1624 register struct blk *p,*q;
1625 struct blk *t,*s;
1626 c = readc() & 0377;
1627 sptr = stable[c];
1628 if(sptr != 0){
1629 p = sptr->val;
1630 if(c >= ARRAYST){
1631 q = salloc(length(p));
1632 rewind(p);
1633 while(sfeof(p) == 0){
1634 s = getwd(p);
1635 if(s == 0){putwd(q, (struct blk *)NULL);}
1636 else{
1637 t = copy(s,length(s));
1638 putwd(q,t);
1639 }
1640 }
1641 pushp(q);
1642 }
1643 else{
1644 q = copy(p,length(p));
1645 pushp(q);
1646 }
1647 }
1648 else{
1649 q = salloc(1);
1650 sputc(q,0);
1651 pushp(q);
1652 }
1653 return;
1654}
1655log2(n)
1656long n;
1657{
1658 register int i;
1659
1660 if(n == 0)return(0);
1661 i=31;
1662 if(n<0)return(i);
1663 while((n= n<<1) >0)i--;
1664 return(--i);
1665}
1666
1667struct blk *
1668salloc(size)
1669int size;
1670{
1671 register struct blk *hdr;
1672 register char *ptr;
1673 all++;
1674 nbytes += size;
1675 ptr = malloc((unsigned)size);
1676 if(ptr == 0){
1677 garbage("salloc");
1678 if((ptr = malloc((unsigned)size)) == 0)
1679 ospace("salloc");
1680 }
1681 if((hdr = hfree) == 0)hdr = morehd();
1682 hfree = (struct blk *)hdr->rd;
1683 hdr->rd = hdr->wt = hdr->beg = ptr;
1684 hdr->last = ptr+size;
1685 return(hdr);
1686}
1687struct blk *
1688morehd(){
1689 register struct blk *h,*kk;
1690 headmor++;
1691 nbytes += HEADSZ;
1692 hfree = h = (struct blk *)malloc(HEADSZ);
1693 if(hfree == 0){
1694 garbage("morehd");
1695 if((hfree = h = (struct blk *)malloc(HEADSZ)) == 0)
1696 ospace("headers");
1697 }
1698 kk = h;
1699 while(h<hfree+(HEADSZ/BLK))(h++)->rd = (char *)++kk;
1700 (--h)->rd=0;
1701 return(hfree);
1702}
1703/*
1704sunputc(hptr)
1705struct blk *hptr;
1706{
1707 hptr->wt--;
1708 hptr->rd = hptr->wt;
1709 return(*hptr->wt);
1710}
1711*/
1712struct blk *
1713copy(hptr,size)
1714struct blk *hptr;
1715int size;
1716{
1717 register struct blk *hdr;
1718 register unsigned sz;
1719 register char *ptr;
1720
1721 all++;
1722 nbytes += size;
1723 sz = length(hptr);
1724 ptr = nalloc(hptr->beg, (unsigned)size);
1725 if(ptr == 0){
1726 garbage("copy");
1727 if((ptr = nalloc(hptr->beg, (unsigned)size)) == NULL){
1728 printf("copy size %d\n",size);
1729 ospace("copy");
1730 }
1731 }
1732 if((hdr = hfree) == 0)hdr = morehd();
1733 hfree = (struct blk *)hdr->rd;
1734 hdr->rd = hdr->beg = ptr;
1735 hdr->last = ptr+size;
1736 hdr->wt = ptr+sz;
1737 ptr = hdr->wt;
1738 while(ptr<hdr->last)*ptr++ = '\0';
1739 return(hdr);
1740}
1741sdump(s1,hptr)
1742char *s1;
1743struct blk *hptr;
1744{
1745 char *p;
1746 printf("%s %o rd %o wt %o beg %o last %o\n",s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last);
1747 p = hptr->beg;
1748 while(p < hptr->wt)printf("%d ",*p++);
1749 printf("\n");
1750}
1751seekc(hptr,n)
1752struct blk *hptr;
1753{
1754 register char *nn,*p;
1755
1756 nn = hptr->beg+n;
1757 if(nn > hptr->last){
1758 nbytes += nn - hptr->last;
1759 free(hptr->beg);
1760 p = realloc(hptr->beg, (unsigned)n);
1761 if(p == 0){
1762 hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg));
1763 garbage("seekc");
1764 if((p = realloc(hptr->beg, (unsigned)n)) == 0)
1765 ospace("seekc");
1766 }
1767 hptr->beg = p;
1768 hptr->wt = hptr->last = hptr->rd = p+n;
1769 return;
1770 }
1771 hptr->rd = nn;
1772 if(nn>hptr->wt)hptr->wt = nn;
1773 return;
1774}
1775salterwd(hptr,n)
1776struct wblk *hptr;
1777struct blk *n;
1778{
1779 if(hptr->rdw == hptr->lastw)more(hptr);
1780 *hptr->rdw++ = n;
1781 if(hptr->rdw > hptr->wtw)hptr->wtw = hptr->rdw;
1782 return;
1783}
1784more(hptr)
1785struct blk *hptr;
1786{
1787 register unsigned size;
1788 register char *p;
1789
1790 if((size=(hptr->last-hptr->beg)*2) == 0)size=1;
1791 nbytes += size/2;
1792 free(hptr->beg);
1793 p = realloc(hptr->beg, (unsigned)size);
1794 if(p == 0){
1795 hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg));
1796 garbage("more");
1797 if((p = realloc(hptr->beg,size)) == 0)
1798 ospace("more");
1799 }
1800 hptr->rd = hptr->rd-hptr->beg+p;
1801 hptr->wt = hptr->wt-hptr->beg+p;
1802 hptr->beg = p;
1803 hptr->last = p+size;
1804 return;
1805}
1806ospace(s)
1807char *s;
1808{
1809 printf("out of space: %s\n",s);
1810 printf("all %ld rel %ld headmor %ld\n",all,rel,headmor);
1811 printf("nbytes %ld\n",nbytes);
1812 sdump("stk",*stkptr);
1813 abort();
1814}
1815garbage(s)
1816char *s;
1817{
1818 int i;
1819 struct blk *p, *q;
1820 struct sym *tmps;
1821 int ct;
1822
1823/* printf("got to garbage %s\n",s); */
1824 for(i=0;i<TBLSZ;i++){
1825 tmps = stable[i];
1826 if(tmps != 0){
1827 if(i < ARRAYST){
1828 do {
1829 p = tmps->val;
1830 if(((int)p->beg & 01) != 0){
1831 printf("string %o\n",i);
1832 sdump("odd beg",p);
1833 }
1834 redef(p);
1835 tmps = tmps->next;
1836 } while(tmps != 0);
1837 continue;
1838 }
1839 else {
1840 do {
1841 p = tmps->val;
1842 rewind(p);
1843 ct = 0;
1844 while((q = getwd(p)) != NULL){
1845 ct++;
1846 if(q != 0){
1847 if(((int)q->beg & 01) != 0){
1848 printf("array %o elt %d odd\n",i-ARRAYST,ct);
1849printf("tmps %o p %o\n",tmps,p);
1850 sdump("elt",q);
1851 }
1852 redef(q);
1853 }
1854 }
1855 tmps = tmps->next;
1856 } while(tmps != 0);
1857 }
1858 }
1859 }
1860}
1861redef(p)
1862struct blk *p;
1863{
1864 register offset;
1865 register char *newp;
1866
1867 if ((int)p->beg&01) {
1868 printf("odd ptr %o hdr %o\n",p->beg,p);
1869 ospace("redef-bad");
1870 }
1871 free(p->beg);
1872 free(dummy);
1873 dummy = malloc(1);
1874 if(dummy == NULL)ospace("dummy");
1875 newp = realloc(p->beg, (unsigned)(p->last-p->beg));
1876 if(newp == NULL)ospace("redef");
1877 offset = newp - p->beg;
1878 p->beg = newp;
1879 p->rd += offset;
1880 p->wt += offset;
1881 p->last += offset;
1882}
1883
1884release(p)
1885register struct blk *p;
1886{
1887 rel++;
1888 nbytes -= p->last - p->beg;
1889 p->rd = (char *)hfree;
1890 hfree = p;
1891 free(p->beg);
1892}
1893
1894struct blk *
1895getwd(p)
1896struct blk *p;
1897{
1898 register struct wblk *wp;
1899
1900 wp = (struct wblk *)p;
1901 if (wp->rdw == wp->wtw)
1902 return(NULL);
1903 return(*wp->rdw++);
1904}
1905
1906putwd(p, c)
1907struct blk *p, *c;
1908{
1909 register struct wblk *wp;
1910
1911 wp = (struct wblk *)p;
1912 if (wp->wtw == wp->lastw)
1913 more(p);
1914 *wp->wtw++ = c;
1915}
1916
1917struct blk *
1918lookwd(p)
1919struct blk *p;
1920{
1921 register struct wblk *wp;
1922
1923 wp = (struct wblk *)p;
1924 if (wp->rdw == wp->wtw)
1925 return(NULL);
1926 return(*wp->rdw);
1927}
1928char *
1929nalloc(p,nbytes)
1930register char *p;
1931unsigned nbytes;
1932{
1933 char *malloc();
1934 register char *q, *r;
1935 q = r = malloc(nbytes);
1936 if(q==0)
1937 return(0);
1938 while(nbytes--)
1939 *q++ = *p++;
1940 return(r);
1941}