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

📄 ed.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	lp = linebuf;	bp = getblock(tl, READ);	nl = nleft;	tl =& ~0377;	while (*lp++ = *bp++)		if (--nl == 0) {			bp = getblock(tl=+0400, READ);			nl = nleft;		}	return(linebuf);}putline(){	register char *bp, *lp;	register nl;	int tl;	lp = linebuf;	tl = tline;	bp = getblock(tl, WRITE);	nl = nleft;	tl =& ~0377;	while (*bp = *lp++) {		if (*bp++ == '\n') {			*--bp = 0;			linebp = lp;			break;		}		if (--nl == 0) {			bp = getblock(tl=+0400, WRITE);			nl = nleft;		}	}	nl = tline;	tline =+ (((lp-linebuf)+03)>>1)&077776;	return(nl);}getblock(atl, iof){	extern read(), write();	register bno, off;		bno = (atl>>8)&0377;	off = (atl<<1)&0774;	if (bno >= 255) {		puts(TMPERR);		error;	}	nleft = 512 - off;	if (bno==iblock) {		ichanged =| iof;		return(ibuff+off);	}	if (bno==oblock)		return(obuff+off);	if (iof==READ) {		if (ichanged)			blkio(iblock, ibuff, write);		ichanged = 0;		iblock = bno;		blkio(bno, ibuff, read);		return(ibuff+off);	}	if (oblock>=0)		blkio(oblock, obuff, write);	oblock = bno;	return(obuff+off);}blkio(b, buf, iofcn)int (*iofcn)();{	seek(tfile, b, 3);	if ((*iofcn)(tfile, buf, 512) != 512) {		puts(TMPERR);		error;	}}init(){	register char *p;	register pid;	close(tfile);	tline = 0;	iblock = -1;	oblock = -1;	tfname = "/tmp/exxxxx";	ichanged = 0;	pid = getpid();	for (p = &tfname[11]; p > &tfname[6];) {		*--p = (pid&07) + '0';		pid =>> 3;	}	close(creat(tfname, 0600));	tfile = open(tfname, 2);	brk(fendcore);	dot = zero = dol = fendcore;	endcore = fendcore - 2;}global(k){	register char *gp;	register c;	register int *a1;	char globuf[GBSIZE];	if (globp)		error;	setall();	nonzero();	if ((c=getchar())=='\n')		error;	compile(c);	gp = globuf;	while ((c = getchar()) != '\n') {		if (c==EOF)			error;		if (c=='\\') {			c = getchar();			if (c!='\n')				*gp++ = '\\';		}		*gp++ = c;		if (gp >= &globuf[GBSIZE-2])			error;	}	*gp++ = '\n';	*gp++ = 0;	for (a1=zero; a1<=dol; a1++) {		*a1 =& ~01;		if (a1>=addr1 && a1<=addr2 && execute(0, a1)==k)			*a1 =| 01;	}	for (a1=zero; a1<=dol; a1++) {		if (*a1 & 01) {			*a1 =& ~01;			dot = a1;			globp = globuf;			commands();			a1 = zero;		}	}}substitute(inglob){	register gsubf, *a1, nl;	int getsub();	gsubf = compsub();	for (a1 = addr1; a1 <= addr2; a1++) {		if (execute(0, a1)==0)			continue;		inglob =| 01;		dosub();		if (gsubf) {			while (*loc2) {				if (execute(1)==0)					break;				dosub();			}		}		*a1 = putline();		nl = append(getsub, a1);		a1 =+ nl;		addr2 =+ nl;	}	if (inglob==0)		error;}compsub(){	register seof, c;	register char *p;	int gsubf;	if ((seof = getchar()) == '\n')		error;	compile(seof);	p = rhsbuf;	for (;;) {		c = getchar();		if (c=='\\')			c = getchar() | 0200;		if (c=='\n')			error;		if (c==seof)			break;		*p++ = c;		if (p >= &rhsbuf[LBSIZE/2])			error;	}	*p++ = 0;	if ((peekc = getchar()) == '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++) {		if (c=='&') {			sp = place(sp, loc1, loc2);			continue;		} else if (c<0 && (c =& 0177) >='1' && c < NBRA+'1') {			sp = place(sp, braslist[c-'1'], braelist[c-'1']);			continue;		}		*sp++ = c&0177;		if (sp >= &genbuf[LBSIZE])			error;	}	lp = loc2;	loc2 = sp + linebuf - genbuf;	while (*sp++ = *lp++)		if (sp >= &genbuf[LBSIZE])			error;	lp = linebuf;	sp = genbuf;	while (*lp++ = *sp++);}place(asp, al1, al2){	register char *sp, *l1, *l2;	sp = asp;	l1 = al1;	l2 = al2;	while (l1 < l2) {		*sp++ = *l1++;		if (sp >= &genbuf[LBSIZE])			error;	}	return(sp);}move(cflag){	register int *adt, *ad1, *ad2;	int getcopy();	setdot();	nonzero();	if ((adt = address())==0)		error;	newline();	ad1 = addr1;	ad2 = addr2;	if (cflag) {		ad1 = dol;		append(getcopy, ad1++);		ad2 = dol;	}	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;}reverse(aa1, aa2){	register int *a1, *a2, t;	a1 = aa1;	a2 = aa2;	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 nbra;	int cclcnt;	ep = expbuf;	eof = aeof;	bracketp = bracket;	nbra = 0;	if ((c = getchar()) == eof) {		if (*ep==0)			error;		return;	}	circfl = 0;	if (c=='^') {		c = getchar();		circfl++;	}	if (c=='*')		goto cerror;	peekc = c;	for (;;) {		if (ep >= &expbuf[ESIZE])			goto cerror;		c = getchar();		if (c==eof) {			*ep++ = CEOF;			return;		}		if (c!='*')			lastep = ep;		switch (c) {		case '\\':			if ((c = getchar())=='(') {				if (nbra >= NBRA)					goto cerror;				*bracketp++ = nbra;				*ep++ = CBRA;				*ep++ = nbra++;				continue;			}			if (c == ')') {				if (bracketp <= bracket)					goto cerror;				*ep++ = CKET;				*ep++ = *--bracketp;				continue;			}			*ep++ = CCHR;			if (c=='\n')				goto cerror;			*ep++ = c;			continue;		case '.':			*ep++ = CDOT;			continue;		case '\n':			goto cerror;		case '*':			if (*lastep==CBRA || *lastep==CKET)				error;			*lastep =| STAR;			continue;		case '$':			if ((peekc=getchar()) != eof)				goto defchar;			*ep++ = CDOL;			continue;		case '[':			*ep++ = CCL;			*ep++ = 0;			cclcnt = 1;			if ((c=getchar()) == '^') {				c = getchar();				ep[-2] = NCCL;			}			do {				if (c=='\n')					goto cerror;				*ep++ = c;				cclcnt++;				if (ep >= &expbuf[ESIZE])					goto cerror;			} while ((c = getchar()) != ']');			lastep[1] = cclcnt;			continue;		defchar:		default:			*ep++ = CCHR;			*ep++ = c;		}	}   cerror:	expbuf[0] = 0;	error;}execute(gf, addr)int *addr;{	register char *p1, *p2, c;	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(alp, aep){	register char *lp, *ep, *curlp;	char *nextep;	lp = alp;	ep = aep;	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 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;	}}cclass(aset, ac, af){	register char *set, c;	register n;	set = aset;	if ((c = ac) == 0)		return(0);	n = *set++;	while (--n)		if (*set++ == c)			return(af);	return(!af);}putd(){	register r;	extern ldivr;	count[1] = ldiv(count[0], count[1], 10);	count[0] = 0;	r = ldivr;	if (count[1])		putd();	putchar(r + '0');}puts(as){	register char *sp;	sp = as;	col = 0;	while (*sp)		putchar(*sp++);	putchar('\n');}char	line[70];char	*linp	line;putchar(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;}/* * Get process ID routine if system call is unavailable.getpid(){	register f;	int b[1];	f = open("/dev/kmem", 0);	if(f < 0)		return(-1);	seek(f, 0140074, 0);	read(f, b, 2);	seek(f, b[0]+8, 0);	read(f, b, 2);	close(f);	return(b[0]);} */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -