1*33076Sbostic /* sed0.c 4.5 87/12/21 */ 218583Sralph 332202Sbostic #include <sys/param.h> 418583Sralph #include <stdio.h> 518583Sralph #include "sed.h" 618583Sralph 718583Sralph struct label *labtab = ltab; 818583Sralph char CGMES[] = "command garbled: %s\n"; 918583Sralph char TMMES[] = "Too much text: %s\n"; 1018583Sralph char LTL[] = "Label too long: %s\n"; 1118583Sralph char AD0MES[] = "No addresses allowed: %s\n"; 1218583Sralph char AD1MES[] = "Only one address allowed: %s\n"; 1318583Sralph char bittab[] = { 1418583Sralph 1, 1518583Sralph 2, 1618583Sralph 4, 1718583Sralph 8, 1818583Sralph 16, 1918583Sralph 32, 2018583Sralph 64, 2118583Sralph 128 2218583Sralph }; 2318583Sralph 2418583Sralph main(argc, argv) 2518583Sralph char *argv[]; 2618583Sralph { 2718583Sralph 2818583Sralph eargc = argc; 2918583Sralph eargv = argv; 3018583Sralph 3118583Sralph badp = &bad; 3218583Sralph aptr = abuf; 3318583Sralph lab = labtab + 1; /* 0 reserved for end-pointer */ 3418583Sralph rep = ptrspace; 3518583Sralph rep->ad1 = respace; 3618583Sralph lbend = &linebuf[LBSIZE]; 3718583Sralph hend = &holdsp[LBSIZE]; 3818583Sralph lcomend = &genbuf[71]; 3918583Sralph ptrend = &ptrspace[PTRSIZE]; 4018583Sralph reend = &respace[RESIZE]; 4118583Sralph labend = &labtab[LABSIZE]; 4218583Sralph lnum = 0; 4318583Sralph pending = 0; 4418583Sralph depth = 0; 4518583Sralph spend = linebuf; 4618583Sralph hspend = holdsp; 4718583Sralph fcode[0] = stdout; 4818583Sralph nfiles = 1; 4918583Sralph 5018583Sralph if(eargc == 1) 5118583Sralph exit(0); 5218583Sralph 5318583Sralph 5418583Sralph while (--eargc > 0 && (++eargv)[0][0] == '-') 5518583Sralph switch (eargv[0][1]) { 5618583Sralph 5718583Sralph case 'n': 5818583Sralph nflag++; 5918583Sralph continue; 6018583Sralph 6118583Sralph case 'f': 6218583Sralph if(eargc-- <= 0) exit(2); 6318583Sralph 6418583Sralph if((fin = fopen(*++eargv, "r")) == NULL) { 6518583Sralph fprintf(stderr, "Cannot open pattern-file: %s\n", *eargv); 6618583Sralph exit(2); 6718583Sralph } 6818583Sralph 6918583Sralph fcomp(); 7018583Sralph fclose(fin); 7118583Sralph continue; 7218583Sralph 7318583Sralph case 'e': 7418583Sralph eflag++; 7518583Sralph fcomp(); 7618583Sralph eflag = 0; 7718583Sralph continue; 7818583Sralph 7918583Sralph case 'g': 8018583Sralph gflag++; 8118583Sralph continue; 8218583Sralph 8318583Sralph default: 8418583Sralph fprintf(stdout, "Unknown flag: %c\n", eargv[0][1]); 8518583Sralph continue; 8618583Sralph } 8718583Sralph 8818583Sralph 8918583Sralph if(compfl == 0) { 9018583Sralph eargv--; 9118583Sralph eargc++; 9218583Sralph eflag++; 9318583Sralph fcomp(); 9418583Sralph eargv++; 9518583Sralph eargc--; 9618583Sralph eflag = 0; 9718583Sralph } 9818583Sralph 9918583Sralph if(depth) { 10018583Sralph fprintf(stderr, "Too many {'s"); 10118583Sralph exit(2); 10218583Sralph } 10318583Sralph 10418583Sralph labtab->address = rep; 10518583Sralph 10618583Sralph dechain(); 10718583Sralph 10818583Sralph /* abort(); /*DEBUG*/ 10918583Sralph 11018583Sralph if(eargc <= 0) 11118583Sralph execute((char *)NULL); 11218583Sralph else while(--eargc >= 0) { 11318583Sralph execute(*eargv++); 11418583Sralph } 11518583Sralph fclose(stdout); 11618583Sralph exit(0); 11718583Sralph } 11818583Sralph fcomp() 11918583Sralph { 12018583Sralph 12118583Sralph register char *p, *op, *tp; 12218583Sralph char *address(); 123*33076Sbostic struct reptr *pt, *pt1; 12418583Sralph int i; 12518583Sralph struct label *lpt; 12632202Sbostic char fbuf[MAXPATHLEN + 1], *newstr(); 12718583Sralph 12818583Sralph compfl = 1; 12918583Sralph op = lastre; 13018583Sralph 13118583Sralph if(rline(linebuf) < 0) return; 13218583Sralph if(*linebuf == '#') { 13318583Sralph if(linebuf[1] == 'n') 13418583Sralph nflag = 1; 13518583Sralph } 13618583Sralph else { 13718583Sralph cp = linebuf; 13818583Sralph goto comploop; 13918583Sralph } 14018583Sralph 14118583Sralph for(;;) { 14218583Sralph if(rline(linebuf) < 0) break; 14318583Sralph 14418583Sralph cp = linebuf; 14518583Sralph 14618583Sralph comploop: 14718583Sralph /* fprintf(stdout, "cp: %s\n", cp); /*DEBUG*/ 14818583Sralph while(*cp == ' ' || *cp == '\t') cp++; 14918583Sralph if(*cp == '\0' || *cp == '#') continue; 15018583Sralph if(*cp == ';') { 15118583Sralph cp++; 15218583Sralph goto comploop; 15318583Sralph } 15418583Sralph 15518583Sralph p = address(rep->ad1); 15618583Sralph if(p == badp) { 15718583Sralph fprintf(stderr, CGMES, linebuf); 15818583Sralph exit(2); 15918583Sralph } 16018583Sralph 16118583Sralph if(p == rep->ad1) { 16218583Sralph if(op) 16318583Sralph rep->ad1 = op; 16418583Sralph else { 16518583Sralph fprintf(stderr, "First RE may not be null\n"); 16618583Sralph exit(2); 16718583Sralph } 16818583Sralph } else if(p == 0) { 16918583Sralph p = rep->ad1; 17018583Sralph rep->ad1 = 0; 17118583Sralph } else { 17218583Sralph op = rep->ad1; 17318583Sralph if(*cp == ',' || *cp == ';') { 17418583Sralph cp++; 17518583Sralph if((rep->ad2 = p) > reend) { 17618583Sralph fprintf(stderr, TMMES, linebuf); 17718583Sralph exit(2); 17818583Sralph } 17918583Sralph p = address(rep->ad2); 18018583Sralph if(p == badp || p == 0) { 18118583Sralph fprintf(stderr, CGMES, linebuf); 18218583Sralph exit(2); 18318583Sralph } 18418583Sralph if(p == rep->ad2) 18518583Sralph rep->ad2 = op; 18618583Sralph else 18718583Sralph op = rep->ad2; 18818583Sralph 18918583Sralph } else 19018583Sralph rep->ad2 = 0; 19118583Sralph } 19218583Sralph 19318583Sralph if(p > reend) { 19418583Sralph fprintf(stderr, "Too much text: %s\n", linebuf); 19518583Sralph exit(2); 19618583Sralph } 19718583Sralph 19818583Sralph while(*cp == ' ' || *cp == '\t') cp++; 19918583Sralph 20018583Sralph swit: 20118583Sralph switch(*cp++) { 20218583Sralph 20318583Sralph default: 20418583Sralph fprintf(stderr, "Unrecognized command: %s\n", linebuf); 20518583Sralph exit(2); 20618583Sralph 20718583Sralph case '!': 20818583Sralph rep->negfl = 1; 20918583Sralph goto swit; 21018583Sralph 21118583Sralph case '{': 21218583Sralph rep->command = BCOM; 21318583Sralph rep->negfl = !(rep->negfl); 21418583Sralph cmpend[depth++] = &rep->lb1; 21518583Sralph if(++rep >= ptrend) { 21618583Sralph fprintf(stderr, "Too many commands: %s\n", linebuf); 21718583Sralph exit(2); 21818583Sralph } 21918583Sralph rep->ad1 = p; 22018583Sralph if(*cp == '\0') continue; 22118583Sralph 22218583Sralph goto comploop; 22318583Sralph 22418583Sralph case '}': 22518583Sralph if(rep->ad1) { 22618583Sralph fprintf(stderr, AD0MES, linebuf); 22718583Sralph exit(2); 22818583Sralph } 22918583Sralph 23018583Sralph if(--depth < 0) { 23118583Sralph fprintf(stderr, "Too many }'s\n"); 23218583Sralph exit(2); 23318583Sralph } 23418583Sralph *cmpend[depth] = rep; 23518583Sralph 23618583Sralph rep->ad1 = p; 23718583Sralph continue; 23818583Sralph 23918583Sralph case '=': 24018583Sralph rep->command = EQCOM; 24118583Sralph if(rep->ad2) { 24218583Sralph fprintf(stderr, AD1MES, linebuf); 24318583Sralph exit(2); 24418583Sralph } 24518583Sralph break; 24618583Sralph 24718583Sralph case ':': 24818583Sralph if(rep->ad1) { 24918583Sralph fprintf(stderr, AD0MES, linebuf); 25018583Sralph exit(2); 25118583Sralph } 25218583Sralph 25318583Sralph while(*cp++ == ' '); 25418583Sralph cp--; 25518583Sralph 25618583Sralph 25718583Sralph tp = lab->asc; 25818583Sralph while((*tp++ = *cp++)) 25918583Sralph if(tp >= &(lab->asc[8])) { 26018583Sralph fprintf(stderr, LTL, linebuf); 26118583Sralph exit(2); 26218583Sralph } 26318583Sralph *--tp = '\0'; 26418583Sralph 26518583Sralph if(lpt = search(lab)) { 26618583Sralph if(lpt->address) { 26718583Sralph fprintf(stderr, "Duplicate labels: %s\n", linebuf); 26818583Sralph exit(2); 26918583Sralph } 27018583Sralph } else { 27118583Sralph lab->chain = 0; 27218583Sralph lpt = lab; 27318583Sralph if(++lab >= labend) { 27418583Sralph fprintf(stderr, "Too many labels: %s\n", linebuf); 27518583Sralph exit(2); 27618583Sralph } 27718583Sralph } 27818583Sralph lpt->address = rep; 27918583Sralph rep->ad1 = p; 28018583Sralph 28118583Sralph continue; 28218583Sralph 28318583Sralph case 'a': 28418583Sralph rep->command = ACOM; 28518583Sralph if(rep->ad2) { 28618583Sralph fprintf(stderr, AD1MES, linebuf); 28718583Sralph exit(2); 28818583Sralph } 28918583Sralph if(*cp == '\\') cp++; 29018583Sralph if(*cp++ != '\n') { 29118583Sralph fprintf(stderr, CGMES, linebuf); 29218583Sralph exit(2); 29318583Sralph } 29418583Sralph rep->re1 = p; 29518583Sralph p = text(rep->re1); 29618583Sralph break; 29718583Sralph case 'c': 29818583Sralph rep->command = CCOM; 29918583Sralph if(*cp == '\\') cp++; 30018583Sralph if(*cp++ != ('\n')) { 30118583Sralph fprintf(stderr, CGMES, linebuf); 30218583Sralph exit(2); 30318583Sralph } 30418583Sralph rep->re1 = p; 30518583Sralph p = text(rep->re1); 30618583Sralph break; 30718583Sralph case 'i': 30818583Sralph rep->command = ICOM; 30918583Sralph if(rep->ad2) { 31018583Sralph fprintf(stderr, AD1MES, linebuf); 31118583Sralph exit(2); 31218583Sralph } 31318583Sralph if(*cp == '\\') cp++; 31418583Sralph if(*cp++ != ('\n')) { 31518583Sralph fprintf(stderr, CGMES, linebuf); 31618583Sralph exit(2); 31718583Sralph } 31818583Sralph rep->re1 = p; 31918583Sralph p = text(rep->re1); 32018583Sralph break; 32118583Sralph 32218583Sralph case 'g': 32318583Sralph rep->command = GCOM; 32418583Sralph break; 32518583Sralph 32618583Sralph case 'G': 32718583Sralph rep->command = CGCOM; 32818583Sralph break; 32918583Sralph 33018583Sralph case 'h': 33118583Sralph rep->command = HCOM; 33218583Sralph break; 33318583Sralph 33418583Sralph case 'H': 33518583Sralph rep->command = CHCOM; 33618583Sralph break; 33718583Sralph 33818583Sralph case 't': 33918583Sralph rep->command = TCOM; 34018583Sralph goto jtcommon; 34118583Sralph 34218583Sralph case 'b': 34318583Sralph rep->command = BCOM; 34418583Sralph jtcommon: 34518583Sralph while(*cp++ == ' '); 34618583Sralph cp--; 34718583Sralph 34818583Sralph if(*cp == '\0') { 34918583Sralph if(pt = labtab->chain) { 35018583Sralph while(pt1 = pt->lb1) 35118583Sralph pt = pt1; 35218583Sralph pt->lb1 = rep; 35318583Sralph } else 35418583Sralph labtab->chain = rep; 35518583Sralph break; 35618583Sralph } 35718583Sralph tp = lab->asc; 35818583Sralph while((*tp++ = *cp++)) 35918583Sralph if(tp >= &(lab->asc[8])) { 36018583Sralph fprintf(stderr, LTL, linebuf); 36118583Sralph exit(2); 36218583Sralph } 36318583Sralph cp--; 36418583Sralph *--tp = '\0'; 36518583Sralph 36618583Sralph if(lpt = search(lab)) { 36718583Sralph if(lpt->address) { 36818583Sralph rep->lb1 = lpt->address; 36918583Sralph } else { 37018583Sralph pt = lpt->chain; 37118583Sralph while(pt1 = pt->lb1) 37218583Sralph pt = pt1; 37318583Sralph pt->lb1 = rep; 37418583Sralph } 37518583Sralph } else { 37618583Sralph lab->chain = rep; 37718583Sralph lab->address = 0; 37818583Sralph if(++lab >= labend) { 37918583Sralph fprintf(stderr, "Too many labels: %s\n", linebuf); 38018583Sralph exit(2); 38118583Sralph } 38218583Sralph } 38318583Sralph break; 38418583Sralph 38518583Sralph case 'n': 38618583Sralph rep->command = NCOM; 38718583Sralph break; 38818583Sralph 38918583Sralph case 'N': 39018583Sralph rep->command = CNCOM; 39118583Sralph break; 39218583Sralph 39318583Sralph case 'p': 39418583Sralph rep->command = PCOM; 39518583Sralph break; 39618583Sralph 39718583Sralph case 'P': 39818583Sralph rep->command = CPCOM; 39918583Sralph break; 40018583Sralph 40118583Sralph case 'r': 40218583Sralph rep->command = RCOM; 40318583Sralph if(rep->ad2) { 40418583Sralph fprintf(stderr, AD1MES, linebuf); 40518583Sralph exit(2); 40618583Sralph } 40718583Sralph if(*cp++ != ' ') { 40818583Sralph fprintf(stderr, CGMES, linebuf); 40918583Sralph exit(2); 41018583Sralph } 41118583Sralph rep->re1 = p; 41218583Sralph p = text(rep->re1); 41318583Sralph break; 41418583Sralph 41518583Sralph case 'd': 41618583Sralph rep->command = DCOM; 41718583Sralph break; 41818583Sralph 41918583Sralph case 'D': 42018583Sralph rep->command = CDCOM; 42118583Sralph rep->lb1 = ptrspace; 42218583Sralph break; 42318583Sralph 42418583Sralph case 'q': 42518583Sralph rep->command = QCOM; 42618583Sralph if(rep->ad2) { 42718583Sralph fprintf(stderr, AD1MES, linebuf); 42818583Sralph exit(2); 42918583Sralph } 43018583Sralph break; 43118583Sralph 43218583Sralph case 'l': 43318583Sralph rep->command = LCOM; 43418583Sralph break; 43518583Sralph 43618583Sralph case 's': 43718583Sralph rep->command = SCOM; 43818583Sralph seof = *cp++; 43918583Sralph rep->re1 = p; 44018583Sralph p = compile(rep->re1); 44118583Sralph if(p == badp) { 44218583Sralph fprintf(stderr, CGMES, linebuf); 44318583Sralph exit(2); 44418583Sralph } 44518583Sralph if(p == rep->re1) { 44623554Sbloom if(op) 44723554Sbloom rep->re1 = op; 44823554Sbloom else { 44923554Sbloom fprintf(stderr, 45023554Sbloom "First RE may not be null\n"); 45123554Sbloom exit(2); 45223554Sbloom } 45318583Sralph } else { 45418583Sralph op = rep->re1; 45518583Sralph } 45618583Sralph 45718583Sralph if((rep->rhs = p) > reend) { 45818583Sralph fprintf(stderr, TMMES, linebuf); 45918583Sralph exit(2); 46018583Sralph } 46118583Sralph 46218583Sralph if((p = compsub(rep->rhs)) == badp) { 46318583Sralph fprintf(stderr, CGMES, linebuf); 46418583Sralph exit(2); 46518583Sralph } 46618583Sralph if(*cp == 'g') { 46718583Sralph cp++; 46818583Sralph rep->gfl++; 46918583Sralph } else if(gflag) 47018583Sralph rep->gfl++; 47118583Sralph 47218583Sralph if(*cp == 'p') { 47318583Sralph cp++; 47418583Sralph rep->pfl = 1; 47518583Sralph } 47618583Sralph 47718583Sralph if(*cp == 'P') { 47818583Sralph cp++; 47918583Sralph rep->pfl = 2; 48018583Sralph } 48118583Sralph 48218583Sralph if(*cp == 'w') { 48318583Sralph cp++; 48418583Sralph if(*cp++ != ' ') { 48518583Sralph fprintf(stderr, CGMES, linebuf); 48618583Sralph exit(2); 48718583Sralph } 48832197Sbostic if(nfiles > 10) { 48918583Sralph fprintf(stderr, "Too many files in w commands\n"); 49018583Sralph exit(2); 49118583Sralph } 49218583Sralph 49332202Sbostic text(fbuf); 49432202Sbostic fname[nfiles] = newstr(fbuf); 49518583Sralph for(i = nfiles - 1; i >= 0; i--) 49618583Sralph if(cmp(fname[nfiles],fname[i]) == 0) { 49718583Sralph rep->fcode = fcode[i]; 49818583Sralph goto done; 49918583Sralph } 50018583Sralph if((rep->fcode = fopen(fname[nfiles], "w")) == NULL) { 50118583Sralph fprintf(stderr, "cannot open %s\n", fname[nfiles]); 50218583Sralph exit(2); 50318583Sralph } 50418583Sralph fcode[nfiles++] = rep->fcode; 50518583Sralph } 50618583Sralph break; 50718583Sralph 50818583Sralph case 'w': 50918583Sralph rep->command = WCOM; 51018583Sralph if(*cp++ != ' ') { 51118583Sralph fprintf(stderr, CGMES, linebuf); 51218583Sralph exit(2); 51318583Sralph } 51432197Sbostic if(nfiles > 10){ 51518583Sralph fprintf(stderr, "Too many files in w commands\n"); 51618583Sralph exit(2); 51718583Sralph } 51818583Sralph 51932202Sbostic text(fbuf); 52032202Sbostic fname[nfiles] = newstr(fbuf); 52118583Sralph for(i = nfiles - 1; i >= 0; i--) 52218583Sralph if(cmp(fname[nfiles], fname[i]) == 0) { 52318583Sralph rep->fcode = fcode[i]; 52418583Sralph goto done; 52518583Sralph } 52618583Sralph 52718583Sralph if((rep->fcode = fopen(fname[nfiles], "w")) == NULL) { 52818583Sralph fprintf(stderr, "Cannot create %s\n", fname[nfiles]); 52918583Sralph exit(2); 53018583Sralph } 53118583Sralph fcode[nfiles++] = rep->fcode; 53218583Sralph break; 53318583Sralph 53418583Sralph case 'x': 53518583Sralph rep->command = XCOM; 53618583Sralph break; 53718583Sralph 53818583Sralph case 'y': 53918583Sralph rep->command = YCOM; 54018583Sralph seof = *cp++; 54118583Sralph rep->re1 = p; 54218583Sralph p = ycomp(rep->re1); 54318583Sralph if(p == badp) { 54418583Sralph fprintf(stderr, CGMES, linebuf); 54518583Sralph exit(2); 54618583Sralph } 54718583Sralph if(p > reend) { 54818583Sralph fprintf(stderr, TMMES, linebuf); 54918583Sralph exit(2); 55018583Sralph } 55118583Sralph break; 55218583Sralph 55318583Sralph } 55418583Sralph done: 55518583Sralph if(++rep >= ptrend) { 55618583Sralph fprintf(stderr, "Too many commands, last: %s\n", linebuf); 55718583Sralph exit(2); 55818583Sralph } 55918583Sralph 56018583Sralph rep->ad1 = p; 56118583Sralph 56218583Sralph if(*cp++ != '\0') { 56318583Sralph if(cp[-1] == ';') 56418583Sralph goto comploop; 56518583Sralph fprintf(stderr, CGMES, linebuf); 56618583Sralph exit(2); 56718583Sralph } 56818583Sralph 56918583Sralph } 57018583Sralph rep->command = 0; 57118583Sralph lastre = op; 57218583Sralph } 57318583Sralph char *compsub(rhsbuf) 57418583Sralph char *rhsbuf; 57518583Sralph { 57618583Sralph register char *p, *q; 57718583Sralph 57818583Sralph p = rhsbuf; 57918583Sralph q = cp; 58018583Sralph for(;;) { 58118583Sralph if((*p = *q++) == '\\') { 58218583Sralph *p = *q++; 58318583Sralph if(*p > numbra + '0' && *p <= '9') 58418583Sralph return(badp); 58518583Sralph *p++ |= 0200; 58618583Sralph continue; 58718583Sralph } 58818583Sralph if(*p == seof) { 58918583Sralph *p++ = '\0'; 59018583Sralph cp = q; 59118583Sralph return(p); 59218583Sralph } 59318583Sralph if(*p++ == '\0') { 59418583Sralph return(badp); 59518583Sralph } 59618583Sralph 59718583Sralph } 59818583Sralph } 59918583Sralph 60018583Sralph char *compile(expbuf) 60118583Sralph char *expbuf; 60218583Sralph { 60318583Sralph register c; 60418583Sralph register char *ep, *sp; 60518583Sralph char neg; 60618583Sralph char *lastep, *cstart; 60718583Sralph int cclcnt; 60818583Sralph int closed; 60918583Sralph char bracket[NBRA], *bracketp; 61018583Sralph 61118583Sralph if(*cp == seof) { 61218583Sralph cp++; 61318583Sralph return(expbuf); 61418583Sralph } 61518583Sralph 61618583Sralph ep = expbuf; 61718583Sralph lastep = 0; 61818583Sralph bracketp = bracket; 61918583Sralph closed = numbra = 0; 62018583Sralph sp = cp; 62118583Sralph if (*sp == '^') { 62218583Sralph *ep++ = 1; 62318583Sralph sp++; 62418583Sralph } else { 62518583Sralph *ep++ = 0; 62618583Sralph } 62718583Sralph for (;;) { 62818583Sralph if (ep >= &expbuf[ESIZE]) { 62918583Sralph cp = sp; 63018583Sralph return(badp); 63118583Sralph } 63218583Sralph if((c = *sp++) == seof) { 63318583Sralph if(bracketp != bracket) { 63418583Sralph cp = sp; 63518583Sralph return(badp); 63618583Sralph } 63718583Sralph cp = sp; 63818583Sralph *ep++ = CEOF; 63918583Sralph return(ep); 64018583Sralph } 64118583Sralph if(c != '*') 64218583Sralph lastep = ep; 64318583Sralph switch (c) { 64418583Sralph 64518583Sralph case '\\': 64618583Sralph if((c = *sp++) == '(') { 64718583Sralph if(numbra >= NBRA) { 64818583Sralph cp = sp; 64918583Sralph return(badp); 65018583Sralph } 65118583Sralph *bracketp++ = numbra; 65218583Sralph *ep++ = CBRA; 65318583Sralph *ep++ = numbra++; 65418583Sralph continue; 65518583Sralph } 65618583Sralph if(c == ')') { 65718583Sralph if(bracketp <= bracket) { 65818583Sralph cp = sp; 65918583Sralph return(badp); 66018583Sralph } 66118583Sralph *ep++ = CKET; 66218583Sralph *ep++ = *--bracketp; 66318583Sralph closed++; 66418583Sralph continue; 66518583Sralph } 66618583Sralph 66718583Sralph if(c >= '1' && c <= '9') { 66818583Sralph if((c -= '1') >= closed) 66918583Sralph return(badp); 67018583Sralph 67118583Sralph *ep++ = CBACK; 67218583Sralph *ep++ = c; 67318583Sralph continue; 67418583Sralph } 67518583Sralph if(c == '\n') { 67618583Sralph cp = sp; 67718583Sralph return(badp); 67818583Sralph } 67918583Sralph if(c == 'n') { 68018583Sralph c = '\n'; 68118583Sralph } 68218583Sralph goto defchar; 68318583Sralph 68418583Sralph case '\0': 68518583Sralph continue; 68618583Sralph case '\n': 68718583Sralph cp = sp; 68818583Sralph return(badp); 68918583Sralph 69018583Sralph case '.': 69118583Sralph *ep++ = CDOT; 69218583Sralph continue; 69318583Sralph 69418583Sralph case '*': 69518583Sralph if (lastep == 0) 69618583Sralph goto defchar; 69718583Sralph if(*lastep == CKET) { 69818583Sralph cp = sp; 69918583Sralph return(badp); 70018583Sralph } 70118583Sralph *lastep |= STAR; 70218583Sralph continue; 70318583Sralph 70418583Sralph case '$': 70518583Sralph if (*sp != seof) 70618583Sralph goto defchar; 70718583Sralph *ep++ = CDOL; 70818583Sralph continue; 70918583Sralph 71018583Sralph case '[': 71118583Sralph if(&ep[17] >= &expbuf[ESIZE]) { 71218583Sralph fprintf(stderr, "RE too long: %s\n", linebuf); 71318583Sralph exit(2); 71418583Sralph } 71518583Sralph 71618583Sralph *ep++ = CCL; 71718583Sralph 71818583Sralph neg = 0; 71918583Sralph if((c = *sp++) == '^') { 72018583Sralph neg = 1; 72118583Sralph c = *sp++; 72218583Sralph } 72318583Sralph 72418583Sralph cstart = sp; 72518583Sralph do { 72618583Sralph if(c == '\0') { 72718583Sralph fprintf(stderr, CGMES, linebuf); 72818583Sralph exit(2); 72918583Sralph } 73018583Sralph if (c=='-' && sp>cstart && *sp!=']') { 73118583Sralph for (c = sp[-2]; c<*sp; c++) 73218583Sralph ep[c>>3] |= bittab[c&07]; 73318583Sralph } 73418583Sralph if(c == '\\') { 73518583Sralph switch(c = *sp++) { 73618583Sralph case 'n': 73718583Sralph c = '\n'; 73818583Sralph break; 73918583Sralph } 74018583Sralph } 74118583Sralph 74218583Sralph ep[c >> 3] |= bittab[c & 07]; 74318583Sralph } while((c = *sp++) != ']'); 74418583Sralph 74518583Sralph if(neg) 74618583Sralph for(cclcnt = 0; cclcnt < 16; cclcnt++) 74718583Sralph ep[cclcnt] ^= -1; 74818583Sralph ep[0] &= 0376; 74918583Sralph 75018583Sralph ep += 16; 75118583Sralph 75218583Sralph continue; 75318583Sralph 75418583Sralph defchar: 75518583Sralph default: 75618583Sralph *ep++ = CCHR; 75718583Sralph *ep++ = c; 75818583Sralph } 75918583Sralph } 76018583Sralph } 76118583Sralph rline(lbuf) 76218583Sralph char *lbuf; 76318583Sralph { 76418583Sralph register char *p, *q; 76518583Sralph register t; 76618583Sralph static char *saveq; 76718583Sralph 76818583Sralph p = lbuf - 1; 76918583Sralph 77018583Sralph if(eflag) { 77118583Sralph if(eflag > 0) { 77218583Sralph eflag = -1; 77318583Sralph if(eargc-- <= 0) 77418583Sralph exit(2); 77518583Sralph q = *++eargv; 77618583Sralph while(*++p = *q++) { 77718583Sralph if(*p == '\\') { 77818583Sralph if((*++p = *q++) == '\0') { 77918583Sralph saveq = 0; 78018583Sralph return(-1); 78118583Sralph } else 78218583Sralph continue; 78318583Sralph } 78418583Sralph if(*p == '\n') { 78518583Sralph *p = '\0'; 78618583Sralph saveq = q; 78718583Sralph return(1); 78818583Sralph } 78918583Sralph } 79018583Sralph saveq = 0; 79118583Sralph return(1); 79218583Sralph } 79318583Sralph if((q = saveq) == 0) return(-1); 79418583Sralph 79518583Sralph while(*++p = *q++) { 79618583Sralph if(*p == '\\') { 79718583Sralph if((*++p = *q++) == '0') { 79818583Sralph saveq = 0; 79918583Sralph return(-1); 80018583Sralph } else 80118583Sralph continue; 80218583Sralph } 80318583Sralph if(*p == '\n') { 80418583Sralph *p = '\0'; 80518583Sralph saveq = q; 80618583Sralph return(1); 80718583Sralph } 80818583Sralph } 80918583Sralph saveq = 0; 81018583Sralph return(1); 81118583Sralph } 81218583Sralph 81318583Sralph while((t = getc(fin)) != EOF) { 81418583Sralph *++p = t; 81518583Sralph if(*p == '\\') { 81618583Sralph t = getc(fin); 81718583Sralph *++p = t; 81818583Sralph } 81918583Sralph else if(*p == '\n') { 82018583Sralph *p = '\0'; 82118583Sralph return(1); 82218583Sralph } 82318583Sralph } 82418583Sralph *++p = '\0'; 82518583Sralph return(-1); 82618583Sralph } 82718583Sralph 82818583Sralph char *address(expbuf) 82918583Sralph char *expbuf; 83018583Sralph { 83118583Sralph register char *rcp; 83218583Sralph long lno; 83318583Sralph 83418583Sralph if(*cp == '$') { 83518583Sralph cp++; 83618583Sralph *expbuf++ = CEND; 83718583Sralph *expbuf++ = CEOF; 83818583Sralph return(expbuf); 83918583Sralph } 84018583Sralph 84118583Sralph if(*cp == '/') { 84218583Sralph seof = '/'; 84318583Sralph cp++; 84418583Sralph return(compile(expbuf)); 84518583Sralph } 84618583Sralph 84718583Sralph rcp = cp; 84818583Sralph lno = 0; 84918583Sralph 85018583Sralph while(*rcp >= '0' && *rcp <= '9') 85118583Sralph lno = lno*10 + *rcp++ - '0'; 85218583Sralph 85318583Sralph if(rcp > cp) { 85418583Sralph *expbuf++ = CLNUM; 85518583Sralph *expbuf++ = nlno; 85618583Sralph tlno[nlno++] = lno; 85718583Sralph if(nlno >= NLINES) { 85818583Sralph fprintf(stderr, "Too many line numbers\n"); 85918583Sralph exit(2); 86018583Sralph } 86118583Sralph *expbuf++ = CEOF; 86218583Sralph cp = rcp; 86318583Sralph return(expbuf); 86418583Sralph } 86518583Sralph return(0); 86618583Sralph } 86718583Sralph cmp(a, b) 86818583Sralph char *a,*b; 86918583Sralph { 87018583Sralph register char *ra, *rb; 87118583Sralph 87218583Sralph ra = a - 1; 87318583Sralph rb = b - 1; 87418583Sralph 87518583Sralph while(*++ra == *++rb) 87618583Sralph if(*ra == '\0') return(0); 87718583Sralph return(1); 87818583Sralph } 87918583Sralph 88018583Sralph char *text(textbuf) 88118583Sralph char *textbuf; 88218583Sralph { 88318583Sralph register char *p, *q; 88418583Sralph 88518583Sralph p = textbuf; 88618583Sralph q = cp; 88718583Sralph while(*q == '\t' || *q == ' ') q++; 88818583Sralph for(;;) { 88918583Sralph 89018583Sralph if((*p = *q++) == '\\') 89118583Sralph *p = *q++; 89218583Sralph if(*p == '\0') { 89318583Sralph cp = --q; 89418583Sralph return(++p); 89518583Sralph } 89618583Sralph if(*p == '\n') { 89718583Sralph while(*q == '\t' || *q == ' ') q++; 89818583Sralph } 89918583Sralph p++; 90018583Sralph } 90118583Sralph } 90218583Sralph 90318583Sralph 90418583Sralph struct label *search(ptr) 90518583Sralph struct label *ptr; 90618583Sralph { 90718583Sralph struct label *rp; 90818583Sralph 90918583Sralph rp = labtab; 91018583Sralph while(rp < ptr) { 91118583Sralph if(cmp(rp->asc, ptr->asc) == 0) 91218583Sralph return(rp); 91318583Sralph rp++; 91418583Sralph } 91518583Sralph 91618583Sralph return(0); 91718583Sralph } 91818583Sralph 91918583Sralph 92018583Sralph dechain() 92118583Sralph { 92218583Sralph struct label *lptr; 923*33076Sbostic struct reptr *rptr, *trptr; 92418583Sralph 92518583Sralph for(lptr = labtab; lptr < lab; lptr++) { 92618583Sralph 92718583Sralph if(lptr->address == 0) { 92818583Sralph fprintf(stderr, "Undefined label: %s\n", lptr->asc); 92918583Sralph exit(2); 93018583Sralph } 93118583Sralph 93218583Sralph if(lptr->chain) { 93318583Sralph rptr = lptr->chain; 93418583Sralph while(trptr = rptr->lb1) { 93518583Sralph rptr->lb1 = lptr->address; 93618583Sralph rptr = trptr; 93718583Sralph } 93818583Sralph rptr->lb1 = lptr->address; 93918583Sralph } 94018583Sralph } 94118583Sralph } 94218583Sralph 94318583Sralph char *ycomp(expbuf) 94418583Sralph char *expbuf; 94518583Sralph { 94618583Sralph register char c, *ep, *tsp; 94718583Sralph char *sp; 94818583Sralph 94918583Sralph ep = expbuf; 95018583Sralph sp = cp; 95118583Sralph for(tsp = cp; *tsp != seof; tsp++) { 95218583Sralph if(*tsp == '\\') 95318583Sralph tsp++; 95418583Sralph if(*tsp == '\n') 95518583Sralph return(badp); 95618583Sralph } 95718583Sralph tsp++; 95818583Sralph 95918583Sralph while((c = *sp++ & 0177) != seof) { 96018583Sralph if(c == '\\' && *sp == 'n') { 96118583Sralph sp++; 96218583Sralph c = '\n'; 96318583Sralph } 96418583Sralph if((ep[c] = *tsp++) == '\\' && *tsp == 'n') { 96518583Sralph ep[c] = '\n'; 96618583Sralph tsp++; 96718583Sralph } 96818583Sralph if(ep[c] == seof || ep[c] == '\0') 96918583Sralph return(badp); 97018583Sralph } 97118583Sralph if(*tsp != seof) 97218583Sralph return(badp); 97318583Sralph cp = ++tsp; 97418583Sralph 97518583Sralph for(c = 0; !(c & 0200); c++) 97618583Sralph if(ep[c] == 0) 97718583Sralph ep[c] = c; 97818583Sralph 97918583Sralph return(ep + 0200); 98018583Sralph } 98132202Sbostic 98232202Sbostic static char * 98332202Sbostic newstr(buf) 98432202Sbostic char *buf; 98532202Sbostic { 98632202Sbostic char *new, *malloc(), *strcpy(); 98732202Sbostic 98832202Sbostic if (!(new = malloc((u_int)(strlen(buf) + 1)))) { 98932202Sbostic fputs("sed: out of memory.\n", stderr); 99032202Sbostic exit(2); 99132202Sbostic } 99232202Sbostic return(strcpy(new, buf)); 99332202Sbostic } 994