⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ed.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -