Blame


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"
6 d49a2e48 2004-03-09 devnull
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
17 d49a2e48 2004-03-09 devnull
18 d49a2e48 2004-03-09 devnull typedef long Bits;
19 d49a2e48 2004-03-09 devnull #define Set(h, f) ((long)(h) & (f))
20 d49a2e48 2004-03-09 devnull
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);
35 d49a2e48 2004-03-09 devnull
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*);
42 d49a2e48 2004-03-09 devnull
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*);
49 d49a2e48 2004-03-09 devnull
50 d49a2e48 2004-03-09 devnull typedef struct Ptab Ptab;
51 d49a2e48 2004-03-09 devnull struct Ptab
52 d49a2e48 2004-03-09 devnull {
53 d49a2e48 2004-03-09 devnull char* s;
54 d49a2e48 2004-03-09 devnull int flag;
55 d49a2e48 2004-03-09 devnull };
56 d49a2e48 2004-03-09 devnull
57 d49a2e48 2004-03-09 devnull typedef struct Suftab Suftab;
58 d49a2e48 2004-03-09 devnull struct Suftab
59 d49a2e48 2004-03-09 devnull {
60 d49a2e48 2004-03-09 devnull char *suf;
61 d49a2e48 2004-03-09 devnull Bits (*p1)(char*, char*, char*, int, int);
62 d49a2e48 2004-03-09 devnull int n1;
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);
68 d49a2e48 2004-03-09 devnull int n2;
69 d49a2e48 2004-03-09 devnull char *d2;
70 d49a2e48 2004-03-09 devnull char *a2;
71 d49a2e48 2004-03-09 devnull };
72 d49a2e48 2004-03-09 devnull
73 d49a2e48 2004-03-09 devnull Suftab staba[] = {
74 d49a2e48 2004-03-09 devnull {"aibohp",subst,1,"-e+ia","",NOUN, NOUN},
75 d49a2e48 2004-03-09 devnull 0
76 d49a2e48 2004-03-09 devnull };
77 d49a2e48 2004-03-09 devnull
78 d49a2e48 2004-03-09 devnull Suftab stabc[] =
79 d49a2e48 2004-03-09 devnull {
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 },
89 d49a2e48 2004-03-09 devnull 0
90 d49a2e48 2004-03-09 devnull };
91 d49a2e48 2004-03-09 devnull Suftab stabd[] =
92 d49a2e48 2004-03-09 devnull {
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},
95 d49a2e48 2004-03-09 devnull 0
96 d49a2e48 2004-03-09 devnull };
97 d49a2e48 2004-03-09 devnull Suftab stabe[] =
98 d49a2e48 2004-03-09 devnull {
99 d49a2e48 2004-03-09 devnull /*
100 d49a2e48 2004-03-09 devnull * V_affix for comment ->commence->commentment??
101 d49a2e48 2004-03-09 devnull */
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},
109 d49a2e48 2004-03-09 devnull 0
110 d49a2e48 2004-03-09 devnull };
111 d49a2e48 2004-03-09 devnull Suftab stabg[] =
112 d49a2e48 2004-03-09 devnull {
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},
117 d49a2e48 2004-03-09 devnull 0
118 d49a2e48 2004-03-09 devnull };
119 d49a2e48 2004-03-09 devnull Suftab stabl[] =
120 d49a2e48 2004-03-09 devnull {
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},
126 d49a2e48 2004-03-09 devnull 0
127 d49a2e48 2004-03-09 devnull };
128 d49a2e48 2004-03-09 devnull Suftab stabm[] =
129 d49a2e48 2004-03-09 devnull {
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},
133 d49a2e48 2004-03-09 devnull 0
134 d49a2e48 2004-03-09 devnull };
135 d49a2e48 2004-03-09 devnull Suftab stabn[] =
136 d49a2e48 2004-03-09 devnull {
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},
147 d49a2e48 2004-03-09 devnull 0
148 d49a2e48 2004-03-09 devnull };
149 d49a2e48 2004-03-09 devnull Suftab stabp[] =
150 d49a2e48 2004-03-09 devnull {
151 d49a2e48 2004-03-09 devnull {"pihs",strip,4,"","+ship",NOUN|PROP_COLLECT,NOUN| N_AFFIX},
152 d49a2e48 2004-03-09 devnull 0
153 d49a2e48 2004-03-09 devnull };
154 d49a2e48 2004-03-09 devnull Suftab stabr[] =
155 d49a2e48 2004-03-09 devnull {
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},
165 d49a2e48 2004-03-09 devnull 0
166 d49a2e48 2004-03-09 devnull };
167 d49a2e48 2004-03-09 devnull Suftab stabs[] =
168 d49a2e48 2004-03-09 devnull {
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 },
174 d49a2e48 2004-03-09 devnull 0
175 d49a2e48 2004-03-09 devnull };
176 d49a2e48 2004-03-09 devnull Suftab stabt[] =
177 d49a2e48 2004-03-09 devnull {
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},
182 d49a2e48 2004-03-09 devnull 0
183 d49a2e48 2004-03-09 devnull };
184 d49a2e48 2004-03-09 devnull Suftab staby[] =
185 d49a2e48 2004-03-09 devnull {
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},
199 d49a2e48 2004-03-09 devnull 0
200 d49a2e48 2004-03-09 devnull };
201 d49a2e48 2004-03-09 devnull Suftab stabz[] =
202 d49a2e48 2004-03-09 devnull {
203 d49a2e48 2004-03-09 devnull 0
204 d49a2e48 2004-03-09 devnull };
205 d49a2e48 2004-03-09 devnull Suftab* suftab[] =
206 d49a2e48 2004-03-09 devnull {
207 d49a2e48 2004-03-09 devnull staba,
208 d49a2e48 2004-03-09 devnull stabz,
209 d49a2e48 2004-03-09 devnull stabc,
210 d49a2e48 2004-03-09 devnull stabd,
211 d49a2e48 2004-03-09 devnull stabe,
212 d49a2e48 2004-03-09 devnull stabz,
213 d49a2e48 2004-03-09 devnull stabg,
214 d49a2e48 2004-03-09 devnull stabz,
215 d49a2e48 2004-03-09 devnull stabz,
216 d49a2e48 2004-03-09 devnull stabz,
217 d49a2e48 2004-03-09 devnull stabz,
218 d49a2e48 2004-03-09 devnull stabl,
219 d49a2e48 2004-03-09 devnull stabm,
220 d49a2e48 2004-03-09 devnull stabn,
221 d49a2e48 2004-03-09 devnull stabz,
222 d49a2e48 2004-03-09 devnull stabp,
223 d49a2e48 2004-03-09 devnull stabz,
224 d49a2e48 2004-03-09 devnull stabr,
225 d49a2e48 2004-03-09 devnull stabs,
226 d49a2e48 2004-03-09 devnull stabt,
227 d49a2e48 2004-03-09 devnull stabz,
228 d49a2e48 2004-03-09 devnull stabz,
229 d49a2e48 2004-03-09 devnull stabz,
230 d49a2e48 2004-03-09 devnull stabz,
231 d49a2e48 2004-03-09 devnull staby,
232 cbeb0b26 2006-04-01 devnull stabz
233 d49a2e48 2004-03-09 devnull };
234 d49a2e48 2004-03-09 devnull
235 d49a2e48 2004-03-09 devnull Ptab ptaba[] =
236 d49a2e48 2004-03-09 devnull {
237 d49a2e48 2004-03-09 devnull "anti", 0,
238 d49a2e48 2004-03-09 devnull "auto", 0,
239 d49a2e48 2004-03-09 devnull 0
240 d49a2e48 2004-03-09 devnull };
241 d49a2e48 2004-03-09 devnull Ptab ptabb[] =
242 d49a2e48 2004-03-09 devnull {
243 d49a2e48 2004-03-09 devnull "bio", 0,
244 d49a2e48 2004-03-09 devnull 0
245 d49a2e48 2004-03-09 devnull };
246 d49a2e48 2004-03-09 devnull Ptab ptabc[] =
247 d49a2e48 2004-03-09 devnull {
248 d49a2e48 2004-03-09 devnull "counter", 0,
249 d49a2e48 2004-03-09 devnull 0
250 d49a2e48 2004-03-09 devnull };
251 d49a2e48 2004-03-09 devnull Ptab ptabd[] =
252 d49a2e48 2004-03-09 devnull {
253 d49a2e48 2004-03-09 devnull "dis", 0,
254 d49a2e48 2004-03-09 devnull 0
255 d49a2e48 2004-03-09 devnull };
256 d49a2e48 2004-03-09 devnull Ptab ptabe[] =
257 d49a2e48 2004-03-09 devnull {
258 d49a2e48 2004-03-09 devnull "electro", 0,
259 d49a2e48 2004-03-09 devnull 0
260 d49a2e48 2004-03-09 devnull };
261 d49a2e48 2004-03-09 devnull Ptab ptabf[] =
262 d49a2e48 2004-03-09 devnull {
263 d49a2e48 2004-03-09 devnull "femto", 0,
264 d49a2e48 2004-03-09 devnull 0
265 d49a2e48 2004-03-09 devnull };
266 d49a2e48 2004-03-09 devnull Ptab ptabg[] =
267 d49a2e48 2004-03-09 devnull {
268 d49a2e48 2004-03-09 devnull "geo", 0,
269 d49a2e48 2004-03-09 devnull "giga", 0,
270 d49a2e48 2004-03-09 devnull 0
271 d49a2e48 2004-03-09 devnull };
272 d49a2e48 2004-03-09 devnull Ptab ptabh[] =
273 d49a2e48 2004-03-09 devnull {
274 d49a2e48 2004-03-09 devnull "hyper", 0,
275 d49a2e48 2004-03-09 devnull 0
276 d49a2e48 2004-03-09 devnull };
277 d49a2e48 2004-03-09 devnull Ptab ptabi[] =
278 d49a2e48 2004-03-09 devnull {
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,
286 d49a2e48 2004-03-09 devnull 0
287 d49a2e48 2004-03-09 devnull };
288 d49a2e48 2004-03-09 devnull Ptab ptabj[] =
289 d49a2e48 2004-03-09 devnull {
290 d49a2e48 2004-03-09 devnull 0
291 d49a2e48 2004-03-09 devnull };
292 d49a2e48 2004-03-09 devnull Ptab ptabk[] =
293 d49a2e48 2004-03-09 devnull {
294 d49a2e48 2004-03-09 devnull "kilo", 0,
295 d49a2e48 2004-03-09 devnull 0
296 d49a2e48 2004-03-09 devnull };
297 d49a2e48 2004-03-09 devnull Ptab ptabl[] =
298 d49a2e48 2004-03-09 devnull {
299 d49a2e48 2004-03-09 devnull 0
300 d49a2e48 2004-03-09 devnull };
301 d49a2e48 2004-03-09 devnull Ptab ptabm[] =
302 d49a2e48 2004-03-09 devnull {
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,
313 d49a2e48 2004-03-09 devnull 0
314 d49a2e48 2004-03-09 devnull };
315 d49a2e48 2004-03-09 devnull Ptab ptabn[] =
316 d49a2e48 2004-03-09 devnull {
317 d49a2e48 2004-03-09 devnull "nano", 0,
318 d49a2e48 2004-03-09 devnull "neuro", 0,
319 d49a2e48 2004-03-09 devnull "non", 0,
320 d49a2e48 2004-03-09 devnull 0
321 d49a2e48 2004-03-09 devnull };
322 d49a2e48 2004-03-09 devnull Ptab ptabo[] =
323 d49a2e48 2004-03-09 devnull {
324 d49a2e48 2004-03-09 devnull "out", 0,
325 d49a2e48 2004-03-09 devnull "over", 0,
326 d49a2e48 2004-03-09 devnull 0
327 d49a2e48 2004-03-09 devnull };
328 d49a2e48 2004-03-09 devnull Ptab ptabp[] =
329 d49a2e48 2004-03-09 devnull {
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,
337 d49a2e48 2004-03-09 devnull 0
338 d49a2e48 2004-03-09 devnull };
339 d49a2e48 2004-03-09 devnull Ptab ptabq[] =
340 d49a2e48 2004-03-09 devnull {
341 d49a2e48 2004-03-09 devnull "quasi", 0,
342 d49a2e48 2004-03-09 devnull 0
343 d49a2e48 2004-03-09 devnull };
344 d49a2e48 2004-03-09 devnull Ptab ptabr[] =
345 d49a2e48 2004-03-09 devnull {
346 d49a2e48 2004-03-09 devnull "radio", 0,
347 d49a2e48 2004-03-09 devnull "re", 0,
348 d49a2e48 2004-03-09 devnull 0
349 d49a2e48 2004-03-09 devnull };
350 d49a2e48 2004-03-09 devnull Ptab ptabs[] =
351 d49a2e48 2004-03-09 devnull {
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,
356 d49a2e48 2004-03-09 devnull 0
357 d49a2e48 2004-03-09 devnull };
358 d49a2e48 2004-03-09 devnull Ptab ptabt[] =
359 d49a2e48 2004-03-09 devnull {
360 d49a2e48 2004-03-09 devnull "tele", 0,
361 d49a2e48 2004-03-09 devnull "tera", 0,
362 d49a2e48 2004-03-09 devnull "thermo", 0,
363 d49a2e48 2004-03-09 devnull 0
364 d49a2e48 2004-03-09 devnull };
365 d49a2e48 2004-03-09 devnull Ptab ptabu[] =
366 d49a2e48 2004-03-09 devnull {
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,
370 d49a2e48 2004-03-09 devnull 0
371 d49a2e48 2004-03-09 devnull };
372 d49a2e48 2004-03-09 devnull Ptab ptabv[] =
373 d49a2e48 2004-03-09 devnull {
374 d49a2e48 2004-03-09 devnull 0
375 d49a2e48 2004-03-09 devnull };
376 d49a2e48 2004-03-09 devnull Ptab ptabw[] =
377 d49a2e48 2004-03-09 devnull {
378 d49a2e48 2004-03-09 devnull 0
379 d49a2e48 2004-03-09 devnull };
380 d49a2e48 2004-03-09 devnull Ptab ptabx[] =
381 d49a2e48 2004-03-09 devnull {
382 d49a2e48 2004-03-09 devnull 0
383 d49a2e48 2004-03-09 devnull };
384 d49a2e48 2004-03-09 devnull Ptab ptaby[] =
385 d49a2e48 2004-03-09 devnull {
386 d49a2e48 2004-03-09 devnull 0
387 d49a2e48 2004-03-09 devnull };
388 d49a2e48 2004-03-09 devnull Ptab ptabz[] =
389 d49a2e48 2004-03-09 devnull {
390 d49a2e48 2004-03-09 devnull 0
391 d49a2e48 2004-03-09 devnull };
392 d49a2e48 2004-03-09 devnull
393 d49a2e48 2004-03-09 devnull Ptab* preftab[] =
394 d49a2e48 2004-03-09 devnull {
395 d49a2e48 2004-03-09 devnull ptaba,
396 d49a2e48 2004-03-09 devnull ptabb,
397 d49a2e48 2004-03-09 devnull ptabc,
398 d49a2e48 2004-03-09 devnull ptabd,
399 d49a2e48 2004-03-09 devnull ptabe,
400 d49a2e48 2004-03-09 devnull ptabf,
401 d49a2e48 2004-03-09 devnull ptabg,
402 d49a2e48 2004-03-09 devnull ptabh,
403 d49a2e48 2004-03-09 devnull ptabi,
404 d49a2e48 2004-03-09 devnull ptabj,
405 d49a2e48 2004-03-09 devnull ptabk,
406 d49a2e48 2004-03-09 devnull ptabl,
407 d49a2e48 2004-03-09 devnull ptabm,
408 d49a2e48 2004-03-09 devnull ptabn,
409 d49a2e48 2004-03-09 devnull ptabo,
410 d49a2e48 2004-03-09 devnull ptabp,
411 d49a2e48 2004-03-09 devnull ptabq,
412 d49a2e48 2004-03-09 devnull ptabr,
413 d49a2e48 2004-03-09 devnull ptabs,
414 d49a2e48 2004-03-09 devnull ptabt,
415 d49a2e48 2004-03-09 devnull ptabu,
416 d49a2e48 2004-03-09 devnull ptabv,
417 d49a2e48 2004-03-09 devnull ptabw,
418 d49a2e48 2004-03-09 devnull ptabx,
419 d49a2e48 2004-03-09 devnull ptaby,
420 cbeb0b26 2006-04-01 devnull ptabz
421 d49a2e48 2004-03-09 devnull };
422 d49a2e48 2004-03-09 devnull
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;
427 d49a2e48 2004-03-09 devnull
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;
449 d49a2e48 2004-03-09 devnull
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";
453 d49a2e48 2004-03-09 devnull
454 d49a2e48 2004-03-09 devnull void
455 d49a2e48 2004-03-09 devnull main(int argc, char *argv[])
456 d49a2e48 2004-03-09 devnull {
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;
461 d49a2e48 2004-03-09 devnull Bits h;
462 d49a2e48 2004-03-09 devnull
463 8ad51794 2004-03-25 devnull codefile = unsharp(codefile);
464 8ad51794 2004-03-25 devnull brfile = unsharp(brfile);
465 8ad51794 2004-03-25 devnull
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] != '-')
472 d49a2e48 2004-03-09 devnull break;
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);
478 d49a2e48 2004-03-09 devnull
479 d49a2e48 2004-03-09 devnull case 'a':
480 d49a2e48 2004-03-09 devnull aflag++;
481 d49a2e48 2004-03-09 devnull continue;
482 d49a2e48 2004-03-09 devnull
483 d49a2e48 2004-03-09 devnull case 'b':
484 d49a2e48 2004-03-09 devnull ise();
485 d49a2e48 2004-03-09 devnull if(!fflag)
486 d49a2e48 2004-03-09 devnull codefile = brfile;
487 d49a2e48 2004-03-09 devnull continue;
488 d49a2e48 2004-03-09 devnull
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;
494 d49a2e48 2004-03-09 devnull
495 d49a2e48 2004-03-09 devnull case 'v':
496 d49a2e48 2004-03-09 devnull vflag++;
497 d49a2e48 2004-03-09 devnull continue;
498 d49a2e48 2004-03-09 devnull
499 d49a2e48 2004-03-09 devnull case 'x':
500 d49a2e48 2004-03-09 devnull xflag++;
501 d49a2e48 2004-03-09 devnull continue;
502 d49a2e48 2004-03-09 devnull
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);
507 d49a2e48 2004-03-09 devnull }
508 d49a2e48 2004-03-09 devnull argv++;
509 d49a2e48 2004-03-09 devnull argc--;
510 d49a2e48 2004-03-09 devnull codefile = argv[1];
511 d49a2e48 2004-03-09 devnull fflag++;
512 d49a2e48 2004-03-09 devnull goto brk;
513 d49a2e48 2004-03-09 devnull }
514 d49a2e48 2004-03-09 devnull brk:
515 d49a2e48 2004-03-09 devnull argv++;
516 d49a2e48 2004-03-09 devnull argc--;
517 d49a2e48 2004-03-09 devnull }
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);
522 d49a2e48 2004-03-09 devnull }
523 d49a2e48 2004-03-09 devnull if(aflag)
524 d49a2e48 2004-03-09 devnull cflag = vflag = 0;
525 d49a2e48 2004-03-09 devnull
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;
533 d49a2e48 2004-03-09 devnull
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;
543 d49a2e48 2004-03-09 devnull }
544 d49a2e48 2004-03-09 devnull for(ep=word,dp=original; j = *dp; ep++,dp++) {
545 d49a2e48 2004-03-09 devnull if(ISLOWER(j))
546 d49a2e48 2004-03-09 devnull low++;
547 d49a2e48 2004-03-09 devnull if(ep >= word+sizeof(word)-1)
548 d49a2e48 2004-03-09 devnull break;
549 d49a2e48 2004-03-09 devnull *ep = j;
550 d49a2e48 2004-03-09 devnull }
551 d49a2e48 2004-03-09 devnull *ep = 0;
552 d49a2e48 2004-03-09 devnull
553 d49a2e48 2004-03-09 devnull if(ISDIGIT(word[0]) && ordinal())
554 d49a2e48 2004-03-09 devnull continue;
555 d49a2e48 2004-03-09 devnull
556 d49a2e48 2004-03-09 devnull h = 0;
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);
560 d49a2e48 2004-03-09 devnull if(!h)
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))
563 d49a2e48 2004-03-09 devnull break;
564 d49a2e48 2004-03-09 devnull if(h = trysuff(ep,0,ALL|STOP|DONT_TOUCH))
565 d49a2e48 2004-03-09 devnull break;
566 d49a2e48 2004-03-09 devnull if(!ISUPPER(word[0]))
567 d49a2e48 2004-03-09 devnull break;
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);
573 d49a2e48 2004-03-09 devnull dp++;
574 d49a2e48 2004-03-09 devnull }
575 d49a2e48 2004-03-09 devnull word[0] = Tolower(word[0]);
576 d49a2e48 2004-03-09 devnull }
577 d49a2e48 2004-03-09 devnull
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("+");
583 fa325e9b 2020-01-10 cross else
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);
589 d49a2e48 2004-03-09 devnull else
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);
593 d49a2e48 2004-03-09 devnull }
594 d49a2e48 2004-03-09 devnull }
595 d49a2e48 2004-03-09 devnull
596 d49a2e48 2004-03-09 devnull /* strip exactly one suffix and do
597 d49a2e48 2004-03-09 devnull * indicated routine(s), which may recursively
598 d49a2e48 2004-03-09 devnull * strip suffixes
599 d49a2e48 2004-03-09 devnull */
600 d49a2e48 2004-03-09 devnull Bits
601 d49a2e48 2004-03-09 devnull trysuff(char* ep, int lev, int flag)
602 d49a2e48 2004-03-09 devnull {
603 d49a2e48 2004-03-09 devnull Suftab *t;
604 d49a2e48 2004-03-09 devnull char *cp, *sp;
605 d49a2e48 2004-03-09 devnull Bits h = 0;
606 d49a2e48 2004-03-09 devnull int initchar = ep[-1];
607 d49a2e48 2004-03-09 devnull
608 d49a2e48 2004-03-09 devnull flag &= ~MONO;
609 d49a2e48 2004-03-09 devnull lev += DLEV;
610 d49a2e48 2004-03-09 devnull if(lev < DSIZ) {
611 d49a2e48 2004-03-09 devnull deriv[lev] = emptyderiv;
612 d49a2e48 2004-03-09 devnull deriv[lev-1] = emptyderiv;
613 d49a2e48 2004-03-09 devnull }
614 d49a2e48 2004-03-09 devnull if(!ISLOWER(initchar))
615 d49a2e48 2004-03-09 devnull return h;
616 d49a2e48 2004-03-09 devnull for(t=suftab[initchar-'a']; sp=t->suf; t++) {
617 d49a2e48 2004-03-09 devnull cp = ep;
618 d49a2e48 2004-03-09 devnull while(*sp)
619 d49a2e48 2004-03-09 devnull if(*--cp != *sp++)
620 d49a2e48 2004-03-09 devnull goto next;
621 d49a2e48 2004-03-09 devnull for(sp=ep-t->n1; --sp >= word && !ISVOWEL(*sp);)
622 d49a2e48 2004-03-09 devnull ;
623 d49a2e48 2004-03-09 devnull if(sp < word)
624 d49a2e48 2004-03-09 devnull continue;
625 d49a2e48 2004-03-09 devnull if(!(t->affixable & flag))
626 d49a2e48 2004-03-09 devnull return 0;
627 d49a2e48 2004-03-09 devnull h = (*t->p1)(ep-t->n1, t->d1, t->a1, lev+1, t->flag|STOP);
628 d49a2e48 2004-03-09 devnull if(!h && t->p2!=0) {
629 d49a2e48 2004-03-09 devnull if(lev < DSIZ) {
630 d49a2e48 2004-03-09 devnull deriv[lev] = emptyderiv;
631 d49a2e48 2004-03-09 devnull deriv[lev+1] = emptyderiv;
632 d49a2e48 2004-03-09 devnull }
633 d49a2e48 2004-03-09 devnull h = (*t->p2)(ep-t->n2, t->d2, t->a2, lev, t->flag|STOP);
634 d49a2e48 2004-03-09 devnull }
635 d49a2e48 2004-03-09 devnull break;
636 d49a2e48 2004-03-09 devnull next:;
637 d49a2e48 2004-03-09 devnull }
638 d49a2e48 2004-03-09 devnull return h;
639 d49a2e48 2004-03-09 devnull }
640 d49a2e48 2004-03-09 devnull
641 d49a2e48 2004-03-09 devnull Bits
642 d49a2e48 2004-03-09 devnull nop(char* ep, char* d, char* a, int lev, int flag)
643 d49a2e48 2004-03-09 devnull {
644 d49a2e48 2004-03-09 devnull USED(ep);
645 d49a2e48 2004-03-09 devnull USED(d);
646 d49a2e48 2004-03-09 devnull USED(a);
647 d49a2e48 2004-03-09 devnull USED(lev);
648 d49a2e48 2004-03-09 devnull USED(flag);
649 d49a2e48 2004-03-09 devnull return 0;
650 d49a2e48 2004-03-09 devnull }
651 d49a2e48 2004-03-09 devnull
652 d49a2e48 2004-03-09 devnull Bits
653 d49a2e48 2004-03-09 devnull cstrip(char* ep, char* d, char* a, int lev, int flag)
654 d49a2e48 2004-03-09 devnull {
655 d49a2e48 2004-03-09 devnull int temp = ep[0];
656 d49a2e48 2004-03-09 devnull
657 d49a2e48 2004-03-09 devnull if(ISVOWEL(temp) && ISVOWEL(ep[-1])) {
658 d49a2e48 2004-03-09 devnull switch(pair(ep[-1],ep[0])) {
659 d49a2e48 2004-03-09 devnull case pair('a', 'a'):
660 d49a2e48 2004-03-09 devnull case pair('a', 'e'):
661 d49a2e48 2004-03-09 devnull case pair('a', 'i'):
662 d49a2e48 2004-03-09 devnull case pair('e', 'a'):
663 d49a2e48 2004-03-09 devnull case pair('e', 'e'):
664 d49a2e48 2004-03-09 devnull case pair('e', 'i'):
665 d49a2e48 2004-03-09 devnull case pair('i', 'i'):
666 d49a2e48 2004-03-09 devnull case pair('o', 'a'):
667 d49a2e48 2004-03-09 devnull return 0;
668 d49a2e48 2004-03-09 devnull }
669 d49a2e48 2004-03-09 devnull } else
670 d49a2e48 2004-03-09 devnull if(temp==ep[-1]&&temp==ep[-2])
671 d49a2e48 2004-03-09 devnull return 0;
672 d49a2e48 2004-03-09 devnull return strip(ep,d,a,lev,flag);
673 d49a2e48 2004-03-09 devnull }
674 d49a2e48 2004-03-09 devnull
675 d49a2e48 2004-03-09 devnull Bits
676 d49a2e48 2004-03-09 devnull strip(char* ep, char* d, char* a, int lev, int flag)
677 d49a2e48 2004-03-09 devnull {
678 d49a2e48 2004-03-09 devnull Bits h = trypref(ep, a, lev, flag);
679 d49a2e48 2004-03-09 devnull
680 d49a2e48 2004-03-09 devnull USED(d);
681 d49a2e48 2004-03-09 devnull if(Set(h,MONO) && ISVOWEL(*ep) && ISVOWEL(ep[-2]))
682 d49a2e48 2004-03-09 devnull h = 0;
683 d49a2e48 2004-03-09 devnull if(h)
684 d49a2e48 2004-03-09 devnull return h;
685 d49a2e48 2004-03-09 devnull if(ISVOWEL(*ep) && !ISVOWEL(ep[-1]) && ep[-1]==ep[-2]) {
686 d49a2e48 2004-03-09 devnull h = trypref(ep-1,a,lev,flag|MONO);
687 d49a2e48 2004-03-09 devnull if(h)
688 d49a2e48 2004-03-09 devnull return h;
689 d49a2e48 2004-03-09 devnull }
690 d49a2e48 2004-03-09 devnull return trysuff(ep,lev,flag);
691 d49a2e48 2004-03-09 devnull }
692 d49a2e48 2004-03-09 devnull
693 d49a2e48 2004-03-09 devnull Bits
694 d49a2e48 2004-03-09 devnull s(char* ep, char* d, char* a, int lev, int flag)
695 d49a2e48 2004-03-09 devnull {
696 d49a2e48 2004-03-09 devnull if(lev > DLEV+1)
697 d49a2e48 2004-03-09 devnull return 0;
698 d49a2e48 2004-03-09 devnull if(*ep=='s') {
699 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
700 d49a2e48 2004-03-09 devnull case 'y':
701 d49a2e48 2004-03-09 devnull if(ISVOWEL(ep[-2])||ISUPPER(*word))
702 d49a2e48 2004-03-09 devnull break; /*says Kennedys*/
703 d49a2e48 2004-03-09 devnull case 'x':
704 d49a2e48 2004-03-09 devnull case 'z':
705 d49a2e48 2004-03-09 devnull case 's':
706 d49a2e48 2004-03-09 devnull return 0;
707 d49a2e48 2004-03-09 devnull case 'h':
708 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
709 d49a2e48 2004-03-09 devnull case 'c':
710 d49a2e48 2004-03-09 devnull case 's':
711 d49a2e48 2004-03-09 devnull return 0;
712 d49a2e48 2004-03-09 devnull }
713 d49a2e48 2004-03-09 devnull }
714 d49a2e48 2004-03-09 devnull }
715 d49a2e48 2004-03-09 devnull return strip(ep,d,a,lev,flag);
716 d49a2e48 2004-03-09 devnull }
717 d49a2e48 2004-03-09 devnull
718 d49a2e48 2004-03-09 devnull Bits
719 d49a2e48 2004-03-09 devnull an(char* ep, char* d, char* a, int lev, int flag)
720 d49a2e48 2004-03-09 devnull {
721 d49a2e48 2004-03-09 devnull USED(d);
722 d49a2e48 2004-03-09 devnull if(!ISUPPER(*word)) /*must be proper name*/
723 d49a2e48 2004-03-09 devnull return 0;
724 d49a2e48 2004-03-09 devnull return trypref(ep,a,lev,flag);
725 d49a2e48 2004-03-09 devnull }
726 d49a2e48 2004-03-09 devnull
727 d49a2e48 2004-03-09 devnull Bits
728 d49a2e48 2004-03-09 devnull ize(char* ep, char* d, char* a, int lev, int flag)
729 d49a2e48 2004-03-09 devnull {
730 d49a2e48 2004-03-09 devnull int temp = ep[-1];
731 d49a2e48 2004-03-09 devnull Bits h;
732 d49a2e48 2004-03-09 devnull
733 d49a2e48 2004-03-09 devnull USED(a);
734 d49a2e48 2004-03-09 devnull ep[-1] = 'e';
735 d49a2e48 2004-03-09 devnull h = strip(ep,"",d,lev,flag);
736 d49a2e48 2004-03-09 devnull ep[-1] = temp;
737 d49a2e48 2004-03-09 devnull return h;
738 d49a2e48 2004-03-09 devnull }
739 d49a2e48 2004-03-09 devnull
740 d49a2e48 2004-03-09 devnull Bits
741 d49a2e48 2004-03-09 devnull y_to_e(char* ep, char* d, char* a, int lev, int flag)
742 d49a2e48 2004-03-09 devnull {
743 d49a2e48 2004-03-09 devnull Bits h;
744 d49a2e48 2004-03-09 devnull int temp;
745 d49a2e48 2004-03-09 devnull
746 d49a2e48 2004-03-09 devnull USED(a);
747 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
748 d49a2e48 2004-03-09 devnull case 'a':
749 d49a2e48 2004-03-09 devnull case 'e':
750 d49a2e48 2004-03-09 devnull case 'i':
751 d49a2e48 2004-03-09 devnull return 0;
752 d49a2e48 2004-03-09 devnull }
753 d49a2e48 2004-03-09 devnull temp = *ep;
754 d49a2e48 2004-03-09 devnull *ep++ = 'e';
755 d49a2e48 2004-03-09 devnull h = strip(ep,"",d,lev,flag);
756 d49a2e48 2004-03-09 devnull ep[-1] = temp;
757 d49a2e48 2004-03-09 devnull return h;
758 d49a2e48 2004-03-09 devnull }
759 d49a2e48 2004-03-09 devnull
760 d49a2e48 2004-03-09 devnull Bits
761 d49a2e48 2004-03-09 devnull ily(char* ep, char* d, char* a, int lev, int flag)
762 d49a2e48 2004-03-09 devnull {
763 d49a2e48 2004-03-09 devnull int temp = ep[0];
764 d49a2e48 2004-03-09 devnull char *cp = ep;
765 d49a2e48 2004-03-09 devnull
766 d49a2e48 2004-03-09 devnull if(temp==ep[-1]&&temp==ep[-2]) /* sillly */
767 d49a2e48 2004-03-09 devnull return 0;
768 d49a2e48 2004-03-09 devnull if(*--cp=='y' && !ISVOWEL(*--cp)) /* happyly */
769 d49a2e48 2004-03-09 devnull while(cp>word)
770 d49a2e48 2004-03-09 devnull if(ISVOWEL(*--cp)) /* shyness */
771 d49a2e48 2004-03-09 devnull return 0;
772 d49a2e48 2004-03-09 devnull if(ep[-1]=='i')
773 d49a2e48 2004-03-09 devnull return i_to_y(ep,d,a,lev,flag);
774 d49a2e48 2004-03-09 devnull return cstrip(ep,d,a,lev,flag);
775 d49a2e48 2004-03-09 devnull }
776 d49a2e48 2004-03-09 devnull
777 d49a2e48 2004-03-09 devnull Bits
778 d49a2e48 2004-03-09 devnull bility(char* ep, char* d, char* a, int lev, int flag)
779 d49a2e48 2004-03-09 devnull {
780 d49a2e48 2004-03-09 devnull *ep++ = 'l';
781 d49a2e48 2004-03-09 devnull return y_to_e(ep,d,a,lev,flag);
782 d49a2e48 2004-03-09 devnull }
783 d49a2e48 2004-03-09 devnull
784 d49a2e48 2004-03-09 devnull Bits
785 d49a2e48 2004-03-09 devnull i_to_y(char* ep, char* d, char* a, int lev, int flag)
786 d49a2e48 2004-03-09 devnull {
787 d49a2e48 2004-03-09 devnull Bits h;
788 d49a2e48 2004-03-09 devnull int temp;
789 d49a2e48 2004-03-09 devnull
790 d49a2e48 2004-03-09 devnull if(ISUPPER(*word))
791 d49a2e48 2004-03-09 devnull return 0;
792 d49a2e48 2004-03-09 devnull if((temp=ep[-1])=='i' && !ISVOWEL(ep[-2])) {
793 d49a2e48 2004-03-09 devnull ep[-1] = 'y';
794 d49a2e48 2004-03-09 devnull a = d;
795 d49a2e48 2004-03-09 devnull }
796 d49a2e48 2004-03-09 devnull h = cstrip(ep,"",a,lev,flag);
797 d49a2e48 2004-03-09 devnull ep[-1] = temp;
798 d49a2e48 2004-03-09 devnull return h;
799 d49a2e48 2004-03-09 devnull }
800 d49a2e48 2004-03-09 devnull
801 d49a2e48 2004-03-09 devnull Bits
802 d49a2e48 2004-03-09 devnull es(char* ep, char* d, char* a, int lev, int flag)
803 d49a2e48 2004-03-09 devnull {
804 d49a2e48 2004-03-09 devnull if(lev>DLEV)
805 d49a2e48 2004-03-09 devnull return 0;
806 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
807 d49a2e48 2004-03-09 devnull default:
808 d49a2e48 2004-03-09 devnull return 0;
809 d49a2e48 2004-03-09 devnull case 'i':
810 d49a2e48 2004-03-09 devnull return i_to_y(ep,d,a,lev,flag);
811 d49a2e48 2004-03-09 devnull case 'h':
812 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
813 d49a2e48 2004-03-09 devnull default:
814 d49a2e48 2004-03-09 devnull return 0;
815 d49a2e48 2004-03-09 devnull case 'c':
816 d49a2e48 2004-03-09 devnull case 's':
817 d49a2e48 2004-03-09 devnull break;
818 d49a2e48 2004-03-09 devnull }
819 d49a2e48 2004-03-09 devnull case 's':
820 d49a2e48 2004-03-09 devnull case 'z':
821 d49a2e48 2004-03-09 devnull case 'x':
822 d49a2e48 2004-03-09 devnull return strip(ep,d,a,lev,flag);
823 d49a2e48 2004-03-09 devnull }
824 d49a2e48 2004-03-09 devnull }
825 d49a2e48 2004-03-09 devnull
826 d49a2e48 2004-03-09 devnull Bits
827 d49a2e48 2004-03-09 devnull subst(char* ep, char* d, char* a, int lev, int flag)
828 d49a2e48 2004-03-09 devnull {
829 d49a2e48 2004-03-09 devnull char *u,*t;
830 d49a2e48 2004-03-09 devnull Bits h;
831 d49a2e48 2004-03-09 devnull
832 d49a2e48 2004-03-09 devnull USED(a);
833 d49a2e48 2004-03-09 devnull if(skipv(skipv(ep-1)) < word)
834 d49a2e48 2004-03-09 devnull return 0;
835 d49a2e48 2004-03-09 devnull for(t=d; *t!='+'; t++)
836 d49a2e48 2004-03-09 devnull continue;
837 d49a2e48 2004-03-09 devnull for(u=ep; *--t!='-';)
838 d49a2e48 2004-03-09 devnull *--u = *t;
839 d49a2e48 2004-03-09 devnull h = strip(ep,"",d,lev,flag);
840 d49a2e48 2004-03-09 devnull while(*++t != '+')
841 d49a2e48 2004-03-09 devnull continue;
842 d49a2e48 2004-03-09 devnull while(*++t)
843 d49a2e48 2004-03-09 devnull *u++ = *t;
844 d49a2e48 2004-03-09 devnull return h;
845 d49a2e48 2004-03-09 devnull }
846 d49a2e48 2004-03-09 devnull
847 d49a2e48 2004-03-09 devnull Bits
848 d49a2e48 2004-03-09 devnull tion(char* ep, char* d, char* a, int lev, int flag)
849 d49a2e48 2004-03-09 devnull {
850 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
851 d49a2e48 2004-03-09 devnull default:
852 d49a2e48 2004-03-09 devnull return trypref(ep,a,lev,flag);
853 d49a2e48 2004-03-09 devnull case 'a':
854 d49a2e48 2004-03-09 devnull case 'e':
855 d49a2e48 2004-03-09 devnull case 'i':
856 d49a2e48 2004-03-09 devnull case 'o':
857 d49a2e48 2004-03-09 devnull case 'u':
858 d49a2e48 2004-03-09 devnull return y_to_e(ep,d,a,lev,flag);
859 d49a2e48 2004-03-09 devnull }
860 d49a2e48 2004-03-09 devnull }
861 d49a2e48 2004-03-09 devnull
862 d49a2e48 2004-03-09 devnull /*
863 d49a2e48 2004-03-09 devnull * possible consonant-consonant-e ending
864 d49a2e48 2004-03-09 devnull */
865 d49a2e48 2004-03-09 devnull Bits
866 d49a2e48 2004-03-09 devnull CCe(char* ep, char* d, char* a, int lev, int flag)
867 d49a2e48 2004-03-09 devnull {
868 d49a2e48 2004-03-09 devnull Bits h;
869 d49a2e48 2004-03-09 devnull
870 d49a2e48 2004-03-09 devnull switch(ep[-1]) {
871 d49a2e48 2004-03-09 devnull case 'l':
872 d49a2e48 2004-03-09 devnull if(ISVOWEL(ep[-2]))
873 d49a2e48 2004-03-09 devnull break;
874 d49a2e48 2004-03-09 devnull switch(ep[-2]) {
875 d49a2e48 2004-03-09 devnull case 'l':
876 d49a2e48 2004-03-09 devnull case 'r':
877 d49a2e48 2004-03-09 devnull case 'w':
878 d49a2e48 2004-03-09 devnull break;
879 d49a2e48 2004-03-09 devnull default:
880 d49a2e48 2004-03-09 devnull return y_to_e(ep,d,a,lev,flag);
881 d49a2e48 2004-03-09 devnull }
882 d49a2e48 2004-03-09 devnull break;
883 d49a2e48 2004-03-09 devnull case 'c':
884 d49a2e48 2004-03-09 devnull case 'g':
885 d49a2e48 2004-03-09 devnull if(*ep == 'a') /* prevent -able for -eable */
886 d49a2e48 2004-03-09 devnull return 0;
887 d49a2e48 2004-03-09 devnull case 's':
888 d49a2e48 2004-03-09 devnull case 'v':
889 d49a2e48 2004-03-09 devnull case 'z':
890 d49a2e48 2004-03-09 devnull if(ep[-2]==ep[-1])
891 d49a2e48 2004-03-09 devnull break;
892 d49a2e48 2004-03-09 devnull if(ISVOWEL(ep[-2]))
893 d49a2e48 2004-03-09 devnull break;
894 d49a2e48 2004-03-09 devnull case 'u':
895 d49a2e48 2004-03-09 devnull if(h = y_to_e(ep,d,a,lev,flag))
896 d49a2e48 2004-03-09 devnull return h;
897 d49a2e48 2004-03-09 devnull if(!(ep[-2]=='n' && ep[-1]=='g'))
898 d49a2e48 2004-03-09 devnull return 0;
899 d49a2e48 2004-03-09 devnull }
900 d49a2e48 2004-03-09 devnull return VCe(ep,d,a,lev,flag);
901 d49a2e48 2004-03-09 devnull }
902 d49a2e48 2004-03-09 devnull
903 d49a2e48 2004-03-09 devnull /*
904 d49a2e48 2004-03-09 devnull * possible consonant-vowel-consonant-e ending
905 d49a2e48 2004-03-09 devnull */
906 d49a2e48 2004-03-09 devnull Bits
907 d49a2e48 2004-03-09 devnull VCe(char* ep, char* d, char* a, int lev, int flag)
908 d49a2e48 2004-03-09 devnull {
909 d49a2e48 2004-03-09 devnull int c;
910 d49a2e48 2004-03-09 devnull Bits h;
911 d49a2e48 2004-03-09 devnull
912 d49a2e48 2004-03-09 devnull c = ep[-1];
913 d49a2e48 2004-03-09 devnull if(c=='e')
914 d49a2e48 2004-03-09 devnull return 0;
915 d49a2e48 2004-03-09 devnull if(!ISVOWEL(c) && ISVOWEL(ep[-2])) {
916 d49a2e48 2004-03-09 devnull c = *ep;
917 d49a2e48 2004-03-09 devnull *ep++ = 'e';
918 d49a2e48 2004-03-09 devnull h = trypref(ep,d,lev,flag);
919 d49a2e48 2004-03-09 devnull if(!h)
920 d49a2e48 2004-03-09 devnull h = trysuff(ep,lev,flag);
921 d49a2e48 2004-03-09 devnull if(h)
922 d49a2e48 2004-03-09 devnull return h;
923 d49a2e48 2004-03-09 devnull ep--;
924 d49a2e48 2004-03-09 devnull *ep = c;
925 d49a2e48 2004-03-09 devnull }
926 d49a2e48 2004-03-09 devnull return cstrip(ep,d,a,lev,flag);
927 d49a2e48 2004-03-09 devnull }
928 d49a2e48 2004-03-09 devnull
929 d49a2e48 2004-03-09 devnull Ptab*
930 d49a2e48 2004-03-09 devnull lookuppref(uchar** wp, char* ep)
931 d49a2e48 2004-03-09 devnull {
932 d49a2e48 2004-03-09 devnull Ptab *sp;
933 d49a2e48 2004-03-09 devnull uchar *bp,*cp;
934 d49a2e48 2004-03-09 devnull unsigned int initchar = Tolower(**wp);
935 d49a2e48 2004-03-09 devnull
936 d49a2e48 2004-03-09 devnull if(!ISALPHA(initchar))
937 d49a2e48 2004-03-09 devnull return 0;
938 d49a2e48 2004-03-09 devnull for(sp=preftab[initchar-'a'];sp->s;sp++) {
939 d49a2e48 2004-03-09 devnull bp = *wp;
940 d49a2e48 2004-03-09 devnull for(cp= (uchar*)sp->s;*cp; )
941 d49a2e48 2004-03-09 devnull if(*bp++!=*cp++)
942 d49a2e48 2004-03-09 devnull goto next;
943 d49a2e48 2004-03-09 devnull for(cp=bp;cp<(uchar*)ep;cp++)
944 d49a2e48 2004-03-09 devnull if(ISVOWEL(*cp)) {
945 d49a2e48 2004-03-09 devnull *wp = bp;
946 d49a2e48 2004-03-09 devnull return sp;
947 d49a2e48 2004-03-09 devnull }
948 d49a2e48 2004-03-09 devnull next:;
949 d49a2e48 2004-03-09 devnull }
950 d49a2e48 2004-03-09 devnull return 0;
951 d49a2e48 2004-03-09 devnull }
952 d49a2e48 2004-03-09 devnull
953 d49a2e48 2004-03-09 devnull /* while word is not in dictionary try stripping
954 d49a2e48 2004-03-09 devnull * prefixes. Fail if no more prefixes.
955 d49a2e48 2004-03-09 devnull */
956 d49a2e48 2004-03-09 devnull Bits
957 d49a2e48 2004-03-09 devnull trypref(char* ep, char* a, int lev, int flag)
958 d49a2e48 2004-03-09 devnull {
959 d49a2e48 2004-03-09 devnull Ptab *tp;
960 d49a2e48 2004-03-09 devnull char *bp, *cp;
961 d49a2e48 2004-03-09 devnull char *pp;
962 d49a2e48 2004-03-09 devnull Bits h;
963 d49a2e48 2004-03-09 devnull char space[20];
964 d49a2e48 2004-03-09 devnull
965 d49a2e48 2004-03-09 devnull if(lev<DSIZ) {
966 d49a2e48 2004-03-09 devnull deriv[lev].mesg = a;
967 d49a2e48 2004-03-09 devnull deriv[lev].type = *a=='.'? NONE: SUFF;
968 d49a2e48 2004-03-09 devnull }
969 d49a2e48 2004-03-09 devnull if(h = tryword(word,ep,lev,flag)) {
970 d49a2e48 2004-03-09 devnull if(Set(h, flag&~MONO) && (flag&MONO) <= Set(h, MONO))
971 d49a2e48 2004-03-09 devnull return h;
972 d49a2e48 2004-03-09 devnull h = 0;
973 d49a2e48 2004-03-09 devnull }
974 d49a2e48 2004-03-09 devnull bp = word;
975 d49a2e48 2004-03-09 devnull pp = space;
976 d49a2e48 2004-03-09 devnull if(lev<DSIZ) {
977 d49a2e48 2004-03-09 devnull deriv[lev+1].mesg = pp;
978 d49a2e48 2004-03-09 devnull deriv[lev+1].type = 0;
979 d49a2e48 2004-03-09 devnull }
980 73bfbacb 2004-12-27 devnull while(tp=lookuppref((uchar**)(void*)&bp,ep)) {
981 d49a2e48 2004-03-09 devnull *pp++ = '+';
982 d49a2e48 2004-03-09 devnull cp = tp->s;
983 d49a2e48 2004-03-09 devnull while(pp<space+sizeof(space) && (*pp = *cp++))
984 d49a2e48 2004-03-09 devnull pp++;
985 d49a2e48 2004-03-09 devnull deriv[lev+1].type += PREF;
986 d49a2e48 2004-03-09 devnull h = tryword(bp,ep,lev+1,flag);
987 d49a2e48 2004-03-09 devnull if(Set(h,NOPREF) ||
988 d49a2e48 2004-03-09 devnull ((tp->flag&IN) && inun(bp-2,h)==0)) {
989 d49a2e48 2004-03-09 devnull h = 0;
990 d49a2e48 2004-03-09 devnull break;
991 d49a2e48 2004-03-09 devnull }
992 d49a2e48 2004-03-09 devnull if(Set(h,flag&~MONO) && (flag&MONO) <= Set(h, MONO))
993 d49a2e48 2004-03-09 devnull break;
994 d49a2e48 2004-03-09 devnull h = 0;
995 d49a2e48 2004-03-09 devnull }
996 d49a2e48 2004-03-09 devnull if(lev < DSIZ) {
997 d49a2e48 2004-03-09 devnull deriv[lev+1] = emptyderiv;
998 d49a2e48 2004-03-09 devnull deriv[lev+2] = emptyderiv;
999 d49a2e48 2004-03-09 devnull }
1000 d49a2e48 2004-03-09 devnull return h;
1001 d49a2e48 2004-03-09 devnull }
1002 d49a2e48 2004-03-09 devnull
1003 d49a2e48 2004-03-09 devnull Bits
1004 d49a2e48 2004-03-09 devnull tryword(char* bp, char* ep, int lev, int flag)
1005 d49a2e48 2004-03-09 devnull {
1006 d49a2e48 2004-03-09 devnull int j;
1007 d49a2e48 2004-03-09 devnull Bits h = 0;
1008 d49a2e48 2004-03-09 devnull char duple[3];
1009 d49a2e48 2004-03-09 devnull
1010 d49a2e48 2004-03-09 devnull if(ep-bp <= 1)
1011 d49a2e48 2004-03-09 devnull return h;
1012 d49a2e48 2004-03-09 devnull if(flag&MONO) {
1013 d49a2e48 2004-03-09 devnull if(lev<DSIZ) {
1014 d49a2e48 2004-03-09 devnull deriv[++lev].mesg = duple;
1015 d49a2e48 2004-03-09 devnull deriv[lev].type = SUFF;
1016 d49a2e48 2004-03-09 devnull }
1017 d49a2e48 2004-03-09 devnull duple[0] = '+';
1018 d49a2e48 2004-03-09 devnull duple[1] = *ep;
1019 d49a2e48 2004-03-09 devnull duple[2] = 0;
1020 d49a2e48 2004-03-09 devnull }
1021 d49a2e48 2004-03-09 devnull h = dict(bp, ep);
1022 d49a2e48 2004-03-09 devnull if(vflag==0 || h==0)
1023 d49a2e48 2004-03-09 devnull return h;
1024 d49a2e48 2004-03-09 devnull /*
1025 d49a2e48 2004-03-09 devnull * when derivations are wanted, collect them
1026 d49a2e48 2004-03-09 devnull * for printing
1027 d49a2e48 2004-03-09 devnull */
1028 d49a2e48 2004-03-09 devnull j = lev;
1029 d49a2e48 2004-03-09 devnull prefcount = suffcount = 0;
1030 d49a2e48 2004-03-09 devnull do {
1031 d49a2e48 2004-03-09 devnull if(j<DSIZ && deriv[j].type) {
1032 d49a2e48 2004-03-09 devnull strcat(affix, deriv[j].mesg);
1033 d49a2e48 2004-03-09 devnull if(deriv[j].type == SUFF)
1034 d49a2e48 2004-03-09 devnull suffcount++;
1035 d49a2e48 2004-03-09 devnull else if(deriv[j].type != NONE)
1036 d49a2e48 2004-03-09 devnull prefcount = deriv[j].type/PREF;
1037 d49a2e48 2004-03-09 devnull }
1038 d49a2e48 2004-03-09 devnull } while(--j > 0);
1039 d49a2e48 2004-03-09 devnull return h;
1040 d49a2e48 2004-03-09 devnull }
1041 d49a2e48 2004-03-09 devnull
1042 d49a2e48 2004-03-09 devnull int
1043 d49a2e48 2004-03-09 devnull inun(char* bp, Bits h)
1044 d49a2e48 2004-03-09 devnull {
1045 d49a2e48 2004-03-09 devnull if(*bp == 'u')
1046 d49a2e48 2004-03-09 devnull return Set(h, IN) == 0;
1047 d49a2e48 2004-03-09 devnull /* *bp == 'i' */
1048 d49a2e48 2004-03-09 devnull if(Set(h, IN) == 0)
1049 d49a2e48 2004-03-09 devnull return 0;
1050 d49a2e48 2004-03-09 devnull switch(bp[2]) {
1051 d49a2e48 2004-03-09 devnull case 'r':
1052 d49a2e48 2004-03-09 devnull return bp[1] == 'r';
1053 d49a2e48 2004-03-09 devnull case 'm':
1054 d49a2e48 2004-03-09 devnull case 'p':
1055 d49a2e48 2004-03-09 devnull return bp[1] == 'm';
1056 d49a2e48 2004-03-09 devnull }
1057 d49a2e48 2004-03-09 devnull return bp[1] == 'n';
1058 d49a2e48 2004-03-09 devnull }
1059 d49a2e48 2004-03-09 devnull
1060 d49a2e48 2004-03-09 devnull char*
1061 d49a2e48 2004-03-09 devnull skipv(char *s)
1062 d49a2e48 2004-03-09 devnull {
1063 d49a2e48 2004-03-09 devnull if(s >= word && ISVOWEL(*s))
1064 d49a2e48 2004-03-09 devnull s--;
1065 d49a2e48 2004-03-09 devnull while(s >= word && !ISVOWEL(*s))
1066 d49a2e48 2004-03-09 devnull s--;
1067 d49a2e48 2004-03-09 devnull return s;
1068 d49a2e48 2004-03-09 devnull }
1069 d49a2e48 2004-03-09 devnull
1070 d49a2e48 2004-03-09 devnull /*
1071 d49a2e48 2004-03-09 devnull * crummy way to Britishise
1072 d49a2e48 2004-03-09 devnull */
1073 d49a2e48 2004-03-09 devnull void
1074 d49a2e48 2004-03-09 devnull ise(void)
1075 d49a2e48 2004-03-09 devnull {
1076 d49a2e48 2004-03-09 devnull Suftab *p;
1077 d49a2e48 2004-03-09 devnull int i;
1078 d49a2e48 2004-03-09 devnull
1079 d49a2e48 2004-03-09 devnull for(i=0; i<26; i++)
1080 d49a2e48 2004-03-09 devnull for(p = suftab[i]; p->suf; p++) {
1081 d49a2e48 2004-03-09 devnull p->suf = ztos(p->suf);
1082 d49a2e48 2004-03-09 devnull p->d1 = ztos(p->d1);
1083 d49a2e48 2004-03-09 devnull p->a1 = ztos(p->a1);
1084 d49a2e48 2004-03-09 devnull }
1085 d49a2e48 2004-03-09 devnull }
1086 d49a2e48 2004-03-09 devnull
1087 d49a2e48 2004-03-09 devnull char*
1088 d49a2e48 2004-03-09 devnull ztos(char *as)
1089 d49a2e48 2004-03-09 devnull {
1090 d49a2e48 2004-03-09 devnull char *s, *ds;
1091 d49a2e48 2004-03-09 devnull
1092 d49a2e48 2004-03-09 devnull for(s=as; *s; s++)
1093 d49a2e48 2004-03-09 devnull if(*s == 'z')
1094 d49a2e48 2004-03-09 devnull goto copy;
1095 d49a2e48 2004-03-09 devnull return as;
1096 d49a2e48 2004-03-09 devnull
1097 d49a2e48 2004-03-09 devnull copy:
1098 d49a2e48 2004-03-09 devnull ds = strdup(as);
1099 d49a2e48 2004-03-09 devnull for(s=ds; *s; s++)
1100 d49a2e48 2004-03-09 devnull if(*s == 'z')
1101 d49a2e48 2004-03-09 devnull *s = 's';
1102 d49a2e48 2004-03-09 devnull return ds;
1103 d49a2e48 2004-03-09 devnull }
1104 d49a2e48 2004-03-09 devnull
1105 d49a2e48 2004-03-09 devnull Bits
1106 d49a2e48 2004-03-09 devnull dict(char* bp, char* ep)
1107 d49a2e48 2004-03-09 devnull {
1108 d49a2e48 2004-03-09 devnull char *cp, *cp1, *w, *wp, *we;
1109 d49a2e48 2004-03-09 devnull int n, f;
1110 d49a2e48 2004-03-09 devnull
1111 d49a2e48 2004-03-09 devnull w = bp;
1112 d49a2e48 2004-03-09 devnull we = ep;
1113 d49a2e48 2004-03-09 devnull n = ep-bp;
1114 d49a2e48 2004-03-09 devnull if(n <= 1)
1115 d49a2e48 2004-03-09 devnull return NOUN;
1116 d49a2e48 2004-03-09 devnull
1117 d49a2e48 2004-03-09 devnull f = w[0] & 0x7f;
1118 d49a2e48 2004-03-09 devnull f *= 128;
1119 d49a2e48 2004-03-09 devnull f += w[1] & 0x7f;
1120 d49a2e48 2004-03-09 devnull bp = spacep[f];
1121 d49a2e48 2004-03-09 devnull ep = spacep[f+1];
1122 d49a2e48 2004-03-09 devnull
1123 d49a2e48 2004-03-09 devnull loop:
1124 d49a2e48 2004-03-09 devnull if(bp >= ep) {
1125 fa325e9b 2020-01-10 cross if(xflag)
1126 d49a2e48 2004-03-09 devnull fprint(2, "=%.*s\n", utfnlen(w, n), w);
1127 d49a2e48 2004-03-09 devnull return 0;
1128 d49a2e48 2004-03-09 devnull }
1129 d49a2e48 2004-03-09 devnull /*
1130 d49a2e48 2004-03-09 devnull * find the beginning of some word in the middle
1131 d49a2e48 2004-03-09 devnull */
1132 d49a2e48 2004-03-09 devnull cp = bp + (ep-bp)/2;
1133 d49a2e48 2004-03-09 devnull
1134 d49a2e48 2004-03-09 devnull while(cp > bp && !(*cp & 0x80))
1135 d49a2e48 2004-03-09 devnull cp--;
1136 d49a2e48 2004-03-09 devnull while(cp > bp && (cp[-1] & 0x80))
1137 d49a2e48 2004-03-09 devnull cp--;
1138 d49a2e48 2004-03-09 devnull
1139 d49a2e48 2004-03-09 devnull wp = w + 2; /* skip two letters */
1140 d49a2e48 2004-03-09 devnull cp1 = cp + 2; /* skip affix code */
1141 d49a2e48 2004-03-09 devnull for(;;) {
1142 d49a2e48 2004-03-09 devnull if(wp >= we) {
1143 d49a2e48 2004-03-09 devnull if(*cp1 & 0x80)
1144 d49a2e48 2004-03-09 devnull goto found;
1145 d49a2e48 2004-03-09 devnull else
1146 d49a2e48 2004-03-09 devnull f = 1;
1147 d49a2e48 2004-03-09 devnull break;
1148 d49a2e48 2004-03-09 devnull }
1149 d49a2e48 2004-03-09 devnull if(*cp1 & 0x80) {
1150 d49a2e48 2004-03-09 devnull f = -1;
1151 d49a2e48 2004-03-09 devnull break;
1152 d49a2e48 2004-03-09 devnull }
1153 d49a2e48 2004-03-09 devnull f = *cp1++ - *wp++;
1154 d49a2e48 2004-03-09 devnull if(f != 0)
1155 d49a2e48 2004-03-09 devnull break;
1156 d49a2e48 2004-03-09 devnull }
1157 d49a2e48 2004-03-09 devnull
1158 d49a2e48 2004-03-09 devnull if(f < 0) {
1159 d49a2e48 2004-03-09 devnull while(!(*cp1 & 0x80))
1160 d49a2e48 2004-03-09 devnull cp1++;
1161 d49a2e48 2004-03-09 devnull bp = cp1;
1162 d49a2e48 2004-03-09 devnull goto loop;
1163 d49a2e48 2004-03-09 devnull }
1164 d49a2e48 2004-03-09 devnull ep = cp;
1165 d49a2e48 2004-03-09 devnull goto loop;
1166 d49a2e48 2004-03-09 devnull
1167 d49a2e48 2004-03-09 devnull found:
1168 d49a2e48 2004-03-09 devnull f = ((cp[0] & 0x7) << 8) |
1169 d49a2e48 2004-03-09 devnull (cp[1] & 0xff);
1170 d49a2e48 2004-03-09 devnull if(xflag) {
1171 d49a2e48 2004-03-09 devnull fprint(2, "=%.*s ", utfnlen(w, n), w);
1172 d49a2e48 2004-03-09 devnull typeprint(encode[f]);
1173 d49a2e48 2004-03-09 devnull }
1174 d49a2e48 2004-03-09 devnull return encode[f];
1175 d49a2e48 2004-03-09 devnull }
1176 d49a2e48 2004-03-09 devnull
1177 d49a2e48 2004-03-09 devnull void
1178 d49a2e48 2004-03-09 devnull typeprint(Bits h)
1179 d49a2e48 2004-03-09 devnull {
1180 d49a2e48 2004-03-09 devnull
1181 d49a2e48 2004-03-09 devnull pcomma("");
1182 d49a2e48 2004-03-09 devnull if(h & NOUN)
1183 d49a2e48 2004-03-09 devnull pcomma("n");
1184 d49a2e48 2004-03-09 devnull if(h & PROP_COLLECT)
1185 d49a2e48 2004-03-09 devnull pcomma("pc");
1186 d49a2e48 2004-03-09 devnull if(h & VERB) {
1187 d49a2e48 2004-03-09 devnull if((h & VERB) == VERB)
1188 d49a2e48 2004-03-09 devnull pcomma("v");
1189 d49a2e48 2004-03-09 devnull else
1190 d49a2e48 2004-03-09 devnull if((h & VERB) == V_IRREG)
1191 d49a2e48 2004-03-09 devnull pcomma("vi");
1192 d49a2e48 2004-03-09 devnull else
1193 d49a2e48 2004-03-09 devnull if(h & ED)
1194 d49a2e48 2004-03-09 devnull pcomma("ed");
1195 d49a2e48 2004-03-09 devnull }
1196 d49a2e48 2004-03-09 devnull if(h & ADJ)
1197 d49a2e48 2004-03-09 devnull pcomma("a");
1198 d49a2e48 2004-03-09 devnull if(h & COMP) {
1199 d49a2e48 2004-03-09 devnull if((h & COMP) == ACTOR)
1200 d49a2e48 2004-03-09 devnull pcomma("er");
1201 d49a2e48 2004-03-09 devnull else
1202 d49a2e48 2004-03-09 devnull pcomma("comp");
1203 d49a2e48 2004-03-09 devnull }
1204 d49a2e48 2004-03-09 devnull if(h & DONT_TOUCH)
1205 d49a2e48 2004-03-09 devnull pcomma("d");
1206 d49a2e48 2004-03-09 devnull if(h & N_AFFIX)
1207 d49a2e48 2004-03-09 devnull pcomma("na");
1208 d49a2e48 2004-03-09 devnull if(h & ADV)
1209 d49a2e48 2004-03-09 devnull pcomma("adv");
1210 d49a2e48 2004-03-09 devnull if(h & ION)
1211 d49a2e48 2004-03-09 devnull pcomma("ion");
1212 d49a2e48 2004-03-09 devnull if(h & V_AFFIX)
1213 d49a2e48 2004-03-09 devnull pcomma("va");
1214 d49a2e48 2004-03-09 devnull if(h & MAN)
1215 d49a2e48 2004-03-09 devnull pcomma("man");
1216 d49a2e48 2004-03-09 devnull if(h & NOPREF)
1217 d49a2e48 2004-03-09 devnull pcomma("nopref");
1218 d49a2e48 2004-03-09 devnull if(h & MONO)
1219 d49a2e48 2004-03-09 devnull pcomma("ms");
1220 d49a2e48 2004-03-09 devnull if(h & IN)
1221 d49a2e48 2004-03-09 devnull pcomma("in");
1222 d49a2e48 2004-03-09 devnull if(h & _Y)
1223 d49a2e48 2004-03-09 devnull pcomma("y");
1224 d49a2e48 2004-03-09 devnull if(h & STOP)
1225 d49a2e48 2004-03-09 devnull pcomma("s");
1226 d49a2e48 2004-03-09 devnull fprint(2, "\n");
1227 d49a2e48 2004-03-09 devnull }
1228 d49a2e48 2004-03-09 devnull
1229 d49a2e48 2004-03-09 devnull void
1230 d49a2e48 2004-03-09 devnull pcomma(char *s)
1231 d49a2e48 2004-03-09 devnull {
1232 d49a2e48 2004-03-09 devnull static int flag;
1233 d49a2e48 2004-03-09 devnull
1234 d49a2e48 2004-03-09 devnull if(*s == 0) {
1235 d49a2e48 2004-03-09 devnull flag = 0;
1236 d49a2e48 2004-03-09 devnull return;
1237 d49a2e48 2004-03-09 devnull }
1238 d49a2e48 2004-03-09 devnull if(!flag) {
1239 d49a2e48 2004-03-09 devnull fprint(2, "%s", s);
1240 d49a2e48 2004-03-09 devnull flag = 1;
1241 d49a2e48 2004-03-09 devnull } else
1242 d49a2e48 2004-03-09 devnull fprint(2, ",%s", s);
1243 d49a2e48 2004-03-09 devnull }
1244 d49a2e48 2004-03-09 devnull
1245 d49a2e48 2004-03-09 devnull /*
1246 d49a2e48 2004-03-09 devnull * is the word on of the following
1247 d49a2e48 2004-03-09 devnull * 12th teen
1248 d49a2e48 2004-03-09 devnull * 21st end in 1
1249 d49a2e48 2004-03-09 devnull * 23rd end in 3
1250 d49a2e48 2004-03-09 devnull * 77th default
1251 d49a2e48 2004-03-09 devnull * called knowing word[0] is a digit
1252 d49a2e48 2004-03-09 devnull */
1253 d49a2e48 2004-03-09 devnull int
1254 d49a2e48 2004-03-09 devnull ordinal(void)
1255 d49a2e48 2004-03-09 devnull {
1256 d49a2e48 2004-03-09 devnull char *cp = word;
1257 d49a2e48 2004-03-09 devnull static char sp[4];
1258 d49a2e48 2004-03-09 devnull
1259 d49a2e48 2004-03-09 devnull while(ISDIGIT(*cp))
1260 d49a2e48 2004-03-09 devnull cp++;
1261 d49a2e48 2004-03-09 devnull strncpy(sp,cp,3);
1262 d49a2e48 2004-03-09 devnull if(ISUPPER(cp[0]) && ISUPPER(cp[1])) {
1263 d49a2e48 2004-03-09 devnull sp[0] = Tolower(cp[0]);
1264 d49a2e48 2004-03-09 devnull sp[1] = Tolower(cp[1]);
1265 d49a2e48 2004-03-09 devnull }
1266 d49a2e48 2004-03-09 devnull return 0 == strncmp(sp,
1267 d49a2e48 2004-03-09 devnull cp[-2]=='1'? "th": /* out of bounds if 1 digit */
1268 d49a2e48 2004-03-09 devnull *--cp=='1'? "st": /* harmless */
1269 d49a2e48 2004-03-09 devnull *cp=='2'? "nd":
1270 d49a2e48 2004-03-09 devnull *cp=='3'? "rd":
1271 d49a2e48 2004-03-09 devnull "th", 3);
1272 d49a2e48 2004-03-09 devnull }
1273 d49a2e48 2004-03-09 devnull
1274 d49a2e48 2004-03-09 devnull /*
1275 d49a2e48 2004-03-09 devnull * read in the dictionary.
1276 d49a2e48 2004-03-09 devnull * format is
1277 d49a2e48 2004-03-09 devnull * {
1278 d49a2e48 2004-03-09 devnull * short nencode;
1279 d49a2e48 2004-03-09 devnull * long encode[nencode];
1280 d49a2e48 2004-03-09 devnull * char space[*];
1281 d49a2e48 2004-03-09 devnull * };
1282 d49a2e48 2004-03-09 devnull *
1283 d49a2e48 2004-03-09 devnull * the encodings are a table all different
1284 d49a2e48 2004-03-09 devnull * affixes.
1285 d49a2e48 2004-03-09 devnull * the dictionary proper has 2 bytes
1286 d49a2e48 2004-03-09 devnull * that demark and then the rest of the
1287 d49a2e48 2004-03-09 devnull * word. the 2 bytes have the following
1288 d49a2e48 2004-03-09 devnull * 0x80 0x00 flag
1289 d49a2e48 2004-03-09 devnull * 0x78 0x00 count of prefix bytes
1290 d49a2e48 2004-03-09 devnull * common with prev word
1291 d49a2e48 2004-03-09 devnull * 0x07 0xff affix code
1292 d49a2e48 2004-03-09 devnull *
1293 d49a2e48 2004-03-09 devnull * all ints are big endians in the file.
1294 d49a2e48 2004-03-09 devnull */
1295 d49a2e48 2004-03-09 devnull void
1296 d49a2e48 2004-03-09 devnull readdict(char *file)
1297 d49a2e48 2004-03-09 devnull {
1298 d49a2e48 2004-03-09 devnull char *s, *is, *lasts, *ls;
1299 d49a2e48 2004-03-09 devnull int c, i, sp, p;
1300 d49a2e48 2004-03-09 devnull int f;
1301 d49a2e48 2004-03-09 devnull long l;
1302 d49a2e48 2004-03-09 devnull
1303 d49a2e48 2004-03-09 devnull lasts = 0;
1304 d49a2e48 2004-03-09 devnull f = open(file, 0);
1305 d49a2e48 2004-03-09 devnull if(f == -1) {
1306 d49a2e48 2004-03-09 devnull fprint(2, "cannot open %s\n", file);
1307 d49a2e48 2004-03-09 devnull exits("open");
1308 d49a2e48 2004-03-09 devnull }
1309 d49a2e48 2004-03-09 devnull if(read(f, space, 2) != 2)
1310 d49a2e48 2004-03-09 devnull goto bad;
1311 d49a2e48 2004-03-09 devnull nencode = ((space[0]&0xff)<<8) | (space[1]&0xff);
1312 d49a2e48 2004-03-09 devnull if(read(f, space, 4*nencode) != 4*nencode)
1313 d49a2e48 2004-03-09 devnull goto bad;
1314 d49a2e48 2004-03-09 devnull s = space;
1315 d49a2e48 2004-03-09 devnull for(i=0; i<nencode; i++) {
1316 d49a2e48 2004-03-09 devnull l = (long)(s[0] & 0xff) << 24;
1317 d49a2e48 2004-03-09 devnull l |= (s[1] & 0xff) << 16;
1318 d49a2e48 2004-03-09 devnull l |= (s[2] & 0xff) << 8;
1319 d49a2e48 2004-03-09 devnull l |= s[3] & 0xff;
1320 d49a2e48 2004-03-09 devnull encode[i] = (Bits)l;
1321 d49a2e48 2004-03-09 devnull s += 4;
1322 d49a2e48 2004-03-09 devnull }
1323 d49a2e48 2004-03-09 devnull l = read(f, space, sizeof(space));
1324 d49a2e48 2004-03-09 devnull if(l == sizeof(space))
1325 d49a2e48 2004-03-09 devnull goto noroom;
1326 d49a2e48 2004-03-09 devnull is = space + (sizeof(space) - l);
1327 d49a2e48 2004-03-09 devnull memmove(is, space, l);
1328 d49a2e48 2004-03-09 devnull
1329 d49a2e48 2004-03-09 devnull s = space;
1330 d49a2e48 2004-03-09 devnull c = *is++ & 0xff;
1331 d49a2e48 2004-03-09 devnull sp = -1;
1332 d49a2e48 2004-03-09 devnull i = 0;
1333 d49a2e48 2004-03-09 devnull
1334 d49a2e48 2004-03-09 devnull loop:
1335 d49a2e48 2004-03-09 devnull if(s > is)
1336 d49a2e48 2004-03-09 devnull goto noroom;
1337 d49a2e48 2004-03-09 devnull if(c < 0) {
1338 d49a2e48 2004-03-09 devnull close(f);
1339 d49a2e48 2004-03-09 devnull while(sp < 128*128)
1340 d49a2e48 2004-03-09 devnull spacep[++sp] = s;
1341 cbeb0b26 2006-04-01 devnull *s = (char)0x80; /* fence */
1342 d49a2e48 2004-03-09 devnull return;
1343 d49a2e48 2004-03-09 devnull }
1344 d49a2e48 2004-03-09 devnull p = (c>>3) & 0xf;
1345 d49a2e48 2004-03-09 devnull *s++ = c;
1346 d49a2e48 2004-03-09 devnull *s++ = *is++ & 0xff;
1347 d49a2e48 2004-03-09 devnull if(p <= 0)
1348 d49a2e48 2004-03-09 devnull i = (*is++ & 0xff)*128;
1349 d49a2e48 2004-03-09 devnull if(p <= 1) {
1350 d49a2e48 2004-03-09 devnull if(!(*is & 0x80))
1351 d49a2e48 2004-03-09 devnull i = i/128*128 + (*is++ & 0xff);
1352 d49a2e48 2004-03-09 devnull if(i <= sp) {
1353 d49a2e48 2004-03-09 devnull fprint(2, "the dict isnt sorted or \n");
1354 d49a2e48 2004-03-09 devnull fprint(2, "memmove didn't work\n");
1355 d49a2e48 2004-03-09 devnull goto bad;
1356 d49a2e48 2004-03-09 devnull }
1357 d49a2e48 2004-03-09 devnull while(sp < i)
1358 d49a2e48 2004-03-09 devnull spacep[++sp] = s-2;
1359 d49a2e48 2004-03-09 devnull }
1360 d49a2e48 2004-03-09 devnull ls = lasts;
1361 d49a2e48 2004-03-09 devnull lasts = s;
1362 d49a2e48 2004-03-09 devnull for(p-=2; p>0; p--)
1363 d49a2e48 2004-03-09 devnull *s++ = *ls++;
1364 d49a2e48 2004-03-09 devnull for(;;) {
1365 d49a2e48 2004-03-09 devnull if(is >= space+sizeof(space)) {
1366 d49a2e48 2004-03-09 devnull c = -1;
1367 d49a2e48 2004-03-09 devnull break;
1368 d49a2e48 2004-03-09 devnull }
1369 d49a2e48 2004-03-09 devnull c = *is++ & 0xff;
1370 d49a2e48 2004-03-09 devnull if(c & 0x80)
1371 d49a2e48 2004-03-09 devnull break;
1372 d49a2e48 2004-03-09 devnull *s++ = c;
1373 d49a2e48 2004-03-09 devnull }
1374 d49a2e48 2004-03-09 devnull *s = 0;
1375 d49a2e48 2004-03-09 devnull goto loop;
1376 d49a2e48 2004-03-09 devnull
1377 d49a2e48 2004-03-09 devnull bad:
1378 d49a2e48 2004-03-09 devnull fprint(2, "trouble reading %s\n", file);
1379 d49a2e48 2004-03-09 devnull exits("read");
1380 d49a2e48 2004-03-09 devnull noroom:
1381 d49a2e48 2004-03-09 devnull fprint(2, "not enough space for dictionary\n");
1382 d49a2e48 2004-03-09 devnull exits("space");
1383 d49a2e48 2004-03-09 devnull }