📄 ed.c
字号:
nl = nleft; } } nl = tline; tline += (((lp-linebuf)+03)>>1)&077776; return(nl);}char *getblock(atl, iof){ extern read(), write(); register bno, off; register char *p1, *p2; register int n; bno = (atl>>8)&0377; off = (atl<<1)&0774; if (bno >= 255) { lastc = '\n'; error(T); } nleft = 512 - off; if (bno==iblock) { ichanged |= iof; return(ibuff+off); } if (bno==oblock) return(obuff+off); if (iof==READ) { if (ichanged) { if(xtflag) crblock(tperm, ibuff, 512, (long)0); blkio(iblock, ibuff, write); } ichanged = 0; iblock = bno; blkio(bno, ibuff, read); if(xtflag) crblock(tperm, ibuff, 512, (long)0); return(ibuff+off); } if (oblock>=0) { if(xtflag) { p1 = obuff; p2 = crbuf; n = 512; while(n--) *p2++ = *p1++; crblock(tperm, crbuf, 512, (long)0); blkio(oblock, crbuf, write); } else blkio(oblock, obuff, write); } oblock = bno; return(obuff+off);}blkio(b, buf, iofcn)char *buf;int (*iofcn)();{ lseek(tfile, (long)b<<9, 0); if ((*iofcn)(tfile, buf, 512) != 512) { error(T); }}init(){ register *markp; close(tfile); tline = 2; for (markp = names; markp < &names[26]; ) *markp++ = 0; subnewa = 0; anymarks = 0; iblock = -1; oblock = -1; ichanged = 0; close(creat(tfname, 0600)); tfile = open(tfname, 2); if(xflag) { xtflag = 1; makekey(key, tperm); } dot = dol = zero;}global(k){ register char *gp; register c; register int *a1; char globuf[GBSIZE]; if (globp) error(Q); setall(); nonzero(); if ((c=getchr())=='\n') error(Q); compile(c); gp = globuf; while ((c = getchr()) != '\n') { if (c==EOF) error(Q); if (c=='\\') { c = getchr(); if (c!='\n') *gp++ = '\\'; } *gp++ = c; if (gp >= &globuf[GBSIZE-2]) error(Q); } *gp++ = '\n'; *gp++ = 0; for (a1=zero; a1<=dol; a1++) { *a1 &= ~01; if (a1>=addr1 && a1<=addr2 && execute(0, a1)==k) *a1 |= 01; } /* * Special case: g/.../d (avoid n^2 algorithm) */ if (globuf[0]=='d' && globuf[1]=='\n' && globuf[2]=='\0') { gdelete(); return; } for (a1=zero; a1<=dol; a1++) { if (*a1 & 01) { *a1 &= ~01; dot = a1; globp = globuf; commands(); a1 = zero; } }}join(){ register char *gp, *lp; register *a1; gp = genbuf; for (a1=addr1; a1<=addr2; a1++) { lp = getline(*a1); while (*gp = *lp++) if (gp++ >= &genbuf[LBSIZE-2]) error(Q); } lp = linebuf; gp = genbuf; while (*lp++ = *gp++) ; *addr1 = putline(); if (addr1<addr2) rdelete(addr1+1, addr2); dot = addr1;}substitute(inglob){ register *markp, *a1, nl; int gsubf; int getsub(); gsubf = compsub(); for (a1 = addr1; a1 <= addr2; a1++) { int *ozero; if (execute(0, a1)==0) continue; inglob |= 01; dosub(); if (gsubf) { while (*loc2) { if (execute(1, (int *)0)==0) break; dosub(); } } subnewa = putline(); *a1 &= ~01; if (anymarks) { for (markp = names; markp < &names[26]; markp++) if (*markp == *a1) *markp = subnewa; } subolda = *a1; *a1 = subnewa; ozero = zero; nl = append(getsub, a1); nl += zero-ozero; a1 += nl; addr2 += nl; } if (inglob==0) error(Q);}compsub(){ register seof, c; register char *p; if ((seof = getchr()) == '\n' || seof == ' ') error(Q); compile(seof); p = rhsbuf; for (;;) { c = getchr(); if (c=='\\') c = getchr() | 0200; if (c=='\n') { if (globp) c |= 0200; else error(Q); } if (c==seof) break; *p++ = c; if (p >= &rhsbuf[LBSIZE/2]) error(Q); } *p++ = 0; if ((peekc = getchr()) == 'g') { peekc = 0; newline(); return(1); } newline(); return(0);}getsub(){ register char *p1, *p2; p1 = linebuf; if ((p2 = linebp) == 0) return(EOF); while (*p1++ = *p2++) ; linebp = 0; return(0);}dosub(){ register char *lp, *sp, *rp; int c; lp = linebuf; sp = genbuf; rp = rhsbuf; while (lp < loc1) *sp++ = *lp++; while (c = *rp++&0377) { if (c=='&') { sp = place(sp, loc1, loc2); continue; } else if (c&0200 && (c &= 0177) >='1' && c < nbra+'1') { sp = place(sp, braslist[c-'1'], braelist[c-'1']); continue; } *sp++ = c&0177; if (sp >= &genbuf[LBSIZE]) error(Q); } lp = loc2; loc2 = sp - genbuf + linebuf; while (*sp++ = *lp++) if (sp >= &genbuf[LBSIZE]) error(Q); lp = linebuf; sp = genbuf; while (*lp++ = *sp++) ;}char *place(sp, l1, l2)register char *sp, *l1, *l2;{ while (l1 < l2) { *sp++ = *l1++; if (sp >= &genbuf[LBSIZE]) error(Q); } return(sp);}move(cflag){ register int *adt, *ad1, *ad2; int getcopy(); setdot(); nonzero(); if ((adt = address())==0) error(Q); newline(); if (cflag) { int *ozero, delta; ad1 = dol; ozero = zero; append(getcopy, ad1++); ad2 = dol; delta = zero - ozero; ad1 += delta; adt += delta; } else { ad2 = addr2; for (ad1 = addr1; ad1 <= ad2;) *ad1++ &= ~01; ad1 = addr1; } ad2++; if (adt<ad1) { dot = adt + (ad2-ad1); if ((++adt)==ad1) return; reverse(adt, ad1); reverse(ad1, ad2); reverse(adt, ad2); } else if (adt >= ad2) { dot = adt++; reverse(ad1, ad2); reverse(ad2, adt); reverse(ad1, adt); } else error(Q); fchange = 1;}reverse(a1, a2)register int *a1, *a2;{ register int t; for (;;) { t = *--a2; if (a2 <= a1) return; *a2 = *a1; *a1++ = t; }}getcopy(){ if (addr1 > addr2) return(EOF); getline(*addr1++); return(0);}compile(aeof){ register eof, c; register char *ep; char *lastep; char bracket[NBRA], *bracketp; int cclcnt; ep = expbuf; eof = aeof; bracketp = bracket; if ((c = getchr()) == eof) { if (*ep==0) error(Q); return; } circfl = 0; nbra = 0; if (c=='^') { c = getchr(); circfl++; } peekc = c; lastep = 0; for (;;) { if (ep >= &expbuf[ESIZE]) goto cerror; c = getchr(); if (c==eof) { if (bracketp != bracket) goto cerror; *ep++ = CEOF; return; } if (c!='*') lastep = ep; switch (c) { case '\\': if ((c = getchr())=='(') { if (nbra >= NBRA) goto cerror; *bracketp++ = nbra; *ep++ = CBRA; *ep++ = nbra++; continue; } if (c == ')') { if (bracketp <= bracket) goto cerror; *ep++ = CKET; *ep++ = *--bracketp; continue; } if (c>='1' && c<'1'+NBRA) { *ep++ = CBACK; *ep++ = c-'1'; continue; } *ep++ = CCHR; if (c=='\n') goto cerror; *ep++ = c; continue; case '.': *ep++ = CDOT; continue; case '\n': goto cerror; case '*': if (lastep==0 || *lastep==CBRA || *lastep==CKET) goto defchar; *lastep |= STAR; continue; case '$': if ((peekc=getchr()) != eof) goto defchar; *ep++ = CDOL; continue; case '[': *ep++ = CCL; *ep++ = 0; cclcnt = 1; if ((c=getchr()) == '^') { c = getchr(); ep[-2] = NCCL; } do { if (c=='\n') goto cerror; if (c=='-' && ep[-1]!=0) { if ((c=getchr())==']') { *ep++ = '-'; cclcnt++; break; } while (ep[-1]<c) { *ep = ep[-1]+1; ep++; cclcnt++; if (ep>=&expbuf[ESIZE]) goto cerror; } } *ep++ = c; cclcnt++; if (ep >= &expbuf[ESIZE]) goto cerror; } while ((c = getchr()) != ']'); lastep[1] = cclcnt; continue; defchar: default: *ep++ = CCHR; *ep++ = c; } } cerror: expbuf[0] = 0; nbra = 0; error(Q);}execute(gf, addr)int *addr;{ register char *p1, *p2, c; for (c=0; c<NBRA; c++) { braslist[c] = 0; braelist[c] = 0; } if (gf) { if (circfl) return(0); p1 = linebuf; p2 = genbuf; while (*p1++ = *p2++) ; locs = p1 = loc2; } else { if (addr==zero) return(0); p1 = getline(*addr); locs = 0; } p2 = expbuf; if (circfl) { loc1 = p1; return(advance(p1, p2)); } /* fast check for first character */ if (*p2==CCHR) { c = p2[1]; do { if (*p1!=c) continue; if (advance(p1, p2)) { loc1 = p1; return(1); } } while (*p1++); return(0); } /* regular algorithm */ do { if (advance(p1, p2)) { loc1 = p1; return(1); } } while (*p1++); return(0);}advance(lp, ep)register char *ep, *lp;{ register char *curlp; int i; for (;;) switch (*ep++) { case CCHR: if (*ep++ == *lp++) continue; return(0); case CDOT: if (*lp++) continue; return(0); case CDOL: if (*lp==0) continue; return(0); case CEOF: loc2 = lp; return(1); case CCL: if (cclass(ep, *lp++, 1)) { ep += *ep; continue; } return(0); case NCCL: if (cclass(ep, *lp++, 0)) { ep += *ep; continue; } return(0); case CBRA: braslist[*ep++] = lp; continue; case CKET: braelist[*ep++] = lp; continue; case CBACK: if (braelist[i = *ep++]==0) error(Q); if (backref(i, lp)) { lp += braelist[i] - braslist[i]; continue; } return(0); case CBACK|STAR: if (braelist[i = *ep++] == 0) error(Q); curlp = lp; while (backref(i, lp)) lp += braelist[i] - braslist[i]; while (lp >= curlp) { if (advance(lp, ep)) return(1); lp -= braelist[i] - braslist[i]; } continue; case CDOT|STAR: curlp = lp; while (*lp++) ; goto star; case CCHR|STAR: curlp = lp; while (*lp++ == *ep) ; ep++; goto star; case CCL|STAR: case NCCL|STAR: curlp = lp; while (cclass(ep, *lp++, ep[-1]==(CCL|STAR))) ; ep += *ep; goto star; star: do { lp--; if (lp==locs) break; if (advance(lp, ep)) return(1); } while (lp > curlp); return(0); default: error(Q); }}backref(i, lp)register i;register char *lp;{ register char *bp; bp = braslist[i]; while (*bp++ == *lp++) if (bp >= braelist[i]) return(1); return(0);}cclass(set, c, af)register char *set, c;{ register n; if (c==0) return(0); n = *set++; while (--n) if (*set++ == c) return(af); return(!af);}putd(){ register r; r = count%10; count /= 10; if (count) putd(); putchr(r + '0');}puts(sp)register char *sp;{ col = 0; while (*sp) putchr(*sp++); putchr('\n');}char line[70];char *linp = line;putchr(ac){ register char *lp; register c; lp = linp; c = ac; if (listf) { col++; if (col >= 72) { col = 0; *lp++ = '\\'; *lp++ = '\n'; } if (c=='\t') { c = '>'; goto esc; } if (c=='\b') { c = '<'; esc: *lp++ = '-'; *lp++ = '\b'; *lp++ = c; goto out; } if (c<' ' && c!= '\n') { *lp++ = '\\'; *lp++ = (c>>3)+'0'; *lp++ = (c&07)+'0'; col += 2; goto out; } } *lp++ = c;out: if(c == '\n' || lp >= &line[64]) { linp = line; write(1, line, lp-line); return; } linp = lp;}crblock(permp, buf, nchar, startn)char *permp;char *buf;long startn;{ register char *p1; int n1; int n2; register char *t1, *t2, *t3; t1 = permp; t2 = &permp[256]; t3 = &permp[512]; n1 = startn&0377; n2 = (startn>>8)&0377; p1 = buf; while(nchar--) { *p1 = t2[(t3[(t1[(*p1+n1)&0377]+n2)&0377]-n2)&0377]-n1; n1++; if(n1==256){ n1 = 0; n2++; if(n2==256) n2 = 0; } p1++; }}getkey(){ struct sgttyb b; int save; int (*sig)(); register char *p; register c; sig = signal(SIGINT, SIG_IGN); if (gtty(0, &b) == -1) error("Input not tty"); save = b.sg_flags; b.sg_flags &= ~ECHO; stty(0, &b); puts("Key:"); p = key; while(((c=getchr()) != EOF) && (c!='\n')) { if(p < &key[KSIZE]) *p++ = c; } *p = 0; b.sg_flags = save; stty(0, &b); signal(SIGINT, sig); return(key[0] != 0);}/* * Besides initializing the encryption machine, this routine * returns 0 if the key is null, and 1 if it is non-null. */crinit(keyp, permp)char *keyp, *permp;{ register char *t1, *t2, *t3; register i; int ic, k, temp, pf[2]; unsigned random; char buf[13]; long seed; t1 = permp; t2 = &permp[256]; t3 = &permp[512]; if(*keyp == 0) return(0); strncpy(buf, keyp, 8); while (*keyp) *keyp++ = '\0'; buf[8] = buf[0]; buf[9] = buf[1]; if (pipe(pf)<0) pf[0] = pf[1] = -1; if (fork()==0) { close(0); close(1); dup(pf[0]); dup(pf[1]); execl("/usr/lib/makekey", "-", 0); execl("/lib/makekey", "-", 0); exit(1); } write(pf[1], buf, 10); if (wait((int *)NULL)==-1 || read(pf[0], buf, 13)!=13) error("crypt: cannot generate key"); close(pf[0]); close(pf[1]); seed = 123; for (i=0; i<13; i++) seed = seed*buf[i] + i; for(i=0;i<256;i++){ t1[i] = i; t3[i] = 0; } for(i=0; i<256; i++) { seed = 5*seed + buf[i%13]; random = seed % 65521; k = 256-1 - i; ic = (random&0377) % (k+1); random >>= 8; temp = t1[k]; t1[k] = t1[ic]; t1[ic] = temp; if(t3[k]!=0) continue; ic = (random&0377) % k; while(t3[ic]!=0) ic = (ic+1) % k; t3[k] = ic; t3[ic] = k; } for(i=0; i<256; i++) t2[t1[i]&0377] = i; return(1);}makekey(a, b)char *a, *b;{ register int i; long t; char temp[KSIZE + 1]; for(i = 0; i < KSIZE; i++) temp[i] = *a++; time(&t); t += getpid(); for(i = 0; i < 4; i++) temp[i] ^= (t>>(8*i))&0377; crinit(temp, b);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -