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

📄 ed.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#/* * Editor */#define	SIGHUP	1#define	SIGINTR	2#define	SIGQUIT	3#define	FNSIZE	64#define	LBSIZE	512#define	ESIZE	128#define	GBSIZE	256#define	NBRA	5#define	EOF	-1#define	CBRA	1#define	CCHR	2#define	CDOT	4#define	CCL	6#define	NCCL	8#define	CDOL	10#define	CEOF	11#define	CKET	12#define	STAR	01#define	error	goto errlab#define	READ	0#define	WRITE	1int	peekc;int	lastc;char	savedfile[FNSIZE];char	file[FNSIZE];char	linebuf[LBSIZE];char	rhsbuf[LBSIZE/2];char	expbuf[ESIZE+4];int	circfl;int	*zero;int	*dot;int	*dol;int	*endcore;int	*fendcore;int	*addr1;int	*addr2;char	genbuf[LBSIZE];int	count[2];char	*nextip;char	*linebp;int	ninbuf;int	io;int	pflag;int	onhup;int	onquit;int	vflag	1;int	listf;int	col;char	*globp;int	tfile	-1;int	tline;char	*tfname;char	*loc1;char	*loc2;char	*locs;char	ibuff[512];int	iblock	-1;char	obuff[512];int	oblock	-1;int	ichanged;int	nleft;int	errfunc();int	*errlab	errfunc;char	TMPERR[] "TMP";int	names[26];char	*braslist[NBRA];char	*braelist[NBRA];main(argc, argv)char **argv;{	register char *p1, *p2;	extern int onintr();	onquit = signal(SIGQUIT, 1);	onhup = signal(SIGHUP, 1);	argv++;	if (argc > 1 && **argv=='-') {		vflag = 0;		/* allow debugging quits? */		if ((*argv)[1]=='q') {			signal(SIGQUIT, 0);			vflag++;		}		argv++;		argc--;	}	if (argc>1) {		p1 = *argv;		p2 = savedfile;		while (*p2++ = *p1++);		globp = "r";	}	fendcore = sbrk(0);	init();	if ((signal(SIGINTR, 1) & 01) == 0)		signal(SIGINTR, onintr);	setexit();	commands();	unlink(tfname);}commands(){	int getfile(), gettty();	register *a1, c;	register char *p;	int r;	for (;;) {	if (pflag) {		pflag = 0;		addr1 = addr2 = dot;		goto print;	}	addr1 = 0;	addr2 = 0;	do {		addr1 = addr2;		if ((a1 = address())==0) {			c = getchar();			break;		}		addr2 = a1;		if ((c=getchar()) == ';') {			c = ',';			dot = a1;		}	} while (c==',');	if (addr1==0)		addr1 = addr2;	switch(c) {	case 'a':		setdot();		newline();		append(gettty, addr2);		continue;	case 'c':		delete();		append(gettty, addr1-1);		continue;	case 'd':		delete();		continue;	case 'e':		setnoaddr();		if ((peekc = getchar()) != ' ')			error;		savedfile[0] = 0;		init();		addr2 = zero;		goto caseread;	case 'f':		setnoaddr();		if ((c = getchar()) != '\n') {			peekc = c;			savedfile[0] = 0;			filename();		}		puts(savedfile);		continue;	case 'g':		global(1);		continue;	case 'i':		setdot();		nonzero();		newline();		append(gettty, addr2-1);		continue;	case 'k':		if ((c = getchar()) < 'a' || c > 'z')			error;		newline();		setdot();		nonzero();		names[c-'a'] = *addr2 | 01;		continue;	case 'm':		move(0);		continue;	case '\n':		if (addr2==0)			addr2 = dot+1;		addr1 = addr2;		goto print;	case 'l':		listf++;	case 'p':		newline();	print:		setdot();		nonzero();		a1 = addr1;		do			puts(getline(*a1++));		while (a1 <= addr2);		dot = addr2;		listf = 0;		continue;	case 'q':		setnoaddr();		newline();		unlink(tfname);		exit();	case 'r':	caseread:		filename();		if ((io = open(file, 0)) < 0) {			lastc = '\n';			error;		}		setall();		ninbuf = 0;		append(getfile, addr2);		exfile();		continue;	case 's':		setdot();		nonzero();		substitute(globp);		continue;	case 't':		move(1);		continue;	case 'v':		global(0);		continue;	case 'w':		setall();		nonzero();		filename();		if ((io = creat(file, 0666)) < 0)			error;		putfile();		exfile();		continue;	case '=':		setall();		newline();		count[1] = (addr2-zero)&077777;		putd();		putchar('\n');		continue;	case '!':		unix();		continue;	case EOF:		return;	}	error;	}}address(){	register *a1, minus, c;	int n, relerr;	minus = 0;	a1 = 0;	for (;;) {		c = getchar();		if ('0'<=c && c<='9') {			n = 0;			do {				n =* 10;				n =+ c - '0';			} while ((c = getchar())>='0' && c<='9');			peekc = c;			if (a1==0)				a1 = zero;			if (minus<0)				n = -n;			a1 =+ n;			minus = 0;			continue;		}		relerr = 0;		if (a1 || minus)			relerr++;		switch(c) {		case ' ':		case '\t':			continue;			case '+':			minus++;			if (a1==0)				a1 = dot;			continue;		case '-':		case '^':			minus--;			if (a1==0)				a1 = dot;			continue;			case '?':		case '/':			compile(c);			a1 = dot;			for (;;) {				if (c=='/') {					a1++;					if (a1 > dol)						a1 = zero;				} else {					a1--;					if (a1 < zero)						a1 = dol;				}				if (execute(0, a1))					break;				if (a1==dot)					error;			}			break;			case '$':			a1 = dol;			break;			case '.':			a1 = dot;			break;		case '\'':			if ((c = getchar()) < 'a' || c > 'z')				error;			for (a1=zero; a1<=dol; a1++)				if (names[c-'a'] == (*a1|01))					break;			break;			default:			peekc = c;			if (a1==0)				return(0);			a1 =+ minus;			if (a1<zero || a1>dol)				error;			return(a1);		}		if (relerr)			error;	}}setdot(){	if (addr2 == 0)		addr1 = addr2 = dot;	if (addr1 > addr2)		error;}setall(){	if (addr2==0) {		addr1 = zero+1;		addr2 = dol;		if (dol==zero)			addr1 = zero;	}	setdot();}setnoaddr(){	if (addr2)		error;}nonzero(){	if (addr1<=zero || addr2>dol)		error;}newline(){	register c;	if ((c = getchar()) == '\n')		return;	if (c=='p' || c=='l') {		pflag++;		if (c=='l')			listf++;		if (getchar() == '\n')			return;	}	error;}filename(){	register char *p1, *p2;	register c;	count[1] = 0;	c = getchar();	if (c=='\n' || c==EOF) {		p1 = savedfile;		if (*p1==0)			error;		p2 = file;		while (*p2++ = *p1++);		return;	}	if (c!=' ')		error;	while ((c = getchar()) == ' ');	if (c=='\n')		error;	p1 = file;	do {		*p1++ = c;	} while ((c = getchar()) != '\n');	*p1++ = 0;	if (savedfile[0]==0) {		p1 = savedfile;		p2 = file;		while (*p1++ = *p2++);	}}exfile(){	close(io);	io = -1;	if (vflag) {		putd();		putchar('\n');	}}onintr(){	signal(SIGINTR, onintr);	putchar('\n');	lastc = '\n';	error;}errfunc(){	register c;	listf = 0;	puts("?");	count[0] = 0;	seek(0, 0, 2);	pflag = 0;	if (globp)		lastc = '\n';	globp = 0;	peekc = lastc;	while ((c = getchar()) != '\n' && c != EOF);	if (io > 0) {		close(io);		io = -1;	}	reset();}getchar(){	if (lastc=peekc) {		peekc = 0;		return(lastc);	}	if (globp) {		if ((lastc = *globp++) != 0)			return(lastc);		globp = 0;		return(EOF);	}	if (read(0, &lastc, 1) <= 0)		return(lastc = EOF);	lastc =& 0177;	return(lastc);}gettty(){	register c, gf;	register char *p;	p = linebuf;	gf = globp;	while ((c = getchar()) != '\n') {		if (c==EOF) {			if (gf)				peekc = c;			return(c);		}		if ((c =& 0177) == 0)			continue;		*p++ = c;		if (p >= &linebuf[LBSIZE-2])			error;	}	*p++ = 0;	if (linebuf[0]=='.' && linebuf[1]==0)		return(EOF);	return(0);}getfile(){	register c;	register char *lp, *fp;	lp = linebuf;	fp = nextip;	do {		if (--ninbuf < 0) {			if ((ninbuf = read(io, genbuf, LBSIZE)-1) < 0)				return(EOF);			fp = genbuf;		}		if (lp >= &linebuf[LBSIZE])			error;		if ((*lp++ = c = *fp++ & 0177) == 0) {			lp--;			continue;		}		if (++count[1] == 0)			++count[0];	} while (c != '\n');	*--lp = 0;	nextip = fp;	return(0);}putfile(){	int *a1;	register char *fp, *lp;	register nib;	nib = 512;	fp = genbuf;	a1 = addr1;	do {		lp = getline(*a1++);		for (;;) {			if (--nib < 0) {				write(io, genbuf, fp-genbuf);				nib = 511;				fp = genbuf;			}			if (++count[1] == 0)				++count[0];			if ((*fp++ = *lp++) == 0) {				fp[-1] = '\n';				break;			}		}	} while (a1 <= addr2);	write(io, genbuf, fp-genbuf);}append(f, a)int (*f)();{	register *a1, *a2, *rdot;	int nline, tl;	struct { int integer; };	nline = 0;	dot = a;	while ((*f)() == 0) {		if (dol >= endcore) {			if (sbrk(1024) == -1)				error;			endcore.integer =+ 1024;		}		tl = putline();		nline++;		a1 = ++dol;		a2 = a1+1;		rdot = ++dot;		while (a1 > rdot)			*--a2 = *--a1;		*rdot = tl;	}	return(nline);}unix(){	register savint, pid, rpid;	int retcode;	setnoaddr();	if ((pid = fork()) == 0) {		signal(SIGHUP, onhup);		signal(SIGQUIT, onquit);		execl("/bin/sh", "sh", "-t", 0);		exit();	}	savint = signal(SIGINTR, 1);	while ((rpid = wait(&retcode)) != pid && rpid != -1);	signal(SIGINTR, savint);	puts("!");}delete(){	register *a1, *a2, *a3;	setdot();	newline();	nonzero();	a1 = addr1;	a2 = addr2+1;	a3 = dol;	dol =- a2 - a1;	do		*a1++ = *a2++;	while (a2 <= a3);	a1 = addr1;	if (a1 > dol)		a1 = dol;	dot = a1;}getline(tl){	register char *bp, *lp;	register nl;

⌨️ 快捷键说明

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