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

📄 typo.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
char number[3];int eflg;char w2006[100];flg 0;char realwd[100];char *wd {&realwd[1]};char *fptr;char *ffptr &ffbuf;char ffbuf[36];int	neng;int	npr;int table[2];	/*keep these four cards in order*/int tab1[26];int tab2[730];char tab3[19684];int logtab[256];float inctab[256];char nwd[100];int tot;int wtot;char *buf[3];file[3];ptr[3];char *name[3];bsp[768];main(argc,argv) int argc; char *argv[]; {	char let,lt;	auto arg,t,sw,i,j,salt,er,c;	register k,l,m;	double junk;	int unl();	int ii;	double log(), exp(), pow();	nice(-20);	inctab[0] = 1;	logtab[0] = -10;	for(ii=1; ii<256; ii++){		inctab[ii] = exp(-ii/30.497);		logtab[ii] = log(30.*pow(1.0333,ii+0.) - 30.) + .5;		}	logtab[1] = -10;	number[2] = ' ';	buf[0] = bsp;	buf[1] = bsp + 0400;	buf[2] = bsp + 01000;	ptr[0] = 0; ptr[1] = 0;	ptr[2] = 1;	arg = 1;	while(argc>1 && argv[arg][0] == '-') {		switch(argv[arg][1]) {		default:			printf("Unrecognizable argument: %c\n",argv[arg][1]);				exit();		case 0:		case 'n':				neng++;				break;		case '1':				npr++;		}		arg++;		--argc;	}	if(!neng) {		salt = open("/usr/lib/salt",0);		er = read(salt,table,21200);			if(er != 21200)err("read salt");		close(salt);		}	if((signal(2,1) & 1) != 1)	signal(2,unl);	name[0] = "/usr/tmp/ttmpa1";	name[1] = "/usr/tmp/ttmpa2";	name[2] = "/usr/tmp/ttmpa3";	while((file[0] = open(name[0],1)) > 0){		close(file[0]);		for(j=0; j < 3; j++)name[j][13]++;		if(name[0][13] == 'z')err("creat tmp file");	}	file[0] = creat(name[0],0666);	fptr = argv[arg];	if(argc == 1) {argc = 2; arg = 0;}	while(--argc){		if(arg == 0){			file[2] = 0;		}else{			file[2] = open(argv[arg++],0);			if(file[2] < 0)err("open input file");		}		eflg = 1;		while((j = wdval(2)) != 0){			put(0,nwd,j);			k = -1;			l = 0;			m = 1;			if(inctab[table[0]] > (junk=rand()/32768.)) table[0]++;			while(m <= j){				c = 27*wd[k++] + wd[l++];				if(inctab[tab2[c]] > junk) tab2[c]++;				c = 27*c + wd[m++];				if(inctab[tab3[c]] > junk) tab3[c]++;			}			c = 27*wd[k] + wd[l];			if(inctab[tab2[c]] > junk) tab2[c]++;		}		if(file[2]) close(file[2]);	}	flsh(0,0);	close(file[0]);	sw = fork();		if(sw == 0){execl("/usr/bin/usort","usort","-o",name[2],name[0],0);			err("sort"); }		if(sw == -1)err("fork");	er = wait();		if(er != sw)err("probs");	file[0] = creat(name[0],0666);		if(file[0] < 0)err("creat tmp");	file[1] = open("/usr/lib/w2006",0);		if(file[1] < 0)err("open w2006");	ptr[1] = 1;	for(k=0;((c = w2006[k] = get(1)) != '\n');k++)		if(c == -1) break;	file[2] = open(name[2],0);	if(file[2] < 0)err("open tmp");	ptr[2] = 1;	while(ptr[2]){		l=0;		for(k=0;((c = wd[k] = get(2)) != '\n');k++)			if(c == -1)goto done;		for(i=0; i<=k;i++){			if(wd[i] < w2006[l]){				put(0,wd,k);				break;			}			if(wd[i] > w2006[l]){				for(l=0;((c = w2006[l] = get(1)) != '\n');l++)				if(c == -1){					put(0,wd,k);					for(k=0;((c = wd[k] =get(2))!= -1);k++){						put(0,wd,k);						k = -1;					}					goto done;				}				i = -1;				l=0;				continue;			}			l++;		}	}done:	close(file[2]); 	unlink(name[2]);	flsh(0,0);	close(file[1]);	close(file[0]);	ptr[1] = 1;	file[1] = open(name[0],0);		if(file[1] < 0)err("open tmp ");	file[0] = creat(name[1],0666);		if(file[0] < 0)err("create tmp");	while((j = nwdval(1)) != 0){		wtot = 0;		flg = 0;		k = -1; l = 0; m = 1;		while(m <= j){			tot = 0;			c = wd[k++]*27 + wd[l++];			tot =+ (logtab[tab2[c]]+logtab[tab2[wd[k]*27+wd[l]]]);			tot =>> 1;			c = c*27 + wd[m++];			tot =- logtab[tab3[c] & 0377];			if(tot > wtot) wtot = tot;			}		if(wtot < 0) wtot = 0;		t = conf(wtot,2,number);		put(0,number,2);		put(0,nwd,j);		}	flsh(0,0);	close(file[1]);	close(file[0]);	sw = fork();		if(sw == 0){execl("/bin/sort","sort","+0nr", "+1","-o",name[1],name[1]			,0);			err("sort"); }		if(sw == -1)err("fork");	er = wait();		if(er != sw)err("prob");	sw = fork();		if(sw == 0){			if(npr) {				execl("/bin/cat","cat",name[1],0);			} else {				i = 0 ;				while((c = "Possible typo's in "[i++])!=0)					*ffptr++ = c;				i = 0;				while((c = fptr[i++]) != 0)					*ffptr++ = c;				*ffptr = 0;				execl("/bin/pr","pr","-3", "-h",				ffbuf,name[1],0);				err("pr");		}	}		if(sw == -1)err("fork");	er = wait();		if(er != sw)err("prob");	unl();}unl() {	register j;	j = 2;	while(j--)unlink(name[j]);	exit();}err(c) char c[];{	register j;	printf("cannot %s\n",c);	unl();}get(ifile) int ifile;{	static char *ibuf[10];	if(--ptr[ifile]){		return(*ibuf[ifile]++ & 0377);}	if(ptr[ifile] = read(file[ifile],buf[ifile],512)){		if(ptr[ifile] < 0)goto prob;		ibuf[ifile] = buf[ifile];		return(*ibuf[ifile]++ & 0377);	}	ptr[ifile] = 1;	return(-1);prob:	ptr[ifile] = 1;	printf("read error\n");	return(-1);}put(ofile,s,optr) char s[]; {	register i;	while(optr-- >= 0)		 buf[ofile][(ptr[ofile] < 512)?ptr[ofile]++:flsh(ofile,1)] = *s++;	return;}flsh(ofile,i){	register error;	error = write(file[ofile],buf[ofile],ptr[ofile]);	if(error < 0)goto prob;	ptr[ofile] = i;	return(0);prob:	printf("write error on t.%d\n",file[ofile]);	unl();}wdval(wfile) int wfile; {	static let,wflg;	register j;beg:	j = -1;	if(wflg == 1){wflg = 0;		goto st; }	while((let = get(wfile)) != '\n'){st:		switch(let){		case -1:	return(0);		case '%':	if(j != -1)break;					goto ret;		case '-':				if((let = get(wfile)) == '\n'){					while((let = get(wfile)) == '\n')if(let == -1)return(0);					goto st; }				else {wflg = 1;					goto ret; }		case '\'':				if(eflg != 1){					if(j < 1)goto beg;						else break;					}		case '.':				if(eflg == 1){					while((let = get(wfile)) != '\n')if(let == -1)return(0);					goto beg; }				else goto ret;		default:				eflg = 0;				if(let < 'A')goto ret;				if(let <= 'Z'){ wd[++j] = let - 0100;					nwd[j] = let + ' ';					break; }				if(let < 'a' || let > 'z')goto ret;				wd[++j] = let - 0140;				nwd[j] = let;			}		 eflg = 0;	}	eflg = 1;ret:	if(j < 1)goto beg;	nwd[++j] = '\n';	wd[j] = 0;	return(j);}nwdval(wfile) int wfile;{	register j;	register char c;	j = -1;	do{		if(( c = nwd[++j] = get(wfile)) == -1)return(0);		wd[j] = c - 0140;	}	while(c != '\n');	wd[j] = '\0';	return(j);}conf(n,width,cbuf) char cbuf[]; {	register i,a;	i = width;	while(i--)cbuf[i] = ' ';	cbuf[(a = n/10)?conf(a,--width,cbuf):--width] = n%10 + '0';	return(++width);}rand(){	static gorp;	gorp = (gorp + 625) & 077777;	return(gorp);}

⌨️ 快捷键说明

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