|
|
1.1 root 1: #include <stdio.h>
2: #include "sed.h"
3:
4: struct label *labtab = ltab;
5: char CGMES[] = "sed: Command garbled: %s\n";
6: char TMMES[] = "sed: Too much text: %s\n";
7: char LTL[] = "sed: Label too long: %s\n";
8: char AD0MES[] = "sed: No addresses allowed: %s\n";
9: char AD1MES[] = "sed: Only one address allowed: %s\n";
10: char bittab[] = {
11: 1,
12: 2,
13: 4,
14: 8,
15: 16,
16: 32,
17: 64,
18: 128
19: };
20:
21: main(argc, argv)
22: char *argv[];
23: {
24:
25: eargc = argc;
26: eargv = argv;
27:
28: badp = &bad;
29: aptr = abuf;
30: hspend = holdsp;
31: lab = labtab + 1; /* 0 reserved for end-pointer */
32: rep = ptrspace;
33: rep->r1.ad1 = respace;
34: lbend = &linebuf[LBSIZE];
35: hend = &holdsp[LBSIZE];
36: lcomend = &genbuf[71];
37: ptrend = &ptrspace[PTRSIZE];
38: reend = &respace[RESIZE];
39: labend = &labtab[LABSIZE];
40: lnum = 0;
41: pending = 0;
42: depth = 0;
43: spend = linebuf;
44: hspend = holdsp;
45: fcode[0] = stdout;
46: nfiles = 1;
47: lastre = NULL;
48:
49: if(eargc == 1)
50: exit(0);
51:
52:
53: while (--eargc > 0 && (++eargv)[0][0] == '-')
54: switch (eargv[0][1]) {
55:
56: case 'n':
57: nflag++;
58: continue;
59:
60: case 'f':
61: if(eargc-- <= 0) exit(2);
62:
63: if((fin = fopen(*++eargv, "r")) == NULL) {
64: fprintf(stderr, "sed: Cannot open pattern-file: %s\n", *eargv);
65: exit(2);
66: }
67:
68: fcomp();
69: fclose(fin);
70: continue;
71:
72: case 'e':
73: eflag++;
74: fcomp();
75: eflag = 0;
76: continue;
77:
78: case 'g':
79: gflag++;
80: continue;
81:
82: default:
83: fprintf(stderr, "sed: Unknown flag: %c\n", eargv[0][1]);
84: continue;
85: }
86:
87:
88: if(compfl == 0) {
89: eargv--;
90: eargc++;
91: eflag++;
92: fcomp();
93: eargv++;
94: eargc--;
95: eflag = 0;
96: }
97:
98: if(depth) {
99: fprintf(stderr, "sed: Too many {'s\n");
100: exit(2);
101: }
102:
103: labtab->address = rep;
104:
105: dechain();
106:
107: /* abort(); /*DEBUG*/
108:
109: if(eargc <= 0)
110: execute((char *)NULL);
111: else while(--eargc >= 0) {
112: execute(*eargv++);
113: }
114: fclose(stdout);
115: exit(0);
116: }
117: fcomp()
118: {
119:
120: register char *p, *op, *tp;
121: char *address();
122: union reptr *pt, *pt1;
123: int i;
124: struct label *lpt;
125:
126: compfl = 1;
127: op = lastre;
128:
129: if(rline(linebuf) < 0) {
130: lastre = op;
131: return;
132: }
133: if(*linebuf == '#') {
134: if(linebuf[1] == 'n')
135: nflag = 1;
136: }
137: else {
138: cp = linebuf;
139: goto comploop;
140: }
141:
142: for(;;) {
143: if(rline(linebuf) < 0) break;
144:
145: cp = linebuf;
146:
147: comploop:
148: /* fprintf(stdout, "cp: %s\n", cp); /*DEBUG*/
149: while(*cp == ' ' || *cp == '\t') cp++;
150: if(*cp == '\0' || *cp == '#') continue;
151: if(*cp == ';') {
152: cp++;
153: goto comploop;
154: }
155:
156: p = address(rep->r1.ad1);
157: if(p == badp) {
158: fprintf(stderr, CGMES, linebuf);
159: exit(2);
160: }
161:
162: if(p == 0) {
163: p = rep->r1.ad1;
164: rep->r1.ad1 = 0;
165: } else {
166: if(p == rep->r1.ad1) {
167: if(op)
168: rep->r1.ad1 = op;
169: else {
170: fprintf(stderr, "sed: First RE may not be null\n");
171: exit(2);
172: }
173: }
174: op = rep->r1.ad1;
175: if(*cp == ',' || *cp == ';') {
176: cp++;
177: if((rep->r1.ad2 = p) > reend) {
178: fprintf(stderr,"1st\n");
179: fprintf(stderr, TMMES, linebuf);
180: exit(2);
181: }
182: p = address(rep->r1.ad2);
183: if(p == badp || p == 0) {
184: fprintf(stderr, CGMES, linebuf);
185: exit(2);
186: }
187: if(p == rep->r1.ad2)
188: rep->r1.ad2 = op;
189: else
190: op = rep->r1.ad2;
191:
192: } else
193: rep->r1.ad2 = 0;
194: }
195:
196: if(p > reend) {
197: fprintf(stderr,"1a\n");
198: fprintf(stderr, "sed: Too much text: %s\n", linebuf);
199: exit(2);
200: }
201:
202: while(*cp == ' ' || *cp == '\t') cp++;
203:
204: swit:
205: switch(*cp++) {
206:
207: default:
208: /*fprintf(stderr, "cp = %d; *cp = %o\n", cp - linebuf, *cp);*/
209: fprintf(stderr, "sed: Unrecognized command: %s\n", linebuf);
210: exit(2);
211:
212: case '!':
213: rep->r1.negfl = 1;
214: goto swit;
215:
216: case '{':
217: rep->r1.command = BCOM;
218: rep->r1.negfl = !(rep->r1.negfl);
219: cmpend[depth++] = &rep->r2.lb1;
220: if(++rep >= ptrend) {
221: fprintf(stderr, "sed: Too many commands: %s\n", linebuf);
222: exit(2);
223: }
224: rep->r1.ad1 = p;
225: if(*cp == '\0') continue;
226:
227: goto comploop;
228:
229: case '}':
230: if(rep->r1.ad1) {
231: fprintf(stderr, AD0MES, linebuf);
232: exit(2);
233: }
234:
235: if(--depth < 0) {
236: fprintf(stderr, "sed: Too many }'s\n");
237: exit(2);
238: }
239: *cmpend[depth] = rep;
240:
241: rep->r1.ad1 = p;
242: if(*cp == 0) continue;
243: goto comploop;
244:
245: case '=':
246: rep->r1.command = EQCOM;
247: if(rep->r1.ad2) {
248: fprintf(stderr, AD1MES, linebuf);
249: exit(2);
250: }
251: break;
252:
253: case ':':
254: if(rep->r1.ad1) {
255: fprintf(stderr, AD0MES, linebuf);
256: exit(2);
257: }
258:
259: while(*cp++ == ' ');
260: cp--;
261:
262:
263: tp = lab->asc;
264: while((*tp++ = *cp++))
265: if(tp >= &(lab->asc[8])) {
266: fprintf(stderr, LTL, linebuf);
267: exit(2);
268: }
269: *--tp = '\0';
270:
271: if(lpt = search(lab)) {
272: if(lpt->address) {
273: fprintf(stderr, "sed: Duplicate labels: %s\n", linebuf);
274: exit(2);
275: }
276: } else {
277: lab->chain = 0;
278: lpt = lab;
279: if(++lab >= labend) {
280: fprintf(stderr, "sed: Too many labels: %s\n", linebuf);
281: exit(2);
282: }
283: }
284: lpt->address = rep;
285: rep->r1.ad1 = p;
286:
287: continue;
288:
289: case 'a':
290: rep->r1.command = ACOM;
291: if(rep->r1.ad2) {
292: fprintf(stderr, AD1MES, linebuf);
293: exit(2);
294: }
295: if(*cp == '\\') cp++;
296: if(*cp++ != '\n') {
297: fprintf(stderr, CGMES, linebuf);
298: exit(2);
299: }
300: rep->r1.re1 = p;
301: p = text(rep->r1.re1);
302: break;
303: case 'c':
304: rep->r1.command = CCOM;
305: if(*cp == '\\') cp++;
306: if(*cp++ != ('\n')) {
307: fprintf(stderr, CGMES, linebuf);
308: exit(2);
309: }
310: rep->r1.re1 = p;
311: p = text(rep->r1.re1);
312: break;
313: case 'i':
314: rep->r1.command = ICOM;
315: if(rep->r1.ad2) {
316: fprintf(stderr, AD1MES, linebuf);
317: exit(2);
318: }
319: if(*cp == '\\') cp++;
320: if(*cp++ != ('\n')) {
321: fprintf(stderr, CGMES, linebuf);
322: exit(2);
323: }
324: rep->r1.re1 = p;
325: p = text(rep->r1.re1);
326: break;
327:
328: case 'g':
329: rep->r1.command = GCOM;
330: break;
331:
332: case 'G':
333: rep->r1.command = CGCOM;
334: break;
335:
336: case 'h':
337: rep->r1.command = HCOM;
338: break;
339:
340: case 'H':
341: rep->r1.command = CHCOM;
342: break;
343:
344: case 't':
345: rep->r1.command = TCOM;
346: goto jtcommon;
347:
348: case 'b':
349: rep->r1.command = BCOM;
350: jtcommon:
351: while(*cp++ == ' ');
352: cp--;
353:
354: if(*cp == '\0') {
355: if(pt = labtab->chain) {
356: while(pt1 = pt->r2.lb1)
357: pt = pt1;
358: pt->r2.lb1 = rep;
359: } else
360: labtab->chain = rep;
361: break;
362: }
363: tp = lab->asc;
364: while((*tp++ = *cp++))
365: if(tp >= &(lab->asc[8])) {
366: fprintf(stderr, LTL, linebuf);
367: exit(2);
368: }
369: cp--;
370: *--tp = '\0';
371:
372: if(lpt = search(lab)) {
373: if(lpt->address) {
374: rep->r2.lb1 = lpt->address;
375: } else {
376: pt = lpt->chain;
377: while(pt1 = pt->r2.lb1)
378: pt = pt1;
379: pt->r2.lb1 = rep;
380: }
381: } else {
382: lab->chain = rep;
383: lab->address = 0;
384: if(++lab >= labend) {
385: fprintf(stderr, "sed: Too many labels: %s\n", linebuf);
386: exit(2);
387: }
388: }
389: break;
390:
391: case 'n':
392: rep->r1.command = NCOM;
393: break;
394:
395: case 'N':
396: rep->r1.command = CNCOM;
397: break;
398:
399: case 'p':
400: rep->r1.command = PCOM;
401: break;
402:
403: case 'P':
404: rep->r1.command = CPCOM;
405: break;
406:
407: case 'r':
408: rep->r1.command = RCOM;
409: if(rep->r1.ad2) {
410: fprintf(stderr, AD1MES, linebuf);
411: exit(2);
412: }
413: if(*cp++ != ' ') {
414: fprintf(stderr, CGMES, linebuf);
415: exit(2);
416: }
417: rep->r1.re1 = p;
418: p = text(rep->r1.re1);
419: break;
420:
421: case 'd':
422: rep->r1.command = DCOM;
423: break;
424:
425: case 'D':
426: rep->r1.command = CDCOM;
427: rep->r2.lb1 = ptrspace;
428: break;
429:
430: case 'q':
431: rep->r1.command = QCOM;
432: if(rep->r1.ad2) {
433: fprintf(stderr, AD1MES, linebuf);
434: exit(2);
435: }
436: break;
437:
438: case 'l':
439: rep->r1.command = LCOM;
440: break;
441:
442: case 's':
443: rep->r1.command = SCOM;
444: seof = *cp++;
445: rep->r1.re1 = p;
446: p = compile(rep->r1.re1);
447: if(p == badp) {
448: fprintf(stderr, CGMES, linebuf);
449: exit(2);
450: }
451: if(p == rep->r1.re1) {
452: if(op == NULL) {
453: fprintf(stderr, "sed: First RE may not be null.\n");
454: exit(2);
455: }
456: rep->r1.re1 = op;
457: } else {
458: op = rep->r1.re1;
459: }
460:
461: if((rep->r1.rhs = p) > reend) {
462: fprintf(stderr,"2nd\n");
463: fprintf(stderr, TMMES, linebuf);
464: exit(2);
465: }
466:
467: if((p = compsub(rep->r1.rhs)) == badp) {
468: fprintf(stderr, CGMES, linebuf);
469: exit(2);
470: }
471: if(*cp == 'g') {
472: cp++;
473: rep->r1.gfl++;
474: } else if(gflag)
475: rep->r1.gfl++;
476:
477: if(*cp == 'p') {
478: cp++;
479: rep->r1.pfl = 1;
480: }
481:
482: if(*cp == 'P') {
483: cp++;
484: rep->r1.pfl = 2;
485: }
486:
487: if(*cp == 'w') {
488: cp++;
489: if(*cp++ != ' ') {
490: fprintf(stderr, CGMES, linebuf);
491: exit(2);
492: }
493: if(nfiles >= MAXFILES) {
494: fprintf(stderr, "sed: Too many files in w commands 1 \n");
495: exit(2);
496: }
497:
498: text(fname[nfiles]);
499: for(i = nfiles - 1; i >= 0; i--)
500: if(cmp(fname[nfiles],fname[i]) == 0) {
501: rep->r1.fcode = fcode[i];
502: goto done;
503: }
504: if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) {
505: fprintf(stderr, "sed: Cannot open %s\n", fname[nfiles]);
506: exit(2);
507: }
508: fcode[nfiles++] = rep->r1.fcode;
509: }
510: break;
511:
512: case 'w':
513: rep->r1.command = WCOM;
514: if(*cp++ != ' ') {
515: fprintf(stderr, CGMES, linebuf);
516: exit(2);
517: }
518: if(nfiles >= MAXFILES){
519: fprintf(stderr, "sed: Too many files in w commands 2 \n");
520: fprintf(stderr, "nfiles = %d; MAXF = %d\n", nfiles, MAXFILES);
521: exit(2);
522: }
523:
524: text(fname[nfiles]);
525: for(i = nfiles - 1; i >= 0; i--)
526: if(cmp(fname[nfiles], fname[i]) == 0) {
527: rep->r1.fcode = fcode[i];
528: goto done;
529: }
530:
531: if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) {
532: fprintf(stderr, "sed: Cannot create %s\n", fname[nfiles]);
533: exit(2);
534: }
535: fcode[nfiles++] = rep->r1.fcode;
536: break;
537:
538: case 'x':
539: rep->r1.command = XCOM;
540: break;
541:
542: case 'y':
543: rep->r1.command = YCOM;
544: seof = *cp++;
545: rep->r1.re1 = p;
546: p = ycomp(rep->r1.re1);
547: if(p == badp) {
548: fprintf(stderr, CGMES, linebuf);
549: exit(2);
550: }
551: if(p > reend) {
552: fprintf(stderr,"3rd\n");
553: fprintf(stderr, TMMES, linebuf);
554: exit(2);
555: }
556: break;
557:
558: }
559: done:
560: if(++rep >= ptrend) {
561: fprintf(stderr, "sed: Too many commands, last: %s\n", linebuf);
562: exit(2);
563: }
564:
565: rep->r1.ad1 = p;
566:
567: if(*cp++ != '\0') {
568: if(cp[-1] == ';')
569: goto comploop;
570: fprintf(stderr, CGMES, linebuf);
571: exit(2);
572: }
573:
574: }
575: }
576: char *
577: compsub(rhsbuf)
578: char *rhsbuf;
579: {
580: register char *p, *q;
581:
582: p = rhsbuf;
583: q = cp;
584: for(;;) {
585: if((*p = *q++) == '\\') {
586: *p = *q++;
587: if(*p > numbra + '0' && *p <= '9')
588: return(badp);
589: if(*p == 'n')
590: *p = '\n';
591: if(*p == 'b'){
592: *p++ = '\b';
593: continue;
594: }
595: *p++ |= 0200;
596: continue;
597: }
598: if(*p == seof) {
599: *p++ = '\0';
600: cp = q;
601: return(p);
602: }
603: if(*p++ == '\0') {
604: return(badp);
605: }
606:
607: }
608: }
609:
610: char *
611: compile(expbuf)
612: char *expbuf;
613: {
614: register c;
615: register char *ep, *sp;
616: char neg;
617: char *lastep, *cstart;
618: int cclcnt;
619: int closed;
620: char bracket[NBRA], *bracketp;
621:
622: if(*cp == seof) {
623: cp++;
624: return(expbuf);
625: }
626:
627: ep = expbuf;
628: lastep = 0;
629: bracketp = bracket;
630: closed = numbra = 0;
631: sp = cp;
632: if (*sp == '^') {
633: *ep++ = 1;
634: sp++;
635: } else {
636: *ep++ = 0;
637: }
638: for (;;) {
639: if (ep >= reend) {
640: cp = sp;
641: return(badp);
642: }
643: if((c = *sp++) == seof) {
644: if(bracketp != bracket) {
645: cp = sp;
646: return(badp);
647: }
648: cp = sp;
649: *ep++ = CEOF;
650: return(ep);
651: }
652: if(c != '*')
653: lastep = ep;
654: switch (c) {
655:
656: case '\\':
657: if((c = *sp++) == '(') {
658: if(numbra >= NBRA) {
659: cp = sp;
660: return(badp);
661: }
662: *bracketp++ = numbra;
663: *ep++ = CBRA;
664: *ep++ = numbra++;
665: continue;
666: }
667: if(c == ')') {
668: if(bracketp <= bracket) {
669: cp = sp;
670: return(badp);
671: }
672: *ep++ = CKET;
673: *ep++ = *--bracketp;
674: closed++;
675: continue;
676: }
677:
678: if(c >= '1' && c <= '9') {
679: if((c -= '1') >= closed)
680: return(badp);
681:
682: *ep++ = CBACK;
683: *ep++ = c;
684: continue;
685: }
686: if(c == '\n') {
687: cp = sp;
688: return(badp);
689: }
690: if(c == 'n') {
691: c = '\n';
692: }
693: if(c == 'b'){
694: c = '\b';
695: }
696: goto defchar;
697:
698: case '\0':
699: case '\n':
700: cp = sp;
701: return(badp);
702:
703: case '.':
704: *ep++ = CDOT;
705: continue;
706:
707: case '*':
708: if (lastep == 0)
709: goto defchar;
710: if(*lastep == CKET) {
711: cp = sp;
712: return(badp);
713: }
714: *lastep |= STAR;
715: continue;
716:
717: case '$':
718: if (*sp != seof)
719: goto defchar;
720: *ep++ = CDOL;
721: continue;
722:
723: case '[':
724: if(&ep[17] >= reend) {
725: fprintf(stderr, "sed: RE too long: %s\n", linebuf);
726: exit(2);
727: }
728:
729: *ep++ = CCL;
730:
731: neg = 0;
732: if((c = *sp++) == '^') {
733: neg = 1;
734: c = *sp++;
735: }
736:
737: cstart = sp;
738: do {
739: if(c == '\0') {
740: fprintf(stderr, CGMES, linebuf);
741: exit(2);
742: }
743: if (c=='-' && sp>cstart && *sp!=']') {
744: for (c = sp[-2]; c<*sp; c++)
745: ep[c>>3] |= bittab[c&07];
746: }
747: if(c == '\\') {
748: switch(c = *sp++) {
749: case 'n':
750: c = '\n';
751: break;
752: }
753: }
754:
755: ep[c >> 3] |= bittab[c & 07];
756: } while((c = *sp++) != ']');
757:
758: if(neg)
759: for(cclcnt = 0; cclcnt < 16; cclcnt++)
760: ep[cclcnt] ^= -1;
761: ep[0] &= 0376;
762:
763: ep += 16;
764:
765: continue;
766:
767: defchar:
768: default:
769: *ep++ = CCHR;
770: *ep++ = c;
771: }
772: }
773: }
774: rline(lbuf)
775: char *lbuf;
776: {
777: register char *p, *q;
778: register t;
779: static char *saveq;
780:
781: p = lbuf - 1;
782:
783: if(eflag) {
784: if(eflag > 0) {
785: eflag = -1;
786: if(eargc-- <= 0)
787: exit(2);
788: q = *++eargv;
789: while(*++p = *q++) {
790: if(*p == '\\') {
791: if((*++p = *q++) == '\0') {
792: saveq = 0;
793: return(-1);
794: } else
795: continue;
796: }
797: if(*p == '\n') {
798: *p = '\0';
799: saveq = q;
800: return(1);
801: }
802: }
803: saveq = 0;
804: return(1);
805: }
806: if((q = saveq) == 0) return(-1);
807:
808: while(*++p = *q++) {
809: if(*p == '\\') {
810: if((*++p = *q++) == '0') {
811: saveq = 0;
812: return(-1);
813: } else
814: continue;
815: }
816: if(*p == '\n') {
817: *p = '\0';
818: saveq = q;
819: return(1);
820: }
821: }
822: saveq = 0;
823: return(1);
824: }
825:
826: while((t = getc(fin)) != EOF) {
827: *++p = t;
828: if(*p == '\\') {
829: t = getc(fin);
830: *++p = t;
831: }
832: else if(*p == '\n') {
833: *p = '\0';
834: return(1);
835: }
836: }
837: *++p = '\0';
838: return(-1);
839: }
840:
841: char *address(expbuf)
842: char *expbuf;
843: {
844: register char *rcp;
845: long lno;
846:
847: if(*cp == '$') {
848: cp++;
849: *expbuf++ = CEND;
850: *expbuf++ = CEOF;
851: return(expbuf);
852: }
853:
854: if(*cp == '/') {
855: seof = '/';
856: cp++;
857: return(compile(expbuf));
858: }
859:
860: rcp = cp;
861: lno = 0;
862:
863: while(*rcp >= '0' && *rcp <= '9')
864: lno = lno*10 + *rcp++ - '0';
865:
866: if(rcp > cp) {
867: *expbuf++ = CLNUM;
868: *expbuf++ = lno;
869: *expbuf++ = lno >> 8;
870: *expbuf++ = lno >> 16;
871: *expbuf++ = lno >> 24;
872: *expbuf++ = CEOF;
873: cp = rcp;
874: return(expbuf);
875: }
876: return(0);
877: }
878: cmp(a, b)
879: char *a,*b;
880: {
881: register char *ra, *rb;
882:
883: ra = a - 1;
884: rb = b - 1;
885:
886: while(*++ra == *++rb)
887: if(*ra == '\0') return(0);
888: return(1);
889: }
890:
891: char *text(textbuf)
892: char *textbuf;
893: {
894: register char *p, *q;
895:
896: p = textbuf;
897: q = cp;
898: while(*q == '\t' || *q == ' ') q++;
899: for(;;) {
900:
901: if((*p = *q++) == '\\')
902: *p = *q++;
903: if(*p == '\0') {
904: cp = --q;
905: return(++p);
906: }
907: if(*p == '\n') {
908: while(*q == '\t' || *q == ' ') q++;
909: }
910: p++;
911: }
912: }
913:
914:
915: struct label *search(ptr)
916: struct label *ptr;
917: {
918: struct label *rp;
919:
920: rp = labtab;
921: while(rp < ptr) {
922: if(cmp(rp->asc, ptr->asc) == 0)
923: return(rp);
924: rp++;
925: }
926:
927: return(0);
928: }
929:
930:
931: dechain()
932: {
933: struct label *lptr;
934: union reptr *rptr, *trptr;
935:
936: for(lptr = labtab; lptr < lab; lptr++) {
937:
938: if(lptr->address == 0) {
939: fprintf(stderr, "sed: Undefined label: %s\n", lptr->asc);
940: exit(2);
941: }
942:
943: if(lptr->chain) {
944: rptr = lptr->chain;
945: while(trptr = rptr->r2.lb1) {
946: rptr->r2.lb1 = lptr->address;
947: rptr = trptr;
948: }
949: rptr->r2.lb1 = lptr->address;
950: }
951: }
952: }
953:
954: char *ycomp(expbuf)
955: char *expbuf;
956: {
957: register char c, *ep, *tsp;
958: char *sp;
959:
960: ep = expbuf;
961: sp = cp;
962: for(tsp = cp; *tsp != seof; tsp++) {
963: if(*tsp == '\\')
964: tsp++;
965: if(*tsp == '\n' || *tsp == '\0')
966: return(badp);
967: }
968: tsp++;
969:
970: while((c = *sp++ & 0177) != seof) {
971: if(c == '\\' && *sp == 'n') {
972: sp++;
973: c = '\n';
974: }
975: if((ep[c] = *tsp++) == '\\' && *tsp == 'n') {
976: ep[c] = '\n';
977: tsp++;
978: }
979: if(ep[c] == seof || ep[c] == '\0')
980: return(badp);
981: }
982: if(*tsp != seof)
983: return(badp);
984: cp = ++tsp;
985:
986: for(c = 0; !(c & 0200); c++)
987: if(ep[c] == 0)
988: ep[c] = c;
989:
990: return(ep + 0200);
991: }
992:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.