📄 sed0.c
字号:
rep->pfl = 1; } if(*cp == 'P') { cp++; rep->pfl = 2; } if(*cp == 'w') { cp++; if(*cp++ != ' ') { fprintf(stderr, CGMES, linebuf); exit(2); } if(nfiles >= 10) { fprintf(stderr, "Too many files in w commands\n"); exit(2); } text(fname[nfiles]); for(i = nfiles - 1; i >= 0; i--) if(cmp(fname[nfiles],fname[i]) == 0) { rep->fcode = fcode[i]; goto done; } if((rep->fcode = fopen(fname[nfiles], "w")) == NULL) { fprintf(stderr, "cannot open %s\n", fname[nfiles]); exit(2); } fcode[nfiles++] = rep->fcode; } break; case 'w': rep->command = WCOM; if(*cp++ != ' ') { fprintf(stderr, CGMES, linebuf); exit(2); } if(nfiles >= 10){ fprintf(stderr, "Too many files in w commands\n"); exit(2); } text(fname[nfiles]); for(i = nfiles - 1; i >= 0; i--) if(cmp(fname[nfiles], fname[i]) == 0) { rep->fcode = fcode[i]; goto done; } if((rep->fcode = fopen(fname[nfiles], "w")) == NULL) { fprintf(stderr, "Cannot create %s\n", fname[nfiles]); exit(2); } fcode[nfiles++] = rep->fcode; break; case 'x': rep->command = XCOM; break; case 'y': rep->command = YCOM; seof = *cp++; rep->re1 = p; p = ycomp(rep->re1); if(p == badp) { fprintf(stderr, CGMES, linebuf); exit(2); } if(p > reend) { fprintf(stderr, TMMES, linebuf); exit(2); } break; }done: if(++rep >= ptrend) { fprintf(stderr, "Too many commands, last: %s\n", linebuf); exit(2); } rep->ad1 = p; if(*cp++ != '\0') { if(cp[-1] == ';') goto comploop; fprintf(stderr, CGMES, linebuf); exit(2); } } rep->command = 0; lastre = op;}char *compsub(rhsbuf)char *rhsbuf;{ register char *p, *q; p = rhsbuf; q = cp; for(;;) { if((*p = *q++) == '\\') { *p++ = CBACK; *p = *q++; if(*p > numbra + '0' && *p <= '9') return(badp); *p++; continue; } if(*p == CBACK) { p++; *p++ = CBACK; } if(*p == seof) { *p++ = '\0'; cp = q; return(p); } if(*p++ == '\0') { return(badp); } }}char *compile(expbuf)char *expbuf;{ register c; register char *ep, *sp; char neg; char *lastep, *cstart; int cclcnt; int closed; char bracket[NBRA], *bracketp; if(*cp == seof) { cp++; return(expbuf); } ep = expbuf; lastep = 0; bracketp = bracket; closed = numbra = 0; sp = cp; if (*sp == '^') { *ep++ = 1; sp++; } else { *ep++ = 0; } for (;;) { if (ep >= &expbuf[ESIZE]) { cp = sp; return(badp); } if((c = *sp++) == seof) { if(bracketp != bracket) { cp = sp; return(badp); } cp = sp; *ep++ = CEOF; return(ep); } if(c != '*') lastep = ep; switch (c) { case '\\': if((c = *sp++) == '(') { if(numbra >= NBRA) { cp = sp; return(badp); } *bracketp++ = numbra; *ep++ = CBRA; *ep++ = numbra++; continue; } if(c == ')') { if(bracketp <= bracket) { cp = sp; return(badp); } *ep++ = CKET; *ep++ = *--bracketp; closed++; continue; } if(c >= '1' && c <= '9') { if((c -= '1') >= closed) return(badp); *ep++ = CBACK; *ep++ = c; continue; } if(c == '\n') { cp = sp; return(badp); } if(c == 'n') { c = '\n'; } goto defchar; case '\0': continue; case '\n': cp = sp; return(badp); case '.': *ep++ = CDOT; continue; case '*': if (lastep == 0) goto defchar; if(*lastep == CKET) { cp = sp; return(badp); } *lastep |= STAR; continue; case '$': if (*sp != seof) goto defchar; *ep++ = CDOL; continue; case '[': if(&ep[33] >= &expbuf[ESIZE]) { fprintf(stderr, "RE too long: %s\n", linebuf); exit(2); } *ep++ = CCL; neg = 0; if((c = *sp++) == '^') { neg = 1; c = *sp++; } cstart = sp; do { if(c == '\0') { fprintf(stderr, CGMES, linebuf); exit(2); } if (c=='-' && sp>cstart && *sp!=']') { for (c = sp[-2]; c<*sp; c++) ep[(c & 0377)>>3] |= bittab[c&07];/* 01 */ } if(c == '\\') { switch(c = *sp++) { case 'n': c = '\n'; break; } } ep[(c & 0377) >> 3] |= bittab[c & 07]; /* 01 */ } while((c = *sp++) != ']'); if(neg) for(cclcnt = 0; cclcnt < 32; cclcnt++) ep[cclcnt] ^= -1; ep[0] &= 0376; ep += 32; continue; defchar: default: *ep++ = CCHR; *ep++ = c; } }}rline(lbuf)char *lbuf;{ register char *p, *q; register t; static char *saveq; p = lbuf - 1; if(eflag) { if(eflag > 0) { eflag = -1; if(eargc-- <= 0) exit(2); q = *++eargv; while(*++p = *q++) { if(*p == '\\') { if((*++p = *q++) == '\0') { saveq = 0; return(-1); } else continue; } if(*p == '\n') { *p = '\0'; saveq = q; return(1); } } saveq = 0; return(1); } if((q = saveq) == 0) return(-1); while(*++p = *q++) { if(*p == '\\') { if((*++p = *q++) == '0') { saveq = 0; return(-1); } else continue; } if(*p == '\n') { *p = '\0'; saveq = q; return(1); } } saveq = 0; return(1); } while((t = getc(fin)) != EOF) { *++p = t; if(*p == '\\') { t = getc(fin); *++p = t; } else if(*p == '\n') { *p = '\0'; return(1); } } *++p = '\0'; return(-1);}char *address(expbuf)char *expbuf;{ register char *rcp; long lno; if(*cp == '$') { cp++; *expbuf++ = CEND; *expbuf++ = CEOF; return(expbuf); } if(*cp == '/' || *cp == '\\') { /* 02 */ if (*cp == '\\') /* 02 */ cp++; /* 02 */ seof = *cp++; return(compile(expbuf)); } rcp = cp; lno = 0; while(*rcp >= '0' && *rcp <= '9') lno = lno*10 + *rcp++ - '0'; if(rcp > cp) { *expbuf++ = CLNUM; *expbuf++ = nlno; tlno[nlno++] = lno; if(nlno >= NLINES) { fprintf(stderr, "Too many line numbers\n"); exit(2); } *expbuf++ = CEOF; cp = rcp; return(expbuf); } return(0);}cmp(a, b)char *a,*b;{ register char *ra, *rb; ra = a - 1; rb = b - 1; while(*++ra == *++rb) if(*ra == '\0') return(0); return(1);}char *text(textbuf)char *textbuf;{ register char *p, *q; p = textbuf; q = cp; while(*q == '\t' || *q == ' ') q++; for(;;) { if((*p = *q++) == '\\') *p = *q++; if(*p == '\0') { cp = --q; return(++p); } if(*p == '\n') { while(*q == '\t' || *q == ' ') q++; } p++; }}struct label *search(ptr)struct label *ptr;{ struct label *rp; rp = labtab; while(rp < ptr) { if(cmp(rp->asc, ptr->asc) == 0) return(rp); rp++; } return(0);}dechain(){ struct label *lptr; union reptr *rptr, *trptr; for(lptr = labtab; lptr < lab; lptr++) { if(lptr->address == 0) { fprintf(stderr, "Undefined label: %s\n", lptr->asc); exit(2); } if(lptr->chain) { rptr = lptr->chain; while(trptr = rptr->lb1) { rptr->lb1 = lptr->address; rptr = trptr; } rptr->lb1 = lptr->address; } }}char *ycomp(expbuf)char *expbuf;{ register char *ep, *tsp; register int c; char *sp; ep = expbuf; sp = cp; for(tsp = cp; *tsp != seof; tsp++) { if(*tsp == '\\') tsp++; if(*tsp == '\n') return(badp); } tsp++; while((c = *sp++ & 0377) != seof) { if(c == '\\' && *sp == 'n') { sp++; c = '\n'; } if((ep[c] = *tsp++) == '\\' && *tsp == 'n') { ep[c] = '\n'; tsp++; } if(ep[c] == seof || ep[c] == '\0') return(badp); } if(*tsp != seof) return(badp); cp = ++tsp; for(c = 0; c <= 0377; c++) if(ep[c] == 0) ep[c] = c; return(ep + 0400);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -