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); }