1: char number[3]; 2: int eflg; 3: char w2006[100]; 4: flg 0; 5: char realwd[100]; 6: char *wd {&realwd[1]}; 7: char *fptr; 8: char *ffptr &ffbuf; 9: char ffbuf[36]; 10: int neng; 11: int npr; 12: int table[2]; /*keep these four cards in order*/ 13: int tab1[26]; 14: int tab2[730]; 15: char tab3[19684]; 16: int logtab[256]; 17: float inctab[256]; 18: char nwd[100]; 19: int tot; 20: int wtot; 21: char *buf[3]; 22: file[3]; 23: ptr[3]; 24: char *name[3]; 25: bsp[768]; 26: 27: main(argc,argv) int argc; char *argv[]; { 28: char let,lt; 29: auto arg,t,sw,i,j,salt,er,c; 30: register k,l,m; 31: double junk; 32: int unl(); 33: int ii; 34: double log(), exp(), pow(); 35: 36: nice(-20); 37: inctab[0] = 1; 38: logtab[0] = -10; 39: for(ii=1; ii<256; ii++){ 40: inctab[ii] = exp(-ii/30.497); 41: logtab[ii] = log(30.*pow(1.0333,ii+0.) - 30.) + .5; 42: } 43: logtab[1] = -10; 44: 45: number[2] = ' '; 46: buf[0] = bsp; 47: buf[1] = bsp + 0400; 48: buf[2] = bsp + 01000; 49: ptr[0] = 0; ptr[1] = 0; 50: ptr[2] = 1; 51: arg = 1; 52: while(argc>1 && argv[arg][0] == '-') { 53: switch(argv[arg][1]) { 54: default: 55: printf("Unrecognizable argument: %c\n",argv[arg][1]); 56: exit(); 57: case 0: 58: case 'n': 59: neng++; 60: break; 61: case '1': 62: npr++; 63: } 64: arg++; 65: --argc; 66: } 67: if(!neng) { 68: salt = open("/usr/lib/salt",0); 69: er = read(salt,table,21200); 70: if(er != 21200)err("read salt"); 71: close(salt); 72: } 73: if((signal(2,1) & 1) != 1) 74: signal(2,unl); 75: name[0] = "/usr/tmp/ttmpa1"; 76: name[1] = "/usr/tmp/ttmpa2"; 77: name[2] = "/usr/tmp/ttmpa3"; 78: while((file[0] = open(name[0],1)) > 0){ 79: close(file[0]); 80: for(j=0; j < 3; j++)name[j][13]++; 81: if(name[0][13] == 'z')err("creat tmp file"); 82: } 83: file[0] = creat(name[0],0666); 84: fptr = argv[arg]; 85: if(argc == 1) {argc = 2; arg = 0;} 86: while(--argc){ 87: if(arg == 0){ 88: file[2] = 0; 89: }else{ 90: file[2] = open(argv[arg++],0); 91: if(file[2] < 0)err("open input file"); 92: } 93: eflg = 1; 94: while((j = wdval(2)) != 0){ 95: put(0,nwd,j); 96: k = -1; 97: l = 0; 98: m = 1; 99: if(inctab[table[0]] > (junk=rand()/32768.)) table[0]++; 100: while(m <= j){ 101: c = 27*wd[k++] + wd[l++]; 102: if(inctab[tab2[c]] > junk) tab2[c]++; 103: c = 27*c + wd[m++]; 104: if(inctab[tab3[c]] > junk) tab3[c]++; 105: } 106: c = 27*wd[k] + wd[l]; 107: if(inctab[tab2[c]] > junk) tab2[c]++; 108: } 109: if(file[2]) close(file[2]); 110: } 111: flsh(0,0); 112: close(file[0]); 113: sw = fork(); 114: if(sw == 0){execl("/usr/bin/usort","usort","-o",name[2],name[0],0); 115: err("sort"); } 116: if(sw == -1)err("fork"); 117: er = wait(); 118: if(er != sw)err("probs"); 119: file[0] = creat(name[0],0666); 120: if(file[0] < 0)err("creat tmp"); 121: file[1] = open("/usr/lib/w2006",0); 122: if(file[1] < 0)err("open w2006"); 123: ptr[1] = 1; 124: for(k=0;((c = w2006[k] = get(1)) != '\n');k++) 125: if(c == -1) break; 126: file[2] = open(name[2],0); 127: if(file[2] < 0)err("open tmp"); 128: ptr[2] = 1; 129: 130: while(ptr[2]){ 131: l=0; 132: for(k=0;((c = wd[k] = get(2)) != '\n');k++) 133: if(c == -1)goto done; 134: for(i=0; i<=k;i++){ 135: if(wd[i] < w2006[l]){ 136: put(0,wd,k); 137: break; 138: } 139: if(wd[i] > w2006[l]){ 140: for(l=0;((c = w2006[l] = get(1)) != '\n');l++) 141: if(c == -1){ 142: put(0,wd,k); 143: for(k=0;((c = wd[k] =get(2))!= -1);k++){ 144: put(0,wd,k); 145: k = -1; 146: } 147: goto done; 148: } 149: i = -1; 150: l=0; 151: continue; 152: } 153: l++; 154: } 155: } 156: done: 157: close(file[2]); 158: unlink(name[2]); 159: flsh(0,0); 160: close(file[1]); 161: close(file[0]); 162: ptr[1] = 1; 163: file[1] = open(name[0],0); 164: if(file[1] < 0)err("open tmp "); 165: file[0] = creat(name[1],0666); 166: if(file[0] < 0)err("create tmp"); 167: while((j = nwdval(1)) != 0){ 168: wtot = 0; 169: flg = 0; 170: k = -1; l = 0; m = 1; 171: while(m <= j){ 172: tot = 0; 173: c = wd[k++]*27 + wd[l++]; 174: tot =+ (logtab[tab2[c]]+logtab[tab2[wd[k]*27+wd[l]]]); 175: tot =>> 1; 176: c = c*27 + wd[m++]; 177: tot =- logtab[tab3[c] & 0377]; 178: if(tot > wtot) wtot = tot; 179: } 180: if(wtot < 0) wtot = 0; 181: t = conf(wtot,2,number); 182: put(0,number,2); 183: put(0,nwd,j); 184: } 185: flsh(0,0); 186: close(file[1]); 187: close(file[0]); 188: 189: sw = fork(); 190: if(sw == 0){execl("/bin/sort","sort","+0nr", "+1","-o",name[1],name[1] 191: ,0); 192: err("sort"); } 193: if(sw == -1)err("fork"); 194: er = wait(); 195: if(er != sw)err("prob"); 196: 197: sw = fork(); 198: if(sw == 0){ 199: if(npr) { 200: execl("/bin/cat","cat",name[1],0); 201: } else { 202: i = 0 ; 203: while((c = "Possible typo's in "[i++])!=0) 204: *ffptr++ = c; 205: i = 0; 206: while((c = fptr[i++]) != 0) 207: *ffptr++ = c; 208: *ffptr = 0; 209: execl("/bin/pr","pr","-3", "-h", 210: ffbuf,name[1],0); 211: err("pr"); 212: } 213: } 214: if(sw == -1)err("fork"); 215: er = wait(); 216: if(er != sw)err("prob"); 217: unl(); 218: } 219: 220: unl() { 221: register j; 222: j = 2; 223: while(j--)unlink(name[j]); 224: exit(); 225: } 226: 227: 228: err(c) char c[];{ 229: register j; 230: printf("cannot %s\n",c); 231: unl(); 232: } 233: 234: get(ifile) int ifile;{ 235: static char *ibuf[10]; 236: if(--ptr[ifile]){ 237: return(*ibuf[ifile]++ & 0377);} 238: if(ptr[ifile] = read(file[ifile],buf[ifile],512)){ 239: if(ptr[ifile] < 0)goto prob; 240: ibuf[ifile] = buf[ifile]; 241: return(*ibuf[ifile]++ & 0377); 242: } 243: ptr[ifile] = 1; 244: return(-1); 245: 246: prob: 247: ptr[ifile] = 1; 248: printf("read error\n"); 249: return(-1); 250: } 251: 252: put(ofile,s,optr) char s[]; { 253: register i; 254: 255: while(optr-- >= 0) 256: buf[ofile][(ptr[ofile] < 512)?ptr[ofile]++:flsh(ofile,1)] = *s++; 257: return; 258: } 259: 260: flsh(ofile,i){ 261: register error; 262: error = write(file[ofile],buf[ofile],ptr[ofile]); 263: if(error < 0)goto prob; 264: 265: ptr[ofile] = i; 266: return(0); 267: prob: 268: printf("write error on t.%d\n",file[ofile]); 269: unl(); 270: } 271: 272: wdval(wfile) int wfile; { 273: static let,wflg; 274: register j; 275: beg: 276: j = -1; 277: if(wflg == 1){wflg = 0; 278: goto st; } 279: while((let = get(wfile)) != '\n'){ 280: st: 281: switch(let){ 282: case -1: return(0); 283: case '%': if(j != -1)break; 284: goto ret; 285: case '-': 286: if((let = get(wfile)) == '\n'){ 287: while((let = get(wfile)) == '\n')if(let == -1)return(0); 288: goto st; } 289: else {wflg = 1; 290: goto ret; } 291: case '\'': 292: if(eflg != 1){ 293: if(j < 1)goto beg; 294: else break; 295: } 296: case '.': 297: if(eflg == 1){ 298: while((let = get(wfile)) != '\n')if(let == -1)return(0); 299: goto beg; } 300: else goto ret; 301: default: 302: eflg = 0; 303: if(let < 'A')goto ret; 304: if(let <= 'Z'){ wd[++j] = let - 0100; 305: nwd[j] = let + ' '; 306: break; } 307: if(let < 'a' || let > 'z')goto ret; 308: wd[++j] = let - 0140; 309: nwd[j] = let; 310: } 311: eflg = 0; } 312: 313: eflg = 1; 314: ret: 315: if(j < 1)goto beg; 316: nwd[++j] = '\n'; 317: wd[j] = 0; 318: return(j); 319: } 320: 321: nwdval(wfile) int wfile;{ 322: register j; 323: register char c; 324: j = -1; 325: do{ 326: if(( c = nwd[++j] = get(wfile)) == -1)return(0); 327: wd[j] = c - 0140; 328: } 329: while(c != '\n'); 330: wd[j] = '\0'; 331: return(j); 332: } 333: conf(n,width,cbuf) char cbuf[]; { 334: register i,a; 335: 336: i = width; 337: while(i--)cbuf[i] = ' '; 338: 339: cbuf[(a = n/10)?conf(a,--width,cbuf):--width] = n%10 + '0'; 340: 341: return(++width); 342: } 343: rand(){ 344: static gorp; 345: gorp = (gorp + 625) & 077777; 346: return(gorp); 347: }