1 d49a2e48 2004-03-09 devnull #include <u.h>
2 d49a2e48 2004-03-09 devnull #include <libc.h>
3 d49a2e48 2004-03-09 devnull #include <bio.h>
4 d49a2e48 2004-03-09 devnull #include <ctype.h>
5 d49a2e48 2004-03-09 devnull #include "code.h"
7 d49a2e48 2004-03-09 devnull /* fig leaves for possibly signed char quantities */
8 d49a2e48 2004-03-09 devnull #define ISUPPER(c) isupper((c)&0xff)
9 d49a2e48 2004-03-09 devnull #define ISLOWER(c) islower((c)&0xff)
10 d49a2e48 2004-03-09 devnull #define ISALPHA(c) isalpha((c)&0xff)
11 d49a2e48 2004-03-09 devnull #define ISDIGIT(c) isdigit((c)&0xff)
12 d49a2e48 2004-03-09 devnull #define ISVOWEL(c) voweltab[(c)&0xff]
13 d49a2e48 2004-03-09 devnull #define Tolower(c) (ISUPPER(c)? (c)-'A'+'a': (c))
14 d49a2e48 2004-03-09 devnull #define pair(a,b) (((a)<<8) | (b))
15 d49a2e48 2004-03-09 devnull #define DLEV 2
16 d49a2e48 2004-03-09 devnull #define DSIZ 40
18 d49a2e48 2004-03-09 devnull typedef long Bits;
19 d49a2e48 2004-03-09 devnull #define Set(h, f) ((long)(h) & (f))
21 d49a2e48 2004-03-09 devnull Bits nop(char*, char*, char*, int, int);
22 d49a2e48 2004-03-09 devnull Bits strip(char*, char*, char*, int, int);
23 d49a2e48 2004-03-09 devnull Bits ize(char*, char*, char*, int, int);
24 d49a2e48 2004-03-09 devnull Bits i_to_y(char*, char*, char*, int, int);
25 d49a2e48 2004-03-09 devnull Bits ily(char*, char*, char*, int, int);
26 d49a2e48 2004-03-09 devnull Bits subst(char*, char*, char*, int, int);
27 d49a2e48 2004-03-09 devnull Bits CCe(char*, char*, char*, int, int);
28 d49a2e48 2004-03-09 devnull Bits tion(char*, char*, char*, int, int);
29 d49a2e48 2004-03-09 devnull Bits an(char*, char*, char*, int, int);
30 d49a2e48 2004-03-09 devnull Bits s(char*, char*, char*, int, int);
31 d49a2e48 2004-03-09 devnull Bits es(char*, char*, char*, int, int);
32 d49a2e48 2004-03-09 devnull Bits bility(char*, char*, char*, int, int);
33 d49a2e48 2004-03-09 devnull Bits y_to_e(char*, char*, char*, int, int);
34 d49a2e48 2004-03-09 devnull Bits VCe(char*, char*, char*, int, int);
36 d49a2e48 2004-03-09 devnull Bits trypref(char*, char*, int, int);
37 d49a2e48 2004-03-09 devnull Bits tryword(char*, char*, int, int);
38 d49a2e48 2004-03-09 devnull Bits trysuff(char*, int, int);
39 d49a2e48 2004-03-09 devnull Bits dict(char*, char*);
40 d49a2e48 2004-03-09 devnull void typeprint(Bits);
41 d49a2e48 2004-03-09 devnull void pcomma(char*);
43 d49a2e48 2004-03-09 devnull void ise(void);
44 d49a2e48 2004-03-09 devnull int ordinal(void);
45 d49a2e48 2004-03-09 devnull char* skipv(char*);
46 d49a2e48 2004-03-09 devnull int inun(char*, Bits);
47 d49a2e48 2004-03-09 devnull char* ztos(char*);
48 d49a2e48 2004-03-09 devnull void readdict(char*);
50 d49a2e48 2004-03-09 devnull typedef struct Ptab Ptab;
51 d49a2e48 2004-03-09 devnull struct Ptab
54 d49a2e48 2004-03-09 devnull int flag;
57 d49a2e48 2004-03-09 devnull typedef struct Suftab Suftab;
58 d49a2e48 2004-03-09 devnull struct Suftab
60 d49a2e48 2004-03-09 devnull char *suf;
61 d49a2e48 2004-03-09 devnull Bits (*p1)(char*, char*, char*, int, int);
63 d49a2e48 2004-03-09 devnull char *d1;
64 d49a2e48 2004-03-09 devnull char *a1;
65 d49a2e48 2004-03-09 devnull int flag;
66 d49a2e48 2004-03-09 devnull int affixable;
67 d49a2e48 2004-03-09 devnull Bits (*p2)(char*, char*, char*, int, int);
69 d49a2e48 2004-03-09 devnull char *d2;
70 d49a2e48 2004-03-09 devnull char *a2;
73 d49a2e48 2004-03-09 devnull Suftab staba[] = {
74 d49a2e48 2004-03-09 devnull {"aibohp",subst,1,"-e+ia","",NOUN, NOUN},
78 d49a2e48 2004-03-09 devnull Suftab stabc[] =
80 d49a2e48 2004-03-09 devnull {"cai",strip,1,"","+c",N_AFFIX, ADJ|NOUN},
81 d49a2e48 2004-03-09 devnull {"citsi",strip,2,"","+ic",N_AFFIX, ADJ | N_AFFIX | NOUN},
82 d49a2e48 2004-03-09 devnull {"citi",ize,1,"-e+ic","",N_AFFIX, ADJ },
83 d49a2e48 2004-03-09 devnull {"cihparg",i_to_y,1,"-y+ic","",NOUN, ADJ|NOUN },
84 d49a2e48 2004-03-09 devnull {"cipocs",ize,1,"-e+ic","",NOUN, ADJ },
85 d49a2e48 2004-03-09 devnull {"cirtem",i_to_y,1,"-y+ic","",NOUN, ADJ },
86 d49a2e48 2004-03-09 devnull {"cigol",i_to_y,1,"-y+ic","",NOUN, ADJ },
87 d49a2e48 2004-03-09 devnull {"cimono",i_to_y,1,"-y+ic","",NOUN, ADJ },
88 d49a2e48 2004-03-09 devnull {"cibohp",subst,1,"-e+ic","",NOUN, ADJ },
91 d49a2e48 2004-03-09 devnull Suftab stabd[] =
93 d49a2e48 2004-03-09 devnull {"de",strip,1,"","+d",ED,ADJ |COMP,i_to_y,2,"-y+ied","+ed"},
94 d49a2e48 2004-03-09 devnull {"dooh",ily,4,"-y+ihood","+hood",NOUN | ADV, NOUN},
97 d49a2e48 2004-03-09 devnull Suftab stabe[] =
100 d49a2e48 2004-03-09 devnull * V_affix for comment ->commence->commentment??
102 d49a2e48 2004-03-09 devnull {"ecna",subst,1,"-t+ce","",ADJ,N_AFFIX|_Y|NOUN|VERB|ACTOR|V_AFFIX},
103 d49a2e48 2004-03-09 devnull {"ecne",subst,1,"-t+ce","",ADJ,N_AFFIX|_Y|NOUN|VERB|ACTOR|V_AFFIX},
104 d49a2e48 2004-03-09 devnull {"elbaif",i_to_y,4,"-y+iable","",V_IRREG,ADJ},
105 d49a2e48 2004-03-09 devnull {"elba",CCe,4,"-e+able","+able",V_AFFIX,ADJ},
106 d49a2e48 2004-03-09 devnull {"evi",subst,0,"-ion+ive","",N_AFFIX | V_AFFIX,NOUN | N_AFFIX| ADJ},
107 d49a2e48 2004-03-09 devnull {"ezi",CCe,3,"-e+ize","+ize",N_AFFIX|ADJ ,V_AFFIX | VERB |ION | COMP},
108 d49a2e48 2004-03-09 devnull {"ekil",strip,4,"","+like",N_AFFIX ,ADJ},
111 d49a2e48 2004-03-09 devnull Suftab stabg[] =
113 d49a2e48 2004-03-09 devnull {"gniee",strip,3,"","+ing",V_IRREG ,ADJ|NOUN},
114 d49a2e48 2004-03-09 devnull {"gnikam",strip,6,"","+making",NOUN,NOUN},
115 d49a2e48 2004-03-09 devnull {"gnipeek",strip,7,"","+keeping",NOUN,NOUN},
116 d49a2e48 2004-03-09 devnull {"gni",CCe,3,"-e+ing","+ing",V_IRREG ,ADJ|ED|NOUN},
119 d49a2e48 2004-03-09 devnull Suftab stabl[] =
121 d49a2e48 2004-03-09 devnull {"ladio",strip,2,"","+al",NOUN |ADJ,ADJ},
122 d49a2e48 2004-03-09 devnull {"laci",strip,2,"","+al",NOUN |ADJ,ADJ |NOUN|N_AFFIX},
123 d49a2e48 2004-03-09 devnull {"latnem",strip,2,"","+al",N_AFFIX,ADJ},
124 d49a2e48 2004-03-09 devnull {"lanoi",strip,2,"","+al",N_AFFIX,ADJ|NOUN},
125 d49a2e48 2004-03-09 devnull {"luf",ily,3,"-y+iful","+ful",N_AFFIX,ADJ | NOUN},
128 d49a2e48 2004-03-09 devnull Suftab stabm[] =
130 d49a2e48 2004-03-09 devnull /* congregational + ism */
131 d49a2e48 2004-03-09 devnull {"msi",CCe,3,"-e+ism","ism",N_AFFIX|ADJ,NOUN},
132 d49a2e48 2004-03-09 devnull {"margo",subst,-1,"-ph+m","",NOUN,NOUN},
135 d49a2e48 2004-03-09 devnull Suftab stabn[] =
137 d49a2e48 2004-03-09 devnull {"noitacifi",i_to_y,6,"-y+ication","",ION,NOUN | N_AFFIX},
138 d49a2e48 2004-03-09 devnull {"noitazi",ize,4,"-e+ation","",ION,NOUN| N_AFFIX},
139 d49a2e48 2004-03-09 devnull {"noit",tion,3,"-e+ion","+ion",ION,NOUN| N_AFFIX | V_AFFIX |VERB|ACTOR},
140 d49a2e48 2004-03-09 devnull {"naino",an,3,"","+ian",NOUN|PROP_COLLECT,NOUN| N_AFFIX},
141 d49a2e48 2004-03-09 devnull {"namow",strip,5,"","+woman",MAN,PROP_COLLECT|N_AFFIX},
142 d49a2e48 2004-03-09 devnull {"nam",strip,3,"","+man",MAN,PROP_COLLECT | N_AFFIX | VERB},
143 d49a2e48 2004-03-09 devnull {"na",an,1,"","+n",NOUN|PROP_COLLECT,NOUN | N_AFFIX},
144 d49a2e48 2004-03-09 devnull {"nemow",strip,5,"","+women",MAN,PROP_COLLECT},
145 d49a2e48 2004-03-09 devnull {"nem",strip,3,"","+man",MAN,PROP_COLLECT},
146 d49a2e48 2004-03-09 devnull {"nosrep",strip,6,"","+person",MAN,PROP_COLLECT},
149 d49a2e48 2004-03-09 devnull Suftab stabp[] =
151 d49a2e48 2004-03-09 devnull {"pihs",strip,4,"","+ship",NOUN|PROP_COLLECT,NOUN| N_AFFIX},
154 d49a2e48 2004-03-09 devnull Suftab stabr[] =
156 d49a2e48 2004-03-09 devnull {"rehparg",subst,1,"-y+er","",ACTOR,NOUN,strip,2,"","+er"},
157 d49a2e48 2004-03-09 devnull {"reyhparg",nop,0,"","",0,NOUN},
158 d49a2e48 2004-03-09 devnull {"reyl",nop,0,"","",0,NOUN},
159 d49a2e48 2004-03-09 devnull {"rekam",strip,5,"","+maker",NOUN,NOUN},
160 d49a2e48 2004-03-09 devnull {"repeek",strip,6,"","+keeper",NOUN,NOUN},
161 d49a2e48 2004-03-09 devnull {"re",strip,1,"","+r",ACTOR,NOUN | N_AFFIX|VERB|ADJ, i_to_y,2,"-y+ier","+er"},
162 d49a2e48 2004-03-09 devnull {"rota",tion,2,"-e+or","",ION,NOUN| N_AFFIX|_Y},
163 d49a2e48 2004-03-09 devnull {"rotc",tion,2,"","+or",ION,NOUN| N_AFFIX},
164 d49a2e48 2004-03-09 devnull {"rotp",tion,2,"","+or",ION,NOUN| N_AFFIX},
167 d49a2e48 2004-03-09 devnull Suftab stabs[] =
169 d49a2e48 2004-03-09 devnull {"ssen",ily,4,"-y+iness","+ness",ADJ|ADV,NOUN| N_AFFIX},
170 d49a2e48 2004-03-09 devnull {"ssel",ily,4,"-y+iless","+less",NOUN | PROP_COLLECT,ADJ },
171 d49a2e48 2004-03-09 devnull {"se",s,1,"","+s",NOUN | V_IRREG,DONT_TOUCH , es,2,"-y+ies","+es"},
172 d49a2e48 2004-03-09 devnull {"s'",s,2,"","+'s",PROP_COLLECT | NOUN,DONT_TOUCH },
173 d49a2e48 2004-03-09 devnull {"s",s,1,"","+s",NOUN | V_IRREG,DONT_TOUCH },
176 d49a2e48 2004-03-09 devnull Suftab stabt[] =
178 d49a2e48 2004-03-09 devnull {"tnem",strip,4,"","+ment",V_AFFIX,NOUN | N_AFFIX | ADJ|VERB},
179 d49a2e48 2004-03-09 devnull {"tse",strip,2,"","+st",EST,DONT_TOUCH, i_to_y,3,"-y+iest","+est" },
180 d49a2e48 2004-03-09 devnull {"tsigol",i_to_y,2,"-y+ist","",N_AFFIX,NOUN | N_AFFIX},
181 d49a2e48 2004-03-09 devnull {"tsi",CCe,3,"-e+ist","+ist",N_AFFIX|ADJ,NOUN | N_AFFIX|COMP},
184 d49a2e48 2004-03-09 devnull Suftab staby[] =
186 d49a2e48 2004-03-09 devnull {"ycna",subst,1,"-t+cy","",ADJ | N_AFFIX,NOUN | N_AFFIX},
187 d49a2e48 2004-03-09 devnull {"ycne",subst,1,"-t+cy","",ADJ | N_AFFIX,NOUN | N_AFFIX},
188 d49a2e48 2004-03-09 devnull {"ytilib",bility,5,"-le+ility","",ADJ | V_AFFIX,NOUN | N_AFFIX},
189 d49a2e48 2004-03-09 devnull {"ytisuo",nop,0,"","",NOUN},
190 d49a2e48 2004-03-09 devnull {"ytilb",nop,0,"","",0,NOUN},
191 d49a2e48 2004-03-09 devnull {"yti",CCe,3,"-e+ity","+ity",ADJ ,NOUN | N_AFFIX },
192 d49a2e48 2004-03-09 devnull {"ylb",y_to_e,1,"-e+y","",ADJ,ADV},
193 d49a2e48 2004-03-09 devnull {"ylc",nop,0,"","",0},
194 d49a2e48 2004-03-09 devnull {"ylelb",nop,0,"","",0},
195 d49a2e48 2004-03-09 devnull {"ylelp",nop,0,"","",0},
196 d49a2e48 2004-03-09 devnull {"yl",ily,2,"-y+ily","+ly",ADJ,ADV|COMP},
197 d49a2e48 2004-03-09 devnull {"yrtem",subst,0,"-er+ry","",NOUN,NOUN | N_AFFIX},
198 d49a2e48 2004-03-09 devnull {"y",CCe,1,"-e+y","+y",_Y,ADJ|COMP},
201 d49a2e48 2004-03-09 devnull Suftab stabz[] =
205 d49a2e48 2004-03-09 devnull Suftab* suftab[] =
235 d49a2e48 2004-03-09 devnull Ptab ptaba[] =
237 d49a2e48 2004-03-09 devnull "anti", 0,
238 d49a2e48 2004-03-09 devnull "auto", 0,
241 d49a2e48 2004-03-09 devnull Ptab ptabb[] =
243 d49a2e48 2004-03-09 devnull "bio", 0,
246 d49a2e48 2004-03-09 devnull Ptab ptabc[] =
248 d49a2e48 2004-03-09 devnull "counter", 0,
251 d49a2e48 2004-03-09 devnull Ptab ptabd[] =
253 d49a2e48 2004-03-09 devnull "dis", 0,
256 d49a2e48 2004-03-09 devnull Ptab ptabe[] =
258 d49a2e48 2004-03-09 devnull "electro", 0,
261 d49a2e48 2004-03-09 devnull Ptab ptabf[] =
263 d49a2e48 2004-03-09 devnull "femto", 0,
266 d49a2e48 2004-03-09 devnull Ptab ptabg[] =
268 d49a2e48 2004-03-09 devnull "geo", 0,
269 d49a2e48 2004-03-09 devnull "giga", 0,
272 d49a2e48 2004-03-09 devnull Ptab ptabh[] =
274 d49a2e48 2004-03-09 devnull "hyper", 0,
277 d49a2e48 2004-03-09 devnull Ptab ptabi[] =
279 d49a2e48 2004-03-09 devnull "immuno", 0,
280 d49a2e48 2004-03-09 devnull "im", IN,
281 d49a2e48 2004-03-09 devnull "intra", 0,
282 d49a2e48 2004-03-09 devnull "inter", 0,
283 d49a2e48 2004-03-09 devnull "in", IN,
284 d49a2e48 2004-03-09 devnull "ir", IN,
285 d49a2e48 2004-03-09 devnull "iso", 0,
288 d49a2e48 2004-03-09 devnull Ptab ptabj[] =
292 d49a2e48 2004-03-09 devnull Ptab ptabk[] =
294 d49a2e48 2004-03-09 devnull "kilo", 0,
297 d49a2e48 2004-03-09 devnull Ptab ptabl[] =
301 d49a2e48 2004-03-09 devnull Ptab ptabm[] =
303 d49a2e48 2004-03-09 devnull "magneto", 0,
304 d49a2e48 2004-03-09 devnull "mega", 0,
305 d49a2e48 2004-03-09 devnull "meta", 0,
306 d49a2e48 2004-03-09 devnull "micro", 0,
307 d49a2e48 2004-03-09 devnull "mid", 0,
308 d49a2e48 2004-03-09 devnull "milli", 0,
309 d49a2e48 2004-03-09 devnull "mini", 0,
310 d49a2e48 2004-03-09 devnull "mis", 0,
311 d49a2e48 2004-03-09 devnull "mono", 0,
312 d49a2e48 2004-03-09 devnull "multi", 0,
315 d49a2e48 2004-03-09 devnull Ptab ptabn[] =
317 d49a2e48 2004-03-09 devnull "nano", 0,
318 d49a2e48 2004-03-09 devnull "neuro", 0,
319 d49a2e48 2004-03-09 devnull "non", 0,
322 d49a2e48 2004-03-09 devnull Ptab ptabo[] =
324 d49a2e48 2004-03-09 devnull "out", 0,
325 d49a2e48 2004-03-09 devnull "over", 0,
328 d49a2e48 2004-03-09 devnull Ptab ptabp[] =
330 d49a2e48 2004-03-09 devnull "para", 0,
331 d49a2e48 2004-03-09 devnull "photo", 0,
332 d49a2e48 2004-03-09 devnull "pico", 0,
333 d49a2e48 2004-03-09 devnull "poly", 0,
334 d49a2e48 2004-03-09 devnull "pre", 0,
335 d49a2e48 2004-03-09 devnull "pseudo", 0,
336 d49a2e48 2004-03-09 devnull "psycho", 0,
339 d49a2e48 2004-03-09 devnull Ptab ptabq[] =
341 d49a2e48 2004-03-09 devnull "quasi", 0,
344 d49a2e48 2004-03-09 devnull Ptab ptabr[] =
346 d49a2e48 2004-03-09 devnull "radio", 0,
347 d49a2e48 2004-03-09 devnull "re", 0,
350 d49a2e48 2004-03-09 devnull Ptab ptabs[] =
352 d49a2e48 2004-03-09 devnull "semi", 0,
353 d49a2e48 2004-03-09 devnull "stereo", 0,
354 d49a2e48 2004-03-09 devnull "sub", 0,
355 d49a2e48 2004-03-09 devnull "super", 0,
358 d49a2e48 2004-03-09 devnull Ptab ptabt[] =
360 d49a2e48 2004-03-09 devnull "tele", 0,
361 d49a2e48 2004-03-09 devnull "tera", 0,
362 d49a2e48 2004-03-09 devnull "thermo", 0,
365 d49a2e48 2004-03-09 devnull Ptab ptabu[] =
367 d49a2e48 2004-03-09 devnull "ultra", 0,
368 d49a2e48 2004-03-09 devnull "under", 0, /*must precede un*/
369 d49a2e48 2004-03-09 devnull "un", IN,
372 d49a2e48 2004-03-09 devnull Ptab ptabv[] =
376 d49a2e48 2004-03-09 devnull Ptab ptabw[] =
380 d49a2e48 2004-03-09 devnull Ptab ptabx[] =
384 d49a2e48 2004-03-09 devnull Ptab ptaby[] =
388 d49a2e48 2004-03-09 devnull Ptab ptabz[] =
393 d49a2e48 2004-03-09 devnull Ptab* preftab[] =
423 d49a2e48 2004-03-09 devnull typedef struct {
424 d49a2e48 2004-03-09 devnull char *mesg;
425 d49a2e48 2004-03-09 devnull enum { NONE, SUFF, PREF} type;
426 d49a2e48 2004-03-09 devnull } Deriv;
428 d49a2e48 2004-03-09 devnull int aflag;
429 d49a2e48 2004-03-09 devnull int cflag;
430 d49a2e48 2004-03-09 devnull int fflag;
431 d49a2e48 2004-03-09 devnull int vflag;
432 d49a2e48 2004-03-09 devnull int xflag;
433 d49a2e48 2004-03-09 devnull int nflag;
434 d49a2e48 2004-03-09 devnull char word[500];
435 d49a2e48 2004-03-09 devnull char* original;
436 d49a2e48 2004-03-09 devnull Deriv emptyderiv;
437 d49a2e48 2004-03-09 devnull Deriv deriv[DSIZ+3];
438 d49a2e48 2004-03-09 devnull char affix[DSIZ*10]; /* 10 is longest affix message */
439 d49a2e48 2004-03-09 devnull int prefcount;
440 d49a2e48 2004-03-09 devnull int suffcount;
441 d49a2e48 2004-03-09 devnull char* acmeid;
442 d49a2e48 2004-03-09 devnull char space[300000]; /* must be as large as "words"+"space" in pcode run */
443 d49a2e48 2004-03-09 devnull Bits encode[2048]; /* must be as long as "codes" in pcode run */
444 d49a2e48 2004-03-09 devnull int nencode;
445 d49a2e48 2004-03-09 devnull char voweltab[256];
446 d49a2e48 2004-03-09 devnull char* spacep[128*128+1]; /* pointer to words starting with 'xx' */
447 d49a2e48 2004-03-09 devnull Biobuf bin;
448 d49a2e48 2004-03-09 devnull Biobuf bout;
450 d49a2e48 2004-03-09 devnull char* codefile = "#9/lib/amspell";
451 d49a2e48 2004-03-09 devnull char* brfile = "#9/lib/brspell";
452 d49a2e48 2004-03-09 devnull char* Usage = "usage";
455 d49a2e48 2004-03-09 devnull main(int argc, char *argv[])
457 d49a2e48 2004-03-09 devnull char *ep, *cp;
458 d49a2e48 2004-03-09 devnull char *dp;
459 d49a2e48 2004-03-09 devnull int j, i, c;
460 d49a2e48 2004-03-09 devnull int low;
463 8ad51794 2004-03-25 devnull codefile = unsharp(codefile);
464 8ad51794 2004-03-25 devnull brfile = unsharp(brfile);
466 d49a2e48 2004-03-09 devnull Binit(&bin, 0, OREAD);
467 d49a2e48 2004-03-09 devnull Binit(&bout, 1, OWRITE);
468 d49a2e48 2004-03-09 devnull for(i=0; c = "aeiouyAEIOUY"[i]; i++)
469 d49a2e48 2004-03-09 devnull voweltab[c] = 1;
470 d49a2e48 2004-03-09 devnull while(argc > 1) {
471 d49a2e48 2004-03-09 devnull if(argv[1][0] != '-')
473 d49a2e48 2004-03-09 devnull for(i=1; c = argv[1][i]; i++)
474 d49a2e48 2004-03-09 devnull switch(c) {
475 d49a2e48 2004-03-09 devnull default:
476 d49a2e48 2004-03-09 devnull fprint(2, "usage: spell [-bcCvx] [-f file]\n");
477 d49a2e48 2004-03-09 devnull exits(Usage);
479 d49a2e48 2004-03-09 devnull case 'a':
480 d49a2e48 2004-03-09 devnull aflag++;
481 d49a2e48 2004-03-09 devnull continue;
483 d49a2e48 2004-03-09 devnull case 'b':
485 d49a2e48 2004-03-09 devnull if(!fflag)
486 d49a2e48 2004-03-09 devnull codefile = brfile;
487 d49a2e48 2004-03-09 devnull continue;
489 d49a2e48 2004-03-09 devnull case 'C': /* for "correct" */
490 d49a2e48 2004-03-09 devnull vflag++;
491 d49a2e48 2004-03-09 devnull case 'c': /* for ocr */
492 d49a2e48 2004-03-09 devnull cflag++;
493 d49a2e48 2004-03-09 devnull continue;
495 d49a2e48 2004-03-09 devnull case 'v':
496 d49a2e48 2004-03-09 devnull vflag++;
497 d49a2e48 2004-03-09 devnull continue;
499 d49a2e48 2004-03-09 devnull case 'x':
500 d49a2e48 2004-03-09 devnull xflag++;
501 d49a2e48 2004-03-09 devnull continue;
503 d49a2e48 2004-03-09 devnull case 'f':
504 d49a2e48 2004-03-09 devnull if(argc <= 2) {
505 d49a2e48 2004-03-09 devnull fprint(2, "spell: -f requires another argument\n");
506 d49a2e48 2004-03-09 devnull exits(Usage);
510 d49a2e48 2004-03-09 devnull codefile = argv[1];
511 d49a2e48 2004-03-09 devnull fflag++;
512 d49a2e48 2004-03-09 devnull goto brk;
518 d49a2e48 2004-03-09 devnull readdict(codefile);
519 d49a2e48 2004-03-09 devnull if(argc > 1) {
520 d49a2e48 2004-03-09 devnull fprint(2, "usage: spell [-bcCvx] [-f file]\n");
521 d49a2e48 2004-03-09 devnull exits(Usage);
523 d49a2e48 2004-03-09 devnull if(aflag)
524 d49a2e48 2004-03-09 devnull cflag = vflag = 0;
526 d49a2e48 2004-03-09 devnull for(;;) {
527 d49a2e48 2004-03-09 devnull affix[0] = 0;
528 d49a2e48 2004-03-09 devnull original = Brdline(&bin, '\n');
529 d49a2e48 2004-03-09 devnull if(original == 0)
530 d49a2e48 2004-03-09 devnull exits(0);
531 d49a2e48 2004-03-09 devnull original[Blinelen(&bin)-1] = 0;
532 d49a2e48 2004-03-09 devnull low = 0;
534 d49a2e48 2004-03-09 devnull if(aflag) {
535 d49a2e48 2004-03-09 devnull acmeid = original;
536 d49a2e48 2004-03-09 devnull while(*original != ':')
537 d49a2e48 2004-03-09 devnull if(*original++ == 0)
538 d49a2e48 2004-03-09 devnull exits(0);
539 d49a2e48 2004-03-09 devnull while(*++original != ':')
540 d49a2e48 2004-03-09 devnull if(*original == 0)
541 d49a2e48 2004-03-09 devnull exits(0);
542 d49a2e48 2004-03-09 devnull *original++ = 0;
544 d49a2e48 2004-03-09 devnull for(ep=word,dp=original; j = *dp; ep++,dp++) {
545 d49a2e48 2004-03-09 devnull if(ISLOWER(j))
547 d49a2e48 2004-03-09 devnull if(ep >= word+sizeof(word)-1)
549 d49a2e48 2004-03-09 devnull *ep = j;
551 d49a2e48 2004-03-09 devnull *ep = 0;
553 d49a2e48 2004-03-09 devnull if(ISDIGIT(word[0]) && ordinal())
554 d49a2e48 2004-03-09 devnull continue;
557 d49a2e48 2004-03-09 devnull if(!low && !(h = trypref(ep,".",0,ALL|STOP|DONT_TOUCH)))
558 d49a2e48 2004-03-09 devnull for(cp=original+1,dp=word+1; dp<ep; dp++,cp++)
559 d49a2e48 2004-03-09 devnull *dp = Tolower(*cp);
561 d49a2e48 2004-03-09 devnull for(;;) { /* at most twice */
562 d49a2e48 2004-03-09 devnull if(h = trypref(ep,".",0,ALL|STOP|DONT_TOUCH))
564 d49a2e48 2004-03-09 devnull if(h = trysuff(ep,0,ALL|STOP|DONT_TOUCH))
566 d49a2e48 2004-03-09 devnull if(!ISUPPER(word[0]))
568 d49a2e48 2004-03-09 devnull cp = original;
569 d49a2e48 2004-03-09 devnull dp = word;
570 d49a2e48 2004-03-09 devnull while(*dp = *cp++) {
571 d49a2e48 2004-03-09 devnull if(!low)
572 d49a2e48 2004-03-09 devnull *dp = Tolower(*dp);
575 d49a2e48 2004-03-09 devnull word[0] = Tolower(word[0]);
578 d49a2e48 2004-03-09 devnull if(cflag) {
579 d49a2e48 2004-03-09 devnull if(!h || Set(h,STOP))
580 d49a2e48 2004-03-09 devnull print("-");
581 d49a2e48 2004-03-09 devnull else if(!vflag)
582 d49a2e48 2004-03-09 devnull print("+");
584 d49a2e48 2004-03-09 devnull print("%c",'0' + (suffcount>0) +
585 d49a2e48 2004-03-09 devnull (prefcount>4? 8: 2*prefcount));
586 d49a2e48 2004-03-09 devnull } else if(!h || Set(h,STOP)) {
587 d49a2e48 2004-03-09 devnull if(aflag)
588 d49a2e48 2004-03-09 devnull Bprint(&bout, "%s:%s\n", acmeid, original);
590 d49a2e48 2004-03-09 devnull Bprint(&bout, "%s\n", original);
591 d49a2e48 2004-03-09 devnull } else if(affix[0] != 0 && affix[0] != '.')
592 d49a2e48 2004-03-09 devnull print("%s\t%s\n", affix, original);
594 d49a2e48 2004-03-09 devnull exits(0);
597 d49a2e48 2004-03-09 devnull /* strip exactly one suffix and do
598 d49a2e48 2004-03-09 devnull * indicated routine(s), which may recursively
599 d49a2e48 2004-03-09 devnull * strip suffixes
602 d49a2e48 2004-03-09 devnull trysuff(char* ep, int lev, int flag)
604 d49a2e48 2004-03-09 devnull Suftab *t;
605 d49a2e48 2004-03-09 devnull char *cp, *sp;
606 d49a2e48 2004-03-09 devnull Bits h = 0;
607 d49a2e48 2004-03-09 devnull int initchar = ep[-1];
609 d49a2e48 2004-03-09 devnull flag &= ~MONO;
610 d49a2e48 2004-03-09 devnull lev += DLEV;
611 d49a2e48 2004-03-09 devnull if(lev < DSIZ) {
612 d49a2e48 2004-03-09 devnull deriv[lev] = emptyderiv;
613 d49a2e48 2004-03-09 devnull deriv[lev-1] = emptyderiv;
615 d49a2e48 2004-03-09 devnull if(!ISLOWER(initchar))
616 d49a2e48 2004-03-09 devnull return h;
617 d49a2e48 2004-03-09 devnull for(t=suftab[initchar-'a']; sp=t->suf; t++) {
618 d49a2e48 2004-03-09 devnull cp = ep;
619 d49a2e48 2004-03-09 devnull while(*sp)
620 d49a2e48 2004-03-09 devnull if(*--cp != *sp++)
621 d49a2e48 2004-03-09 devnull goto next;
622 d49a2e48 2004-03-09 devnull for(sp=ep-t->n1; --sp >= word && !ISVOWEL(*sp);)
624 d49a2e48 2004-03-09 devnull if(sp < word)
625 d49a2e48 2004-03-09 devnull continue;
626 d49a2e48 2004-03-09 devnull if(!(t->affixable & flag))
627 d49a2e48 2004-03-09 devnull return 0;
628 d49a2e48 2004-03-09 devnull h = (*t->p1)(ep-t->n1, t->d1, t->a1, lev+1, t->flag|STOP);
629 d49a2e48 2004-03-09 devnull if(!h && t->p2!=0) {
630 d49a2e48 2004-03-09 devnull if(lev < DSIZ) {
631 d49a2e48 2004-03-09 devnull deriv[lev] = emptyderiv;
632 d49a2e48 2004-03-09 devnull deriv[lev+1] = emptyderiv;
634 d49a2e48 2004-03-09 devnull h = (*t->p2)(ep-t->n2, t->d2, t->a2, lev, t->flag|STOP);
639 d49a2e48 2004-03-09 devnull return h;
643 d49a2e48 2004-03-09 devnull nop(char* ep, char* d, char* a, int lev, int flag)
645 d49a2e48 2004-03-09 devnull USED(ep);
646 d49a2e48 2004-03-09 devnull USED(d);
647 d49a2e48 2004-03-09 devnull USED(a);
648 d49a2e48 2004-03-09 devnull USED(lev);
649 d49a2e48 2004-03-09 devnull USED(flag);
650 d49a2e48 2004-03-09 devnull return 0;
654 d49a2e48 2004-03-09 devnull cstrip(char* ep, char* d, char* a, int lev, int flag)
656 d49a2e48 2004-03-09 devnull int temp = ep[0];
658 d49a2e48 2004-03-09 devnull if(ISVOWEL(temp) && ISVOWEL(ep[-1])) {
659 d49a2e48 2004-03-09 devnull switch(pair(ep[-1],ep[0])) {
660 d49a2e48 2004-03-09 devnull case pair('a', 'a'):
661 d49a2e48 2004-03-09 devnull case pair('a', 'e'):
662 d49a2e48 2004-03-09 devnull case pair('a', 'i'):
663 d49a2e48 2004-03-09 devnull case pair('e', 'a'):
664 d49a2e48 2004-03-09 devnull case pair('e', 'e'):
665 d49a2e48 2004-03-09 devnull case pair('e', 'i'):
666 d49a2e48 2004-03-09 devnull case pair('i', 'i'):
667 d49a2e48 2004-03-09 devnull case pair('o', 'a'):
668 d49a2e48 2004-03-09 devnull return 0;
671 d49a2e48 2004-03-09 devnull if(temp==ep[-1]&&temp==ep[-2])
672 d49a2e48 2004-03-09 devnull return 0;
673 d49a2e48 2004-03-09 devnull return strip(ep,d,a,lev,flag);
677 d49a2e48 2004-03-09 devnull strip(char* ep, char* d, char* a, int lev, int flag)
679 d49a2e48 2004-03-09 devnull Bits h = trypref(ep, a, lev, flag);
681 d49a2e48 2004-03-09 devnull USED(d);
682 d49a2e48 2004-03-09 devnull if(Set(h,MONO) && ISVOWEL(*ep) && ISVOWEL(ep[-2]))
685 d49a2e48 2004-03-09 devnull return h;
686 d49a2e48 2004-03-09 devnull if(ISVOWEL(*ep) && !ISVOWEL(ep[-1]) && ep[-1]==ep[-2]) {
687 d49a2e48 2004-03-09 devnull h = trypref(ep-1,a,lev,flag|MONO);
689 d49a2e48 2004-03-09 devnull return h;
691 d49a2e48 2004-03-09 devnull return trysuff(ep,lev,flag);
695 d49a2e48 2004-03-09 devnull s(char* ep, char* d, char* a, int lev, int flag)
697 d49a2e48 2004-03-09 devnull if(lev > DLEV+1)
698 d49a2e48 2004-03-09 devnull return 0;
699 d49a2e48 2004-03-09 devnull if(*ep=='s') {
700 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
701 d49a2e48 2004-03-09 devnull case 'y':
702 d49a2e48 2004-03-09 devnull if(ISVOWEL(ep[-2])||ISUPPER(*word))
703 d49a2e48 2004-03-09 devnull break; /*says Kennedys*/
704 d49a2e48 2004-03-09 devnull case 'x':
705 d49a2e48 2004-03-09 devnull case 'z':
706 d49a2e48 2004-03-09 devnull case 's':
707 d49a2e48 2004-03-09 devnull return 0;
708 d49a2e48 2004-03-09 devnull case 'h':
709 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
710 d49a2e48 2004-03-09 devnull case 'c':
711 d49a2e48 2004-03-09 devnull case 's':
712 d49a2e48 2004-03-09 devnull return 0;
716 d49a2e48 2004-03-09 devnull return strip(ep,d,a,lev,flag);
720 d49a2e48 2004-03-09 devnull an(char* ep, char* d, char* a, int lev, int flag)
722 d49a2e48 2004-03-09 devnull USED(d);
723 d49a2e48 2004-03-09 devnull if(!ISUPPER(*word)) /*must be proper name*/
724 d49a2e48 2004-03-09 devnull return 0;
725 d49a2e48 2004-03-09 devnull return trypref(ep,a,lev,flag);
729 d49a2e48 2004-03-09 devnull ize(char* ep, char* d, char* a, int lev, int flag)
731 d49a2e48 2004-03-09 devnull int temp = ep[-1];
734 d49a2e48 2004-03-09 devnull USED(a);
735 d49a2e48 2004-03-09 devnull ep[-1] = 'e';
736 d49a2e48 2004-03-09 devnull h = strip(ep,"",d,lev,flag);
737 d49a2e48 2004-03-09 devnull ep[-1] = temp;
738 d49a2e48 2004-03-09 devnull return h;
742 d49a2e48 2004-03-09 devnull y_to_e(char* ep, char* d, char* a, int lev, int flag)
745 d49a2e48 2004-03-09 devnull int temp;
747 d49a2e48 2004-03-09 devnull USED(a);
748 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
749 d49a2e48 2004-03-09 devnull case 'a':
750 d49a2e48 2004-03-09 devnull case 'e':
751 d49a2e48 2004-03-09 devnull case 'i':
752 d49a2e48 2004-03-09 devnull return 0;
754 d49a2e48 2004-03-09 devnull temp = *ep;
755 d49a2e48 2004-03-09 devnull *ep++ = 'e';
756 d49a2e48 2004-03-09 devnull h = strip(ep,"",d,lev,flag);
757 d49a2e48 2004-03-09 devnull ep[-1] = temp;
758 d49a2e48 2004-03-09 devnull return h;
762 d49a2e48 2004-03-09 devnull ily(char* ep, char* d, char* a, int lev, int flag)
764 d49a2e48 2004-03-09 devnull int temp = ep[0];
765 d49a2e48 2004-03-09 devnull char *cp = ep;
767 d49a2e48 2004-03-09 devnull if(temp==ep[-1]&&temp==ep[-2]) /* sillly */
768 d49a2e48 2004-03-09 devnull return 0;
769 d49a2e48 2004-03-09 devnull if(*--cp=='y' && !ISVOWEL(*--cp)) /* happyly */
770 d49a2e48 2004-03-09 devnull while(cp>word)
771 d49a2e48 2004-03-09 devnull if(ISVOWEL(*--cp)) /* shyness */
772 d49a2e48 2004-03-09 devnull return 0;
773 d49a2e48 2004-03-09 devnull if(ep[-1]=='i')
774 d49a2e48 2004-03-09 devnull return i_to_y(ep,d,a,lev,flag);
775 d49a2e48 2004-03-09 devnull return cstrip(ep,d,a,lev,flag);
779 d49a2e48 2004-03-09 devnull bility(char* ep, char* d, char* a, int lev, int flag)
781 d49a2e48 2004-03-09 devnull *ep++ = 'l';
782 d49a2e48 2004-03-09 devnull return y_to_e(ep,d,a,lev,flag);
786 d49a2e48 2004-03-09 devnull i_to_y(char* ep, char* d, char* a, int lev, int flag)
789 d49a2e48 2004-03-09 devnull int temp;
791 d49a2e48 2004-03-09 devnull if(ISUPPER(*word))
792 d49a2e48 2004-03-09 devnull return 0;
793 d49a2e48 2004-03-09 devnull if((temp=ep[-1])=='i' && !ISVOWEL(ep[-2])) {
794 d49a2e48 2004-03-09 devnull ep[-1] = 'y';
797 d49a2e48 2004-03-09 devnull h = cstrip(ep,"",a,lev,flag);
798 d49a2e48 2004-03-09 devnull ep[-1] = temp;
799 d49a2e48 2004-03-09 devnull return h;
803 d49a2e48 2004-03-09 devnull es(char* ep, char* d, char* a, int lev, int flag)
805 d49a2e48 2004-03-09 devnull if(lev>DLEV)
806 d49a2e48 2004-03-09 devnull return 0;
807 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
808 d49a2e48 2004-03-09 devnull default:
809 d49a2e48 2004-03-09 devnull return 0;
810 d49a2e48 2004-03-09 devnull case 'i':
811 d49a2e48 2004-03-09 devnull return i_to_y(ep,d,a,lev,flag);
812 d49a2e48 2004-03-09 devnull case 'h':
813 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
814 d49a2e48 2004-03-09 devnull default:
815 d49a2e48 2004-03-09 devnull return 0;
816 d49a2e48 2004-03-09 devnull case 'c':
817 d49a2e48 2004-03-09 devnull case 's':
820 d49a2e48 2004-03-09 devnull case 's':
821 d49a2e48 2004-03-09 devnull case 'z':
822 d49a2e48 2004-03-09 devnull case 'x':
823 d49a2e48 2004-03-09 devnull return strip(ep,d,a,lev,flag);
828 d49a2e48 2004-03-09 devnull subst(char* ep, char* d, char* a, int lev, int flag)
830 d49a2e48 2004-03-09 devnull char *u,*t;
833 d49a2e48 2004-03-09 devnull USED(a);
834 d49a2e48 2004-03-09 devnull if(skipv(skipv(ep-1)) < word)
835 d49a2e48 2004-03-09 devnull return 0;
836 d49a2e48 2004-03-09 devnull for(t=d; *t!='+'; t++)
837 d49a2e48 2004-03-09 devnull continue;
838 d49a2e48 2004-03-09 devnull for(u=ep; *--t!='-';)
839 d49a2e48 2004-03-09 devnull *--u = *t;
840 d49a2e48 2004-03-09 devnull h = strip(ep,"",d,lev,flag);
841 d49a2e48 2004-03-09 devnull while(*++t != '+')
842 d49a2e48 2004-03-09 devnull continue;
843 d49a2e48 2004-03-09 devnull while(*++t)
844 d49a2e48 2004-03-09 devnull *u++ = *t;
845 d49a2e48 2004-03-09 devnull return h;
849 d49a2e48 2004-03-09 devnull tion(char* ep, char* d, char* a, int lev, int flag)
851 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
852 d49a2e48 2004-03-09 devnull default:
853 d49a2e48 2004-03-09 devnull return trypref(ep,a,lev,flag);
854 d49a2e48 2004-03-09 devnull case 'a':
855 d49a2e48 2004-03-09 devnull case 'e':
856 d49a2e48 2004-03-09 devnull case 'i':
857 d49a2e48 2004-03-09 devnull case 'o':
858 d49a2e48 2004-03-09 devnull case 'u':
859 d49a2e48 2004-03-09 devnull return y_to_e(ep,d,a,lev,flag);
864 d49a2e48 2004-03-09 devnull * possible consonant-consonant-e ending
867 d49a2e48 2004-03-09 devnull CCe(char* ep, char* d, char* a, int lev, int flag)
871 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
872 d49a2e48 2004-03-09 devnull case 'l':
873 d49a2e48 2004-03-09 devnull if(ISVOWEL(ep[-2]))
875 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
876 d49a2e48 2004-03-09 devnull case 'l':
877 d49a2e48 2004-03-09 devnull case 'r':
878 d49a2e48 2004-03-09 devnull case 'w':
880 d49a2e48 2004-03-09 devnull default:
881 d49a2e48 2004-03-09 devnull return y_to_e(ep,d,a,lev,flag);
884 d49a2e48 2004-03-09 devnull case 'c':
885 d49a2e48 2004-03-09 devnull case 'g':
886 d49a2e48 2004-03-09 devnull if(*ep == 'a') /* prevent -able for -eable */
887 d49a2e48 2004-03-09 devnull return 0;
888 d49a2e48 2004-03-09 devnull case 's':
889 d49a2e48 2004-03-09 devnull case 'v':
890 d49a2e48 2004-03-09 devnull case 'z':
891 d49a2e48 2004-03-09 devnull if(ep[-2]==ep[-1])
893 d49a2e48 2004-03-09 devnull if(ISVOWEL(ep[-2]))
895 d49a2e48 2004-03-09 devnull case 'u':
896 d49a2e48 2004-03-09 devnull if(h = y_to_e(ep,d,a,lev,flag))
897 d49a2e48 2004-03-09 devnull return h;
898 d49a2e48 2004-03-09 devnull if(!(ep[-2]=='n' && ep[-1]=='g'))
899 d49a2e48 2004-03-09 devnull return 0;
901 d49a2e48 2004-03-09 devnull return VCe(ep,d,a,lev,flag);
905 d49a2e48 2004-03-09 devnull * possible consonant-vowel-consonant-e ending
908 d49a2e48 2004-03-09 devnull VCe(char* ep, char* d, char* a, int lev, int flag)
913 d49a2e48 2004-03-09 devnull c = ep[-1];
914 d49a2e48 2004-03-09 devnull if(c=='e')
915 d49a2e48 2004-03-09 devnull return 0;
916 d49a2e48 2004-03-09 devnull if(!ISVOWEL(c) && ISVOWEL(ep[-2])) {
917 d49a2e48 2004-03-09 devnull c = *ep;
918 d49a2e48 2004-03-09 devnull *ep++ = 'e';
919 d49a2e48 2004-03-09 devnull h = trypref(ep,d,lev,flag);
921 d49a2e48 2004-03-09 devnull h = trysuff(ep,lev,flag);
923 d49a2e48 2004-03-09 devnull return h;
925 d49a2e48 2004-03-09 devnull *ep = c;
927 d49a2e48 2004-03-09 devnull return cstrip(ep,d,a,lev,flag);
931 d49a2e48 2004-03-09 devnull lookuppref(uchar** wp, char* ep)
933 d49a2e48 2004-03-09 devnull Ptab *sp;
934 d49a2e48 2004-03-09 devnull uchar *bp,*cp;
935 d49a2e48 2004-03-09 devnull unsigned int initchar = Tolower(**wp);
937 d49a2e48 2004-03-09 devnull if(!ISALPHA(initchar))
938 d49a2e48 2004-03-09 devnull return 0;
939 d49a2e48 2004-03-09 devnull for(sp=preftab[initchar-'a'];sp->s;sp++) {
940 d49a2e48 2004-03-09 devnull bp = *wp;
941 d49a2e48 2004-03-09 devnull for(cp= (uchar*)sp->s;*cp; )
942 d49a2e48 2004-03-09 devnull if(*bp++!=*cp++)
943 d49a2e48 2004-03-09 devnull goto next;
944 d49a2e48 2004-03-09 devnull for(cp=bp;cp<(uchar*)ep;cp++)
945 d49a2e48 2004-03-09 devnull if(ISVOWEL(*cp)) {
946 d49a2e48 2004-03-09 devnull *wp = bp;
947 d49a2e48 2004-03-09 devnull return sp;
951 d49a2e48 2004-03-09 devnull return 0;
954 d49a2e48 2004-03-09 devnull /* while word is not in dictionary try stripping
955 d49a2e48 2004-03-09 devnull * prefixes. Fail if no more prefixes.
958 d49a2e48 2004-03-09 devnull trypref(char* ep, char* a, int lev, int flag)
960 d49a2e48 2004-03-09 devnull Ptab *tp;
961 d49a2e48 2004-03-09 devnull char *bp, *cp;
962 d49a2e48 2004-03-09 devnull char *pp;
964 d49a2e48 2004-03-09 devnull char space[20];
966 d49a2e48 2004-03-09 devnull if(lev<DSIZ) {
967 d49a2e48 2004-03-09 devnull deriv[lev].mesg = a;
968 d49a2e48 2004-03-09 devnull deriv[lev].type = *a=='.'? NONE: SUFF;
970 d49a2e48 2004-03-09 devnull if(h = tryword(word,ep,lev,flag)) {
971 d49a2e48 2004-03-09 devnull if(Set(h, flag&~MONO) && (flag&MONO) <= Set(h, MONO))
972 d49a2e48 2004-03-09 devnull return h;
975 d49a2e48 2004-03-09 devnull bp = word;
976 d49a2e48 2004-03-09 devnull pp = space;
977 d49a2e48 2004-03-09 devnull if(lev<DSIZ) {
978 d49a2e48 2004-03-09 devnull deriv[lev+1].mesg = pp;
979 d49a2e48 2004-03-09 devnull deriv[lev+1].type = 0;
981 d49a2e48 2004-03-09 devnull while(tp=lookuppref((uchar**)&bp,ep)) {
982 d49a2e48 2004-03-09 devnull *pp++ = '+';
983 d49a2e48 2004-03-09 devnull cp = tp->s;
984 d49a2e48 2004-03-09 devnull while(pp<space+sizeof(space) && (*pp = *cp++))
986 d49a2e48 2004-03-09 devnull deriv[lev+1].type += PREF;
987 d49a2e48 2004-03-09 devnull h = tryword(bp,ep,lev+1,flag);
988 d49a2e48 2004-03-09 devnull if(Set(h,NOPREF) ||
989 d49a2e48 2004-03-09 devnull ((tp->flag&IN) && inun(bp-2,h)==0)) {
993 d49a2e48 2004-03-09 devnull if(Set(h,flag&~MONO) && (flag&MONO) <= Set(h, MONO))
997 d49a2e48 2004-03-09 devnull if(lev < DSIZ) {
998 d49a2e48 2004-03-09 devnull deriv[lev+1] = emptyderiv;
999 d49a2e48 2004-03-09 devnull deriv[lev+2] = emptyderiv;
1001 d49a2e48 2004-03-09 devnull return h;
1005 d49a2e48 2004-03-09 devnull tryword(char* bp, char* ep, int lev, int flag)
1008 d49a2e48 2004-03-09 devnull Bits h = 0;
1009 d49a2e48 2004-03-09 devnull char duple[3];
1011 d49a2e48 2004-03-09 devnull if(ep-bp <= 1)
1012 d49a2e48 2004-03-09 devnull return h;
1013 d49a2e48 2004-03-09 devnull if(flag&MONO) {
1014 d49a2e48 2004-03-09 devnull if(lev<DSIZ) {
1015 d49a2e48 2004-03-09 devnull deriv[++lev].mesg = duple;
1016 d49a2e48 2004-03-09 devnull deriv[lev].type = SUFF;
1018 d49a2e48 2004-03-09 devnull duple[0] = '+';
1019 d49a2e48 2004-03-09 devnull duple[1] = *ep;
1020 d49a2e48 2004-03-09 devnull duple[2] = 0;
1022 d49a2e48 2004-03-09 devnull h = dict(bp, ep);
1023 d49a2e48 2004-03-09 devnull if(vflag==0 || h==0)
1024 d49a2e48 2004-03-09 devnull return h;
1026 d49a2e48 2004-03-09 devnull * when derivations are wanted, collect them
1027 d49a2e48 2004-03-09 devnull * for printing
1029 d49a2e48 2004-03-09 devnull j = lev;
1030 d49a2e48 2004-03-09 devnull prefcount = suffcount = 0;
1032 d49a2e48 2004-03-09 devnull if(j<DSIZ && deriv[j].type) {
1033 d49a2e48 2004-03-09 devnull strcat(affix, deriv[j].mesg);
1034 d49a2e48 2004-03-09 devnull if(deriv[j].type == SUFF)
1035 d49a2e48 2004-03-09 devnull suffcount++;
1036 d49a2e48 2004-03-09 devnull else if(deriv[j].type != NONE)
1037 d49a2e48 2004-03-09 devnull prefcount = deriv[j].type/PREF;
1039 d49a2e48 2004-03-09 devnull } while(--j > 0);
1040 d49a2e48 2004-03-09 devnull return h;
1044 d49a2e48 2004-03-09 devnull inun(char* bp, Bits h)
1046 d49a2e48 2004-03-09 devnull if(*bp == 'u')
1047 d49a2e48 2004-03-09 devnull return Set(h, IN) == 0;
1048 d49a2e48 2004-03-09 devnull /* *bp == 'i' */
1049 d49a2e48 2004-03-09 devnull if(Set(h, IN) == 0)
1050 d49a2e48 2004-03-09 devnull return 0;
1051 d49a2e48 2004-03-09 devnull switch(bp[2]) {
1052 d49a2e48 2004-03-09 devnull case 'r':
1053 d49a2e48 2004-03-09 devnull return bp[1] == 'r';
1054 d49a2e48 2004-03-09 devnull case 'm':
1055 d49a2e48 2004-03-09 devnull case 'p':
1056 d49a2e48 2004-03-09 devnull return bp[1] == 'm';
1058 d49a2e48 2004-03-09 devnull return bp[1] == 'n';
1062 d49a2e48 2004-03-09 devnull skipv(char *s)
1064 d49a2e48 2004-03-09 devnull if(s >= word && ISVOWEL(*s))
1066 d49a2e48 2004-03-09 devnull while(s >= word && !ISVOWEL(*s))
1068 d49a2e48 2004-03-09 devnull return s;
1072 d49a2e48 2004-03-09 devnull * crummy way to Britishise
1075 d49a2e48 2004-03-09 devnull ise(void)
1077 d49a2e48 2004-03-09 devnull Suftab *p;
1080 d49a2e48 2004-03-09 devnull for(i=0; i<26; i++)
1081 d49a2e48 2004-03-09 devnull for(p = suftab[i]; p->suf; p++) {
1082 d49a2e48 2004-03-09 devnull p->suf = ztos(p->suf);
1083 d49a2e48 2004-03-09 devnull p->d1 = ztos(p->d1);
1084 d49a2e48 2004-03-09 devnull p->a1 = ztos(p->a1);
1089 d49a2e48 2004-03-09 devnull ztos(char *as)
1091 d49a2e48 2004-03-09 devnull char *s, *ds;
1093 d49a2e48 2004-03-09 devnull for(s=as; *s; s++)
1094 d49a2e48 2004-03-09 devnull if(*s == 'z')
1095 d49a2e48 2004-03-09 devnull goto copy;
1096 d49a2e48 2004-03-09 devnull return as;
1099 d49a2e48 2004-03-09 devnull ds = strdup(as);
1100 d49a2e48 2004-03-09 devnull for(s=ds; *s; s++)
1101 d49a2e48 2004-03-09 devnull if(*s == 'z')
1102 d49a2e48 2004-03-09 devnull *s = 's';
1103 d49a2e48 2004-03-09 devnull return ds;
1107 d49a2e48 2004-03-09 devnull dict(char* bp, char* ep)
1109 d49a2e48 2004-03-09 devnull char *cp, *cp1, *w, *wp, *we;
1110 d49a2e48 2004-03-09 devnull int n, f;
1112 d49a2e48 2004-03-09 devnull w = bp;
1113 d49a2e48 2004-03-09 devnull we = ep;
1114 d49a2e48 2004-03-09 devnull n = ep-bp;
1115 d49a2e48 2004-03-09 devnull if(n <= 1)
1116 d49a2e48 2004-03-09 devnull return NOUN;
1118 d49a2e48 2004-03-09 devnull f = w[0] & 0x7f;
1119 d49a2e48 2004-03-09 devnull f *= 128;
1120 d49a2e48 2004-03-09 devnull f += w[1] & 0x7f;
1121 d49a2e48 2004-03-09 devnull bp = spacep[f];
1122 d49a2e48 2004-03-09 devnull ep = spacep[f+1];
1125 d49a2e48 2004-03-09 devnull if(bp >= ep) {
1126 d49a2e48 2004-03-09 devnull if(xflag)
1127 d49a2e48 2004-03-09 devnull fprint(2, "=%.*s\n", utfnlen(w, n), w);
1128 d49a2e48 2004-03-09 devnull return 0;
1131 d49a2e48 2004-03-09 devnull * find the beginning of some word in the middle
1133 d49a2e48 2004-03-09 devnull cp = bp + (ep-bp)/2;
1135 d49a2e48 2004-03-09 devnull while(cp > bp && !(*cp & 0x80))
1137 d49a2e48 2004-03-09 devnull while(cp > bp && (cp[-1] & 0x80))
1140 d49a2e48 2004-03-09 devnull wp = w + 2; /* skip two letters */
1141 d49a2e48 2004-03-09 devnull cp1 = cp + 2; /* skip affix code */
1142 d49a2e48 2004-03-09 devnull for(;;) {
1143 d49a2e48 2004-03-09 devnull if(wp >= we) {
1144 d49a2e48 2004-03-09 devnull if(*cp1 & 0x80)
1145 d49a2e48 2004-03-09 devnull goto found;
1150 d49a2e48 2004-03-09 devnull if(*cp1 & 0x80) {
1151 d49a2e48 2004-03-09 devnull f = -1;
1154 d49a2e48 2004-03-09 devnull f = *cp1++ - *wp++;
1155 d49a2e48 2004-03-09 devnull if(f != 0)
1159 d49a2e48 2004-03-09 devnull if(f < 0) {
1160 d49a2e48 2004-03-09 devnull while(!(*cp1 & 0x80))
1162 d49a2e48 2004-03-09 devnull bp = cp1;
1163 d49a2e48 2004-03-09 devnull goto loop;
1165 d49a2e48 2004-03-09 devnull ep = cp;
1166 d49a2e48 2004-03-09 devnull goto loop;
1169 d49a2e48 2004-03-09 devnull f = ((cp[0] & 0x7) << 8) |
1170 d49a2e48 2004-03-09 devnull (cp[1] & 0xff);
1171 d49a2e48 2004-03-09 devnull if(xflag) {
1172 d49a2e48 2004-03-09 devnull fprint(2, "=%.*s ", utfnlen(w, n), w);
1173 d49a2e48 2004-03-09 devnull typeprint(encode[f]);
1175 d49a2e48 2004-03-09 devnull return encode[f];
1179 d49a2e48 2004-03-09 devnull typeprint(Bits h)
1182 d49a2e48 2004-03-09 devnull pcomma("");
1183 d49a2e48 2004-03-09 devnull if(h & NOUN)
1184 d49a2e48 2004-03-09 devnull pcomma("n");
1185 d49a2e48 2004-03-09 devnull if(h & PROP_COLLECT)
1186 d49a2e48 2004-03-09 devnull pcomma("pc");
1187 d49a2e48 2004-03-09 devnull if(h & VERB) {
1188 d49a2e48 2004-03-09 devnull if((h & VERB) == VERB)
1189 d49a2e48 2004-03-09 devnull pcomma("v");
1191 d49a2e48 2004-03-09 devnull if((h & VERB) == V_IRREG)
1192 d49a2e48 2004-03-09 devnull pcomma("vi");
1194 d49a2e48 2004-03-09 devnull if(h & ED)
1195 d49a2e48 2004-03-09 devnull pcomma("ed");
1197 d49a2e48 2004-03-09 devnull if(h & ADJ)
1198 d49a2e48 2004-03-09 devnull pcomma("a");
1199 d49a2e48 2004-03-09 devnull if(h & COMP) {
1200 d49a2e48 2004-03-09 devnull if((h & COMP) == ACTOR)
1201 d49a2e48 2004-03-09 devnull pcomma("er");
1203 d49a2e48 2004-03-09 devnull pcomma("comp");
1205 d49a2e48 2004-03-09 devnull if(h & DONT_TOUCH)
1206 d49a2e48 2004-03-09 devnull pcomma("d");
1207 d49a2e48 2004-03-09 devnull if(h & N_AFFIX)
1208 d49a2e48 2004-03-09 devnull pcomma("na");
1209 d49a2e48 2004-03-09 devnull if(h & ADV)
1210 d49a2e48 2004-03-09 devnull pcomma("adv");
1211 d49a2e48 2004-03-09 devnull if(h & ION)
1212 d49a2e48 2004-03-09 devnull pcomma("ion");
1213 d49a2e48 2004-03-09 devnull if(h & V_AFFIX)
1214 d49a2e48 2004-03-09 devnull pcomma("va");
1215 d49a2e48 2004-03-09 devnull if(h & MAN)
1216 d49a2e48 2004-03-09 devnull pcomma("man");
1217 d49a2e48 2004-03-09 devnull if(h & NOPREF)
1218 d49a2e48 2004-03-09 devnull pcomma("nopref");
1219 d49a2e48 2004-03-09 devnull if(h & MONO)
1220 d49a2e48 2004-03-09 devnull pcomma("ms");
1221 d49a2e48 2004-03-09 devnull if(h & IN)
1222 d49a2e48 2004-03-09 devnull pcomma("in");
1223 d49a2e48 2004-03-09 devnull if(h & _Y)
1224 d49a2e48 2004-03-09 devnull pcomma("y");
1225 d49a2e48 2004-03-09 devnull if(h & STOP)
1226 d49a2e48 2004-03-09 devnull pcomma("s");
1227 d49a2e48 2004-03-09 devnull fprint(2, "\n");
1231 d49a2e48 2004-03-09 devnull pcomma(char *s)
1233 d49a2e48 2004-03-09 devnull static int flag;
1235 d49a2e48 2004-03-09 devnull if(*s == 0) {
1236 d49a2e48 2004-03-09 devnull flag = 0;
1237 d49a2e48 2004-03-09 devnull return;
1239 d49a2e48 2004-03-09 devnull if(!flag) {
1240 d49a2e48 2004-03-09 devnull fprint(2, "%s", s);
1241 d49a2e48 2004-03-09 devnull flag = 1;
1243 d49a2e48 2004-03-09 devnull fprint(2, ",%s", s);
1247 d49a2e48 2004-03-09 devnull * is the word on of the following
1248 d49a2e48 2004-03-09 devnull * 12th teen
1249 d49a2e48 2004-03-09 devnull * 21st end in 1
1250 d49a2e48 2004-03-09 devnull * 23rd end in 3
1251 d49a2e48 2004-03-09 devnull * 77th default
1252 d49a2e48 2004-03-09 devnull * called knowing word[0] is a digit
1255 d49a2e48 2004-03-09 devnull ordinal(void)
1257 d49a2e48 2004-03-09 devnull char *cp = word;
1258 d49a2e48 2004-03-09 devnull static char sp[4];
1260 d49a2e48 2004-03-09 devnull while(ISDIGIT(*cp))
1262 d49a2e48 2004-03-09 devnull strncpy(sp,cp,3);
1263 d49a2e48 2004-03-09 devnull if(ISUPPER(cp[0]) && ISUPPER(cp[1])) {
1264 d49a2e48 2004-03-09 devnull sp[0] = Tolower(cp[0]);
1265 d49a2e48 2004-03-09 devnull sp[1] = Tolower(cp[1]);
1267 d49a2e48 2004-03-09 devnull return 0 == strncmp(sp,
1268 d49a2e48 2004-03-09 devnull cp[-2]=='1'? "th": /* out of bounds if 1 digit */
1269 d49a2e48 2004-03-09 devnull *--cp=='1'? "st": /* harmless */
1270 d49a2e48 2004-03-09 devnull *cp=='2'? "nd":
1271 d49a2e48 2004-03-09 devnull *cp=='3'? "rd":
1272 d49a2e48 2004-03-09 devnull "th", 3);
1276 d49a2e48 2004-03-09 devnull * read in the dictionary.
1277 d49a2e48 2004-03-09 devnull * format is
1279 d49a2e48 2004-03-09 devnull * short nencode;
1280 d49a2e48 2004-03-09 devnull * long encode[nencode];
1281 d49a2e48 2004-03-09 devnull * char space[*];
1284 d49a2e48 2004-03-09 devnull * the encodings are a table all different
1285 d49a2e48 2004-03-09 devnull * affixes.
1286 d49a2e48 2004-03-09 devnull * the dictionary proper has 2 bytes
1287 d49a2e48 2004-03-09 devnull * that demark and then the rest of the
1288 d49a2e48 2004-03-09 devnull * word. the 2 bytes have the following
1289 d49a2e48 2004-03-09 devnull * 0x80 0x00 flag
1290 d49a2e48 2004-03-09 devnull * 0x78 0x00 count of prefix bytes
1291 d49a2e48 2004-03-09 devnull * common with prev word
1292 d49a2e48 2004-03-09 devnull * 0x07 0xff affix code
1294 d49a2e48 2004-03-09 devnull * all ints are big endians in the file.
1297 d49a2e48 2004-03-09 devnull readdict(char *file)
1299 d49a2e48 2004-03-09 devnull char *s, *is, *lasts, *ls;
1300 d49a2e48 2004-03-09 devnull int c, i, sp, p;
1302 d49a2e48 2004-03-09 devnull long l;
1304 d49a2e48 2004-03-09 devnull lasts = 0;
1305 d49a2e48 2004-03-09 devnull f = open(file, 0);
1306 d49a2e48 2004-03-09 devnull if(f == -1) {
1307 d49a2e48 2004-03-09 devnull fprint(2, "cannot open %s\n", file);
1308 d49a2e48 2004-03-09 devnull exits("open");
1310 d49a2e48 2004-03-09 devnull if(read(f, space, 2) != 2)
1311 d49a2e48 2004-03-09 devnull goto bad;
1312 d49a2e48 2004-03-09 devnull nencode = ((space[0]&0xff)<<8) | (space[1]&0xff);
1313 d49a2e48 2004-03-09 devnull if(read(f, space, 4*nencode) != 4*nencode)
1314 d49a2e48 2004-03-09 devnull goto bad;
1315 d49a2e48 2004-03-09 devnull s = space;
1316 d49a2e48 2004-03-09 devnull for(i=0; i<nencode; i++) {
1317 d49a2e48 2004-03-09 devnull l = (long)(s[0] & 0xff) << 24;
1318 d49a2e48 2004-03-09 devnull l |= (s[1] & 0xff) << 16;
1319 d49a2e48 2004-03-09 devnull l |= (s[2] & 0xff) << 8;
1320 d49a2e48 2004-03-09 devnull l |= s[3] & 0xff;
1321 d49a2e48 2004-03-09 devnull encode[i] = (Bits)l;
1322 d49a2e48 2004-03-09 devnull s += 4;
1324 d49a2e48 2004-03-09 devnull l = read(f, space, sizeof(space));
1325 d49a2e48 2004-03-09 devnull if(l == sizeof(space))
1326 d49a2e48 2004-03-09 devnull goto noroom;
1327 d49a2e48 2004-03-09 devnull is = space + (sizeof(space) - l);
1328 d49a2e48 2004-03-09 devnull memmove(is, space, l);
1330 d49a2e48 2004-03-09 devnull s = space;
1331 d49a2e48 2004-03-09 devnull c = *is++ & 0xff;
1332 d49a2e48 2004-03-09 devnull sp = -1;
1336 d49a2e48 2004-03-09 devnull if(s > is)
1337 d49a2e48 2004-03-09 devnull goto noroom;
1338 d49a2e48 2004-03-09 devnull if(c < 0) {
1339 d49a2e48 2004-03-09 devnull close(f);
1340 d49a2e48 2004-03-09 devnull while(sp < 128*128)
1341 d49a2e48 2004-03-09 devnull spacep[++sp] = s;
1342 d49a2e48 2004-03-09 devnull *s = 0x80; /* fence */
1343 d49a2e48 2004-03-09 devnull return;
1345 d49a2e48 2004-03-09 devnull p = (c>>3) & 0xf;
1346 d49a2e48 2004-03-09 devnull *s++ = c;
1347 d49a2e48 2004-03-09 devnull *s++ = *is++ & 0xff;
1348 d49a2e48 2004-03-09 devnull if(p <= 0)
1349 d49a2e48 2004-03-09 devnull i = (*is++ & 0xff)*128;
1350 d49a2e48 2004-03-09 devnull if(p <= 1) {
1351 d49a2e48 2004-03-09 devnull if(!(*is & 0x80))
1352 d49a2e48 2004-03-09 devnull i = i/128*128 + (*is++ & 0xff);
1353 d49a2e48 2004-03-09 devnull if(i <= sp) {
1354 d49a2e48 2004-03-09 devnull fprint(2, "the dict isnt sorted or \n");
1355 d49a2e48 2004-03-09 devnull fprint(2, "memmove didn't work\n");
1356 d49a2e48 2004-03-09 devnull goto bad;
1358 d49a2e48 2004-03-09 devnull while(sp < i)
1359 d49a2e48 2004-03-09 devnull spacep[++sp] = s-2;
1361 d49a2e48 2004-03-09 devnull ls = lasts;
1362 d49a2e48 2004-03-09 devnull lasts = s;
1363 d49a2e48 2004-03-09 devnull for(p-=2; p>0; p--)
1364 d49a2e48 2004-03-09 devnull *s++ = *ls++;
1365 d49a2e48 2004-03-09 devnull for(;;) {
1366 d49a2e48 2004-03-09 devnull if(is >= space+sizeof(space)) {
1367 d49a2e48 2004-03-09 devnull c = -1;
1370 d49a2e48 2004-03-09 devnull c = *is++ & 0xff;
1371 d49a2e48 2004-03-09 devnull if(c & 0x80)
1373 d49a2e48 2004-03-09 devnull *s++ = c;
1375 d49a2e48 2004-03-09 devnull *s = 0;
1376 d49a2e48 2004-03-09 devnull goto loop;
1379 d49a2e48 2004-03-09 devnull fprint(2, "trouble reading %s\n", file);
1380 d49a2e48 2004-03-09 devnull exits("read");
1381 d49a2e48 2004-03-09 devnull noroom:
1382 d49a2e48 2004-03-09 devnull fprint(2, "not enough space for dictionary\n");
1383 d49a2e48 2004-03-09 devnull exits("space");