xref: /original-bsd/usr.bin/spell/spell.c (revision 410275ba)
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