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