6 struct label *labtab = ltab;
7 char CGMES[] = "sed: Command garbled: %s\n";
8 char TMMES[] = "sed: Too much text: %s\n";
9 char LTL[] = "sed: Label too long: %s\n";
10 char AD0MES[] = "sed: No addresses allowed: %s\n";
11 char AD1MES[] = "sed: Only one address allowed: %s\n";
23 main(int argc, char **argv)
27 eargv = (uchar**)argv;
32 lab = labtab + 1; /* 0 reserved for end-pointer */
34 rep->r1.ad1 = respace;
35 lbend = &linebuf[LBSIZE];
36 hend = &holdsp[LBSIZE];
37 lcomend = &genbuf[64];
38 ptrend = &ptrspace[PTRSIZE];
39 reend = &respace[RESIZE];
40 labend = &labtab[LABSIZE];
54 while (--eargc > 0 && (++eargv)[0][0] == '-')
55 switch (eargv[0][1]) {
62 if(eargc-- <= 0) exit(2);
64 if((fin = fopen((char*)(*++eargv), "r")) == NULL) {
65 fprintf(stderr, "sed: Cannot open pattern-file: %s\n", *eargv);
84 fprintf(stderr, "sed: Unknown flag: %c\n", eargv[0][1]);
100 fprintf(stderr, "sed: Too many {'s\n");
104 labtab->address = rep;
108 /* abort(); /*DEBUG*/
111 execute((uchar *)NULL);
112 else while(--eargc >= 0) {
123 uchar *address(uchar*);
124 union reptr *pt, *pt1;
131 if(rline(linebuf) < 0) {
135 if(*linebuf == '#') {
136 if(linebuf[1] == 'n')
145 if(rline(linebuf) < 0) break;
150 /* fprintf(stdout, "cp: %s\n", cp); /*DEBUG*/
151 while(*cp == ' ' || *cp == '\t') cp++;
152 if(*cp == '\0' || *cp == '#') continue;
158 p = address(rep->r1.ad1);
160 fprintf(stderr, CGMES, linebuf);
168 if(p == rep->r1.ad1) {
172 fprintf(stderr, "sed: First RE may not be null\n");
176 if(*rep->r1.ad1 != CLNUM && *rep->r1.ad1 != CEND)
178 if(*cp == ',' || *cp == ';') {
180 if((rep->r1.ad2 = p) > reend) {
181 fprintf(stderr, TMMES, linebuf);
184 p = address(rep->r1.ad2);
185 if(p == badp || p == 0) {
186 fprintf(stderr, CGMES, linebuf);
192 if(*rep->r1.ad2 != CLNUM && *rep->r1.ad2 != CEND)
201 fprintf(stderr, "sed: Too much text: %s\n", linebuf);
205 while(*cp == ' ' || *cp == '\t') cp++;
211 /*fprintf(stderr, "cp = %d; *cp = %o\n", cp - linebuf, *cp);*/
212 fprintf(stderr, "sed: Unrecognized command: %s\n", linebuf);
220 rep->r1.command = BCOM;
221 rep->r1.negfl = !(rep->r1.negfl);
222 cmpend[depth++] = &rep->r2.lb1;
223 if(++rep >= ptrend) {
224 fprintf(stderr, "sed: Too many commands: %s\n", linebuf);
228 if(*cp == '\0') continue;
234 fprintf(stderr, AD0MES, linebuf);
239 fprintf(stderr, "sed: Too many }'s\n");
242 *cmpend[depth] = rep;
245 if(*cp == 0) continue;
249 rep->r1.command = EQCOM;
251 fprintf(stderr, AD1MES, linebuf);
258 fprintf(stderr, AD0MES, linebuf);
267 while((*tp = *cp++) && *tp != ';')
268 if(++tp >= &(lab->asc[8])) {
269 fprintf(stderr, LTL, linebuf);
274 fprintf(stderr, CGMES, linebuf);
278 if(lpt = search(lab)) {
280 fprintf(stderr, "sed: Duplicate labels: %s\n", linebuf);
286 if(++lab >= labend) {
287 fprintf(stderr, "sed: Too many labels: %s\n", linebuf);
297 rep->r1.command = ACOM;
299 fprintf(stderr, AD1MES, linebuf);
302 if(*cp == '\\') cp++;
304 fprintf(stderr, CGMES, linebuf);
308 p = text(rep->r1.re1);
311 rep->r1.command = CCOM;
312 if(*cp == '\\') cp++;
313 if(*cp++ != ('\n')) {
314 fprintf(stderr, CGMES, linebuf);
318 p = text(rep->r1.re1);
321 rep->r1.command = ICOM;
323 fprintf(stderr, AD1MES, linebuf);
326 if(*cp == '\\') cp++;
327 if(*cp++ != ('\n')) {
328 fprintf(stderr, CGMES, linebuf);
332 p = text(rep->r1.re1);
336 rep->r1.command = GCOM;
340 rep->r1.command = CGCOM;
344 rep->r1.command = HCOM;
348 rep->r1.command = CHCOM;
352 rep->r1.command = TCOM;
356 rep->r1.command = BCOM;
362 if(pt = labtab->chain) {
363 while(pt1 = pt->r2.lb1)
371 while((*tp = *cp++) && *tp != ';')
372 if(++tp >= &(lab->asc[8])) {
373 fprintf(stderr, LTL, linebuf);
379 fprintf(stderr, CGMES, linebuf);
383 if(lpt = search(lab)) {
385 rep->r2.lb1 = lpt->address;
388 while(pt1 = pt->r2.lb1)
395 if(++lab >= labend) {
396 fprintf(stderr, "sed: Too many labels: %s\n", linebuf);
403 rep->r1.command = NCOM;
407 rep->r1.command = CNCOM;
411 rep->r1.command = PCOM;
415 rep->r1.command = CPCOM;
419 rep->r1.command = RCOM;
421 fprintf(stderr, AD1MES, linebuf);
425 fprintf(stderr, CGMES, linebuf);
429 p = text(rep->r1.re1);
433 rep->r1.command = DCOM;
437 rep->r1.command = CDCOM;
438 rep->r2.lb1 = ptrspace;
442 rep->r1.command = QCOM;
444 fprintf(stderr, AD1MES, linebuf);
450 rep->r1.command = LCOM;
454 rep->r1.command = SCOM;
457 p = compile(rep->r1.re1);
459 fprintf(stderr, CGMES, linebuf);
462 if(p == rep->r1.re1) {
464 fprintf(stderr, "sed: First RE may not be null.\n");
472 if((rep->r1.rhs = p) > reend) {
473 fprintf(stderr, TMMES, linebuf);
477 if((p = compsub(rep->r1.rhs)) == badp) {
478 fprintf(stderr, CGMES, linebuf);
500 fprintf(stderr, CGMES, linebuf);
503 if(nfiles >= MAXFILES) {
504 fprintf(stderr, "sed: Too many files in w commands 1 \n");
508 text((uchar*)fname[nfiles]);
509 for(i = nfiles - 1; i >= 0; i--)
510 if(cmp((uchar*)fname[nfiles],(uchar*)fname[i]) == 0) {
511 rep->r1.fcode = fcode[i];
514 if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) {
515 fprintf(stderr, "sed: Cannot open %s\n", fname[nfiles]);
518 fcode[nfiles++] = rep->r1.fcode;
523 rep->r1.command = WCOM;
525 fprintf(stderr, CGMES, linebuf);
528 if(nfiles >= MAXFILES){
529 fprintf(stderr, "sed: Too many files in w commands 2 \n");
530 fprintf(stderr, "nfiles = %d; MAXF = %d\n", nfiles, MAXFILES);
534 text((uchar*)fname[nfiles]);
535 for(i = nfiles - 1; i >= 0; i--)
536 if(cmp((uchar*)fname[nfiles], (uchar*)fname[i]) == 0) {
537 rep->r1.fcode = fcode[i];
541 if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) {
542 fprintf(stderr, "sed: Cannot create %s\n", fname[nfiles]);
545 fcode[nfiles++] = rep->r1.fcode;
549 rep->r1.command = XCOM;
553 rep->r1.command = YCOM;
556 p = ycomp(rep->r1.re1);
558 fprintf(stderr, CGMES, linebuf);
562 fprintf(stderr, TMMES, linebuf);
569 if(++rep >= ptrend) {
570 fprintf(stderr, "sed: Too many commands, last: %s\n", linebuf);
579 fprintf(stderr, CGMES, linebuf);
587 compsub(uchar *rhsbuf)
593 if((*p = *q++) == '\\') {
595 if(*p >= '1' && *p <= '9' && *p > numbra + '0')
599 } else if(*p == seof) {
612 compile(uchar *expbuf)
617 uchar *lastep, *cstart;
620 uchar bracket[NBRA], *bracketp;
643 if((c = *sp++) == seof) {
644 if(bracketp != bracket) {
657 if((c = *sp++) == '(') {
662 *bracketp++ = numbra;
668 if(bracketp <= bracket) {
678 if(c >= '1' && c <= '9') {
679 if((c -= '1') >= closed)
707 if(*lastep == CKET) {
721 if(&ep[33] >= reend) {
722 fprintf(stderr, "sed: RE too long: %s\n", linebuf);
729 if((c = *sp++) == '^') {
737 fprintf(stderr, CGMES, linebuf);
740 if (c=='-' && sp>cstart && *sp!=']') {
741 for (c = sp[-2]; c<*sp; c++)
742 ep[c>>3] |= bittab[c&07];
752 ep[c >> 3] |= bittab[c & 07];
753 } while((c = *sp++) != ']');
756 for(cclcnt = 0; cclcnt < 32; cclcnt++)
788 if((*++p = *q++) == '\0') {
803 if((q = saveq) == 0) return(-1);
807 if((*++p = *q++) == '0') {
823 while((t = getc(fin)) != EOF) {
829 else if(*p == '\n') {
839 address(uchar *expbuf)
854 return(compile(expbuf));
860 while(*rcp >= '0' && *rcp <= '9')
861 lno = lno*10 + *rcp++ - '0';
865 fprintf(stderr, "sed: line number 0 is illegal\n");
870 *expbuf++ = lno >> 8;
871 *expbuf++ = lno >> 16;
872 *expbuf++ = lno >> 24;
880 cmp(uchar *a, uchar *b)
887 while(*++ra == *++rb)
888 if(*ra == '\0') return(0);
899 while(*q == '\t' || *q == ' ') q++;
902 if((*p = *q++) == '\\')
909 while(*q == '\t' || *q == ' ') q++;
917 search(struct label *ptr)
923 if(cmp(rp->asc, ptr->asc) == 0)
935 union reptr *rptr, *trptr;
937 for(lptr = labtab; lptr < lab; lptr++) {
939 if(lptr->address == 0) {
940 fprintf(stderr, "sed: Undefined label: %s\n", lptr->asc);
946 while(trptr = rptr->r2.lb1) {
947 rptr->r2.lb1 = lptr->address;
950 rptr->r2.lb1 = lptr->address;
964 for(tsp = cp; *tsp != seof; tsp++) {
967 if(*tsp == '\n' || *tsp == '\0')
972 while((c = *sp++) != seof) {
973 if(c == '\\' && *sp == 'n') {
977 if((ep[c] = *tsp++) == '\\' && *tsp == 'n') {
981 if(ep[c] == seof || ep[c] == '\0')
988 for(c = 0; c<0400; c++)