Update sed.

This commit is contained in:
Serge
2022-05-27 21:54:16 -07:00
parent e728e7f25d
commit 97dfd3ae89
8 changed files with 509 additions and 442 deletions

View File

@@ -28,43 +28,43 @@
#define LABSIZE 50 #define LABSIZE 50
#define NBRA 9 #define NBRA 9
FILE *fin; extern FILE *fin;
union reptr *abuf[ABUFSIZE]; extern union reptr *abuf[ABUFSIZE];
union reptr **aptr; extern union reptr **aptr;
char *lastre; extern char *lastre;
char ibuf[BUFSIZ]; extern char ibuf[BUFSIZ];
char *cbp; extern char *cbp;
char *ebp; extern char *ebp;
char genbuf[LBSIZE]; extern char genbuf[LBSIZE];
char *loc1; extern char *loc1;
char *loc2; extern char *loc2;
char *locs; extern char *locs;
char seof; extern char seof;
char *reend; extern char *reend;
char *lbend; extern char *lbend;
char *hend; extern char *hend;
char *lcomend; extern char *lcomend;
union reptr *ptrend; extern union reptr *ptrend;
int eflag; extern int eflag;
int dolflag; extern int dolflag;
int sflag; extern int sflag;
int jflag; extern int jflag;
int numbra; extern int numbra;
int delflag; extern int delflag;
long lnum; extern long lnum;
char linebuf[LBSIZE+1]; extern char linebuf[LBSIZE+1];
char holdsp[LBSIZE+1]; extern char holdsp[LBSIZE+1];
char *spend; extern char *spend;
char *hspend; extern char *hspend;
int nflag; extern int nflag;
int gflag; extern int gflag;
char *braelist[NBRA]; extern char *braelist[NBRA];
char *braslist[NBRA]; extern char *braslist[NBRA];
long tlno[NLINES]; extern long tlno[NLINES];
int nlno; extern int nlno;
char fname[12][40]; extern char fname[12][40];
FILE *fcode[12]; extern FILE *fcode[12];
int nfiles; extern int nfiles;
#define ACOM 01 #define ACOM 01
#define BCOM 020 #define BCOM 020
@@ -94,9 +94,9 @@ int nfiles;
#define YCOM 026 #define YCOM 026
#define XCOM 033 #define XCOM 033
char *cp; extern char *cp;
char *reend; extern char *reend;
char *lbend; extern char *lbend;
union reptr { union reptr {
struct reptr1 { struct reptr1 {
@@ -123,39 +123,34 @@ union reptr {
char inar; char inar;
char negfl; char negfl;
} B; } B;
} ptrspace[PTRSIZE], *rep; };
extern union reptr ptrspace[PTRSIZE], *rep;
extern char respace[RESIZE];
char respace[RESIZE];
struct label { struct label {
char asc[9]; char asc[9];
union reptr *chain; union reptr *chain;
union reptr *address; union reptr *address;
} ltab[LABSIZE]; };
extern struct label ltab[LABSIZE];
struct label *lab; extern struct label *lab;
struct label *labend; extern struct label *labend;
int f; extern int f;
int depth; extern int depth;
int eargc; extern int eargc;
char **eargv; extern char **eargv;
extern char bittab[]; extern char bittab[];
union reptr **cmpend[DEPTH]; extern union reptr **cmpend[DEPTH];
int depth; extern int depth;
union reptr *pending; extern union reptr *pending;
char *badp; extern char *badp;
char bad; extern char bad;
char *compile(); extern char compfl;
char *ycomp();
char *address(); void execute(char *file);
char *text();
char *compsub();
struct label *search();
char *gline();
char *place();
char compfl;

View File

@@ -19,8 +19,75 @@ char bittab[] = {
128 128
}; };
main(argc, argv) FILE *fin;
char *argv[]; union reptr *abuf[ABUFSIZE];
union reptr **aptr;
char *lastre;
char ibuf[BUFSIZ];
char *cbp;
char *ebp;
char genbuf[LBSIZE];
char *loc1;
char *loc2;
char *locs;
char seof;
char *reend;
char *lbend;
char *hend;
char *lcomend;
union reptr *ptrend;
int eflag;
int dolflag;
int sflag;
int jflag;
int numbra;
int delflag;
long lnum;
char linebuf[LBSIZE+1];
char holdsp[LBSIZE+1];
char *spend;
char *hspend;
int nflag;
int gflag;
char *braelist[NBRA];
char *braslist[NBRA];
long tlno[NLINES];
int nlno;
char fname[12][40];
FILE *fcode[12];
int nfiles;
char *cp;
char *reend;
char *lbend;
union reptr ptrspace[PTRSIZE], *rep;
char respace[RESIZE];
struct label ltab[LABSIZE];
struct label *lab;
struct label *labend;
int f;
int depth;
int eargc;
char **eargv;
char bittab[];
union reptr **cmpend[DEPTH];
int depth;
union reptr *pending;
char *badp;
char bad;
char compfl;
void fcomp(void);
void dechain(void);
int rline(char *lbuf);
struct label *search(struct label *ptr);
char *text(char *textbuf);
char *compile(char *expbuf);
char *compsub(char *rhsbuf);
int cmp(char *a, char *b);
char *ycomp(char *expbuf);
int main(argc, argv)
char *argv[];
{ {
eargc = argc; eargc = argc;
@@ -45,7 +112,7 @@ char *argv[];
fcode[0] = stdout; fcode[0] = stdout;
nfiles = 1; nfiles = 1;
if(eargc == 1) if (eargc == 1)
exit(0); exit(0);
@@ -57,9 +124,9 @@ char *argv[];
continue; continue;
case 'f': case 'f':
if(eargc-- <= 0) exit(2); if (eargc-- <= 0) exit(2);
if((fin = fopen(*++eargv, "r")) == NULL) { if ((fin = fopen(*++eargv, "r")) == NULL) {
fprintf(stderr, "Cannot open pattern-file: %s\n", *eargv); fprintf(stderr, "Cannot open pattern-file: %s\n", *eargv);
exit(2); exit(2);
} }
@@ -84,7 +151,7 @@ char *argv[];
} }
if(compfl == 0) { if (compfl == 0) {
eargv--; eargv--;
eargc++; eargc++;
eflag++; eflag++;
@@ -94,7 +161,7 @@ char *argv[];
eflag = 0; eflag = 0;
} }
if(depth) { if (depth) {
fprintf(stderr, "Too many {'s"); fprintf(stderr, "Too many {'s");
exit(2); exit(2);
} }
@@ -103,20 +170,20 @@ char *argv[];
dechain(); dechain();
/* abort(); /*DEBUG*/ /*abort();*/ /*DEBUG*/
if(eargc <= 0) if (eargc <= 0)
execute((char *)NULL); execute((char *)NULL);
else while(--eargc >= 0) { else while (--eargc >= 0) {
execute(*eargv++); execute(*eargv++);
} }
fclose(stdout); fclose(stdout);
exit(0); exit(0);
} }
fcomp()
{
register char *p, *op, *tp; void fcomp()
{
char *p, *op, *tp;
char *address(); char *address();
union reptr *pt, *pt1; union reptr *pt, *pt1;
int i; int i;
@@ -125,9 +192,9 @@ fcomp()
compfl = 1; compfl = 1;
op = lastre; op = lastre;
if(rline(linebuf) < 0) return; if (rline(linebuf) < 0) return;
if(*linebuf == '#') { if (*linebuf == '#') {
if(linebuf[1] == 'n') if (linebuf[1] == 'n')
nflag = 1; nflag = 1;
} }
else { else {
@@ -135,50 +202,50 @@ fcomp()
goto comploop; goto comploop;
} }
for(;;) { for (;;) {
if(rline(linebuf) < 0) break; if (rline(linebuf) < 0) break;
cp = linebuf; cp = linebuf;
comploop: comploop:
/* fprintf(stdout, "cp: %s\n", cp); /*DEBUG*/ /*fprintf(stdout, "cp: %s\n", cp);*/ /*DEBUG*/
while(*cp == ' ' || *cp == '\t') cp++; while (*cp == ' ' || *cp == '\t') cp++;
if(*cp == '\0' || *cp == '#') continue; if (*cp == '\0' || *cp == '#') continue;
if(*cp == ';') { if (*cp == ';') {
cp++; cp++;
goto comploop; goto comploop;
} }
p = address(rep->A.ad1); p = address(rep->A.ad1);
if(p == badp) { if (p == badp) {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
if(p == rep->A.ad1) { if (p == rep->A.ad1) {
if(op) if (op)
rep->A.ad1 = op; rep->A.ad1 = op;
else { else {
fprintf(stderr, "First RE may not be null\n"); fprintf(stderr, "First RE may not be null\n");
exit(2); exit(2);
} }
} else if(p == 0) { } else if (p == 0) {
p = rep->A.ad1; p = rep->A.ad1;
rep->A.ad1 = 0; rep->A.ad1 = 0;
} else { } else {
op = rep->A.ad1; op = rep->A.ad1;
if(*cp == ',' || *cp == ';') { if (*cp == ',' || *cp == ';') {
cp++; cp++;
if((rep->A.ad2 = p) > reend) { if ((rep->A.ad2 = p) > reend) {
fprintf(stderr, TMMES, linebuf); fprintf(stderr, TMMES, linebuf);
exit(2); exit(2);
} }
p = address(rep->A.ad2); p = address(rep->A.ad2);
if(p == badp || p == 0) { if (p == badp || p == 0) {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
if(p == rep->A.ad2) if (p == rep->A.ad2)
rep->A.ad2 = op; rep->A.ad2 = op;
else else
op = rep->A.ad2; op = rep->A.ad2;
@@ -187,15 +254,15 @@ comploop:
rep->A.ad2 = 0; rep->A.ad2 = 0;
} }
if(p > reend) { if (p > reend) {
fprintf(stderr, "Too much text: %s\n", linebuf); fprintf(stderr, "Too much text: %s\n", linebuf);
exit(2); exit(2);
} }
while(*cp == ' ' || *cp == '\t') cp++; while (*cp == ' ' || *cp == '\t') cp++;
swit: swit:
switch(*cp++) { switch (*cp++) {
default: default:
fprintf(stderr, "Unrecognized command: %s\n", linebuf); fprintf(stderr, "Unrecognized command: %s\n", linebuf);
@@ -209,22 +276,22 @@ swit:
rep->A.command = BCOM; rep->A.command = BCOM;
rep->A.negfl = !(rep->A.negfl); rep->A.negfl = !(rep->A.negfl);
cmpend[depth++] = &rep->B.lb1; cmpend[depth++] = &rep->B.lb1;
if(++rep >= ptrend) { if (++rep >= ptrend) {
fprintf(stderr, "Too many commands: %s\n", linebuf); fprintf(stderr, "Too many commands: %s\n", linebuf);
exit(2); exit(2);
} }
rep->A.ad1 = p; rep->A.ad1 = p;
if(*cp == '\0') continue; if (*cp == '\0') continue;
goto comploop; goto comploop;
case '}': case '}':
if(rep->A.ad1) { if (rep->A.ad1) {
fprintf(stderr, AD0MES, linebuf); fprintf(stderr, AD0MES, linebuf);
exit(2); exit(2);
} }
if(--depth < 0) { if (--depth < 0) {
fprintf(stderr, "Too many }'s\n"); fprintf(stderr, "Too many }'s\n");
exit(2); exit(2);
} }
@@ -235,39 +302,39 @@ swit:
case '=': case '=':
rep->A.command = EQCOM; rep->A.command = EQCOM;
if(rep->A.ad2) { if (rep->A.ad2) {
fprintf(stderr, AD1MES, linebuf); fprintf(stderr, AD1MES, linebuf);
exit(2); exit(2);
} }
break; break;
case ':': case ':':
if(rep->A.ad1) { if (rep->A.ad1) {
fprintf(stderr, AD0MES, linebuf); fprintf(stderr, AD0MES, linebuf);
exit(2); exit(2);
} }
while(*cp++ == ' '); while (*cp++ == ' ');
cp--; cp--;
tp = lab->asc; tp = lab->asc;
while((*tp++ = *cp++)) while ((*tp++ = *cp++))
if(tp >= &(lab->asc[8])) { if (tp >= &(lab->asc[8])) {
fprintf(stderr, LTL, linebuf); fprintf(stderr, LTL, linebuf);
exit(2); exit(2);
} }
*--tp = '\0'; *--tp = '\0';
if(lpt = search(lab)) { if ((lpt = search(lab))) {
if(lpt->address) { if (lpt->address) {
fprintf(stderr, "Duplicate labels: %s\n", linebuf); fprintf(stderr, "Duplicate labels: %s\n", linebuf);
exit(2); exit(2);
} }
} else { } else {
lab->chain = 0; lab->chain = 0;
lpt = lab; lpt = lab;
if(++lab >= labend) { if (++lab >= labend) {
fprintf(stderr, "Too many labels: %s\n", linebuf); fprintf(stderr, "Too many labels: %s\n", linebuf);
exit(2); exit(2);
} }
@@ -279,12 +346,12 @@ swit:
case 'a': case 'a':
rep->A.command = ACOM; rep->A.command = ACOM;
if(rep->A.ad2) { if (rep->A.ad2) {
fprintf(stderr, AD1MES, linebuf); fprintf(stderr, AD1MES, linebuf);
exit(2); exit(2);
} }
if(*cp == '\\') cp++; if (*cp == '\\') cp++;
if(*cp++ != '\n') { if (*cp++ != '\n') {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
@@ -293,8 +360,8 @@ swit:
break; break;
case 'c': case 'c':
rep->A.command = CCOM; rep->A.command = CCOM;
if(*cp == '\\') cp++; if (*cp == '\\') cp++;
if(*cp++ != ('\n')) { if (*cp++ != ('\n')) {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
@@ -303,12 +370,12 @@ swit:
break; break;
case 'i': case 'i':
rep->A.command = ICOM; rep->A.command = ICOM;
if(rep->A.ad2) { if (rep->A.ad2) {
fprintf(stderr, AD1MES, linebuf); fprintf(stderr, AD1MES, linebuf);
exit(2); exit(2);
} }
if(*cp == '\\') cp++; if (*cp == '\\') cp++;
if(*cp++ != ('\n')) { if (*cp++ != ('\n')) {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
@@ -339,12 +406,12 @@ swit:
case 'b': case 'b':
rep->A.command = BCOM; rep->A.command = BCOM;
jtcommon: jtcommon:
while(*cp++ == ' '); while (*cp++ == ' ');
cp--; cp--;
if(*cp == '\0') { if (*cp == '\0') {
if(pt = labtab->chain) { if ((pt = labtab->chain)) {
while(pt1 = pt->B.lb1) while ((pt1 = pt->B.lb1))
pt = pt1; pt = pt1;
pt->B.lb1 = rep; pt->B.lb1 = rep;
} else } else
@@ -352,27 +419,27 @@ jtcommon:
break; break;
} }
tp = lab->asc; tp = lab->asc;
while((*tp++ = *cp++)) while ((*tp++ = *cp++))
if(tp >= &(lab->asc[8])) { if (tp >= &(lab->asc[8])) {
fprintf(stderr, LTL, linebuf); fprintf(stderr, LTL, linebuf);
exit(2); exit(2);
} }
cp--; cp--;
*--tp = '\0'; *--tp = '\0';
if(lpt = search(lab)) { if ((lpt = search(lab))) {
if(lpt->address) { if (lpt->address) {
rep->B.lb1 = lpt->address; rep->B.lb1 = lpt->address;
} else { } else {
pt = lpt->chain; pt = lpt->chain;
while(pt1 = pt->B.lb1) while ((pt1 = pt->B.lb1))
pt = pt1; pt = pt1;
pt->B.lb1 = rep; pt->B.lb1 = rep;
} }
} else { } else {
lab->chain = rep; lab->chain = rep;
lab->address = 0; lab->address = 0;
if(++lab >= labend) { if (++lab >= labend) {
fprintf(stderr, "Too many labels: %s\n", linebuf); fprintf(stderr, "Too many labels: %s\n", linebuf);
exit(2); exit(2);
} }
@@ -397,11 +464,11 @@ jtcommon:
case 'r': case 'r':
rep->A.command = RCOM; rep->A.command = RCOM;
if(rep->A.ad2) { if (rep->A.ad2) {
fprintf(stderr, AD1MES, linebuf); fprintf(stderr, AD1MES, linebuf);
exit(2); exit(2);
} }
if(*cp++ != ' ') { if (*cp++ != ' ') {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
@@ -420,7 +487,7 @@ jtcommon:
case 'q': case 'q':
rep->A.command = QCOM; rep->A.command = QCOM;
if(rep->A.ad2) { if (rep->A.ad2) {
fprintf(stderr, AD1MES, linebuf); fprintf(stderr, AD1MES, linebuf);
exit(2); exit(2);
} }
@@ -435,12 +502,12 @@ jtcommon:
seof = *cp++; seof = *cp++;
rep->A.re1 = p; rep->A.re1 = p;
p = compile(rep->A.re1); p = compile(rep->A.re1);
if(p == badp) { if (p == badp) {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
if(p == rep->A.re1) { if (p == rep->A.re1) {
if(op) if (op)
rep->A.re1 = op; rep->A.re1 = op;
else { else {
fprintf(stderr, fprintf(stderr,
@@ -451,49 +518,49 @@ jtcommon:
op = rep->A.re1; op = rep->A.re1;
} }
if((rep->A.rhs = p) > reend) { if ((rep->A.rhs = p) > reend) {
fprintf(stderr, TMMES, linebuf); fprintf(stderr, TMMES, linebuf);
exit(2); exit(2);
} }
if((p = compsub(rep->A.rhs)) == badp) { if ((p = compsub(rep->A.rhs)) == badp) {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
if(*cp == 'g') { if (*cp == 'g') {
cp++; cp++;
rep->A.gfl++; rep->A.gfl++;
} else if(gflag) } else if (gflag)
rep->A.gfl++; rep->A.gfl++;
if(*cp == 'p') { if (*cp == 'p') {
cp++; cp++;
rep->A.pfl = 1; rep->A.pfl = 1;
} }
if(*cp == 'P') { if (*cp == 'P') {
cp++; cp++;
rep->A.pfl = 2; rep->A.pfl = 2;
} }
if(*cp == 'w') { if (*cp == 'w') {
cp++; cp++;
if(*cp++ != ' ') { if (*cp++ != ' ') {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
if(nfiles >= 10) { if (nfiles >= 10) {
fprintf(stderr, "Too many files in w commands\n"); fprintf(stderr, "Too many files in w commands\n");
exit(2); exit(2);
} }
text(fname[nfiles]); text(fname[nfiles]);
for(i = nfiles - 1; i >= 0; i--) for (i = nfiles - 1; i >= 0; i--)
if(cmp(fname[nfiles],fname[i]) == 0) { if (cmp(fname[nfiles],fname[i]) == 0) {
rep->A.fcode = fcode[i]; rep->A.fcode = fcode[i];
goto done; goto done;
} }
if((rep->A.fcode = fopen(fname[nfiles], "w")) == NULL) { if ((rep->A.fcode = fopen(fname[nfiles], "w")) == NULL) {
fprintf(stderr, "cannot open %s\n", fname[nfiles]); fprintf(stderr, "cannot open %s\n", fname[nfiles]);
exit(2); exit(2);
} }
@@ -503,23 +570,23 @@ jtcommon:
case 'w': case 'w':
rep->A.command = WCOM; rep->A.command = WCOM;
if(*cp++ != ' ') { if (*cp++ != ' ') {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
if(nfiles >= 10){ if (nfiles >= 10){
fprintf(stderr, "Too many files in w commands\n"); fprintf(stderr, "Too many files in w commands\n");
exit(2); exit(2);
} }
text(fname[nfiles]); text(fname[nfiles]);
for(i = nfiles - 1; i >= 0; i--) for (i = nfiles - 1; i >= 0; i--)
if(cmp(fname[nfiles], fname[i]) == 0) { if (cmp(fname[nfiles], fname[i]) == 0) {
rep->A.fcode = fcode[i]; rep->A.fcode = fcode[i];
goto done; goto done;
} }
if((rep->A.fcode = fopen(fname[nfiles], "w")) == NULL) { if ((rep->A.fcode = fopen(fname[nfiles], "w")) == NULL) {
fprintf(stderr, "Cannot create %s\n", fname[nfiles]); fprintf(stderr, "Cannot create %s\n", fname[nfiles]);
exit(2); exit(2);
} }
@@ -535,11 +602,11 @@ jtcommon:
seof = *cp++; seof = *cp++;
rep->A.re1 = p; rep->A.re1 = p;
p = ycomp(rep->A.re1); p = ycomp(rep->A.re1);
if(p == badp) { if (p == badp) {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
if(p > reend) { if (p > reend) {
fprintf(stderr, TMMES, linebuf); fprintf(stderr, TMMES, linebuf);
exit(2); exit(2);
} }
@@ -547,15 +614,15 @@ jtcommon:
} }
done: done:
if(++rep >= ptrend) { if (++rep >= ptrend) {
fprintf(stderr, "Too many commands, last: %s\n", linebuf); fprintf(stderr, "Too many commands, last: %s\n", linebuf);
exit(2); exit(2);
} }
rep->A.ad1 = p; rep->A.ad1 = p;
if(*cp++ != '\0') { if (*cp++ != '\0') {
if(cp[-1] == ';') if (cp[-1] == ';')
goto comploop; goto comploop;
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
@@ -565,27 +632,28 @@ done:
rep->A.command = 0; rep->A.command = 0;
lastre = op; lastre = op;
} }
char *compsub(rhsbuf)
char *rhsbuf; char *compsub(rhsbuf)
char *rhsbuf;
{ {
register char *p, *q; char *p, *q;
p = rhsbuf; p = rhsbuf;
q = cp; q = cp;
for(;;) { for (;;) {
if((*p = *q++) == '\\') { if ((*p = *q++) == '\\') {
*p = *q++; *p = *q++;
if(*p > numbra + '0' && *p <= '9') if (*p > numbra + '0' && *p <= '9')
return(badp); return(badp);
*p++ |= 0200; *p++ |= 0200;
continue; continue;
} }
if(*p == seof) { if (*p == seof) {
*p++ = '\0'; *p++ = '\0';
cp = q; cp = q;
return(p); return(p);
} }
if(*p++ == '\0') { if (*p++ == '\0') {
return(badp); return(badp);
} }
@@ -593,17 +661,17 @@ char *rhsbuf;
} }
char *compile(expbuf) char *compile(expbuf)
char *expbuf; char *expbuf;
{ {
register c; int c;
register char *ep, *sp; char *ep, *sp;
char neg; char neg;
char *lastep, *cstart; char *lastep, *cstart;
int cclcnt; int cclcnt;
int closed; int closed;
char bracket[NBRA], *bracketp; char bracket[NBRA], *bracketp;
if(*cp == seof) { if (*cp == seof) {
cp++; cp++;
return(expbuf); return(expbuf);
} }
@@ -624,8 +692,8 @@ char *expbuf;
cp = sp; cp = sp;
return(badp); return(badp);
} }
if((c = *sp++) == seof) { if ((c = *sp++) == seof) {
if(bracketp != bracket) { if (bracketp != bracket) {
cp = sp; cp = sp;
return(badp); return(badp);
} }
@@ -633,13 +701,13 @@ char *expbuf;
*ep++ = CEOF; *ep++ = CEOF;
return(ep); return(ep);
} }
if(c != '*') if (c != '*')
lastep = ep; lastep = ep;
switch (c) { switch (c) {
case '\\': case '\\':
if((c = *sp++) == '(') { if ((c = *sp++) == '(') {
if(numbra >= NBRA) { if (numbra >= NBRA) {
cp = sp; cp = sp;
return(badp); return(badp);
} }
@@ -648,8 +716,8 @@ char *expbuf;
*ep++ = numbra++; *ep++ = numbra++;
continue; continue;
} }
if(c == ')') { if (c == ')') {
if(bracketp <= bracket) { if (bracketp <= bracket) {
cp = sp; cp = sp;
return(badp); return(badp);
} }
@@ -659,19 +727,19 @@ char *expbuf;
continue; continue;
} }
if(c >= '1' && c <= '9') { if (c >= '1' && c <= '9') {
if((c -= '1') >= closed) if ((c -= '1') >= closed)
return(badp); return(badp);
*ep++ = CBACK; *ep++ = CBACK;
*ep++ = c; *ep++ = c;
continue; continue;
} }
if(c == '\n') { if (c == '\n') {
cp = sp; cp = sp;
return(badp); return(badp);
} }
if(c == 'n') { if (c == 'n') {
c = '\n'; c = '\n';
} }
goto defchar; goto defchar;
@@ -689,7 +757,7 @@ char *expbuf;
case '*': case '*':
if (lastep == 0) if (lastep == 0)
goto defchar; goto defchar;
if(*lastep == CKET) { if (*lastep == CKET) {
cp = sp; cp = sp;
return(badp); return(badp);
} }
@@ -703,7 +771,7 @@ char *expbuf;
continue; continue;
case '[': case '[':
if(&ep[17] >= &expbuf[ESIZE]) { if (&ep[17] >= &expbuf[ESIZE]) {
fprintf(stderr, "RE too long: %s\n", linebuf); fprintf(stderr, "RE too long: %s\n", linebuf);
exit(2); exit(2);
} }
@@ -711,14 +779,14 @@ char *expbuf;
*ep++ = CCL; *ep++ = CCL;
neg = 0; neg = 0;
if((c = *sp++) == '^') { if ((c = *sp++) == '^') {
neg = 1; neg = 1;
c = *sp++; c = *sp++;
} }
cstart = sp; cstart = sp;
do { do {
if(c == '\0') { if (c == '\0') {
fprintf(stderr, CGMES, linebuf); fprintf(stderr, CGMES, linebuf);
exit(2); exit(2);
} }
@@ -726,8 +794,8 @@ char *expbuf;
for (c = sp[-2]; c<*sp; c++) for (c = sp[-2]; c<*sp; c++)
ep[c>>3] |= bittab[c&07]; ep[c>>3] |= bittab[c&07];
} }
if(c == '\\') { if (c == '\\') {
switch(c = *sp++) { switch (c = *sp++) {
case 'n': case 'n':
c = '\n'; c = '\n';
break; break;
@@ -735,10 +803,10 @@ char *expbuf;
} }
ep[c >> 3] |= bittab[c & 07]; ep[c >> 3] |= bittab[c & 07];
} while((c = *sp++) != ']'); } while ((c = *sp++) != ']');
if(neg) if (neg)
for(cclcnt = 0; cclcnt < 16; cclcnt++) for (cclcnt = 0; cclcnt < 16; cclcnt++)
ep[cclcnt] ^= -1; ep[cclcnt] ^= -1;
ep[0] &= 0376; ep[0] &= 0376;
@@ -753,30 +821,31 @@ char *expbuf;
} }
} }
} }
rline(lbuf)
char *lbuf; int rline(lbuf)
char *lbuf;
{ {
register char *p, *q; char *p, *q;
register t; int t;
static char *saveq; static char *saveq;
p = lbuf - 1; p = lbuf - 1;
if(eflag) { if (eflag) {
if(eflag > 0) { if (eflag > 0) {
eflag = -1; eflag = -1;
if(eargc-- <= 0) if (eargc-- <= 0)
exit(2); exit(2);
q = *++eargv; q = *++eargv;
while(*++p = *q++) { while ((*++p = *q++)) {
if(*p == '\\') { if (*p == '\\') {
if((*++p = *q++) == '\0') { if ((*++p = *q++) == '\0') {
saveq = 0; saveq = 0;
return(-1); return(-1);
} else } else
continue; continue;
} }
if(*p == '\n') { if (*p == '\n') {
*p = '\0'; *p = '\0';
saveq = q; saveq = q;
return(1); return(1);
@@ -785,17 +854,17 @@ char *lbuf;
saveq = 0; saveq = 0;
return(1); return(1);
} }
if((q = saveq) == 0) return(-1); if ((q = saveq) == 0) return(-1);
while(*++p = *q++) { while ((*++p = *q++)) {
if(*p == '\\') { if (*p == '\\') {
if((*++p = *q++) == '0') { if ((*++p = *q++) == '0') {
saveq = 0; saveq = 0;
return(-1); return(-1);
} else } else
continue; continue;
} }
if(*p == '\n') { if (*p == '\n') {
*p = '\0'; *p = '\0';
saveq = q; saveq = q;
return(1); return(1);
@@ -805,13 +874,13 @@ char *lbuf;
return(1); return(1);
} }
while((t = getc(fin)) != EOF) { while ((t = getc(fin)) != EOF) {
*++p = t; *++p = t;
if(*p == '\\') { if (*p == '\\') {
t = getc(fin); t = getc(fin);
*++p = t; *++p = t;
} }
else if(*p == '\n') { else if (*p == '\n') {
*p = '\0'; *p = '\0';
return(1); return(1);
} }
@@ -820,20 +889,20 @@ char *lbuf;
return(-1); return(-1);
} }
char *address(expbuf) char *address(expbuf)
char *expbuf; char *expbuf;
{ {
register char *rcp; char *rcp;
long lno; long lno;
if(*cp == '$') { if (*cp == '$') {
cp++; cp++;
*expbuf++ = CEND; *expbuf++ = CEND;
*expbuf++ = CEOF; *expbuf++ = CEOF;
return(expbuf); return(expbuf);
} }
if(*cp == '/') { if (*cp == '/') {
seof = '/'; seof = '/';
cp++; cp++;
return(compile(expbuf)); return(compile(expbuf));
@@ -842,14 +911,14 @@ char *expbuf;
rcp = cp; rcp = cp;
lno = 0; lno = 0;
while(*rcp >= '0' && *rcp <= '9') while (*rcp >= '0' && *rcp <= '9')
lno = lno*10 + *rcp++ - '0'; lno = lno*10 + *rcp++ - '0';
if(rcp > cp) { if (rcp > cp) {
*expbuf++ = CLNUM; *expbuf++ = CLNUM;
*expbuf++ = nlno; *expbuf++ = nlno;
tlno[nlno++] = lno; tlno[nlno++] = lno;
if(nlno >= NLINES) { if (nlno >= NLINES) {
fprintf(stderr, "Too many line numbers\n"); fprintf(stderr, "Too many line numbers\n");
exit(2); exit(2);
} }
@@ -859,51 +928,51 @@ char *expbuf;
} }
return(0); return(0);
} }
cmp(a, b)
char *a,*b; int cmp(a, b)
char *a,*b;
{ {
register char *ra, *rb; char *ra, *rb;
ra = a - 1; ra = a - 1;
rb = b - 1; rb = b - 1;
while(*++ra == *++rb) while (*++ra == *++rb)
if(*ra == '\0') return(0); if (*ra == '\0') return(0);
return(1); return(1);
} }
char *text(textbuf) char *text(textbuf)
char *textbuf; char *textbuf;
{ {
register char *p, *q; char *p, *q;
p = textbuf; p = textbuf;
q = cp; q = cp;
while(*q == '\t' || *q == ' ') q++; while (*q == '\t' || *q == ' ') q++;
for(;;) { for (;;) {
if((*p = *q++) == '\\') if ((*p = *q++) == '\\')
*p = *q++; *p = *q++;
if(*p == '\0') { if (*p == '\0') {
cp = --q; cp = --q;
return(++p); return(++p);
} }
if(*p == '\n') { if (*p == '\n') {
while(*q == '\t' || *q == ' ') q++; while (*q == '\t' || *q == ' ') q++;
} }
p++; p++;
} }
} }
struct label *search(ptr)
struct label *search(ptr) struct label *ptr;
struct label *ptr;
{ {
struct label *rp; struct label *rp;
rp = labtab; rp = labtab;
while(rp < ptr) { while (rp < ptr) {
if(cmp(rp->asc, ptr->asc) == 0) if (cmp(rp->asc, ptr->asc) == 0)
return(rp); return(rp);
rp++; rp++;
} }
@@ -911,22 +980,21 @@ struct label *ptr;
return(0); return(0);
} }
void dechain()
dechain()
{ {
struct label *lptr; struct label *lptr;
union reptr *rptr, *trptr; union reptr *rptr, *trptr;
for(lptr = labtab; lptr < lab; lptr++) { for (lptr = labtab; lptr < lab; lptr++) {
if(lptr->address == 0) { if (lptr->address == 0) {
fprintf(stderr, "Undefined label: %s\n", lptr->asc); fprintf(stderr, "Undefined label: %s\n", lptr->asc);
exit(2); exit(2);
} }
if(lptr->chain) { if (lptr->chain) {
rptr = lptr->chain; rptr = lptr->chain;
while(trptr = rptr->B.lb1) { while ((trptr = rptr->B.lb1)) {
rptr->B.lb1 = lptr->address; rptr->B.lb1 = lptr->address;
rptr = trptr; rptr = trptr;
} }
@@ -936,39 +1004,39 @@ dechain()
} }
char *ycomp(expbuf) char *ycomp(expbuf)
char *expbuf; char *expbuf;
{ {
register char c, *ep, *tsp; char c, *ep, *tsp;
char *sp; char *sp;
ep = expbuf; ep = expbuf;
sp = cp; sp = cp;
for(tsp = cp; *tsp != seof; tsp++) { for (tsp = cp; *tsp != seof; tsp++) {
if(*tsp == '\\') if (*tsp == '\\')
tsp++; tsp++;
if(*tsp == '\n') if (*tsp == '\n')
return(badp); return(badp);
} }
tsp++; tsp++;
while((c = *sp++ & 0177) != seof) { while ((c = *sp++ & 0177) != seof) {
if(c == '\\' && *sp == 'n') { if (c == '\\' && *sp == 'n') {
sp++; sp++;
c = '\n'; c = '\n';
} }
if((ep[c] = *tsp++) == '\\' && *tsp == 'n') { if ((ep[c] = *tsp++) == '\\' && *tsp == 'n') {
ep[c] = '\n'; ep[c] = '\n';
tsp++; tsp++;
} }
if(ep[c] == seof || ep[c] == '\0') if (ep[c] == seof || ep[c] == '\0')
return(badp); return(badp);
} }
if(*tsp != seof) if (*tsp != seof)
return(badp); return(badp);
cp = ++tsp; cp = ++tsp;
for(c = 0; !(c & 0200); c++) for (c = 0; !(c & 0200); c++)
if(ep[c] == 0) if (ep[c] == 0)
ep[c] = c; ep[c] = c;
return(ep + 0200); return(ep + 0200);

View File

@@ -1,5 +1,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include "sed.h" #include "sed.h"
char *trans[040] = { char *trans[040] = {
@@ -37,11 +39,20 @@ char *trans[040] = {
}; };
char rub[] = {"\177"}; char rub[] = {"\177"};
execute(file) char *gline(char *addr);
char *file; int match(char *expbuf, int gf);
void command(union reptr *ipc);
void arout(void);
int advance(char *alp, char *aep);
int ecmp(char *a, char *b, int count);
void dosub(char *rhsbuf);
char *place(char *asp, char *al1, char *al2);
void execute(file)
char *file;
{ {
register char *p1, *p2; char *p1, *p2;
register union reptr *ipc; union reptr *ipc;
int c; int c;
char *execp; char *execp;
@@ -55,86 +66,86 @@ char *file;
ebp = ibuf; ebp = ibuf;
cbp = ibuf; cbp = ibuf;
if(pending) { if (pending) {
ipc = pending; ipc = pending;
pending = 0; pending = 0;
goto yes; goto yes;
} }
for(;;) { for (;;) {
if((execp = gline(linebuf)) == badp) { if ((execp = gline(linebuf)) == badp) {
close(f); close(f);
return; return;
} }
spend = execp; spend = execp;
for(ipc = ptrspace; ipc->A.command; ) { for (ipc = ptrspace; ipc->A.command; ) {
p1 = ipc->A.ad1; p1 = ipc->A.ad1;
p2 = ipc->A.ad2; p2 = ipc->A.ad2;
if(p1) { if (p1) {
if(ipc->A.inar) { if (ipc->A.inar) {
if(*p2 == CEND) { if (*p2 == CEND) {
p1 = 0; p1 = 0;
} else if(*p2 == CLNUM) { } else if (*p2 == CLNUM) {
c = p2[1]; c = p2[1];
if(lnum > tlno[c]) { if (lnum > tlno[c]) {
ipc->A.inar = 0; ipc->A.inar = 0;
if(ipc->A.negfl) if (ipc->A.negfl)
goto yes; goto yes;
ipc++; ipc++;
continue; continue;
} }
if(lnum == tlno[c]) { if (lnum == tlno[c]) {
ipc->A.inar = 0; ipc->A.inar = 0;
} }
} else if(match(p2, 0)) { } else if (match(p2, 0)) {
ipc->A.inar = 0; ipc->A.inar = 0;
} }
} else if(*p1 == CEND) { } else if (*p1 == CEND) {
if(!dolflag) { if (!dolflag) {
if(ipc->A.negfl) if (ipc->A.negfl)
goto yes; goto yes;
ipc++; ipc++;
continue; continue;
} }
} else if(*p1 == CLNUM) { } else if (*p1 == CLNUM) {
c = p1[1]; c = p1[1];
if(lnum != tlno[c]) { if (lnum != tlno[c]) {
if(ipc->A.negfl) if (ipc->A.negfl)
goto yes; goto yes;
ipc++; ipc++;
continue; continue;
} }
if(p2) if (p2)
ipc->A.inar = 1; ipc->A.inar = 1;
} else if(match(p1, 0)) { } else if (match(p1, 0)) {
if(p2) if (p2)
ipc->A.inar = 1; ipc->A.inar = 1;
} else { } else {
if(ipc->A.negfl) if (ipc->A.negfl)
goto yes; goto yes;
ipc++; ipc++;
continue; continue;
} }
} }
if(ipc->A.negfl) { if (ipc->A.negfl) {
ipc++; ipc++;
continue; continue;
} }
yes: yes:
command(ipc); command(ipc);
if(delflag) if (delflag)
break; break;
if(jflag) { if (jflag) {
jflag = 0; jflag = 0;
if((ipc = ipc->B.lb1) == 0) { if ((ipc = ipc->B.lb1) == 0) {
ipc = ptrspace; ipc = ptrspace;
break; break;
} }
@@ -142,13 +153,13 @@ char *file;
ipc++; ipc++;
} }
if(!nflag && !delflag) { if (!nflag && !delflag) {
for(p1 = linebuf; p1 < spend; p1++) for (p1 = linebuf; p1 < spend; p1++)
putc(*p1, stdout); putc(*p1, stdout);
putc('\n', stdout); putc('\n', stdout);
} }
if(aptr > abuf) { if (aptr > abuf) {
arout(); arout();
} }
@@ -156,16 +167,18 @@ char *file;
} }
} }
match(expbuf, gf)
char *expbuf;
{
register char *p1, *p2, c;
if(gf) { int match(expbuf, gf)
if(*expbuf) return(0); char *expbuf;
{
char *p1, *p2, c;
if (gf) {
if (*expbuf)
return(0);
p1 = linebuf; p1 = linebuf;
p2 = genbuf; p2 = genbuf;
while(*p1++ = *p2++); while ((*p1++ = *p2++));
locs = p1 = loc2; locs = p1 = loc2;
} else { } else {
p1 = linebuf; p1 = linebuf;
@@ -173,45 +186,46 @@ char *expbuf;
} }
p2 = expbuf; p2 = expbuf;
if(*p2++) { if (*p2++) {
loc1 = p1; loc1 = p1;
if(*p2 == CCHR && p2[1] != *p1) if (*p2 == CCHR && p2[1] != *p1)
return(0); return(0);
return(advance(p1, p2)); return(advance(p1, p2));
} }
/* fast check for first character */ /* fast check for first character */
if(*p2 == CCHR) { if (*p2 == CCHR) {
c = p2[1]; c = p2[1];
do { do {
if(*p1 != c) if (*p1 != c)
continue; continue;
if(advance(p1, p2)) { if (advance(p1, p2)) {
loc1 = p1; loc1 = p1;
return(1); return(1);
} }
} while(*p1++); } while (*p1++);
return(0); return(0);
} }
do { do {
if(advance(p1, p2)) { if (advance(p1, p2)) {
loc1 = p1; loc1 = p1;
return(1); return(1);
} }
} while(*p1++); } while (*p1++);
return(0); return(0);
} }
advance(alp, aep)
char *alp, *aep; int advance(alp, aep)
char *alp, *aep;
{ {
register char *lp, *ep, *curlp; char *lp, *ep, *curlp;
char c; char c;
char *bbeg; char *bbeg;
int ct; int ct;
/*fprintf(stderr, "*lp = %c, %o\n*ep = %c, %o\n", *lp, *lp, *ep, *ep); /*DEBUG*/ /*fprintf(stderr, "*lp = %c, %o\n*ep = %c, %o\n", *lp, *lp, *ep, *ep);*/ /*DEBUG*/
lp = alp; lp = alp;
ep = aep; ep = aep;
@@ -239,7 +253,7 @@ char *alp, *aep;
case CCL: case CCL:
c = *lp++ & 0177; c = *lp++ & 0177;
if(ep[c>>3] & bittab[c & 07]) { if (ep[c>>3] & bittab[c & 07]) {
ep += 16; ep += 16;
continue; continue;
} }
@@ -257,7 +271,7 @@ char *alp, *aep;
bbeg = braslist[*ep]; bbeg = braslist[*ep];
ct = braelist[*ep++] - bbeg; ct = braelist[*ep++] - bbeg;
if(ecmp(bbeg, lp, ct)) { if (ecmp(bbeg, lp, ct)) {
lp += ct; lp += ct;
continue; continue;
} }
@@ -267,11 +281,11 @@ char *alp, *aep;
bbeg = braslist[*ep]; bbeg = braslist[*ep];
ct = braelist[*ep++] - bbeg; ct = braelist[*ep++] - bbeg;
curlp = lp; curlp = lp;
while(ecmp(bbeg, lp, ct)) while (ecmp(bbeg, lp, ct))
lp += ct; lp += ct;
while(lp >= curlp) { while (lp >= curlp) {
if(advance(lp, ep)) return(1); if (advance(lp, ep)) return(1);
lp -= ct; lp -= ct;
} }
return(0); return(0);
@@ -292,39 +306,39 @@ char *alp, *aep;
curlp = lp; curlp = lp;
do { do {
c = *lp++ & 0177; c = *lp++ & 0177;
} while(ep[c>>3] & bittab[c & 07]); } while (ep[c>>3] & bittab[c & 07]);
ep += 16; ep += 16;
goto star; goto star;
star: star:
if(--lp == curlp) { if (--lp == curlp) {
continue; continue;
} }
if(*ep == CCHR) { if (*ep == CCHR) {
c = ep[1]; c = ep[1];
do { do {
if(*lp != c) if (*lp != c)
continue; continue;
if(advance(lp, ep)) if (advance(lp, ep))
return(1); return(1);
} while(lp-- > curlp); } while (lp-- > curlp);
return(0); return(0);
} }
if(*ep == CBACK) { if (*ep == CBACK) {
c = *(braslist[ep[1]]); c = *(braslist[ep[1]]);
do { do {
if(*lp != c) if (*lp != c)
continue; continue;
if(advance(lp, ep)) if (advance(lp, ep))
return(1); return(1);
} while(lp-- > curlp); } while (lp-- > curlp);
return(0); return(0);
} }
do { do {
if(lp == locs) break; if (lp == locs) break;
if (advance(lp, ep)) if (advance(lp, ep))
return(1); return(1);
} while (lp-- > curlp); } while (lp-- > curlp);
@@ -334,27 +348,28 @@ char *alp, *aep;
fprintf(stderr, "RE botch, %o\n", *--ep); fprintf(stderr, "RE botch, %o\n", *--ep);
} }
} }
substitute(ipc)
union reptr *ipc; int substitute(ipc)
union reptr *ipc;
{ {
if(match(ipc->A.re1, 0) == 0) return(0); if (match(ipc->A.re1, 0) == 0) return(0);
sflag = 1; sflag = 1;
dosub(ipc->A.rhs); dosub(ipc->A.rhs);
if(ipc->A.gfl) { if (ipc->A.gfl) {
while(*loc2) { while (*loc2) {
if(match(ipc->A.re1, 1) == 0) break; if (match(ipc->A.re1, 1) == 0) break;
dosub(ipc->A.rhs); dosub(ipc->A.rhs);
} }
} }
return(1); return(1);
} }
dosub(rhsbuf) void dosub(rhsbuf)
char *rhsbuf; char *rhsbuf;
{ {
register char *lp, *sp, *rp; char *lp, *sp, *rp;
int c; int c;
lp = linebuf; lp = linebuf;
@@ -362,7 +377,7 @@ char *rhsbuf;
rp = rhsbuf; rp = rhsbuf;
while (lp < loc1) while (lp < loc1)
*sp++ = *lp++; *sp++ = *lp++;
while(c = *rp++) { while ((c = *rp++)) {
if (c == '&') { if (c == '&') {
sp = place(sp, loc1, loc2); sp = place(sp, loc1, loc2);
continue; continue;
@@ -376,19 +391,20 @@ char *rhsbuf;
} }
lp = loc2; lp = loc2;
loc2 = sp - genbuf + linebuf; loc2 = sp - genbuf + linebuf;
while (*sp++ = *lp++) while ((*sp++ = *lp++))
if (sp >= &genbuf[LBSIZE]) { if (sp >= &genbuf[LBSIZE]) {
fprintf(stderr, "Output line too long.\n"); fprintf(stderr, "Output line too long.\n");
} }
lp = linebuf; lp = linebuf;
sp = genbuf; sp = genbuf;
while (*lp++ = *sp++); while ((*lp++ = *sp++));
spend = lp-1; spend = lp-1;
} }
char *place(asp, al1, al2)
char *asp, *al1, *al2; char *place(asp, al1, al2)
char *asp, *al1, *al2;
{ {
register char *sp, *l1, *l2; char *sp, *l1, *l2;
sp = asp; sp = asp;
l1 = al1; l1 = al1;
@@ -401,19 +417,19 @@ char *asp, *al1, *al2;
return(sp); return(sp);
} }
command(ipc) void command(ipc)
union reptr *ipc; union reptr *ipc;
{ {
register int i; int i;
register char *p1, *p2, *p3; char *p1, *p2, *p3;
char *execp; char *execp;
switch(ipc->A.command) { switch (ipc->A.command) {
case ACOM: case ACOM:
*aptr++ = ipc; *aptr++ = ipc;
if(aptr >= &abuf[ABUFSIZE]) { if (aptr >= &abuf[ABUFSIZE]) {
fprintf(stderr, "Too many appends after line %ld\n", fprintf(stderr, "Too many appends after line %ld\n",
lnum); lnum);
} }
@@ -422,8 +438,8 @@ union reptr *ipc;
case CCOM: case CCOM:
delflag = 1; delflag = 1;
if(!ipc->A.inar || dolflag) { if (!ipc->A.inar || dolflag) {
for(p1 = ipc->A.re1; *p1; ) for (p1 = ipc->A.re1; *p1; )
putc(*p1++, stdout); putc(*p1++, stdout);
putc('\n', stdout); putc('\n', stdout);
} }
@@ -434,15 +450,15 @@ union reptr *ipc;
case CDCOM: case CDCOM:
p1 = p2 = linebuf; p1 = p2 = linebuf;
while(*p1 != '\n') { while (*p1 != '\n') {
if(*p1++ == 0) { if (*p1++ == 0) {
delflag++; delflag++;
return; return;
} }
} }
p1++; p1++;
while(*p2++ = *p1++); while ((*p2++ = *p1++));
spend = p2-1; spend = p2-1;
jflag++; jflag++;
break; break;
@@ -454,7 +470,7 @@ union reptr *ipc;
case GCOM: case GCOM:
p1 = linebuf; p1 = linebuf;
p2 = holdsp; p2 = holdsp;
while(*p1++ = *p2++); while ((*p1++ = *p2++));
spend = p1-1; spend = p1-1;
break; break;
@@ -462,8 +478,8 @@ union reptr *ipc;
*spend++ = '\n'; *spend++ = '\n';
p1 = spend; p1 = spend;
p2 = holdsp; p2 = holdsp;
while(*p1++ = *p2++) while ((*p1++ = *p2++))
if(p1 >= lbend) if (p1 >= lbend)
break; break;
spend = p1-1; spend = p1-1;
break; break;
@@ -471,7 +487,7 @@ union reptr *ipc;
case HCOM: case HCOM:
p1 = holdsp; p1 = holdsp;
p2 = linebuf; p2 = linebuf;
while(*p1++ = *p2++); while ((*p1++ = *p2++));
hspend = p1-1; hspend = p1-1;
break; break;
@@ -479,14 +495,14 @@ union reptr *ipc;
*hspend++ = '\n'; *hspend++ = '\n';
p1 = hspend; p1 = hspend;
p2 = linebuf; p2 = linebuf;
while(*p1++ = *p2++) while ((*p1++ = *p2++))
if(p1 >= hend) if (p1 >= hend)
break; break;
hspend = p1-1; hspend = p1-1;
break; break;
case ICOM: case ICOM:
for(p1 = ipc->A.re1; *p1; ) for (p1 = ipc->A.re1; *p1; )
putc(*p1++, stdout); putc(*p1++, stdout);
putc('\n', stdout); putc('\n', stdout);
break; break;
@@ -499,12 +515,12 @@ union reptr *ipc;
p1 = linebuf; p1 = linebuf;
p2 = genbuf; p2 = genbuf;
genbuf[72] = 0; genbuf[72] = 0;
while(*p1) while (*p1)
if(*p1 >= 040) { if (*p1 >= 040) {
if(*p1 == 0177) { if (*p1 == 0177) {
p3 = rub; p3 = rub;
while(*p2++ = *p3++) while ((*p2++ = *p3++))
if(p2 >= lcomend) { if (p2 >= lcomend) {
*p2 = '\\'; *p2 = '\\';
fprintf(stdout, "%s\n", genbuf); fprintf(stdout, "%s\n", genbuf);
p2 = genbuf; p2 = genbuf;
@@ -514,15 +530,15 @@ union reptr *ipc;
continue; continue;
} }
*p2++ = *p1++; *p2++ = *p1++;
if(p2 >= lcomend) { if (p2 >= lcomend) {
*p2 = '\\'; *p2 = '\\';
fprintf(stdout, "%s\n", genbuf); fprintf(stdout, "%s\n", genbuf);
p2 = genbuf; p2 = genbuf;
} }
} else { } else {
p3 = trans[*p1-1]; p3 = trans[*p1-1];
while(*p2++ = *p3++) while ((*p2++ = *p3++))
if(p2 >= lcomend) { if (p2 >= lcomend) {
*p2 = '\\'; *p2 = '\\';
fprintf(stdout, "%s\n", genbuf); fprintf(stdout, "%s\n", genbuf);
p2 = genbuf; p2 = genbuf;
@@ -535,15 +551,15 @@ union reptr *ipc;
break; break;
case NCOM: case NCOM:
if(!nflag) { if (!nflag) {
for(p1 = linebuf; p1 < spend; p1++) for (p1 = linebuf; p1 < spend; p1++)
putc(*p1, stdout); putc(*p1, stdout);
putc('\n', stdout); putc('\n', stdout);
} }
if(aptr > abuf) if (aptr > abuf)
arout(); arout();
if((execp = gline(linebuf)) == badp) { if ((execp = gline(linebuf)) == badp) {
pending = ipc; pending = ipc;
delflag = 1; delflag = 1;
break; break;
@@ -552,10 +568,10 @@ union reptr *ipc;
break; break;
case CNCOM: case CNCOM:
if(aptr > abuf) if (aptr > abuf)
arout(); arout();
*spend++ = '\n'; *spend++ = '\n';
if((execp = gline(spend)) == badp) { if ((execp = gline(spend)) == badp) {
pending = ipc; pending = ipc;
delflag = 1; delflag = 1;
break; break;
@@ -564,30 +580,30 @@ union reptr *ipc;
break; break;
case PCOM: case PCOM:
for(p1 = linebuf; p1 < spend; p1++) for (p1 = linebuf; p1 < spend; p1++)
putc(*p1, stdout); putc(*p1, stdout);
putc('\n', stdout); putc('\n', stdout);
break; break;
case CPCOM: case CPCOM:
cpcom: cpcom:
for(p1 = linebuf; *p1 != '\n' && *p1 != '\0'; ) for (p1 = linebuf; *p1 != '\n' && *p1 != '\0'; )
putc(*p1++, stdout); putc(*p1++, stdout);
putc('\n', stdout); putc('\n', stdout);
break; break;
case QCOM: case QCOM:
if(!nflag) { if (!nflag) {
for(p1 = linebuf; p1 < spend; p1++) for (p1 = linebuf; p1 < spend; p1++)
putc(*p1, stdout); putc(*p1, stdout);
putc('\n', stdout); putc('\n', stdout);
} }
if(aptr > abuf) arout(); if (aptr > abuf) arout();
fclose(stdout); fclose(stdout);
exit(0); exit(0);
case RCOM: case RCOM:
*aptr++ = ipc; *aptr++ = ipc;
if(aptr >= &abuf[ABUFSIZE]) if (aptr >= &abuf[ABUFSIZE])
fprintf(stderr, "Too many reads after line%ld\n", fprintf(stderr, "Too many reads after line%ld\n",
lnum); lnum);
@@ -597,20 +613,21 @@ union reptr *ipc;
case SCOM: case SCOM:
i = substitute(ipc); i = substitute(ipc);
if(ipc->A.pfl && i) if (ipc->A.pfl && i) {
if(ipc->A.pfl == 1) { if (ipc->A.pfl == 1) {
for(p1 = linebuf; p1 < spend; p1++) for (p1 = linebuf; p1 < spend; p1++)
putc(*p1, stdout); putc(*p1, stdout);
putc('\n', stdout); putc('\n', stdout);
} }
else else
goto cpcom; goto cpcom;
if(i && ipc->A.fcode) }
if (i && ipc->A.fcode)
goto wcom; goto wcom;
break; break;
case TCOM: case TCOM:
if(sflag == 0) break; if (sflag == 0) break;
sflag = 0; sflag = 0;
jflag = 1; jflag = 1;
break; break;
@@ -623,32 +640,32 @@ union reptr *ipc;
case XCOM: case XCOM:
p1 = linebuf; p1 = linebuf;
p2 = genbuf; p2 = genbuf;
while(*p2++ = *p1++); while ((*p2++ = *p1++));
p1 = holdsp; p1 = holdsp;
p2 = linebuf; p2 = linebuf;
while(*p2++ = *p1++); while ((*p2++ = *p1++));
spend = p2 - 1; spend = p2 - 1;
p1 = genbuf; p1 = genbuf;
p2 = holdsp; p2 = holdsp;
while(*p2++ = *p1++); while ((*p2++ = *p1++));
hspend = p2 - 1; hspend = p2 - 1;
break; break;
case YCOM: case YCOM:
p1 = linebuf; p1 = linebuf;
p2 = ipc->A.re1; p2 = ipc->A.re1;
while(*p1 = p2[*p1]) p1++; while ((*p1 = p2[*p1]))
p1++;
break; break;
} }
} }
char * char *gline(addr)
gline(addr) char *addr;
char *addr;
{ {
register char *p1, *p2; char *p1, *p2;
register c; int c;
p1 = addr; p1 = addr;
p2 = cbp; p2 = cbp;
for (;;) { for (;;) {
@@ -660,10 +677,10 @@ char *addr;
ebp = ibuf+c; ebp = ibuf+c;
} }
if ((c = *p2++) == '\n') { if ((c = *p2++) == '\n') {
if(p2 >= ebp) { if (p2 >= ebp) {
if((c = read(f, ibuf, BUFSIZ)) <= 0) { if ((c = read(f, ibuf, BUFSIZ)) <= 0) {
close(f); close(f);
if(eargc == 0) if (eargc == 0)
dolflag = 1; dolflag = 1;
} }
@@ -672,8 +689,8 @@ char *addr;
} }
break; break;
} }
if(c) if (c)
if(p1 < lbend) if (p1 < lbend)
*p1++ = c; *p1++ = c;
} }
lnum++; lnum++;
@@ -682,31 +699,32 @@ char *addr;
return(p1); return(p1);
} }
ecmp(a, b, count)
char *a, *b; int ecmp(a, b, count)
char *a, *b;
{ {
while(count--) while (count--)
if(*a++ != *b++) return(0); if (*a++ != *b++) return(0);
return(1); return(1);
} }
arout() void arout()
{ {
register char *p1; char *p1;
FILE *fi; FILE *fi;
char c; char c;
int t; int t;
aptr = abuf - 1; aptr = abuf - 1;
while(*++aptr) { while (*++aptr) {
if((*aptr)->A.command == ACOM) { if ((*aptr)->A.command == ACOM) {
for(p1 = (*aptr)->A.re1; *p1; ) for (p1 = (*aptr)->A.re1; *p1; )
putc(*p1++, stdout); putc(*p1++, stdout);
putc('\n', stdout); putc('\n', stdout);
} else { } else {
if((fi = fopen((*aptr)->A.re1, "r")) == NULL) if ((fi = fopen((*aptr)->A.re1, "r")) == NULL)
continue; continue;
while((t = getc(fi)) != EOF) { while ((t = getc(fi)) != EOF) {
c = t; c = t;
putc(c, stdout); putc(c, stdout);
} }

View File

@@ -54,12 +54,13 @@ alloc(nbytes)
} }
} }
void
addblok(reqd) addblok(reqd)
unsigned reqd; unsigned reqd;
{ {
if (stakbot == NIL) if (stakbot == NIL)
{ {
extern end; extern int end;
brkbegin = setbrk(BRKINCR * 5); brkbegin = setbrk(BRKINCR * 5);
bloktop = (struct blk *) &end; bloktop = (struct blk *) &end;
} }
@@ -94,6 +95,7 @@ addblok(reqd)
} }
} }
void
free(ap) free(ap)
struct blk *ap; struct blk *ap;
{ {
@@ -109,9 +111,8 @@ free(ap)
} }
} }
#ifdef DEBUG #ifdef DEBUG
void
chkbptr(ptr) chkbptr(ptr)
struct blk *ptr; struct blk *ptr;
{ {
@@ -147,7 +148,7 @@ chkbptr(ptr)
abort(1); abort(1);
} }
void
chkmem() chkmem()
{ {
register struct blk *p = (struct blk *)brkbegin; register struct blk *p = (struct blk *)brkbegin;
@@ -182,6 +183,5 @@ chkmem()
blank(); blank();
prn((char *)bloktop - brkbegin - (un + us)); prn((char *)bloktop - brkbegin - (un + us));
newline(); newline();
} }
#endif #endif

View File

@@ -93,36 +93,14 @@
#include "name.h" #include "name.h"
#include <signal.h> #include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
/* error catching */ /* error catching */
extern int errno; extern int errno;
/* result type declarations */ /* result type declarations */
#define free afree #define free afree
extern char *allat();
extern char *make();
extern char *alloc();
extern char *movstr();
extern char *movstrn();
extern struct trenod *cmd();
extern struct trenod *makefork();
extern struct namnod *lookup();
extern struct namnod *findnam();
extern struct dolnod *useargs();
extern float expr();
extern char *catpath();
extern char *getpath();
extern char *nextpath();
extern char **scan();
extern char *mactrim();
extern char *macro();
extern int exname();
extern int printnam();
extern int printro();
extern int printexp();
extern char **setenvv();
extern long time();
#define attrib(n,f) (n->namflg |= f) #define attrib(n,f) (n->namflg |= f)
#define round(a,b) (((int)(((char *)(a)+b)-1))&~((b)-1)) #define round(a,b) (((int)(((char *)(a)+b)-1))&~((b)-1))
@@ -272,8 +250,6 @@ extern unsigned brkincr;
#define SIGMOD 8 #define SIGMOD 8
#define SIGCAUGHT 16 #define SIGCAUGHT 16
extern void done();
extern void fault();
extern BOOL trapnote; extern BOOL trapnote;
extern char *trapcom[]; extern char *trapcom[];
extern BOOL trapflg[]; extern BOOL trapflg[];
@@ -340,7 +316,7 @@ extern char badop[];
#include "ctype.h" #include "ctype.h"
extern int wasintr; /* used to tell if break or delete is hit extern int wasintr; /* used to tell if break or delete is hit
* while executing a wait */ * while executing a wait */
extern int eflag; extern int eflag;
@@ -356,3 +332,10 @@ extern int eflag;
#define exitset() retval = exitval #define exitset() retval = exitval
#define ENDPATH 27 /* see msg.c/defpath */ #define ENDPATH 27 /* see msg.c/defpath */
void addblok(unsigned reqd);
char *movstr(char *a, char *b);
char *setbrk(int incr);
void error(char *s);
void free(struct blk *ap);
void rmtemp(struct ionod *base);

View File

@@ -6,7 +6,7 @@
#include "defs.h" #include "defs.h"
/* ======== error handling ======== */ /* ======== error handling ======== */
void
failed(s1, s2) failed(s1, s2)
char *s1, *s2; char *s1, *s2;
{ {
@@ -21,12 +21,14 @@ char *s1, *s2;
exitsh(ERROR); exitsh(ERROR);
} }
void
error(s) error(s)
char *s; char *s;
{ {
failed(s, NIL); failed(s, NIL);
} }
void
exitsh(xno) exitsh(xno)
int xno; int xno;
{ {
@@ -75,6 +77,7 @@ done()
exit(exitval); exit(exitval);
} }
void
rmtemp(base) rmtemp(base)
struct ionod *base; struct ionod *base;
{ {
@@ -86,6 +89,7 @@ struct ionod *base;
} }
} }
void
rmfunctmp() rmfunctmp()
{ {
while (fiotemp) while (fiotemp)

View File

@@ -5,12 +5,9 @@
*/ */
#include "defs.h" #include "defs.h"
char *sbrk();
char* char*
setbrk(incr) setbrk(incr)
{ {
register char *a = sbrk(incr); register char *a = sbrk(incr);
brkend = a + incr; brkend = a + incr;

View File

@@ -29,7 +29,7 @@ locstak()
{ {
if (brkend - stakbot < BRKINCR) if (brkend - stakbot < BRKINCR)
{ {
if (setbrk(brkincr) == -1) if (setbrk(brkincr) == (char*)-1)
error(nostack); error(nostack);
if (brkincr < BRKMAX) if (brkincr < BRKMAX)
brkincr += 256; brkincr += 256;
@@ -56,6 +56,7 @@ register char *argp;
return(oldstak); return(oldstak);
} }
void
tdystak(x) /* try to bring stack back to x */ tdystak(x) /* try to bring stack back to x */
register char *x; register char *x;
{ {
@@ -65,9 +66,10 @@ register char *x;
stakbsy = stakbsy->word; stakbsy = stakbsy->word;
} }
staktop = stakbot = max((char *)(x), (char *)(stakbas)); staktop = stakbot = max((char *)(x), (char *)(stakbas));
rmtemp(x); rmtemp((struct ionod *)x);
} }
void
stakchk() stakchk()
{ {
if ((brkend - stakbas) > BRKINCR + BRKINCR) if ((brkend - stakbas) > BRKINCR + BRKINCR)