|
|
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;
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: else cc += 1;
634: if(magic != 0)td = td<<3;
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: seekc(divd,offset);
647: carry = 0;
648: while(sfeof(divd) == 0){
649: d = slookc(divd);
650: d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry;
651: carry = 0;
652: if(d < 0){
653: d += 100;
654: carry = 1;
655: }
656: salterc(divd,d);
657: }
658: divcarry = carry;
659: sbackc(p);
660: salterc(p,dig);
661: sbackc(p);
662: if(--offset >= 0)divd->wt--;
663: }
664: if(divcarry != 0){
665: salterc(p,dig-1);
666: salterc(divd,-1);
667: ps = add(divr,divd);
668: release(divd);
669: divd = ps;
670: }
671:
672: rewind(p);
673: divcarry = 0;
674: while(sfeof(p) == 0){
675: d = slookc(p)+divcarry;
676: divcarry = 0;
677: if(d >= 100){
678: d -= 100;
679: divcarry = 1;
680: }
681: salterc(p,d);
682: }
683: if(divcarry != 0)salterc(p,divcarry);
684: fsfile(p);
685: while(sfbeg(p) == 0){
686: if(sbackc(p) == 0)truncate(p);
687: else break;
688: }
689: if(divsign < 0)chsign(p);
690: fsfile(divd);
691: while(sfbeg(divd) == 0){
692: if(sbackc(divd) == 0)truncate(divd);
693: else break;
694: }
695: ddone:
696: if(remsign<0)chsign(divd);
697: if(divr != ddivr)release(divr);
698: rem = divd;
699: return(p);
700: }
701: dscale(){
702: register struct blk *dd,*dr;
703: register struct blk *r;
704: int c;
705:
706: dr = pop();
707: EMPTYS;
708: dd = pop();
709: EMPTYSR(dr);
710: fsfile(dd);
711: skd = sunputc(dd);
712: fsfile(dr);
713: skr = sunputc(dr);
714: if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)){
715: sputc(dr,skr);
716: pushp(dr);
717: errorrt("divide by 0\n");
718: }
719: c = k-skd+skr;
720: if(c < 0)r = removr(dd,-c);
721: else {
722: r = add0(dd,c);
723: irem = 0;
724: }
725: arg1 = r;
726: arg2 = dr;
727: savk = k;
728: return(0);
729: }
730: struct blk *
731: removr(p,n)
732: struct blk *p;
733: {
734: int nn;
735: register struct blk *q,*s,*r;
736:
737: rewind(p);
738: nn = (n+1)/2;
739: q = salloc(nn);
740: while(n>1){
741: sputc(q,sgetc(p));
742: n -= 2;
743: }
744: r = salloc(2);
745: while(sfeof(p) == 0)sputc(r,sgetc(p));
746: release(p);
747: if(n == 1){
748: s = div(r,tenptr);
749: release(r);
750: rewind(rem);
751: if(sfeof(rem) == 0)sputc(q,sgetc(rem));
752: release(rem);
753: irem = q;
754: return(s);
755: }
756: irem = q;
757: return(r);
758: }
759: struct blk *
760: sqrt(p)
761: struct blk *p;
762: {
763: struct blk *t;
764: struct blk *r,*q,*s;
765: int c,n,nn;
766:
767: n = length(p);
768: fsfile(p);
769: c = sbackc(p);
770: if((n&1) != 1)c = c*100+(sfbeg(p)?0:sbackc(p));
771: n = (n+1)>>1;
772: r = salloc(n);
773: zero(r);
774: seekc(r,n);
775: nn=1;
776: while((c -= nn)>=0)nn+=2;
777: c=(nn+1)>>1;
778: fsfile(r);
779: sbackc(r);
780: if(c>=100){
781: c -= 100;
782: salterc(r,c);
783: sputc(r,1);
784: }
785: else salterc(r,c);
786: while(1){
787: q = div(p,r);
788: s = add(q,r);
789: release(q);
790: release(rem);
791: q = div(s,sqtemp);
792: release(s);
793: release(rem);
794: s = copy(r,length(r));
795: chsign(s);
796: t = add(s,q);
797: release(s);
798: fsfile(t);
799: nn = sfbeg(t)?0:sbackc(t);
800: if(nn>=0)break;
801: release(r);
802: release(t);
803: r = q;
804: }
805: release(t);
806: release(q);
807: release(p);
808: return(r);
809: }
810: struct blk *
811: exp(base,ex)
812: struct blk *base,*ex;
813: {
814: register struct blk *r,*e,*p;
815: struct blk *e1,*t,*cp;
816: int temp,c,n;
817: r = salloc(1);
818: sputc(r,1);
819: p = copy(base,length(base));
820: e = copy(ex,length(ex));
821: fsfile(e);
822: if(sfbeg(e) != 0)goto edone;
823: temp=0;
824: c = sbackc(e);
825: if(c<0){
826: temp++;
827: chsign(e);
828: }
829: while(length(e) != 0){
830: e1=div(e,sqtemp);
831: release(e);
832: e = e1;
833: n = length(rem);
834: release(rem);
835: if(n != 0){
836: e1=mult(p,r);
837: release(r);
838: r = e1;
839: }
840: t = copy(p,length(p));
841: cp = mult(p,t);
842: release(p);
843: release(t);
844: p = cp;
845: }
846: if(temp != 0){
847: if((c = length(base)) == 0){
848: goto edone;
849: }
850: if(c>1)create(r);
851: else{
852: rewind(base);
853: if((c = sgetc(base))<=1){
854: create(r);
855: sputc(r,c);
856: }
857: else create(r);
858: }
859: }
860: edone:
861: release(p);
862: release(e);
863: return(r);
864: }
865: init(argc,argv)
866: int argc;
867: char *argv[];
868: {
869: register struct sym *sp;
870:
871: if (signal(SIGINT, SIG_IGN) != SIG_IGN)
872: signal(SIGINT,onintr);
873: setbuf(stdout,(char *)NULL);
874: svargc = --argc;
875: svargv = argv;
876: while(svargc>0 && svargv[1][0] == '-'){
877: switch(svargv[1][1]){
878: default:
879: dbg=1;
880: }
881: svargc--;
882: svargv++;
883: }
884: ifile=1;
885: if(svargc<=0)curfile = stdin;
886: else if((curfile = fopen(svargv[1],"r")) == NULL){
887: printf("can't open file %s\n",svargv[1]);
888: exit(1);
889: }
890: dummy = malloc(1);
891: scalptr = salloc(1);
892: sputc(scalptr,0);
893: basptr = salloc(1);
894: sputc(basptr,10);
895: obase=10;
896: log10=log2(10L);
897: ll=70;
898: fw=1;
899: fw1=0;
900: tenptr = salloc(1);
901: sputc(tenptr,10);
902: obase=10;
903: inbas = salloc(1);
904: sputc(inbas,10);
905: sqtemp = salloc(1);
906: sputc(sqtemp,2);
907: chptr = salloc(0);
908: strptr = salloc(0);
909: divxyz = salloc(0);
910: stkbeg = stkptr = &stack[0];
911: stkend = &stack[STKSZ];
912: stkerr = 0;
913: readptr = &readstk[0];
914: k=0;
915: sp = sptr = &symlst[0];
916: while(sptr < &symlst[TBLSZ-1]){
917: sptr->next = ++sp;
918: sptr++;
919: }
920: sptr->next=0;
921: sfree = &symlst[0];
922: return;
923: }
924: onintr(){
925:
926: signal(SIGINT,onintr);
927: while(readptr != &readstk[0]){
928: if(*readptr != 0){release(*readptr);}
929: readptr--;
930: }
931: curfile = stdin;
932: commnds();
933: }
934: pushp(p)
935: struct blk *p;
936: {
937: if(stkptr == stkend){
938: printf("out of stack space\n");
939: return;
940: }
941: stkerr=0;
942: *++stkptr = p;
943: return;
944: }
945: struct blk *
946: pop(){
947: if(stkptr == stack){
948: stkerr=1;
949: return(0);
950: }
951: return(*stkptr--);
952: }
953: struct blk *
954: readin(){
955: register struct blk *p,*q;
956: int dp,dpct;
957: register int c;
958:
959: dp = dpct=0;
960: p = salloc(0);
961: while(1){
962: c = readc();
963: switch(c){
964: case '.':
965: if(dp != 0){
966: unreadc(c);
967: break;
968: }
969: dp++;
970: continue;
971: case '\\':
972: readc();
973: continue;
974: default:
975: if(c >= 'A' && c <= 'F')c = c - 'A' + 10;
976: else if(c >= '0' && c <= '9')c -= '0';
977: else goto gotnum;
978: if(dp != 0){
979: if(dpct >= 99)continue;
980: dpct++;
981: }
982: create(chptr);
983: if(c != 0)sputc(chptr,c);
984: q = mult(p,inbas);
985: release(p);
986: p = add(chptr,q);
987: release(q);
988: }
989: }
990: gotnum:
991: unreadc(c);
992: if(dp == 0){
993: sputc(p,0);
994: return(p);
995: }
996: else{
997: q = scale(p,dpct);
998: return(q);
999: }
1000: }
1001: struct blk *
1002: add0(p,ct)
1003: int ct;
1004: struct blk *p;
1005: {
1006: /* returns pointer to struct with ct 0's & p */
1007: register struct blk *q,*t;
1008:
1009: q = salloc(length(p)+(ct+1)/2);
1010: while(ct>1){
1011: sputc(q,0);
1012: ct -= 2;
1013: }
1014: rewind(p);
1015: while(sfeof(p) == 0){
1016: sputc(q,sgetc(p));
1017: }
1018: release(p);
1019: if(ct == 1){
1020: t = mult(tenptr,q);
1021: release(q);
1022: return(t);
1023: }
1024: return(q);
1025: }
1026: struct blk *
1027: mult(p,q)
1028: struct blk *p,*q;
1029: {
1030: register struct blk *mp,*mq,*mr;
1031: int sign,offset,carry;
1032: int cq,cp,mt,mcr;
1033:
1034: offset = sign = 0;
1035: fsfile(p);
1036: mp = p;
1037: if(sfbeg(p) == 0){
1038: if(sbackc(p)<0){
1039: mp = copy(p,length(p));
1040: chsign(mp);
1041: sign = ~sign;
1042: }
1043: }
1044: fsfile(q);
1045: mq = q;
1046: if(sfbeg(q) == 0){
1047: if(sbackc(q)<0){
1048: mq = copy(q,length(q));
1049: chsign(mq);
1050: sign = ~sign;
1051: }
1052: }
1053: mr = salloc(length(mp)+length(mq));
1054: zero(mr);
1055: rewind(mq);
1056: while(sfeof(mq) == 0){
1057: cq = sgetc(mq);
1058: rewind(mp);
1059: rewind(mr);
1060: mr->rd += offset;
1061: carry=0;
1062: while(sfeof(mp) == 0){
1063: cp = sgetc(mp);
1064: mcr = sfeof(mr)?0:slookc(mr);
1065: mt = cp*cq + carry + mcr;
1066: carry = mt/100;
1067: salterc(mr,mt%100);
1068: }
1069: offset++;
1070: if(carry != 0){
1071: mcr = sfeof(mr)?0:slookc(mr);
1072: salterc(mr,mcr+carry);
1073: }
1074: }
1075: if(sign < 0){
1076: chsign(mr);
1077: }
1078: if(mp != p)release(mp);
1079: if(mq != q)release(mq);
1080: return(mr);
1081: }
1082: chsign(p)
1083: struct blk *p;
1084: {
1085: register int carry;
1086: register char ct;
1087:
1088: carry=0;
1089: rewind(p);
1090: while(sfeof(p) == 0){
1091: ct=100-slookc(p)-carry;
1092: carry=1;
1093: if(ct>=100){
1094: ct -= 100;
1095: carry=0;
1096: }
1097: salterc(p,ct);
1098: }
1099: if(carry != 0){
1100: sputc(p,-1);
1101: fsfile(p);
1102: sbackc(p);
1103: ct = sbackc(p);
1104: if(ct == 99){
1105: truncate(p);
1106: sputc(p,-1);
1107: }
1108: }
1109: else{
1110: fsfile(p);
1111: ct = sbackc(p);
1112: if(ct == 0)truncate(p);
1113: }
1114: return;
1115: }
1116: readc(){
1117: loop:
1118: if((readptr != &readstk[0]) && (*readptr != 0)){
1119: if(sfeof(*readptr) == 0)return(lastchar = sgetc(*readptr));
1120: release(*readptr);
1121: readptr--;
1122: goto loop;
1123: }
1124: lastchar = getc(curfile);
1125: if(lastchar != EOF)return(lastchar);
1126: if(readptr != &readptr[0]){
1127: readptr--;
1128: if(*readptr == 0)curfile = stdin;
1129: goto loop;
1130: }
1131: if(curfile != stdin){
1132: fclose(curfile);
1133: curfile = stdin;
1134: goto loop;
1135: }
1136: exit(0);
1137: }
1138: unreadc(c)
1139: char c;
1140: {
1141:
1142: if((readptr != &readstk[0]) && (*readptr != 0)){
1143: sungetc(*readptr,c);
1144: }
1145: else ungetc(c,curfile);
1146: return;
1147: }
1148: binop(c)
1149: char c;
1150: {
1151: register struct blk *r;
1152:
1153: switch(c){
1154: case '+':
1155: r = add(arg1,arg2);
1156: break;
1157: case '*':
1158: r = mult(arg1,arg2);
1159: break;
1160: case '/':
1161: r = div(arg1,arg2);
1162: break;
1163: }
1164: release(arg1);
1165: release(arg2);
1166: sputc(r,savk);
1167: pushp(r);
1168: return;
1169: }
1170: print(hptr)
1171: struct blk *hptr;
1172: {
1173: int sc;
1174: register struct blk *p,*q,*dec;
1175: int dig,dout,ct;
1176:
1177: rewind(hptr);
1178: while(sfeof(hptr) == 0){
1179: if(sgetc(hptr)>99){
1180: rewind(hptr);
1181: while(sfeof(hptr) == 0){
1182: printf("%c",sgetc(hptr));
1183: }
1184: printf("\n");
1185: return;
1186: }
1187: }
1188: fsfile(hptr);
1189: sc = sbackc(hptr);
1190: if(sfbeg(hptr) != 0){
1191: printf("0\n");
1192: return;
1193: }
1194: count = ll;
1195: p = copy(hptr,length(hptr));
1196: sunputc(p);
1197: fsfile(p);
1198: if(sbackc(p)<0){
1199: chsign(p);
1200: OUTC('-');
1201: }
1202: if((obase == 0) || (obase == -1)){
1203: oneot(p,sc,'d');
1204: return;
1205: }
1206: if(obase == 1){
1207: oneot(p,sc,'1');
1208: return;
1209: }
1210: if(obase == 10){
1211: tenot(p,sc);
1212: return;
1213: }
1214: create(strptr);
1215: dig = log10*sc;
1216: dout = ((dig/10) + dig) /logo;
1217: dec = getdec(p,sc);
1218: p = removc(p,sc);
1219: while(length(p) != 0){
1220: q = div(p,basptr);
1221: release(p);
1222: p = q;
1223: (*outdit)(rem,0);
1224: }
1225: release(p);
1226: fsfile(strptr);
1227: while(sfbeg(strptr) == 0)OUTC(sbackc(strptr));
1228: if(sc == 0){
1229: release(dec);
1230: printf("\n");
1231: return;
1232: }
1233: create(strptr);
1234: OUTC('.');
1235: ct=0;
1236: do{
1237: q = mult(basptr,dec);
1238: release(dec);
1239: dec = getdec(q,sc);
1240: p = removc(q,sc);
1241: (*outdit)(p,1);
1242: }while(++ct < dout);
1243: release(dec);
1244: rewind(strptr);
1245: while(sfeof(strptr) == 0)OUTC(sgetc(strptr));
1246: printf("\n");
1247: return;
1248: }
1249:
1250: struct blk *
1251: getdec(p,sc)
1252: struct blk *p;
1253: {
1254: int cc;
1255: register struct blk *q,*t,*s;
1256:
1257: rewind(p);
1258: if(length(p)*2 < sc){
1259: q = copy(p,length(p));
1260: return(q);
1261: }
1262: q = salloc(length(p));
1263: while(sc >= 1){
1264: sputc(q,sgetc(p));
1265: sc -= 2;
1266: }
1267: if(sc != 0){
1268: t = mult(q,tenptr);
1269: s = salloc(cc = length(q));
1270: release(q);
1271: rewind(t);
1272: while(cc-- > 0)sputc(s,sgetc(t));
1273: sputc(s,0);
1274: release(t);
1275: t = div(s,tenptr);
1276: release(s);
1277: release(rem);
1278: return(t);
1279: }
1280: return(q);
1281: }
1282: tenot(p,sc)
1283: struct blk *p;
1284: {
1285: register int c,f;
1286:
1287: fsfile(p);
1288: f=0;
1289: while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)){
1290: c = sbackc(p);
1291: if((c<10) && (f == 1))printf("0%d",c);
1292: else printf("%d",c);
1293: f=1;
1294: TEST2;
1295: }
1296: if(sc == 0){
1297: printf("\n");
1298: release(p);
1299: return;
1300: }
1301: if((p->rd-p->beg)*2 > sc){
1302: c = sbackc(p);
1303: printf("%d.",c/10);
1304: TEST2;
1305: OUTC(c%10 +'0');
1306: sc--;
1307: }
1308: else {
1309: OUTC('.');
1310: }
1311: if(sc > (p->rd-p->beg)*2){
1312: while(sc>(p->rd-p->beg)*2){
1313: OUTC('0');
1314: sc--;
1315: }
1316: }
1317: while(sc > 1){
1318: c = sbackc(p);
1319: if(c<10)printf("0%d",c);
1320: else printf("%d",c);
1321: sc -= 2;
1322: TEST2;
1323: }
1324: if(sc == 1){
1325: OUTC(sbackc(p)/10 +'0');
1326: }
1327: printf("\n");
1328: release(p);
1329: return;
1330: }
1331: oneot(p,sc,ch)
1332: struct blk *p;
1333: char ch;
1334: {
1335: register struct blk *q;
1336:
1337: q = removc(p,sc);
1338: create(strptr);
1339: sputc(strptr,-1);
1340: while(length(q)>0){
1341: p = add(strptr,q);
1342: release(q);
1343: q = p;
1344: OUTC(ch);
1345: }
1346: release(q);
1347: printf("\n");
1348: return;
1349: }
1350: hexot(p,flg)
1351: struct blk *p;
1352: {
1353: register int c;
1354: rewind(p);
1355: if(sfeof(p) != 0){
1356: sputc(strptr,'0');
1357: release(p);
1358: return;
1359: }
1360: c = sgetc(p);
1361: release(p);
1362: if(c >= 16){
1363: printf("hex digit > 16");
1364: return;
1365: }
1366: sputc(strptr,c<10?c+'0':c-10+'A');
1367: return;
1368: }
1369: bigot(p,flg)
1370: struct blk *p;
1371: {
1372: register struct blk *t,*q;
1373: register int l;
1374: int neg;
1375:
1376: if(flg == 1)t = salloc(0);
1377: else{
1378: t = strptr;
1379: l = length(strptr)+fw-1;
1380: }
1381: neg=0;
1382: if(length(p) != 0){
1383: fsfile(p);
1384: if(sbackc(p)<0){
1385: neg=1;
1386: chsign(p);
1387: }
1388: while(length(p) != 0){
1389: q = div(p,tenptr);
1390: release(p);
1391: p = q;
1392: rewind(rem);
1393: sputc(t,sfeof(rem)?'0':sgetc(rem)+'0');
1394: release(rem);
1395: }
1396: }
1397: release(p);
1398: if(flg == 1){
1399: l = fw1-length(t);
1400: if(neg != 0){
1401: l--;
1402: sputc(strptr,'-');
1403: }
1404: fsfile(t);
1405: while(l-- > 0)sputc(strptr,'0');
1406: while(sfbeg(t) == 0)sputc(strptr,sbackc(t));
1407: release(t);
1408: }
1409: else{
1410: l -= length(strptr);
1411: while(l-- > 0)sputc(strptr,'0');
1412: if(neg != 0){
1413: sunputc(strptr);
1414: sputc(strptr,'-');
1415: }
1416: }
1417: sputc(strptr,' ');
1418: return;
1419: }
1420: struct blk *
1421: add(a1,a2)
1422: struct blk *a1,*a2;
1423: {
1424: register struct blk *p;
1425: register int carry,n;
1426: int size;
1427: int c,n1,n2;
1428:
1429: size = length(a1)>length(a2)?length(a1):length(a2);
1430: p = salloc(size);
1431: rewind(a1);
1432: rewind(a2);
1433: carry=0;
1434: while(--size >= 0){
1435: n1 = sfeof(a1)?0:sgetc(a1);
1436: n2 = sfeof(a2)?0:sgetc(a2);
1437: n = n1 + n2 + carry;
1438: if(n>=100){
1439: carry=1;
1440: n -= 100;
1441: }
1442: else if(n<0){
1443: carry = -1;
1444: n += 100;
1445: }
1446: else carry = 0;
1447: sputc(p,n);
1448: }
1449: if(carry != 0)sputc(p,carry);
1450: fsfile(p);
1451: if(sfbeg(p) == 0){
1452: while(sfbeg(p) == 0 && (c = sbackc(p)) == 0);
1453: if(c != 0)salterc(p,c);
1454: truncate(p);
1455: }
1456: fsfile(p);
1457: if(sfbeg(p) == 0 && sbackc(p) == -1){
1458: while((c = sbackc(p)) == 99){
1459: if(c == EOF)break;
1460: }
1461: sgetc(p);
1462: salterc(p,-1);
1463: truncate(p);
1464: }
1465: return(p);
1466: }
1467: eqk(){
1468: register struct blk *p,*q;
1469: register int skp;
1470: int skq;
1471:
1472: p = pop();
1473: EMPTYS;
1474: q = pop();
1475: EMPTYSR(p);
1476: skp = sunputc(p);
1477: skq = sunputc(q);
1478: if(skp == skq){
1479: arg1=p;
1480: arg2=q;
1481: savk = skp;
1482: return(0);
1483: }
1484: else if(skp < skq){
1485: savk = skq;
1486: p = add0(p,skq-skp);
1487: }
1488: else {
1489: savk = skp;
1490: q = add0(q,skp-skq);
1491: }
1492: arg1=p;
1493: arg2=q;
1494: return(0);
1495: }
1496: struct blk *
1497: removc(p,n)
1498: struct blk *p;
1499: {
1500: register struct blk *q,*r;
1501:
1502: rewind(p);
1503: while(n>1){
1504: sgetc(p);
1505: n -= 2;
1506: }
1507: q = salloc(2);
1508: while(sfeof(p) == 0)sputc(q,sgetc(p));
1509: if(n == 1){
1510: r = div(q,tenptr);
1511: release(q);
1512: release(rem);
1513: q = r;
1514: }
1515: release(p);
1516: return(q);
1517: }
1518: struct blk *
1519: scalint(p)
1520: struct blk *p;
1521: {
1522: register int n;
1523: n = sunputc(p);
1524: p = removc(p,n);
1525: return(p);
1526: }
1527: struct blk *
1528: scale(p,n)
1529: struct blk *p;
1530: {
1531: register struct blk *q,*s,*t;
1532:
1533: t = add0(p,n);
1534: q = salloc(1);
1535: sputc(q,n);
1536: s = exp(inbas,q);
1537: release(q);
1538: q = div(t,s);
1539: release(t);
1540: release(s);
1541: release(rem);
1542: sputc(q,n);
1543: return(q);
1544: }
1545: subt(){
1546: arg1=pop();
1547: EMPTYS;
1548: savk = sunputc(arg1);
1549: chsign(arg1);
1550: sputc(arg1,savk);
1551: pushp(arg1);
1552: if(eqk() != 0)return(1);
1553: binop('+');
1554: return(0);
1555: }
1556: command(){
1557: int c;
1558: char line[100],*sl;
1559: register (*savint)(),pid,rpid;
1560: int retcode;
1561:
1562: switch(c = readc()){
1563: case '<':
1564: return(cond(NL));
1565: case '>':
1566: return(cond(NG));
1567: case '=':
1568: return(cond(NE));
1569: default:
1570: sl = line;
1571: *sl++ = c;
1572: while((c = readc()) != '\n')*sl++ = c;
1573: *sl = 0;
1574: if((pid = fork()) == 0){
1575: execl("/bin/sh","sh","-c",line,0);
1576: exit(0100);
1577: }
1578: savint = signal(SIGINT, SIG_IGN);
1579: while((rpid = wait(&retcode)) != pid && rpid != -1);
1580: signal(SIGINT,savint);
1581: printf("!\n");
1582: return(0);
1583: }
1584: }
1585: cond(c)
1586: char c;
1587: {
1588: register struct blk *p;
1589: register char cc;
1590:
1591: if(subt() != 0)return(1);
1592: p = pop();
1593: sunputc(p);
1594: if(length(p) == 0){
1595: release(p);
1596: if(c == '<' || c == '>' || c == NE){
1597: readc();
1598: return(0);
1599: }
1600: load();
1601: return(1);
1602: }
1603: else {
1604: if(c == '='){
1605: release(p);
1606: readc();
1607: return(0);
1608: }
1609: }
1610: if(c == NE){
1611: release(p);
1612: load();
1613: return(1);
1614: }
1615: fsfile(p);
1616: cc = sbackc(p);
1617: release(p);
1618: if((cc<0 && (c == '<' || c == NG)) ||
1619: (cc >0) && (c == '>' || c == NL)){
1620: readc();
1621: return(0);
1622: }
1623: load();
1624: return(1);
1625: }
1626: load(){
1627: register int c;
1628: register struct blk *p,*q;
1629: struct blk *t,*s;
1630: c = readc() & 0377;
1631: sptr = stable[c];
1632: if(sptr != 0){
1633: p = sptr->val;
1634: if(c >= ARRAYST){
1635: q = salloc(length(p));
1636: rewind(p);
1637: while(sfeof(p) == 0){
1638: s = getwd(p);
1639: if(s == 0){putwd(q, (struct blk *)NULL);}
1640: else{
1641: t = copy(s,length(s));
1642: putwd(q,t);
1643: }
1644: }
1645: pushp(q);
1646: }
1647: else{
1648: q = copy(p,length(p));
1649: pushp(q);
1650: }
1651: }
1652: else{
1653: q = salloc(1);
1654: sputc(q,0);
1655: pushp(q);
1656: }
1657: return;
1658: }
1659: log2(n)
1660: long n;
1661: {
1662: register int i;
1663:
1664: if(n == 0)return(0);
1665: i=31;
1666: if(n<0)return(i);
1667: while((n= n<<1) >0)i--;
1668: return(--i);
1669: }
1670:
1671: struct blk *
1672: salloc(size)
1673: int size;
1674: {
1675: register struct blk *hdr;
1676: register char *ptr;
1677: all++;
1678: nbytes += size;
1679: ptr = malloc((unsigned)size);
1680: if(ptr == 0){
1681: garbage("salloc");
1682: if((ptr = malloc((unsigned)size)) == 0)
1683: ospace("salloc");
1684: }
1685: if((hdr = hfree) == 0)hdr = morehd();
1686: hfree = (struct blk *)hdr->rd;
1687: hdr->rd = hdr->wt = hdr->beg = ptr;
1688: hdr->last = ptr+size;
1689: return(hdr);
1690: }
1691: struct blk *
1692: morehd(){
1693: register struct blk *h,*kk;
1694: headmor++;
1695: nbytes += HEADSZ;
1696: hfree = h = (struct blk *)malloc(HEADSZ);
1697: if(hfree == 0){
1698: garbage("morehd");
1699: if((hfree = h = (struct blk *)malloc(HEADSZ)) == 0)
1700: ospace("headers");
1701: }
1702: kk = h;
1703: while(h<hfree+(HEADSZ/BLK))(h++)->rd = (char *)++kk;
1704: (--h)->rd=0;
1705: return(hfree);
1706: }
1707: /*
1708: sunputc(hptr)
1709: struct blk *hptr;
1710: {
1711: hptr->wt--;
1712: hptr->rd = hptr->wt;
1713: return(*hptr->wt);
1714: }
1715: */
1716: struct blk *
1717: copy(hptr,size)
1718: struct blk *hptr;
1719: int size;
1720: {
1721: register struct blk *hdr;
1722: register unsigned sz;
1723: register char *ptr;
1724:
1725: all++;
1726: nbytes += size;
1727: sz = length(hptr);
1728: ptr = nalloc(hptr->beg, (unsigned)size);
1729: if(ptr == 0){
1730: garbage("copy");
1731: if((ptr = nalloc(hptr->beg, (unsigned)size)) == NULL){
1732: printf("copy size %d\n",size);
1733: ospace("copy");
1734: }
1735: }
1736: if((hdr = hfree) == 0)hdr = morehd();
1737: hfree = (struct blk *)hdr->rd;
1738: hdr->rd = hdr->beg = ptr;
1739: hdr->last = ptr+size;
1740: hdr->wt = ptr+sz;
1741: ptr = hdr->wt;
1742: while(ptr<hdr->last)*ptr++ = '\0';
1743: return(hdr);
1744: }
1745: sdump(s1,hptr)
1746: char *s1;
1747: struct blk *hptr;
1748: {
1749: char *p;
1750: printf("%s %o rd %o wt %o beg %o last %o\n",s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last);
1751: p = hptr->beg;
1752: while(p < hptr->wt)printf("%d ",*p++);
1753: printf("\n");
1754: }
1755: seekc(hptr,n)
1756: struct blk *hptr;
1757: {
1758: register char *nn,*p;
1759:
1760: nn = hptr->beg+n;
1761: if(nn > hptr->last){
1762: nbytes += nn - hptr->last;
1763: free(hptr->beg);
1764: p = realloc(hptr->beg, (unsigned)n);
1765: if(p == 0){
1766: hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg));
1767: garbage("seekc");
1768: if((p = realloc(hptr->beg, (unsigned)n)) == 0)
1769: ospace("seekc");
1770: }
1771: hptr->beg = p;
1772: hptr->wt = hptr->last = hptr->rd = p+n;
1773: return;
1774: }
1775: hptr->rd = nn;
1776: if(nn>hptr->wt)hptr->wt = nn;
1777: return;
1778: }
1779: salterwd(hptr,n)
1780: struct wblk *hptr;
1781: struct blk *n;
1782: {
1783: if(hptr->rdw == hptr->lastw)more(hptr);
1784: *hptr->rdw++ = n;
1785: if(hptr->rdw > hptr->wtw)hptr->wtw = hptr->rdw;
1786: return;
1787: }
1788: more(hptr)
1789: struct blk *hptr;
1790: {
1791: register unsigned size;
1792: register char *p;
1793:
1794: if((size=(hptr->last-hptr->beg)*2) == 0)size=1;
1795: nbytes += size/2;
1796: free(hptr->beg);
1797: p = realloc(hptr->beg, (unsigned)size);
1798: if(p == 0){
1799: hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg));
1800: garbage("more");
1801: if((p = realloc(hptr->beg,size)) == 0)
1802: ospace("more");
1803: }
1804: hptr->rd = hptr->rd-hptr->beg+p;
1805: hptr->wt = hptr->wt-hptr->beg+p;
1806: hptr->beg = p;
1807: hptr->last = p+size;
1808: return;
1809: }
1810: ospace(s)
1811: char *s;
1812: {
1813: printf("out of space: %s\n",s);
1814: printf("all %ld rel %ld headmor %ld\n",all,rel,headmor);
1815: printf("nbytes %ld\n",nbytes);
1816: sdump("stk",*stkptr);
1817: abort();
1818: }
1819: garbage(s)
1820: char *s;
1821: {
1822: int i;
1823: struct blk *p, *q;
1824: struct sym *tmps;
1825: int ct;
1826:
1827: /* printf("got to garbage %s\n",s); */
1828: for(i=0;i<TBLSZ;i++){
1829: tmps = stable[i];
1830: if(tmps != 0){
1831: if(i < ARRAYST){
1832: do {
1833: p = tmps->val;
1834: if(((int)p->beg & 01) != 0){
1835: printf("string %o\n",i);
1836: sdump("odd beg",p);
1837: }
1838: redef(p);
1839: tmps = tmps->next;
1840: } while(tmps != 0);
1841: continue;
1842: }
1843: else {
1844: do {
1845: p = tmps->val;
1846: rewind(p);
1847: ct = 0;
1848: while((q = getwd(p)) != NULL){
1849: ct++;
1850: if(q != 0){
1851: if(((int)q->beg & 01) != 0){
1852: printf("array %o elt %d odd\n",i-ARRAYST,ct);
1853: printf("tmps %o p %o\n",tmps,p);
1854: sdump("elt",q);
1855: }
1856: redef(q);
1857: }
1858: }
1859: tmps = tmps->next;
1860: } while(tmps != 0);
1861: }
1862: }
1863: }
1864: }
1865: redef(p)
1866: struct blk *p;
1867: {
1868: register offset;
1869: register char *newp;
1870:
1871: if ((int)p->beg&01) {
1872: printf("odd ptr %o hdr %o\n",p->beg,p);
1873: ospace("redef-bad");
1874: }
1875: free(p->beg);
1876: free(dummy);
1877: dummy = malloc(1);
1878: if(dummy == NULL)ospace("dummy");
1879: newp = realloc(p->beg, (unsigned)(p->last-p->beg));
1880: if(newp == NULL)ospace("redef");
1881: offset = newp - p->beg;
1882: p->beg = newp;
1883: p->rd += offset;
1884: p->wt += offset;
1885: p->last += offset;
1886: }
1887:
1888: release(p)
1889: register struct blk *p;
1890: {
1891: rel++;
1892: nbytes -= p->last - p->beg;
1893: p->rd = (char *)hfree;
1894: hfree = p;
1895: free(p->beg);
1896: }
1897:
1898: struct blk *
1899: getwd(p)
1900: struct blk *p;
1901: {
1902: register struct wblk *wp;
1903:
1904: wp = (struct wblk *)p;
1905: if (wp->rdw == wp->wtw)
1906: return(NULL);
1907: return(*wp->rdw++);
1908: }
1909:
1910: putwd(p, c)
1911: struct blk *p, *c;
1912: {
1913: register struct wblk *wp;
1914:
1915: wp = (struct wblk *)p;
1916: if (wp->wtw == wp->lastw)
1917: more(p);
1918: *wp->wtw++ = c;
1919: }
1920:
1921: struct blk *
1922: lookwd(p)
1923: struct blk *p;
1924: {
1925: register struct wblk *wp;
1926:
1927: wp = (struct wblk *)p;
1928: if (wp->rdw == wp->wtw)
1929: return(NULL);
1930: return(*wp->rdw);
1931: }
1932: char *
1933: nalloc(p,nbytes)
1934: register char *p;
1935: unsigned nbytes;
1936: {
1937: char *malloc();
1938: register char *q, *r;
1939: q = r = malloc(nbytes);
1940: if(q==0)
1941: return(0);
1942: while(nbytes--)
1943: *q++ = *p++;
1944: return(r);
1945: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.