1d4aefe62Ssam #ifndef lint 2*410275baStorek static char sccsid[] = "@(#)spell.c 4.4 02/02/91"; 3d4aefe62Ssam #endif 4d4aefe62Ssam 5d4aefe62Ssam #include "spell.h" 6d4aefe62Ssam #define DLEV 2 7d4aefe62Ssam 8d4aefe62Ssam char *strcat(); 9d4aefe62Ssam int strip(); 10d4aefe62Ssam char *skipv(); 11d4aefe62Ssam int an(); 12d4aefe62Ssam int s(); 13d4aefe62Ssam int es(); 14d4aefe62Ssam int ily(); 15d4aefe62Ssam int ncy(); 16d4aefe62Ssam int CCe(); 17d4aefe62Ssam int VCe(); 18d4aefe62Ssam int bility(); 19d4aefe62Ssam int tion(); 20d4aefe62Ssam int ize(); 21d4aefe62Ssam int y_to_e(); 22d4aefe62Ssam int i_to_y(); 23d4aefe62Ssam int nop(); 24d4aefe62Ssam int metry(); 25d4aefe62Ssam 26d4aefe62Ssam struct suftab { 27d4aefe62Ssam char *suf; 28d4aefe62Ssam int (*p1)(); 29d4aefe62Ssam int n1; 30d4aefe62Ssam char *d1; 31d4aefe62Ssam char *a1; 32d4aefe62Ssam int (*p2)(); 33d4aefe62Ssam int n2; 34d4aefe62Ssam char *d2; 35d4aefe62Ssam char *a2; 36d4aefe62Ssam } suftab[] = { 37d4aefe62Ssam {"ssen",ily,4,"-y+iness","+ness" }, 38d4aefe62Ssam {"ssel",ily,4,"-y+i+less","+less" }, 39d4aefe62Ssam {"se",s,1,"","+s", es,2,"-y+ies","+es" }, 40d4aefe62Ssam {"s'",s,2,"","+'s"}, 41d4aefe62Ssam {"s",s,1,"","+s"}, 42d4aefe62Ssam {"ecn",ncy,1,"","-t+ce"}, 43d4aefe62Ssam {"ycn",ncy,1,"","-cy+t"}, 44d4aefe62Ssam {"ytilb",nop,0,"",""}, 45d4aefe62Ssam {"ytilib",bility,5,"-le+ility",""}, 46d4aefe62Ssam {"elbaif",i_to_y,4,"-y+iable",""}, 47d4aefe62Ssam {"elba",CCe,4,"-e+able","+able"}, 48d4aefe62Ssam {"yti",CCe,3,"-e+ity","+ity"}, 49d4aefe62Ssam {"ylb",y_to_e,1,"-e+y",""}, 50d4aefe62Ssam {"yl",ily,2,"-y+ily","+ly"}, 51d4aefe62Ssam {"laci",strip,2,"","+al"}, 52d4aefe62Ssam {"latnem",strip,2,"","+al"}, 53d4aefe62Ssam {"lanoi",strip,2,"","+al"}, 54d4aefe62Ssam {"tnem",strip,4,"","+ment"}, 55d4aefe62Ssam {"gni",CCe,3,"-e+ing","+ing"}, 56d4aefe62Ssam {"reta",nop,0,"",""}, 57d4aefe62Ssam {"re",strip,1,"","+r", i_to_y,2,"-y+ier","+er"}, 58d4aefe62Ssam {"de",strip,1,"","+d", i_to_y,2,"-y+ied","+ed"}, 59d4aefe62Ssam {"citsi",strip,2,"","+ic"}, 60d4aefe62Ssam {"cihparg",i_to_y,1,"-y+ic",""}, 61d4aefe62Ssam {"tse",strip,2,"","+st", i_to_y,3,"-y+iest","+est"}, 62d4aefe62Ssam {"cirtem",i_to_y,1,"-y+ic",""}, 63d4aefe62Ssam {"yrtem",metry,0,"-ry+er",""}, 64d4aefe62Ssam {"cigol",i_to_y,1,"-y+ic",""}, 65d4aefe62Ssam {"tsigol",i_to_y,2,"-y+ist",""}, 66d4aefe62Ssam {"tsi",VCe,3,"-e+ist","+ist"}, 67d4aefe62Ssam {"msi",VCe,3,"-e+ism","+ist"}, 68d4aefe62Ssam {"noitacif",i_to_y,6,"-y+ication",""}, 69d4aefe62Ssam {"noitazi",ize,5,"-e+ation",""}, 70d4aefe62Ssam {"rota",tion,2,"-e+or",""}, 71d4aefe62Ssam {"noit",tion,3,"-e+ion","+ion"}, 72d4aefe62Ssam {"naino",an,3,"","+ian"}, 73d4aefe62Ssam {"na",an,1,"","+n"}, 74d4aefe62Ssam {"evit",tion,3,"-e+ive","+ive"}, 75d4aefe62Ssam {"ezi",CCe,3,"-e+ize","+ize"}, 76d4aefe62Ssam {"pihs",strip,4,"","+ship"}, 77d4aefe62Ssam {"dooh",ily,4,"-y+hood","+hood"}, 78d4aefe62Ssam {"ekil",strip,4,"","+like"}, 79d4aefe62Ssam 0 80d4aefe62Ssam }; 81d4aefe62Ssam 82d4aefe62Ssam char *preftab[] = { 83d4aefe62Ssam "anti", 84d4aefe62Ssam "bio", 85d4aefe62Ssam "dis", 86d4aefe62Ssam "electro", 87d4aefe62Ssam "en", 88d4aefe62Ssam "fore", 89d4aefe62Ssam "hyper", 90d4aefe62Ssam "intra", 91d4aefe62Ssam "inter", 92d4aefe62Ssam "iso", 93d4aefe62Ssam "kilo", 94d4aefe62Ssam "magneto", 95d4aefe62Ssam "meta", 96d4aefe62Ssam "micro", 97d4aefe62Ssam "milli", 98d4aefe62Ssam "mis", 99d4aefe62Ssam "mono", 100d4aefe62Ssam "multi", 101d4aefe62Ssam "non", 102d4aefe62Ssam "out", 103d4aefe62Ssam "over", 104d4aefe62Ssam "photo", 105d4aefe62Ssam "poly", 106d4aefe62Ssam "pre", 107d4aefe62Ssam "pseudo", 108d4aefe62Ssam "re", 109d4aefe62Ssam "semi", 110d4aefe62Ssam "stereo", 111d4aefe62Ssam "sub", 112d4aefe62Ssam "super", 113d4aefe62Ssam "thermo", 114d4aefe62Ssam "ultra", 115d4aefe62Ssam "under", /*must precede un*/ 116d4aefe62Ssam "un", 117d4aefe62Ssam 0 118d4aefe62Ssam }; 119d4aefe62Ssam 120d4aefe62Ssam int vflag; 121d4aefe62Ssam int xflag; 122d4aefe62Ssam char word[100]; 123d4aefe62Ssam char original[100]; 124d4aefe62Ssam char *deriv[40]; 125d4aefe62Ssam char affix[40]; 126d4aefe62Ssam 127d4aefe62Ssam main(argc,argv) 128*410275baStorek int argc; 129d4aefe62Ssam char **argv; 130d4aefe62Ssam { 131d4aefe62Ssam register char *ep, *cp; 132d4aefe62Ssam register char *dp; 133d4aefe62Ssam int fold; 134d4aefe62Ssam int j; 135d4aefe62Ssam FILE *file, *found; 136d4aefe62Ssam if(!prime(argc,argv)) { 137d4aefe62Ssam fprintf(stderr, 138d4aefe62Ssam "spell: cannot initialize hash table\n"); 139d4aefe62Ssam exit(1); 140d4aefe62Ssam } 141d4aefe62Ssam found = fopen(argv[2],"w"); 142d4aefe62Ssam for(argc-=3,argv+=3; argc>0 && argv[0][0]=='-'; argc--,argv++) 143d4aefe62Ssam switch(argv[0][1]) { 144d4aefe62Ssam case 'b': 145d4aefe62Ssam ise(); 146d4aefe62Ssam break; 147d4aefe62Ssam case 'v': 148d4aefe62Ssam vflag++; 149d4aefe62Ssam break; 150d4aefe62Ssam case 'x': 151d4aefe62Ssam xflag++; 152d4aefe62Ssam break; 153d4aefe62Ssam } 154d4aefe62Ssam for(;; fprintf(file,"%s%s\n",affix,original)) { 155d4aefe62Ssam affix[0] = 0; 156d4aefe62Ssam file = found; 157d4aefe62Ssam for(ep=word;(*ep=j=getchar())!='\n';ep++) 1580c77bd29Sbloom if(j == EOF) { 1590c77bd29Sbloom fclose(found); 160d4aefe62Ssam exit(0); 1610c77bd29Sbloom } 162d4aefe62Ssam for(cp=word,dp=original; cp<ep; ) 163d4aefe62Ssam *dp++ = *cp++; 164d4aefe62Ssam *dp = 0; 165d4aefe62Ssam fold = 0; 166d4aefe62Ssam for(cp=word;cp<ep;cp++) 167d4aefe62Ssam if(islower(*cp)) 168d4aefe62Ssam goto lcase; 169d4aefe62Ssam if(putsuf(ep,".",0)) 170d4aefe62Ssam continue; 171d4aefe62Ssam ++fold; 172d4aefe62Ssam for(cp=original+1,dp=word+1;dp<ep;dp++,cp++) 173d4aefe62Ssam *dp = Tolower(*cp); 174d4aefe62Ssam lcase: 175d4aefe62Ssam if(putsuf(ep,".",0)||suffix(ep,0)) 176d4aefe62Ssam continue; 177d4aefe62Ssam if(isupper(word[0])) { 178d4aefe62Ssam for(cp=original,dp=word; *dp = *cp++; dp++) 179d4aefe62Ssam if (fold) *dp = Tolower(*dp); 180d4aefe62Ssam word[0] = Tolower(word[0]); 181d4aefe62Ssam goto lcase; 182d4aefe62Ssam } 183d4aefe62Ssam file = stdout; 184d4aefe62Ssam } 185d4aefe62Ssam } 186d4aefe62Ssam 187d4aefe62Ssam suffix(ep,lev) 188d4aefe62Ssam char *ep; 189*410275baStorek int lev; 190d4aefe62Ssam { 191d4aefe62Ssam register struct suftab *t; 192d4aefe62Ssam register char *cp, *sp; 193d4aefe62Ssam lev += DLEV; 194d4aefe62Ssam deriv[lev] = deriv[lev-1] = 0; 195d4aefe62Ssam for(t= &suftab[0];sp=t->suf;t++) { 196d4aefe62Ssam cp = ep; 197d4aefe62Ssam while(*sp) 198d4aefe62Ssam if(*--cp!=*sp++) 199d4aefe62Ssam goto next; 200d4aefe62Ssam for(sp=cp; --sp>=word&&!vowel(*sp); ) ; 201d4aefe62Ssam if(sp<word) 202d4aefe62Ssam return(0); 203d4aefe62Ssam if((*t->p1)(ep-t->n1,t->d1,t->a1,lev+1)) 204d4aefe62Ssam return(1); 205d4aefe62Ssam if(t->p2!=0) { 206d4aefe62Ssam deriv[lev] = deriv[lev+1] = 0; 207d4aefe62Ssam return((*t->p2)(ep-t->n2,t->d2,t->a2,lev)); 208d4aefe62Ssam } 209d4aefe62Ssam return(0); 210d4aefe62Ssam next: ; 211d4aefe62Ssam } 212d4aefe62Ssam return(0); 213d4aefe62Ssam } 214d4aefe62Ssam 215d4aefe62Ssam nop() 216d4aefe62Ssam { 217d4aefe62Ssam return(0); 218d4aefe62Ssam } 219d4aefe62Ssam 220d4aefe62Ssam strip(ep,d,a,lev) 221d4aefe62Ssam char *ep,*d,*a; 222*410275baStorek int lev; 223d4aefe62Ssam { 224d4aefe62Ssam return(putsuf(ep,a,lev)||suffix(ep,lev)); 225d4aefe62Ssam } 226d4aefe62Ssam 227d4aefe62Ssam s(ep,d,a,lev) 228d4aefe62Ssam char *ep,*d,*a; 229*410275baStorek int lev; 230d4aefe62Ssam { 231d4aefe62Ssam if(lev>DLEV+1) 232d4aefe62Ssam return(0); 233d4aefe62Ssam if(*ep=='s'&&ep[-1]=='s') 234d4aefe62Ssam return(0); 235d4aefe62Ssam return(strip(ep,d,a,lev)); 236d4aefe62Ssam } 237d4aefe62Ssam 238d4aefe62Ssam an(ep,d,a,lev) 239d4aefe62Ssam char *ep,*d,*a; 240*410275baStorek int lev; 241d4aefe62Ssam { 242d4aefe62Ssam if(!isupper(*word)) /*must be proper name*/ 243d4aefe62Ssam return(0); 244d4aefe62Ssam return(putsuf(ep,a,lev)); 245d4aefe62Ssam } 246d4aefe62Ssam 247d4aefe62Ssam ize(ep,d,a,lev) 248d4aefe62Ssam char *ep,*d,*a; 249*410275baStorek int lev; 250d4aefe62Ssam { 251d4aefe62Ssam *ep++ = 'e'; 252d4aefe62Ssam return(strip(ep,"",d,lev)); 253d4aefe62Ssam } 254d4aefe62Ssam 255d4aefe62Ssam y_to_e(ep,d,a,lev) 256d4aefe62Ssam char *ep,*d,*a; 257*410275baStorek int lev; 258d4aefe62Ssam { 259ffac4c86Sedward char c = *ep; 260d4aefe62Ssam *ep++ = 'e'; 261ffac4c86Sedward if (strip(ep,"",d,lev)) 262ffac4c86Sedward return (1); 263ffac4c86Sedward ep[-1] = c; 264ffac4c86Sedward return (0); 265d4aefe62Ssam } 266d4aefe62Ssam 267d4aefe62Ssam ily(ep,d,a,lev) 268d4aefe62Ssam char *ep,*d,*a; 269*410275baStorek int lev; 270d4aefe62Ssam { 271d4aefe62Ssam if(ep[-1]=='i') 272d4aefe62Ssam return(i_to_y(ep,d,a,lev)); 273d4aefe62Ssam else 274d4aefe62Ssam return(strip(ep,d,a,lev)); 275d4aefe62Ssam } 276d4aefe62Ssam 277d4aefe62Ssam ncy(ep,d,a,lev) 278d4aefe62Ssam char *ep, *d, *a; 279*410275baStorek int lev; 280d4aefe62Ssam { 281d4aefe62Ssam if(skipv(skipv(ep-1))<word) 282d4aefe62Ssam return(0); 283d4aefe62Ssam ep[-1] = 't'; 284d4aefe62Ssam return(strip(ep,d,a,lev)); 285d4aefe62Ssam } 286d4aefe62Ssam 287d4aefe62Ssam bility(ep,d,a,lev) 288d4aefe62Ssam char *ep,*d,*a; 289*410275baStorek int lev; 290d4aefe62Ssam { 291d4aefe62Ssam *ep++ = 'l'; 292d4aefe62Ssam return(y_to_e(ep,d,a,lev)); 293d4aefe62Ssam } 294d4aefe62Ssam 295d4aefe62Ssam i_to_y(ep,d,a,lev) 296d4aefe62Ssam char *ep,*d,*a; 297*410275baStorek int lev; 298d4aefe62Ssam { 299d4aefe62Ssam if(ep[-1]=='i') { 300d4aefe62Ssam ep[-1] = 'y'; 301d4aefe62Ssam a = d; 302d4aefe62Ssam } 303d4aefe62Ssam return(strip(ep,"",a,lev)); 304d4aefe62Ssam } 305d4aefe62Ssam 306d4aefe62Ssam es(ep,d,a,lev) 307d4aefe62Ssam char *ep,*d,*a; 308*410275baStorek int lev; 309d4aefe62Ssam { 310d4aefe62Ssam if(lev>DLEV) 311d4aefe62Ssam return(0); 312d4aefe62Ssam switch(ep[-1]) { 313d4aefe62Ssam default: 314d4aefe62Ssam return(0); 315d4aefe62Ssam case 'i': 316d4aefe62Ssam return(i_to_y(ep,d,a,lev)); 317d4aefe62Ssam case 's': 318d4aefe62Ssam case 'h': 319d4aefe62Ssam case 'z': 320d4aefe62Ssam case 'x': 321d4aefe62Ssam return(strip(ep,d,a,lev)); 322d4aefe62Ssam } 323d4aefe62Ssam } 324d4aefe62Ssam 325d4aefe62Ssam metry(ep,d,a,lev) 326d4aefe62Ssam char *ep, *d,*a; 327*410275baStorek int lev; 328d4aefe62Ssam { 329d4aefe62Ssam ep[-2] = 'e'; 330d4aefe62Ssam ep[-1] = 'r'; 331d4aefe62Ssam return(strip(ep,d,a,lev)); 332d4aefe62Ssam } 333d4aefe62Ssam 334d4aefe62Ssam tion(ep,d,a,lev) 335d4aefe62Ssam char *ep,*d,*a; 336*410275baStorek int lev; 337d4aefe62Ssam { 338d4aefe62Ssam switch(ep[-2]) { 339d4aefe62Ssam case 'c': 340d4aefe62Ssam case 'r': 341d4aefe62Ssam return(putsuf(ep,a,lev)); 342d4aefe62Ssam case 'a': 343d4aefe62Ssam return(y_to_e(ep,d,a,lev)); 344d4aefe62Ssam } 345d4aefe62Ssam return(0); 346d4aefe62Ssam } 347d4aefe62Ssam 348d4aefe62Ssam /* possible consonant-consonant-e ending*/ 349d4aefe62Ssam CCe(ep,d,a,lev) 350d4aefe62Ssam char *ep,*d,*a; 351*410275baStorek int lev; 352d4aefe62Ssam { 353d4aefe62Ssam switch(ep[-1]) { 354d4aefe62Ssam case 'l': 355d4aefe62Ssam if(vowel(ep[-2])) 356d4aefe62Ssam break; 357d4aefe62Ssam switch(ep[-2]) { 358d4aefe62Ssam case 'l': 359d4aefe62Ssam case 'r': 360d4aefe62Ssam case 'w': 361d4aefe62Ssam break; 362d4aefe62Ssam default: 363d4aefe62Ssam return(y_to_e(ep,d,a,lev)); 364d4aefe62Ssam } 365d4aefe62Ssam break; 366d4aefe62Ssam case 's': 367d4aefe62Ssam if(ep[-2]=='s') 368d4aefe62Ssam break; 369d4aefe62Ssam case 'c': 370d4aefe62Ssam case 'g': 371d4aefe62Ssam if(*ep=='a') 372d4aefe62Ssam return(0); 373d4aefe62Ssam case 'v': 374d4aefe62Ssam case 'z': 375d4aefe62Ssam if(vowel(ep[-2])) 376d4aefe62Ssam break; 377d4aefe62Ssam case 'u': 378d4aefe62Ssam if(y_to_e(ep,d,a,lev)) 379d4aefe62Ssam return(1); 380d4aefe62Ssam if(!(ep[-2]=='n'&&ep[-1]=='g')) 381d4aefe62Ssam return(0); 382d4aefe62Ssam } 383d4aefe62Ssam return(VCe(ep,d,a,lev)); 384d4aefe62Ssam } 385d4aefe62Ssam 386d4aefe62Ssam /* possible consonant-vowel-consonant-e ending*/ 387d4aefe62Ssam VCe(ep,d,a,lev) 388d4aefe62Ssam char *ep,*d,*a; 389*410275baStorek int lev; 390d4aefe62Ssam { 391d4aefe62Ssam char c; 392d4aefe62Ssam c = ep[-1]; 393d4aefe62Ssam if(c=='e') 394d4aefe62Ssam return(0); 395d4aefe62Ssam if(!vowel(c) && vowel(ep[-2])) { 396d4aefe62Ssam c = *ep; 397d4aefe62Ssam *ep++ = 'e'; 398d4aefe62Ssam if(putsuf(ep,d,lev)||suffix(ep,lev)) 399d4aefe62Ssam return(1); 400d4aefe62Ssam ep--; 401d4aefe62Ssam *ep = c; 402d4aefe62Ssam } 403d4aefe62Ssam return(strip(ep,d,a,lev)); 404d4aefe62Ssam } 405d4aefe62Ssam 406d4aefe62Ssam char *lookuppref(wp,ep) 407d4aefe62Ssam char **wp; 408d4aefe62Ssam char *ep; 409d4aefe62Ssam { 410d4aefe62Ssam register char **sp; 411d4aefe62Ssam register char *bp,*cp; 412d4aefe62Ssam for(sp=preftab;*sp;sp++) { 413d4aefe62Ssam bp = *wp; 414d4aefe62Ssam for(cp= *sp;*cp;cp++,bp++) 415d4aefe62Ssam if(Tolower(*bp)!=*cp) 416d4aefe62Ssam goto next; 417d4aefe62Ssam for(cp=bp;cp<ep;cp++) 418d4aefe62Ssam if(vowel(*cp)) { 419d4aefe62Ssam *wp = bp; 420d4aefe62Ssam return(*sp); 421d4aefe62Ssam } 422d4aefe62Ssam next: ; 423d4aefe62Ssam } 424d4aefe62Ssam return(0); 425d4aefe62Ssam } 426d4aefe62Ssam 427d4aefe62Ssam putsuf(ep,a,lev) 428d4aefe62Ssam char *ep,*a; 429*410275baStorek int lev; 430d4aefe62Ssam { 431d4aefe62Ssam register char *cp; 432d4aefe62Ssam char *bp; 433d4aefe62Ssam register char *pp; 434d4aefe62Ssam int val = 0; 435d4aefe62Ssam char space[20]; 436d4aefe62Ssam deriv[lev] = a; 437*410275baStorek if(putword(word,ep,lev)) 438d4aefe62Ssam return(1); 439d4aefe62Ssam bp = word; 440d4aefe62Ssam pp = space; 441d4aefe62Ssam deriv[lev+1] = pp; 442d4aefe62Ssam while(cp=lookuppref(&bp,ep)) { 443d4aefe62Ssam *pp++ = '+'; 444d4aefe62Ssam while(*pp = *cp++) 445d4aefe62Ssam pp++; 446*410275baStorek if(putword(bp,ep,lev+1)) { 447d4aefe62Ssam val = 1; 448d4aefe62Ssam break; 449d4aefe62Ssam } 450d4aefe62Ssam } 451d4aefe62Ssam deriv[lev+1] = deriv[lev+2] = 0; 452d4aefe62Ssam return(val); 453d4aefe62Ssam } 454d4aefe62Ssam 455*410275baStorek putword(bp,ep,lev) 456d4aefe62Ssam char *bp,*ep; 457*410275baStorek int lev; 458d4aefe62Ssam { 459d4aefe62Ssam register i, j; 460d4aefe62Ssam char duple[3]; 461d4aefe62Ssam if(ep-bp<=1) 462d4aefe62Ssam return(0); 463d4aefe62Ssam if(vowel(*ep)) { 464d4aefe62Ssam if(monosyl(bp,ep)) 465d4aefe62Ssam return(0); 466d4aefe62Ssam } 467d4aefe62Ssam i = dict(bp,ep); 468d4aefe62Ssam if(i==0&&vowel(*ep)&&ep[-1]==ep[-2]&&monosyl(bp,ep-1)) { 469d4aefe62Ssam ep--; 470d4aefe62Ssam deriv[++lev] = duple; 471d4aefe62Ssam duple[0] = '+'; 472d4aefe62Ssam duple[1] = *ep; 473d4aefe62Ssam duple[2] = 0; 474d4aefe62Ssam i = dict(bp,ep); 475d4aefe62Ssam } 476d4aefe62Ssam if(vflag==0||i==0) 477d4aefe62Ssam return(i); 478d4aefe62Ssam j = lev; 479d4aefe62Ssam do { 480d4aefe62Ssam if(deriv[j]) 481d4aefe62Ssam strcat(affix,deriv[j]); 482d4aefe62Ssam } while(--j>0); 483d4aefe62Ssam strcat(affix,"\t"); 484d4aefe62Ssam return(i); 485d4aefe62Ssam } 486d4aefe62Ssam 487d4aefe62Ssam 488d4aefe62Ssam monosyl(bp,ep) 489d4aefe62Ssam char *bp, *ep; 490d4aefe62Ssam { 491d4aefe62Ssam if(ep<bp+2) 492d4aefe62Ssam return(0); 493d4aefe62Ssam if(vowel(*--ep)||!vowel(*--ep) 494d4aefe62Ssam ||ep[1]=='x'||ep[1]=='w') 495d4aefe62Ssam return(0); 496d4aefe62Ssam while(--ep>=bp) 497d4aefe62Ssam if(vowel(*ep)) 498d4aefe62Ssam return(0); 499d4aefe62Ssam return(1); 500d4aefe62Ssam } 501d4aefe62Ssam 502d4aefe62Ssam char * 503d4aefe62Ssam skipv(s) 504d4aefe62Ssam char *s; 505d4aefe62Ssam { 506d4aefe62Ssam if(s>=word&&vowel(*s)) 507d4aefe62Ssam s--; 508d4aefe62Ssam while(s>=word&&!vowel(*s)) 509d4aefe62Ssam s--; 510d4aefe62Ssam return(s); 511d4aefe62Ssam } 512d4aefe62Ssam 513d4aefe62Ssam vowel(c) 514*410275baStorek int c; 515d4aefe62Ssam { 516d4aefe62Ssam switch(Tolower(c)) { 517d4aefe62Ssam case 'a': 518d4aefe62Ssam case 'e': 519d4aefe62Ssam case 'i': 520d4aefe62Ssam case 'o': 521d4aefe62Ssam case 'u': 522d4aefe62Ssam case 'y': 523d4aefe62Ssam return(1); 524d4aefe62Ssam } 525d4aefe62Ssam return(0); 526d4aefe62Ssam } 527d4aefe62Ssam 528d4aefe62Ssam /* crummy way to Britishise */ 529d4aefe62Ssam ise() 530d4aefe62Ssam { 531d4aefe62Ssam register struct suftab *p; 532d4aefe62Ssam for(p = suftab;p->suf;p++) { 533d4aefe62Ssam ztos(p->suf); 534d4aefe62Ssam ztos(p->d1); 535d4aefe62Ssam ztos(p->a1); 536d4aefe62Ssam } 537d4aefe62Ssam } 538d4aefe62Ssam ztos(s) 539d4aefe62Ssam char *s; 540d4aefe62Ssam { 541d4aefe62Ssam for(;*s;s++) 542d4aefe62Ssam if(*s=='z') 543d4aefe62Ssam *s = 's'; 544d4aefe62Ssam } 545d4aefe62Ssam 546d4aefe62Ssam dict(bp,ep) 547d4aefe62Ssam char *bp, *ep; 548d4aefe62Ssam { 549d4aefe62Ssam register char *wp; 550d4aefe62Ssam long h; 551d4aefe62Ssam register long *lp; 552d4aefe62Ssam register i; 553d4aefe62Ssam if(xflag) 554d4aefe62Ssam printf("=%.*s\n",ep-bp,bp); 555d4aefe62Ssam for(i=0; i<NP; i++) { 556d4aefe62Ssam for (wp = bp, h = 0, lp = pow2[i]; wp < ep; ++wp, ++lp) 557d4aefe62Ssam h += *wp * *lp; 558d4aefe62Ssam h += '\n' * *lp; 559d4aefe62Ssam h %= p[i]; 560d4aefe62Ssam if(get(h)==0) 561d4aefe62Ssam return(0); 562d4aefe62Ssam } 563d4aefe62Ssam return(1); 564d4aefe62Ssam } 565