17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*a73c0fe4SJayakara Kini * Common Development and Distribution License (the "License"). 6*a73c0fe4SJayakara Kini * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 21bdcaf822Sbasabi /* 22*a73c0fe4SJayakara Kini * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23bdcaf822Sbasabi * Use is subject to license terms. 24bdcaf822Sbasabi */ 25bdcaf822Sbasabi 267c478bd9Sstevel@tonic-gate /* Copyright (c) 1984 AT&T */ 277c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate #include <stdio.h> 307c478bd9Sstevel@tonic-gate #include <sys/param.h> 317c478bd9Sstevel@tonic-gate #include "sed.h" 32bdcaf822Sbasabi 337c478bd9Sstevel@tonic-gate #define NWFILES 11 /* 10 plus one for standard output */ 347c478bd9Sstevel@tonic-gate FILE *fin; 357c478bd9Sstevel@tonic-gate FILE *fcode[NWFILES]; 367c478bd9Sstevel@tonic-gate char *lastre; 377c478bd9Sstevel@tonic-gate char sseof; 387c478bd9Sstevel@tonic-gate union reptr *ptrend; 397c478bd9Sstevel@tonic-gate int eflag; 40bdcaf822Sbasabi extern int nbra; 417c478bd9Sstevel@tonic-gate char linebuf[LBSIZE+1]; 427c478bd9Sstevel@tonic-gate int gflag; 437c478bd9Sstevel@tonic-gate int nlno; 447c478bd9Sstevel@tonic-gate char *fname[NWFILES]; 457c478bd9Sstevel@tonic-gate int nfiles; 467c478bd9Sstevel@tonic-gate union reptr ptrspace[PTRSIZE]; 477c478bd9Sstevel@tonic-gate union reptr *rep; 487c478bd9Sstevel@tonic-gate char *cp; 497c478bd9Sstevel@tonic-gate char respace[RESIZE]; 507c478bd9Sstevel@tonic-gate struct label ltab[LABSIZE]; 517c478bd9Sstevel@tonic-gate struct label *lab; 527c478bd9Sstevel@tonic-gate struct label *labend; 537c478bd9Sstevel@tonic-gate int depth; 547c478bd9Sstevel@tonic-gate int eargc; 557c478bd9Sstevel@tonic-gate char **eargv; 567c478bd9Sstevel@tonic-gate union reptr **cmpend[DEPTH]; 577c478bd9Sstevel@tonic-gate 587c478bd9Sstevel@tonic-gate #define CCEOF 22 597c478bd9Sstevel@tonic-gate 607c478bd9Sstevel@tonic-gate struct label *labtab = ltab; 617c478bd9Sstevel@tonic-gate 627c478bd9Sstevel@tonic-gate char ETMES[] = "Extra text at end of command: %s"; 637c478bd9Sstevel@tonic-gate char SMMES[] = "Space missing before filename: %s"; 647c478bd9Sstevel@tonic-gate char TMMES[] = "Too much command text: %s"; 657c478bd9Sstevel@tonic-gate char LTL[] = "Label too long: %s"; 667c478bd9Sstevel@tonic-gate char AD0MES[] = "No addresses allowed: %s"; 677c478bd9Sstevel@tonic-gate char AD1MES[] = "Only one address allowed: %s"; 687c478bd9Sstevel@tonic-gate char TOOBIG[] = "Suffix too large - 512 max: %s"; 697c478bd9Sstevel@tonic-gate 70bdcaf822Sbasabi extern int sed; /* IMPORTANT flag !!! */ 717c478bd9Sstevel@tonic-gate extern char *comple(); 727c478bd9Sstevel@tonic-gate 737c478bd9Sstevel@tonic-gate extern char *malloc(); 747c478bd9Sstevel@tonic-gate 75bdcaf822Sbasabi static void dechain(void); 76bdcaf822Sbasabi static void fcomp(void); 77bdcaf822Sbasabi 78bdcaf822Sbasabi int 79bdcaf822Sbasabi main(int argc, char *argv[]) 807c478bd9Sstevel@tonic-gate { 817c478bd9Sstevel@tonic-gate int flag_found = 0; 827c478bd9Sstevel@tonic-gate 837c478bd9Sstevel@tonic-gate sed = 1; 847c478bd9Sstevel@tonic-gate eargc = argc; 857c478bd9Sstevel@tonic-gate eargv = argv; 867c478bd9Sstevel@tonic-gate 877c478bd9Sstevel@tonic-gate aptr = abuf; 887c478bd9Sstevel@tonic-gate lab = labtab + 1; /* 0 reserved for end-pointer */ 897c478bd9Sstevel@tonic-gate rep = ptrspace; 907c478bd9Sstevel@tonic-gate rep->r1.ad1 = respace; 917c478bd9Sstevel@tonic-gate lcomend = &genbuf[71]; 927c478bd9Sstevel@tonic-gate ptrend = &ptrspace[PTRSIZE]; 937c478bd9Sstevel@tonic-gate labend = &labtab[LABSIZE]; 947c478bd9Sstevel@tonic-gate lnum = 0; 957c478bd9Sstevel@tonic-gate pending = 0; 967c478bd9Sstevel@tonic-gate depth = 0; 977c478bd9Sstevel@tonic-gate spend = linebuf; 987c478bd9Sstevel@tonic-gate hspend = holdsp; /* Avoid "bus error" under "H" cmd. */ 997c478bd9Sstevel@tonic-gate fcode[0] = stdout; 1007c478bd9Sstevel@tonic-gate fname[0] = ""; 1017c478bd9Sstevel@tonic-gate nfiles = 1; 1027c478bd9Sstevel@tonic-gate 1037c478bd9Sstevel@tonic-gate if(eargc == 1) 1047c478bd9Sstevel@tonic-gate exit(0); 1057c478bd9Sstevel@tonic-gate 1067c478bd9Sstevel@tonic-gate 1077c478bd9Sstevel@tonic-gate setlocale(LC_ALL, ""); /* get locale environment */ 1087c478bd9Sstevel@tonic-gate 1097c478bd9Sstevel@tonic-gate while (--eargc > 0 && (++eargv)[0][0] == '-') 1107c478bd9Sstevel@tonic-gate switch (eargv[0][1]) { 1117c478bd9Sstevel@tonic-gate 1127c478bd9Sstevel@tonic-gate case 'n': 1137c478bd9Sstevel@tonic-gate nflag++; 1147c478bd9Sstevel@tonic-gate continue; 1157c478bd9Sstevel@tonic-gate 1167c478bd9Sstevel@tonic-gate case 'f': 1177c478bd9Sstevel@tonic-gate flag_found = 1; 1187c478bd9Sstevel@tonic-gate if(eargc-- <= 0) exit(2); 1197c478bd9Sstevel@tonic-gate 1207c478bd9Sstevel@tonic-gate if((fin = fopen(*++eargv, "r")) == NULL) { 1217c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: "); 1227c478bd9Sstevel@tonic-gate perror(*eargv); 1237c478bd9Sstevel@tonic-gate exit(2); 1247c478bd9Sstevel@tonic-gate } 1257c478bd9Sstevel@tonic-gate 1267c478bd9Sstevel@tonic-gate fcomp(); 1277c478bd9Sstevel@tonic-gate (void) fclose(fin); 1287c478bd9Sstevel@tonic-gate continue; 1297c478bd9Sstevel@tonic-gate 1307c478bd9Sstevel@tonic-gate case 'e': 1317c478bd9Sstevel@tonic-gate flag_found = 1; 1327c478bd9Sstevel@tonic-gate eflag++; 1337c478bd9Sstevel@tonic-gate fcomp(); 1347c478bd9Sstevel@tonic-gate eflag = 0; 1357c478bd9Sstevel@tonic-gate continue; 1367c478bd9Sstevel@tonic-gate 1377c478bd9Sstevel@tonic-gate case 'g': 1387c478bd9Sstevel@tonic-gate gflag++; 1397c478bd9Sstevel@tonic-gate continue; 1407c478bd9Sstevel@tonic-gate 1417c478bd9Sstevel@tonic-gate default: 1427c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: Unknown flag: %c\n", eargv[0][1]); 1437c478bd9Sstevel@tonic-gate exit(2); 1447c478bd9Sstevel@tonic-gate } 1457c478bd9Sstevel@tonic-gate 1467c478bd9Sstevel@tonic-gate 1477c478bd9Sstevel@tonic-gate if(rep == ptrspace && !flag_found) { 1487c478bd9Sstevel@tonic-gate eargv--; 1497c478bd9Sstevel@tonic-gate eargc++; 1507c478bd9Sstevel@tonic-gate eflag++; 1517c478bd9Sstevel@tonic-gate fcomp(); 1527c478bd9Sstevel@tonic-gate eargv++; 1537c478bd9Sstevel@tonic-gate eargc--; 1547c478bd9Sstevel@tonic-gate eflag = 0; 1557c478bd9Sstevel@tonic-gate } 1567c478bd9Sstevel@tonic-gate 1577c478bd9Sstevel@tonic-gate if(depth) 1587c478bd9Sstevel@tonic-gate comperr("Too many {'s"); 1597c478bd9Sstevel@tonic-gate 1607c478bd9Sstevel@tonic-gate labtab->address = rep; 1617c478bd9Sstevel@tonic-gate 1627c478bd9Sstevel@tonic-gate dechain(); 1637c478bd9Sstevel@tonic-gate 1647c478bd9Sstevel@tonic-gate if(eargc <= 0) 1657c478bd9Sstevel@tonic-gate execute((char *)NULL); 1667c478bd9Sstevel@tonic-gate else while(--eargc >= 0) { 1677c478bd9Sstevel@tonic-gate execute(*eargv++); 1687c478bd9Sstevel@tonic-gate } 1697c478bd9Sstevel@tonic-gate (void) fclose(stdout); 170bdcaf822Sbasabi return (0); 1717c478bd9Sstevel@tonic-gate } 1727c478bd9Sstevel@tonic-gate 173bdcaf822Sbasabi static void 174bdcaf822Sbasabi fcomp(void) 1757c478bd9Sstevel@tonic-gate { 1767c478bd9Sstevel@tonic-gate 177bdcaf822Sbasabi char *p, *op, *tp; 1787c478bd9Sstevel@tonic-gate char *address(); 1797c478bd9Sstevel@tonic-gate union reptr *pt, *pt1; 1807c478bd9Sstevel@tonic-gate int i, ii; 1817c478bd9Sstevel@tonic-gate struct label *lpt; 1827c478bd9Sstevel@tonic-gate char fnamebuf[MAXPATHLEN]; 1837c478bd9Sstevel@tonic-gate 1847c478bd9Sstevel@tonic-gate op = lastre; 1857c478bd9Sstevel@tonic-gate 1867c478bd9Sstevel@tonic-gate if(rline(linebuf, &linebuf[LBSIZE+1]) < 0) return; 1877c478bd9Sstevel@tonic-gate if(*linebuf == '#') { 1887c478bd9Sstevel@tonic-gate if(linebuf[1] == 'n') 1897c478bd9Sstevel@tonic-gate nflag = 1; 1907c478bd9Sstevel@tonic-gate } 1917c478bd9Sstevel@tonic-gate else { 1927c478bd9Sstevel@tonic-gate cp = linebuf; 1937c478bd9Sstevel@tonic-gate goto comploop; 1947c478bd9Sstevel@tonic-gate } 1957c478bd9Sstevel@tonic-gate 1967c478bd9Sstevel@tonic-gate for(;;) { 1977c478bd9Sstevel@tonic-gate if(rline(linebuf, &linebuf[LBSIZE+1]) < 0) break; 1987c478bd9Sstevel@tonic-gate 1997c478bd9Sstevel@tonic-gate cp = linebuf; 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate comploop: 202bdcaf822Sbasabi /* (void) fprintf(stderr, "cp: %s\n", cp); DEBUG */ 2037c478bd9Sstevel@tonic-gate while(*cp == ' ' || *cp == '\t') cp++; 2047c478bd9Sstevel@tonic-gate if(*cp == '\0' || *cp == '#') continue; 2057c478bd9Sstevel@tonic-gate if(*cp == ';') { 2067c478bd9Sstevel@tonic-gate cp++; 2077c478bd9Sstevel@tonic-gate goto comploop; 2087c478bd9Sstevel@tonic-gate } 2097c478bd9Sstevel@tonic-gate 2107c478bd9Sstevel@tonic-gate p = address(rep->r1.ad1); 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate if(p == rep->r1.ad1) { 2137c478bd9Sstevel@tonic-gate if(op) 2147c478bd9Sstevel@tonic-gate rep->r1.ad1 = op; 2157c478bd9Sstevel@tonic-gate else 2167c478bd9Sstevel@tonic-gate comperr("First RE may not be null: %s"); 2177c478bd9Sstevel@tonic-gate } else if(p == 0) { 2187c478bd9Sstevel@tonic-gate p = rep->r1.ad1; 2197c478bd9Sstevel@tonic-gate rep->r1.ad1 = 0; 2207c478bd9Sstevel@tonic-gate } else { 2217c478bd9Sstevel@tonic-gate op = rep->r1.ad1; 2227c478bd9Sstevel@tonic-gate if(*cp == ',' || *cp == ';') { 2237c478bd9Sstevel@tonic-gate cp++; 2247c478bd9Sstevel@tonic-gate rep->r1.ad2 = p; 2257c478bd9Sstevel@tonic-gate p = address(rep->r1.ad2); 2267c478bd9Sstevel@tonic-gate if(p == 0) 2277c478bd9Sstevel@tonic-gate comperr("Illegal line number: %s"); 2287c478bd9Sstevel@tonic-gate if(p == rep->r1.ad2) 2297c478bd9Sstevel@tonic-gate rep->r1.ad2 = op; 2307c478bd9Sstevel@tonic-gate else 2317c478bd9Sstevel@tonic-gate op = rep->r1.ad2; 2327c478bd9Sstevel@tonic-gate 2337c478bd9Sstevel@tonic-gate } else 2347c478bd9Sstevel@tonic-gate rep->r1.ad2 = 0; 2357c478bd9Sstevel@tonic-gate } 2367c478bd9Sstevel@tonic-gate 2377c478bd9Sstevel@tonic-gate if(p > &respace[RESIZE-1]) 2387c478bd9Sstevel@tonic-gate comperr(TMMES); 2397c478bd9Sstevel@tonic-gate 2407c478bd9Sstevel@tonic-gate while(*cp == ' ' || *cp == '\t') cp++; 2417c478bd9Sstevel@tonic-gate 2427c478bd9Sstevel@tonic-gate swit: 2437c478bd9Sstevel@tonic-gate switch(*cp++) { 2447c478bd9Sstevel@tonic-gate 2457c478bd9Sstevel@tonic-gate default: 2467c478bd9Sstevel@tonic-gate comperr("Unrecognized command: %s"); 2477c478bd9Sstevel@tonic-gate 2487c478bd9Sstevel@tonic-gate case '!': 2497c478bd9Sstevel@tonic-gate rep->r1.negfl = 1; 2507c478bd9Sstevel@tonic-gate goto swit; 2517c478bd9Sstevel@tonic-gate 2527c478bd9Sstevel@tonic-gate case '{': 2537c478bd9Sstevel@tonic-gate rep->r1.command = BCOM; 2547c478bd9Sstevel@tonic-gate rep->r1.negfl = !(rep->r1.negfl); 2557c478bd9Sstevel@tonic-gate cmpend[depth++] = &rep->r2.lb1; 2567c478bd9Sstevel@tonic-gate if(++rep >= ptrend) 2577c478bd9Sstevel@tonic-gate comperr("Too many commands: %s"); 2587c478bd9Sstevel@tonic-gate rep->r1.ad1 = p; 2597c478bd9Sstevel@tonic-gate if(*cp == '\0') continue; 2607c478bd9Sstevel@tonic-gate 2617c478bd9Sstevel@tonic-gate goto comploop; 2627c478bd9Sstevel@tonic-gate 2637c478bd9Sstevel@tonic-gate case '}': 2647c478bd9Sstevel@tonic-gate if(rep->r1.ad1) 2657c478bd9Sstevel@tonic-gate comperr(AD0MES); 2667c478bd9Sstevel@tonic-gate 2677c478bd9Sstevel@tonic-gate if(--depth < 0) 2687c478bd9Sstevel@tonic-gate comperr("Too many }'s"); 2697c478bd9Sstevel@tonic-gate *cmpend[depth] = rep; 2707c478bd9Sstevel@tonic-gate 2717c478bd9Sstevel@tonic-gate rep->r1.ad1 = p; 2727c478bd9Sstevel@tonic-gate continue; 2737c478bd9Sstevel@tonic-gate 2747c478bd9Sstevel@tonic-gate case '=': 2757c478bd9Sstevel@tonic-gate rep->r1.command = EQCOM; 2767c478bd9Sstevel@tonic-gate if(rep->r1.ad2) 2777c478bd9Sstevel@tonic-gate comperr(AD1MES); 2787c478bd9Sstevel@tonic-gate break; 2797c478bd9Sstevel@tonic-gate 2807c478bd9Sstevel@tonic-gate case ':': 2817c478bd9Sstevel@tonic-gate if(rep->r1.ad1) 2827c478bd9Sstevel@tonic-gate comperr(AD0MES); 2837c478bd9Sstevel@tonic-gate 2847c478bd9Sstevel@tonic-gate while(*cp++ == ' '); 2857c478bd9Sstevel@tonic-gate cp--; 2867c478bd9Sstevel@tonic-gate 2877c478bd9Sstevel@tonic-gate 2887c478bd9Sstevel@tonic-gate tp = lab->asc; 2897c478bd9Sstevel@tonic-gate while((*tp++ = *cp++)) 290*a73c0fe4SJayakara Kini if(tp >= &(lab->asc[9])) 2917c478bd9Sstevel@tonic-gate comperr(LTL); 2927c478bd9Sstevel@tonic-gate *--tp = '\0'; 2937c478bd9Sstevel@tonic-gate 2947c478bd9Sstevel@tonic-gate if(lpt = search(lab)) { 2957c478bd9Sstevel@tonic-gate if(lpt->address) 2967c478bd9Sstevel@tonic-gate comperr("Duplicate labels: %s"); 2977c478bd9Sstevel@tonic-gate } else { 2987c478bd9Sstevel@tonic-gate lab->chain = 0; 2997c478bd9Sstevel@tonic-gate lpt = lab; 3007c478bd9Sstevel@tonic-gate if(++lab >= labend) 3017c478bd9Sstevel@tonic-gate comperr("Too many labels: %s"); 3027c478bd9Sstevel@tonic-gate } 3037c478bd9Sstevel@tonic-gate lpt->address = rep; 3047c478bd9Sstevel@tonic-gate rep->r1.ad1 = p; 3057c478bd9Sstevel@tonic-gate 3067c478bd9Sstevel@tonic-gate continue; 3077c478bd9Sstevel@tonic-gate 3087c478bd9Sstevel@tonic-gate case 'a': 3097c478bd9Sstevel@tonic-gate rep->r1.command = ACOM; 3107c478bd9Sstevel@tonic-gate if(rep->r1.ad2) 3117c478bd9Sstevel@tonic-gate comperr(AD1MES); 3127c478bd9Sstevel@tonic-gate if(*cp == '\\') cp++; 3137c478bd9Sstevel@tonic-gate if(*cp++ != '\n') 3147c478bd9Sstevel@tonic-gate comperr(ETMES); 3157c478bd9Sstevel@tonic-gate rep->r1.re1 = p; 3167c478bd9Sstevel@tonic-gate if ((p = text(rep->r1.re1, &respace[RESIZE-1])) == NULL) 3177c478bd9Sstevel@tonic-gate comperr(TMMES); 3187c478bd9Sstevel@tonic-gate break; 3197c478bd9Sstevel@tonic-gate case 'c': 3207c478bd9Sstevel@tonic-gate rep->r1.command = CCOM; 3217c478bd9Sstevel@tonic-gate if(*cp == '\\') cp++; 3227c478bd9Sstevel@tonic-gate if(*cp++ != ('\n')) 3237c478bd9Sstevel@tonic-gate comperr(ETMES); 3247c478bd9Sstevel@tonic-gate rep->r1.re1 = p; 3257c478bd9Sstevel@tonic-gate if ((p = text(rep->r1.re1, &respace[RESIZE-1])) == NULL) 3267c478bd9Sstevel@tonic-gate comperr(TMMES); 3277c478bd9Sstevel@tonic-gate break; 3287c478bd9Sstevel@tonic-gate case 'i': 3297c478bd9Sstevel@tonic-gate rep->r1.command = ICOM; 3307c478bd9Sstevel@tonic-gate if(rep->r1.ad2) 3317c478bd9Sstevel@tonic-gate comperr(AD1MES); 3327c478bd9Sstevel@tonic-gate if(*cp == '\\') cp++; 3337c478bd9Sstevel@tonic-gate if(*cp++ != ('\n')) 3347c478bd9Sstevel@tonic-gate comperr(ETMES); 3357c478bd9Sstevel@tonic-gate rep->r1.re1 = p; 3367c478bd9Sstevel@tonic-gate if ((p = text(rep->r1.re1, &respace[RESIZE-1])) == NULL) 3377c478bd9Sstevel@tonic-gate comperr(TMMES); 3387c478bd9Sstevel@tonic-gate break; 3397c478bd9Sstevel@tonic-gate 3407c478bd9Sstevel@tonic-gate case 'g': 3417c478bd9Sstevel@tonic-gate rep->r1.command = GCOM; 3427c478bd9Sstevel@tonic-gate break; 3437c478bd9Sstevel@tonic-gate 3447c478bd9Sstevel@tonic-gate case 'G': 3457c478bd9Sstevel@tonic-gate rep->r1.command = CGCOM; 3467c478bd9Sstevel@tonic-gate break; 3477c478bd9Sstevel@tonic-gate 3487c478bd9Sstevel@tonic-gate case 'h': 3497c478bd9Sstevel@tonic-gate rep->r1.command = HCOM; 3507c478bd9Sstevel@tonic-gate break; 3517c478bd9Sstevel@tonic-gate 3527c478bd9Sstevel@tonic-gate case 'H': 3537c478bd9Sstevel@tonic-gate rep->r1.command = CHCOM; 3547c478bd9Sstevel@tonic-gate break; 3557c478bd9Sstevel@tonic-gate 3567c478bd9Sstevel@tonic-gate case 't': 3577c478bd9Sstevel@tonic-gate rep->r1.command = TCOM; 3587c478bd9Sstevel@tonic-gate goto jtcommon; 3597c478bd9Sstevel@tonic-gate 3607c478bd9Sstevel@tonic-gate case 'b': 3617c478bd9Sstevel@tonic-gate rep->r1.command = BCOM; 3627c478bd9Sstevel@tonic-gate jtcommon: 3637c478bd9Sstevel@tonic-gate while(*cp++ == ' '); 3647c478bd9Sstevel@tonic-gate cp--; 3657c478bd9Sstevel@tonic-gate 3667c478bd9Sstevel@tonic-gate if(*cp == '\0') { 3677c478bd9Sstevel@tonic-gate if(pt = labtab->chain) { 3687c478bd9Sstevel@tonic-gate while(pt1 = pt->r2.lb1) 3697c478bd9Sstevel@tonic-gate pt = pt1; 3707c478bd9Sstevel@tonic-gate pt->r2.lb1 = rep; 3717c478bd9Sstevel@tonic-gate } else 3727c478bd9Sstevel@tonic-gate labtab->chain = rep; 3737c478bd9Sstevel@tonic-gate break; 3747c478bd9Sstevel@tonic-gate } 3757c478bd9Sstevel@tonic-gate tp = lab->asc; 3767c478bd9Sstevel@tonic-gate while((*tp++ = *cp++)) 377*a73c0fe4SJayakara Kini if(tp >= &(lab->asc[9])) 3787c478bd9Sstevel@tonic-gate comperr(LTL); 3797c478bd9Sstevel@tonic-gate cp--; 3807c478bd9Sstevel@tonic-gate *--tp = '\0'; 3817c478bd9Sstevel@tonic-gate 3827c478bd9Sstevel@tonic-gate if(lpt = search(lab)) { 3837c478bd9Sstevel@tonic-gate if(lpt->address) { 3847c478bd9Sstevel@tonic-gate rep->r2.lb1 = lpt->address; 3857c478bd9Sstevel@tonic-gate } else { 3867c478bd9Sstevel@tonic-gate pt = lpt->chain; 3877c478bd9Sstevel@tonic-gate while(pt1 = pt->r2.lb1) 3887c478bd9Sstevel@tonic-gate pt = pt1; 3897c478bd9Sstevel@tonic-gate pt->r2.lb1 = rep; 3907c478bd9Sstevel@tonic-gate } 3917c478bd9Sstevel@tonic-gate } else { 3927c478bd9Sstevel@tonic-gate lab->chain = rep; 3937c478bd9Sstevel@tonic-gate lab->address = 0; 3947c478bd9Sstevel@tonic-gate if(++lab >= labend) 3957c478bd9Sstevel@tonic-gate comperr("Too many labels: %s"); 3967c478bd9Sstevel@tonic-gate } 3977c478bd9Sstevel@tonic-gate break; 3987c478bd9Sstevel@tonic-gate 3997c478bd9Sstevel@tonic-gate case 'n': 4007c478bd9Sstevel@tonic-gate rep->r1.command = NCOM; 4017c478bd9Sstevel@tonic-gate break; 4027c478bd9Sstevel@tonic-gate 4037c478bd9Sstevel@tonic-gate case 'N': 4047c478bd9Sstevel@tonic-gate rep->r1.command = CNCOM; 4057c478bd9Sstevel@tonic-gate break; 4067c478bd9Sstevel@tonic-gate 4077c478bd9Sstevel@tonic-gate case 'p': 4087c478bd9Sstevel@tonic-gate rep->r1.command = PCOM; 4097c478bd9Sstevel@tonic-gate break; 4107c478bd9Sstevel@tonic-gate 4117c478bd9Sstevel@tonic-gate case 'P': 4127c478bd9Sstevel@tonic-gate rep->r1.command = CPCOM; 4137c478bd9Sstevel@tonic-gate break; 4147c478bd9Sstevel@tonic-gate 4157c478bd9Sstevel@tonic-gate case 'r': 4167c478bd9Sstevel@tonic-gate rep->r1.command = RCOM; 4177c478bd9Sstevel@tonic-gate if(rep->r1.ad2) 4187c478bd9Sstevel@tonic-gate comperr(AD1MES); 4197c478bd9Sstevel@tonic-gate if(*cp++ != ' ') 4207c478bd9Sstevel@tonic-gate comperr(SMMES); 4217c478bd9Sstevel@tonic-gate rep->r1.re1 = p; 4227c478bd9Sstevel@tonic-gate if ((p = text(rep->r1.re1, &respace[RESIZE-1])) == NULL) 4237c478bd9Sstevel@tonic-gate comperr(TMMES); 4247c478bd9Sstevel@tonic-gate break; 4257c478bd9Sstevel@tonic-gate 4267c478bd9Sstevel@tonic-gate case 'd': 4277c478bd9Sstevel@tonic-gate rep->r1.command = DCOM; 4287c478bd9Sstevel@tonic-gate break; 4297c478bd9Sstevel@tonic-gate 4307c478bd9Sstevel@tonic-gate case 'D': 4317c478bd9Sstevel@tonic-gate rep->r1.command = CDCOM; 4327c478bd9Sstevel@tonic-gate rep->r2.lb1 = ptrspace; 4337c478bd9Sstevel@tonic-gate break; 4347c478bd9Sstevel@tonic-gate 4357c478bd9Sstevel@tonic-gate case 'q': 4367c478bd9Sstevel@tonic-gate rep->r1.command = QCOM; 4377c478bd9Sstevel@tonic-gate if(rep->r1.ad2) 4387c478bd9Sstevel@tonic-gate comperr(AD1MES); 4397c478bd9Sstevel@tonic-gate break; 4407c478bd9Sstevel@tonic-gate 4417c478bd9Sstevel@tonic-gate case 'l': 4427c478bd9Sstevel@tonic-gate rep->r1.command = LCOM; 4437c478bd9Sstevel@tonic-gate break; 4447c478bd9Sstevel@tonic-gate 4457c478bd9Sstevel@tonic-gate case 's': 4467c478bd9Sstevel@tonic-gate rep->r1.command = SCOM; 4477c478bd9Sstevel@tonic-gate sseof = *cp++; 4487c478bd9Sstevel@tonic-gate rep->r1.re1 = p; 4497c478bd9Sstevel@tonic-gate p = comple((char *) 0, rep->r1.re1, &respace[RESIZE-1], sseof); 4507c478bd9Sstevel@tonic-gate if(p == rep->r1.re1) { 4517c478bd9Sstevel@tonic-gate if(op) 4527c478bd9Sstevel@tonic-gate rep->r1.re1 = op; 4537c478bd9Sstevel@tonic-gate else 4547c478bd9Sstevel@tonic-gate comperr("First RE may not be null: %s"); 4557c478bd9Sstevel@tonic-gate } else 4567c478bd9Sstevel@tonic-gate op = rep->r1.re1; 4577c478bd9Sstevel@tonic-gate rep->r1.rhs = p; 4587c478bd9Sstevel@tonic-gate 4597c478bd9Sstevel@tonic-gate p = compsub(rep->r1.rhs); 4607c478bd9Sstevel@tonic-gate 4617c478bd9Sstevel@tonic-gate if(*cp == 'g') { 4627c478bd9Sstevel@tonic-gate cp++; 4637c478bd9Sstevel@tonic-gate rep->r1.gfl = 999; 4647c478bd9Sstevel@tonic-gate } else if(gflag) 4657c478bd9Sstevel@tonic-gate rep->r1.gfl = 999; 4667c478bd9Sstevel@tonic-gate 4677c478bd9Sstevel@tonic-gate if(*cp >= '1' && *cp <= '9') 4687c478bd9Sstevel@tonic-gate {i = *cp - '0'; 4697c478bd9Sstevel@tonic-gate cp++; 4707c478bd9Sstevel@tonic-gate while(1) 4717c478bd9Sstevel@tonic-gate {ii = *cp; 4727c478bd9Sstevel@tonic-gate if(ii < '0' || ii > '9') break; 4737c478bd9Sstevel@tonic-gate i = i*10 + ii - '0'; 4747c478bd9Sstevel@tonic-gate if(i > 512) 4757c478bd9Sstevel@tonic-gate comperr(TOOBIG); 4767c478bd9Sstevel@tonic-gate cp++; 4777c478bd9Sstevel@tonic-gate } 4787c478bd9Sstevel@tonic-gate rep->r1.gfl = i; 4797c478bd9Sstevel@tonic-gate } 4807c478bd9Sstevel@tonic-gate 4817c478bd9Sstevel@tonic-gate if(*cp == 'p') { 4827c478bd9Sstevel@tonic-gate cp++; 4837c478bd9Sstevel@tonic-gate rep->r1.pfl = 1; 4847c478bd9Sstevel@tonic-gate } 4857c478bd9Sstevel@tonic-gate 4867c478bd9Sstevel@tonic-gate if(*cp == 'P') { 4877c478bd9Sstevel@tonic-gate cp++; 4887c478bd9Sstevel@tonic-gate rep->r1.pfl = 2; 4897c478bd9Sstevel@tonic-gate } 4907c478bd9Sstevel@tonic-gate 4917c478bd9Sstevel@tonic-gate if(*cp == 'w') { 4927c478bd9Sstevel@tonic-gate cp++; 4937c478bd9Sstevel@tonic-gate if(*cp++ != ' ') 4947c478bd9Sstevel@tonic-gate comperr(SMMES); 4957c478bd9Sstevel@tonic-gate if (text(fnamebuf, &fnamebuf[MAXPATHLEN]) == NULL) 4967c478bd9Sstevel@tonic-gate comperr("File name too long: %s"); 4977c478bd9Sstevel@tonic-gate for(i = nfiles - 1; i >= 0; i--) 4987c478bd9Sstevel@tonic-gate if(strcmp(fnamebuf,fname[i]) == 0) { 4997c478bd9Sstevel@tonic-gate rep->r1.fcode = fcode[i]; 5007c478bd9Sstevel@tonic-gate goto done; 5017c478bd9Sstevel@tonic-gate } 5027c478bd9Sstevel@tonic-gate if(nfiles >= NWFILES) 5037c478bd9Sstevel@tonic-gate comperr("Too many files in w commands: %s"); 5047c478bd9Sstevel@tonic-gate 5057c478bd9Sstevel@tonic-gate i = strlen(fnamebuf) + 1; 5067c478bd9Sstevel@tonic-gate if ((fname[nfiles] = malloc((unsigned)i)) == NULL) { 5077c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: Out of memory\n"); 5087c478bd9Sstevel@tonic-gate exit(2); 5097c478bd9Sstevel@tonic-gate } 5107c478bd9Sstevel@tonic-gate (void) strcpy(fname[nfiles], fnamebuf); 5117c478bd9Sstevel@tonic-gate if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) { 5127c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: Cannot open "); 5137c478bd9Sstevel@tonic-gate perror(fname[nfiles]); 5147c478bd9Sstevel@tonic-gate exit(2); 5157c478bd9Sstevel@tonic-gate } 5167c478bd9Sstevel@tonic-gate fcode[nfiles++] = rep->r1.fcode; 5177c478bd9Sstevel@tonic-gate } 5187c478bd9Sstevel@tonic-gate break; 5197c478bd9Sstevel@tonic-gate 5207c478bd9Sstevel@tonic-gate case 'w': 5217c478bd9Sstevel@tonic-gate rep->r1.command = WCOM; 5227c478bd9Sstevel@tonic-gate if(*cp++ != ' ') 5237c478bd9Sstevel@tonic-gate comperr(SMMES); 5247c478bd9Sstevel@tonic-gate if (text(fnamebuf, &fnamebuf[MAXPATHLEN]) == NULL) 5257c478bd9Sstevel@tonic-gate comperr("File name too long: %s"); 5267c478bd9Sstevel@tonic-gate for(i = nfiles - 1; i >= 0; i--) 5277c478bd9Sstevel@tonic-gate if(strcmp(fnamebuf, fname[i]) == 0) { 5287c478bd9Sstevel@tonic-gate rep->r1.fcode = fcode[i]; 5297c478bd9Sstevel@tonic-gate goto done; 5307c478bd9Sstevel@tonic-gate } 5317c478bd9Sstevel@tonic-gate if(nfiles >= NWFILES) 5327c478bd9Sstevel@tonic-gate comperr("Too many files in w commands: %s"); 5337c478bd9Sstevel@tonic-gate 5347c478bd9Sstevel@tonic-gate i = strlen(fnamebuf) + 1; 5357c478bd9Sstevel@tonic-gate if ((fname[nfiles] = malloc((unsigned)i)) == NULL) { 5367c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: Out of memory\n"); 5377c478bd9Sstevel@tonic-gate exit(2); 5387c478bd9Sstevel@tonic-gate } 5397c478bd9Sstevel@tonic-gate (void) strcpy(fname[nfiles], fnamebuf); 5407c478bd9Sstevel@tonic-gate if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) { 5417c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: Cannot create "); 5427c478bd9Sstevel@tonic-gate perror(fname[nfiles]); 5437c478bd9Sstevel@tonic-gate exit(2); 5447c478bd9Sstevel@tonic-gate } 5457c478bd9Sstevel@tonic-gate fcode[nfiles++] = rep->r1.fcode; 5467c478bd9Sstevel@tonic-gate break; 5477c478bd9Sstevel@tonic-gate 5487c478bd9Sstevel@tonic-gate case 'x': 5497c478bd9Sstevel@tonic-gate rep->r1.command = XCOM; 5507c478bd9Sstevel@tonic-gate break; 5517c478bd9Sstevel@tonic-gate 5527c478bd9Sstevel@tonic-gate case 'y': 5537c478bd9Sstevel@tonic-gate rep->r1.command = YCOM; 5547c478bd9Sstevel@tonic-gate sseof = *cp++; 5557c478bd9Sstevel@tonic-gate rep->r1.re1 = p; 5567c478bd9Sstevel@tonic-gate p = ycomp(rep->r1.re1); 5577c478bd9Sstevel@tonic-gate break; 5587c478bd9Sstevel@tonic-gate 5597c478bd9Sstevel@tonic-gate } 5607c478bd9Sstevel@tonic-gate done: 5617c478bd9Sstevel@tonic-gate if(++rep >= ptrend) 5627c478bd9Sstevel@tonic-gate comperr("Too many commands, last: %s"); 5637c478bd9Sstevel@tonic-gate 5647c478bd9Sstevel@tonic-gate rep->r1.ad1 = p; 5657c478bd9Sstevel@tonic-gate 5667c478bd9Sstevel@tonic-gate if(*cp++ != '\0') { 5677c478bd9Sstevel@tonic-gate if(cp[-1] == ';') 5687c478bd9Sstevel@tonic-gate goto comploop; 5697c478bd9Sstevel@tonic-gate comperr(ETMES); 5707c478bd9Sstevel@tonic-gate } 5717c478bd9Sstevel@tonic-gate } 5727c478bd9Sstevel@tonic-gate rep->r1.command = 0; 5737c478bd9Sstevel@tonic-gate lastre = op; 5747c478bd9Sstevel@tonic-gate } 575bdcaf822Sbasabi 5767c478bd9Sstevel@tonic-gate char *compsub(rhsbuf) 5777c478bd9Sstevel@tonic-gate char *rhsbuf; 5787c478bd9Sstevel@tonic-gate { 579bdcaf822Sbasabi char *p, *q; 5807c478bd9Sstevel@tonic-gate 5817c478bd9Sstevel@tonic-gate p = rhsbuf; 5827c478bd9Sstevel@tonic-gate q = cp; 5837c478bd9Sstevel@tonic-gate for(;;) { 5847c478bd9Sstevel@tonic-gate if(p > &respace[RESIZE-1]) 5857c478bd9Sstevel@tonic-gate comperr(TMMES); 5867c478bd9Sstevel@tonic-gate if((*p = *q++) == '\\') { 5877c478bd9Sstevel@tonic-gate p++; 5887c478bd9Sstevel@tonic-gate if(p > &respace[RESIZE-1]) 5897c478bd9Sstevel@tonic-gate comperr(TMMES); 5907c478bd9Sstevel@tonic-gate *p = *q++; 5917c478bd9Sstevel@tonic-gate if(*p > nbra + '0' && *p <= '9') 5927c478bd9Sstevel@tonic-gate comperr("``\\digit'' out of range: %s"); 5937c478bd9Sstevel@tonic-gate p++; 5947c478bd9Sstevel@tonic-gate continue; 5957c478bd9Sstevel@tonic-gate } 5967c478bd9Sstevel@tonic-gate if(*p == sseof) { 5977c478bd9Sstevel@tonic-gate *p++ = '\0'; 5987c478bd9Sstevel@tonic-gate cp = q; 5997c478bd9Sstevel@tonic-gate return(p); 6007c478bd9Sstevel@tonic-gate } 6017c478bd9Sstevel@tonic-gate if(*p++ == '\0') 6027c478bd9Sstevel@tonic-gate comperr("Ending delimiter missing on substitution: %s"); 6037c478bd9Sstevel@tonic-gate 6047c478bd9Sstevel@tonic-gate } 6057c478bd9Sstevel@tonic-gate } 6067c478bd9Sstevel@tonic-gate 607bdcaf822Sbasabi int 6087c478bd9Sstevel@tonic-gate rline(lbuf, lbend) 6097c478bd9Sstevel@tonic-gate char *lbuf; 6107c478bd9Sstevel@tonic-gate char *lbend; 6117c478bd9Sstevel@tonic-gate { 612bdcaf822Sbasabi char *p, *q; 613bdcaf822Sbasabi int t; 6147c478bd9Sstevel@tonic-gate static char *saveq; 6157c478bd9Sstevel@tonic-gate 6167c478bd9Sstevel@tonic-gate p = lbuf; 6177c478bd9Sstevel@tonic-gate 6187c478bd9Sstevel@tonic-gate if(eflag) { 6197c478bd9Sstevel@tonic-gate if(eflag > 0) { 6207c478bd9Sstevel@tonic-gate eflag = -1; 6217c478bd9Sstevel@tonic-gate if(--eargc <= 0) 6227c478bd9Sstevel@tonic-gate exit(2); 6237c478bd9Sstevel@tonic-gate q = *++eargv; 6247c478bd9Sstevel@tonic-gate while((t = *q++) != '\0') { 6257c478bd9Sstevel@tonic-gate if(t == '\n') { 6267c478bd9Sstevel@tonic-gate saveq = q; 6277c478bd9Sstevel@tonic-gate goto out1; 6287c478bd9Sstevel@tonic-gate } 6297c478bd9Sstevel@tonic-gate if (p < lbend) 6307c478bd9Sstevel@tonic-gate *p++ = t; 6317c478bd9Sstevel@tonic-gate if(t == '\\') { 6327c478bd9Sstevel@tonic-gate if((t = *q++) == '\0') { 6337c478bd9Sstevel@tonic-gate saveq = 0; 6347c478bd9Sstevel@tonic-gate return(-1); 6357c478bd9Sstevel@tonic-gate } 6367c478bd9Sstevel@tonic-gate if (p < lbend) 6377c478bd9Sstevel@tonic-gate *p++ = t; 6387c478bd9Sstevel@tonic-gate } 6397c478bd9Sstevel@tonic-gate } 6407c478bd9Sstevel@tonic-gate saveq = 0; 6417c478bd9Sstevel@tonic-gate 6427c478bd9Sstevel@tonic-gate out1: 6437c478bd9Sstevel@tonic-gate if (p == lbend) 6447c478bd9Sstevel@tonic-gate comperr("Command line too long"); 6457c478bd9Sstevel@tonic-gate *p = '\0'; 6467c478bd9Sstevel@tonic-gate return(1); 6477c478bd9Sstevel@tonic-gate } 6487c478bd9Sstevel@tonic-gate if((q = saveq) == 0) return(-1); 6497c478bd9Sstevel@tonic-gate 6507c478bd9Sstevel@tonic-gate while((t = *q++) != '\0') { 6517c478bd9Sstevel@tonic-gate if(t == '\n') { 6527c478bd9Sstevel@tonic-gate saveq = q; 6537c478bd9Sstevel@tonic-gate goto out2; 6547c478bd9Sstevel@tonic-gate } 6557c478bd9Sstevel@tonic-gate if(p < lbend) 6567c478bd9Sstevel@tonic-gate *p++ = t; 6577c478bd9Sstevel@tonic-gate if(t == '\\') { 6587c478bd9Sstevel@tonic-gate if((t = *q++) == '\0') { 6597c478bd9Sstevel@tonic-gate saveq = 0; 6607c478bd9Sstevel@tonic-gate return(-1); 6617c478bd9Sstevel@tonic-gate } 6627c478bd9Sstevel@tonic-gate if (p < lbend) 6637c478bd9Sstevel@tonic-gate *p++ = t; 6647c478bd9Sstevel@tonic-gate } 6657c478bd9Sstevel@tonic-gate } 6667c478bd9Sstevel@tonic-gate saveq = 0; 6677c478bd9Sstevel@tonic-gate 6687c478bd9Sstevel@tonic-gate out2: 6697c478bd9Sstevel@tonic-gate if (p == lbend) 6707c478bd9Sstevel@tonic-gate comperr("Command line too long"); 6717c478bd9Sstevel@tonic-gate *p = '\0'; 6727c478bd9Sstevel@tonic-gate return(1); 6737c478bd9Sstevel@tonic-gate } 6747c478bd9Sstevel@tonic-gate 6757c478bd9Sstevel@tonic-gate while((t = getc(fin)) != EOF) { 6767c478bd9Sstevel@tonic-gate if(t == '\n') { 6777c478bd9Sstevel@tonic-gate if (p == lbend) 6787c478bd9Sstevel@tonic-gate comperr("Command line too long"); 6797c478bd9Sstevel@tonic-gate *p = '\0'; 6807c478bd9Sstevel@tonic-gate return(1); 6817c478bd9Sstevel@tonic-gate } 6827c478bd9Sstevel@tonic-gate if (p < lbend) 6837c478bd9Sstevel@tonic-gate *p++ = t; 6847c478bd9Sstevel@tonic-gate if(t == '\\') { 6857c478bd9Sstevel@tonic-gate if((t = getc(fin)) == EOF) 6867c478bd9Sstevel@tonic-gate break; 6877c478bd9Sstevel@tonic-gate if(p < lbend) 6887c478bd9Sstevel@tonic-gate *p++ = t; 6897c478bd9Sstevel@tonic-gate } 6907c478bd9Sstevel@tonic-gate } 6917c478bd9Sstevel@tonic-gate if(ferror(fin)) { 6927c478bd9Sstevel@tonic-gate perror("sed: Error reading pattern file"); 6937c478bd9Sstevel@tonic-gate exit(2); 6947c478bd9Sstevel@tonic-gate } 6957c478bd9Sstevel@tonic-gate return(-1); 6967c478bd9Sstevel@tonic-gate } 6977c478bd9Sstevel@tonic-gate 6987c478bd9Sstevel@tonic-gate char *address(expbuf) 6997c478bd9Sstevel@tonic-gate char *expbuf; 7007c478bd9Sstevel@tonic-gate { 701bdcaf822Sbasabi char *rcp; 7027c478bd9Sstevel@tonic-gate long long lno; 7037c478bd9Sstevel@tonic-gate 7047c478bd9Sstevel@tonic-gate if(*cp == '$') { 7057c478bd9Sstevel@tonic-gate if (expbuf > &respace[RESIZE-2]) 7067c478bd9Sstevel@tonic-gate comperr(TMMES); 7077c478bd9Sstevel@tonic-gate cp++; 7087c478bd9Sstevel@tonic-gate *expbuf++ = CEND; 7097c478bd9Sstevel@tonic-gate *expbuf++ = CCEOF; 7107c478bd9Sstevel@tonic-gate return(expbuf); 7117c478bd9Sstevel@tonic-gate } 7127c478bd9Sstevel@tonic-gate if (*cp == '/' || *cp == '\\' ) { 7137c478bd9Sstevel@tonic-gate if ( *cp == '\\' ) 7147c478bd9Sstevel@tonic-gate cp++; 7157c478bd9Sstevel@tonic-gate sseof = *cp++; 7167c478bd9Sstevel@tonic-gate return(comple((char *) 0, expbuf, &respace[RESIZE-1], sseof)); 7177c478bd9Sstevel@tonic-gate } 7187c478bd9Sstevel@tonic-gate 7197c478bd9Sstevel@tonic-gate rcp = cp; 7207c478bd9Sstevel@tonic-gate lno = 0; 7217c478bd9Sstevel@tonic-gate 7227c478bd9Sstevel@tonic-gate while(*rcp >= '0' && *rcp <= '9') 7237c478bd9Sstevel@tonic-gate lno = lno*10 + *rcp++ - '0'; 7247c478bd9Sstevel@tonic-gate 7257c478bd9Sstevel@tonic-gate if(rcp > cp) { 7267c478bd9Sstevel@tonic-gate if (expbuf > &respace[RESIZE-3]) 7277c478bd9Sstevel@tonic-gate comperr(TMMES); 7287c478bd9Sstevel@tonic-gate *expbuf++ = CLNUM; 7297c478bd9Sstevel@tonic-gate *expbuf++ = nlno; 7307c478bd9Sstevel@tonic-gate tlno[nlno++] = lno; 7317c478bd9Sstevel@tonic-gate if(nlno >= NLINES) 7327c478bd9Sstevel@tonic-gate comperr("Too many line numbers: %s"); 7337c478bd9Sstevel@tonic-gate *expbuf++ = CCEOF; 7347c478bd9Sstevel@tonic-gate cp = rcp; 7357c478bd9Sstevel@tonic-gate return(expbuf); 7367c478bd9Sstevel@tonic-gate } 7377c478bd9Sstevel@tonic-gate return(0); 7387c478bd9Sstevel@tonic-gate } 7397c478bd9Sstevel@tonic-gate 7407c478bd9Sstevel@tonic-gate char *text(textbuf, tbend) 7417c478bd9Sstevel@tonic-gate char *textbuf; 7427c478bd9Sstevel@tonic-gate char *tbend; 7437c478bd9Sstevel@tonic-gate { 744bdcaf822Sbasabi char *p, *q; 7457c478bd9Sstevel@tonic-gate 7467c478bd9Sstevel@tonic-gate p = textbuf; 7477c478bd9Sstevel@tonic-gate q = cp; 7487c478bd9Sstevel@tonic-gate #ifndef S5EMUL 7497c478bd9Sstevel@tonic-gate /* 7507c478bd9Sstevel@tonic-gate * Strip off indentation from text to be inserted. 7517c478bd9Sstevel@tonic-gate */ 7527c478bd9Sstevel@tonic-gate while(*q == '\t' || *q == ' ') q++; 7537c478bd9Sstevel@tonic-gate #endif 7547c478bd9Sstevel@tonic-gate for(;;) { 7557c478bd9Sstevel@tonic-gate 7567c478bd9Sstevel@tonic-gate if(p > tbend) 7577c478bd9Sstevel@tonic-gate return(NULL); /* overflowed the buffer */ 7587c478bd9Sstevel@tonic-gate if((*p = *q++) == '\\') 7597c478bd9Sstevel@tonic-gate *p = *q++; 7607c478bd9Sstevel@tonic-gate if(*p == '\0') { 7617c478bd9Sstevel@tonic-gate cp = --q; 7627c478bd9Sstevel@tonic-gate return(++p); 7637c478bd9Sstevel@tonic-gate } 7647c478bd9Sstevel@tonic-gate #ifndef S5EMUL 7657c478bd9Sstevel@tonic-gate /* 7667c478bd9Sstevel@tonic-gate * Strip off indentation from text to be inserted. 7677c478bd9Sstevel@tonic-gate */ 7687c478bd9Sstevel@tonic-gate if(*p == '\n') { 7697c478bd9Sstevel@tonic-gate while(*q == '\t' || *q == ' ') q++; 7707c478bd9Sstevel@tonic-gate } 7717c478bd9Sstevel@tonic-gate #endif 7727c478bd9Sstevel@tonic-gate p++; 7737c478bd9Sstevel@tonic-gate } 7747c478bd9Sstevel@tonic-gate } 7757c478bd9Sstevel@tonic-gate 7767c478bd9Sstevel@tonic-gate 7777c478bd9Sstevel@tonic-gate struct label *search(ptr) 7787c478bd9Sstevel@tonic-gate struct label *ptr; 7797c478bd9Sstevel@tonic-gate { 7807c478bd9Sstevel@tonic-gate struct label *rp; 7817c478bd9Sstevel@tonic-gate 7827c478bd9Sstevel@tonic-gate rp = labtab; 7837c478bd9Sstevel@tonic-gate while(rp < ptr) { 7847c478bd9Sstevel@tonic-gate if(strcmp(rp->asc, ptr->asc) == 0) 7857c478bd9Sstevel@tonic-gate return(rp); 7867c478bd9Sstevel@tonic-gate rp++; 7877c478bd9Sstevel@tonic-gate } 7887c478bd9Sstevel@tonic-gate 7897c478bd9Sstevel@tonic-gate return(0); 7907c478bd9Sstevel@tonic-gate } 7917c478bd9Sstevel@tonic-gate 7927c478bd9Sstevel@tonic-gate 793bdcaf822Sbasabi static void 794bdcaf822Sbasabi dechain(void) 7957c478bd9Sstevel@tonic-gate { 7967c478bd9Sstevel@tonic-gate struct label *lptr; 7977c478bd9Sstevel@tonic-gate union reptr *rptr, *trptr; 7987c478bd9Sstevel@tonic-gate 7997c478bd9Sstevel@tonic-gate for(lptr = labtab; lptr < lab; lptr++) { 8007c478bd9Sstevel@tonic-gate 8017c478bd9Sstevel@tonic-gate if(lptr->address == 0) { 8027c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: Undefined label: %s\n", lptr->asc); 8037c478bd9Sstevel@tonic-gate exit(2); 8047c478bd9Sstevel@tonic-gate } 8057c478bd9Sstevel@tonic-gate 8067c478bd9Sstevel@tonic-gate if(lptr->chain) { 8077c478bd9Sstevel@tonic-gate rptr = lptr->chain; 8087c478bd9Sstevel@tonic-gate while(trptr = rptr->r2.lb1) { 8097c478bd9Sstevel@tonic-gate rptr->r2.lb1 = lptr->address; 8107c478bd9Sstevel@tonic-gate rptr = trptr; 8117c478bd9Sstevel@tonic-gate } 8127c478bd9Sstevel@tonic-gate rptr->r2.lb1 = lptr->address; 8137c478bd9Sstevel@tonic-gate } 8147c478bd9Sstevel@tonic-gate } 8157c478bd9Sstevel@tonic-gate } 8167c478bd9Sstevel@tonic-gate 8177c478bd9Sstevel@tonic-gate char *ycomp(expbuf) 8187c478bd9Sstevel@tonic-gate char *expbuf; 8197c478bd9Sstevel@tonic-gate { 820bdcaf822Sbasabi char c; 821bdcaf822Sbasabi char *ep, *tsp; 822bdcaf822Sbasabi int i; 8237c478bd9Sstevel@tonic-gate char *sp; 8247c478bd9Sstevel@tonic-gate 8257c478bd9Sstevel@tonic-gate ep = expbuf; 8267c478bd9Sstevel@tonic-gate if(ep + 0377 > &respace[RESIZE-1]) 8277c478bd9Sstevel@tonic-gate comperr(TMMES); 8287c478bd9Sstevel@tonic-gate sp = cp; 8297c478bd9Sstevel@tonic-gate for(tsp = cp; (c = *tsp) != sseof; tsp++) { 8307c478bd9Sstevel@tonic-gate if(c == '\\') 8317c478bd9Sstevel@tonic-gate tsp++; 8327c478bd9Sstevel@tonic-gate if(c == '\0' || c == '\n') 8337c478bd9Sstevel@tonic-gate comperr("Ending delimiter missing on string: %s"); 8347c478bd9Sstevel@tonic-gate } 8357c478bd9Sstevel@tonic-gate tsp++; 8367c478bd9Sstevel@tonic-gate 8377c478bd9Sstevel@tonic-gate while((c = *sp++) != sseof) { 8387c478bd9Sstevel@tonic-gate c &= 0377; 8397c478bd9Sstevel@tonic-gate if(c == '\\' && *sp == 'n') { 8407c478bd9Sstevel@tonic-gate sp++; 8417c478bd9Sstevel@tonic-gate c = '\n'; 8427c478bd9Sstevel@tonic-gate } 8437c478bd9Sstevel@tonic-gate if((ep[c] = *tsp++) == '\\' && *tsp == 'n') { 8447c478bd9Sstevel@tonic-gate ep[c] = '\n'; 8457c478bd9Sstevel@tonic-gate tsp++; 8467c478bd9Sstevel@tonic-gate } 8477c478bd9Sstevel@tonic-gate if(ep[c] == sseof || ep[c] == '\0') 8487c478bd9Sstevel@tonic-gate comperr("Transform strings not the same size: %s"); 8497c478bd9Sstevel@tonic-gate } 8507c478bd9Sstevel@tonic-gate if(*tsp != sseof) { 8517c478bd9Sstevel@tonic-gate if(*tsp == '\0') 8527c478bd9Sstevel@tonic-gate comperr("Ending delimiter missing on string: %s"); 8537c478bd9Sstevel@tonic-gate else 8547c478bd9Sstevel@tonic-gate comperr("Transform strings not the same size: %s"); 8557c478bd9Sstevel@tonic-gate } 8567c478bd9Sstevel@tonic-gate cp = ++tsp; 8577c478bd9Sstevel@tonic-gate 8587c478bd9Sstevel@tonic-gate for(i = 0; i < 0400; i++) 8597c478bd9Sstevel@tonic-gate if(ep[i] == 0) 8607c478bd9Sstevel@tonic-gate ep[i] = i; 8617c478bd9Sstevel@tonic-gate 8627c478bd9Sstevel@tonic-gate return(ep + 0400); 8637c478bd9Sstevel@tonic-gate } 864bdcaf822Sbasabi 865bdcaf822Sbasabi void 866bdcaf822Sbasabi comperr(char *msg) 8677c478bd9Sstevel@tonic-gate { 8687c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "sed: "); 8697c478bd9Sstevel@tonic-gate (void) fprintf(stderr, msg, linebuf); 8707c478bd9Sstevel@tonic-gate (void) putc('\n', stderr); 8717c478bd9Sstevel@tonic-gate exit(2); 8727c478bd9Sstevel@tonic-gate } 873