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