00001
00002
00003 #include <limits.h>
00004 #include "german.h"
00005
00006 static const symbol s_pool[] = {
00007 #define s_0_1 0
00008 'U',
00009 #define s_0_2 1
00010 'Y',
00011 #define s_0_3 2
00012 0xC3, 0xA4,
00013 #define s_0_4 4
00014 0xC3, 0xB6,
00015 #define s_0_5 6
00016 0xC3, 0xBC,
00017 #define s_1_0 8
00018 'e',
00019 #define s_1_1 9
00020 'e', 'm',
00021 #define s_1_2 11
00022 'e', 'n',
00023 #define s_1_3 13
00024 'e', 'r', 'n',
00025 #define s_1_4 16
00026 'e', 'r',
00027 #define s_1_5 18
00028 's',
00029 #define s_1_6 19
00030 'e', 's',
00031 #define s_2_0 21
00032 'e', 'n',
00033 #define s_2_1 23
00034 'e', 'r',
00035 #define s_2_2 25
00036 's', 't',
00037 #define s_2_3 27
00038 'e', 's', 't',
00039 #define s_3_0 30
00040 'i', 'g',
00041 #define s_3_1 32
00042 'l', 'i', 'c', 'h',
00043 #define s_4_0 36
00044 'e', 'n', 'd',
00045 #define s_4_1 39
00046 'i', 'g',
00047 #define s_4_2 41
00048 'u', 'n', 'g',
00049 #define s_4_3 44
00050 'l', 'i', 'c', 'h',
00051 #define s_4_4 48
00052 'i', 's', 'c', 'h',
00053 #define s_4_5 52
00054 'i', 'k',
00055 #define s_4_6 54
00056 'h', 'e', 'i', 't',
00057 #define s_4_7 58
00058 'k', 'e', 'i', 't',
00059 };
00060
00061
00062 static const struct among a_0[6] =
00063 {
00064 { 0, 0, -1, 6},
00065 { 1, s_0_1, 0, 2},
00066 { 1, s_0_2, 0, 1},
00067 { 2, s_0_3, 0, 3},
00068 { 2, s_0_4, 0, 4},
00069 { 2, s_0_5, 0, 5}
00070 };
00071
00072
00073 static const struct among a_1[7] =
00074 {
00075 { 1, s_1_0, -1, 1},
00076 { 2, s_1_1, -1, 1},
00077 { 2, s_1_2, -1, 1},
00078 { 3, s_1_3, -1, 1},
00079 { 2, s_1_4, -1, 1},
00080 { 1, s_1_5, -1, 2},
00081 { 2, s_1_6, 5, 1}
00082 };
00083
00084
00085 static const struct among a_2[4] =
00086 {
00087 { 2, s_2_0, -1, 1},
00088 { 2, s_2_1, -1, 1},
00089 { 2, s_2_2, -1, 2},
00090 { 3, s_2_3, 2, 1}
00091 };
00092
00093
00094 static const struct among a_3[2] =
00095 {
00096 { 2, s_3_0, -1, 1},
00097 { 4, s_3_1, -1, 1}
00098 };
00099
00100
00101 static const struct among a_4[8] =
00102 {
00103 { 3, s_4_0, -1, 1},
00104 { 2, s_4_1, -1, 2},
00105 { 3, s_4_2, -1, 1},
00106 { 4, s_4_3, -1, 3},
00107 { 4, s_4_4, -1, 2},
00108 { 2, s_4_5, -1, 2},
00109 { 4, s_4_6, -1, 3},
00110 { 4, s_4_7, -1, 4}
00111 };
00112
00113 static const unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 };
00114
00115 static const unsigned char g_s_ending[] = { 117, 30, 5 };
00116
00117 static const unsigned char g_st_ending[] = { 117, 30, 4 };
00118
00119 static const symbol s_0[] = { 0xC3, 0x9F };
00120 static const symbol s_1[] = { 's', 's' };
00121 static const symbol s_2[] = { 'U' };
00122 static const symbol s_3[] = { 'Y' };
00123 static const symbol s_4[] = { 'y' };
00124 static const symbol s_5[] = { 'u' };
00125 static const symbol s_6[] = { 'a' };
00126 static const symbol s_7[] = { 'o' };
00127 static const symbol s_8[] = { 'u' };
00128 static const symbol s_9[] = { 'i', 'g' };
00129 static const symbol s_10[] = { 'e', 'r' };
00130 static const symbol s_11[] = { 'e', 'n' };
00131
00132 int Xapian::InternalStemGerman::r_prelude() {
00133 { int c_test1 = c;
00134 while(1) {
00135 int c2 = c;
00136 { int c3 = c;
00137 bra = c;
00138 if (!(eq_s(2, s_0))) goto lab2;
00139 ket = c;
00140 { int ret = slice_from_s(2, s_1);
00141 if (ret < 0) return ret;
00142 }
00143 goto lab1;
00144 lab2:
00145 c = c3;
00146 { int ret = skip_utf8(p, c, 0, l, 1);
00147 if (ret < 0) goto lab0;
00148 c = ret;
00149 }
00150 }
00151 lab1:
00152 continue;
00153 lab0:
00154 c = c2;
00155 break;
00156 }
00157 c = c_test1;
00158 }
00159 while(1) {
00160 int c4 = c;
00161 while(1) {
00162 int c5 = c;
00163 if (in_grouping_U(g_v, 97, 252, 0)) goto lab4;
00164 bra = c;
00165 { int c6 = c;
00166 if (c == l || p[c] != 'u') goto lab6;
00167 c++;
00168 ket = c;
00169 if (in_grouping_U(g_v, 97, 252, 0)) goto lab6;
00170 { int ret = slice_from_s(1, s_2);
00171 if (ret < 0) return ret;
00172 }
00173 goto lab5;
00174 lab6:
00175 c = c6;
00176 if (c == l || p[c] != 'y') goto lab4;
00177 c++;
00178 ket = c;
00179 if (in_grouping_U(g_v, 97, 252, 0)) goto lab4;
00180 { int ret = slice_from_s(1, s_3);
00181 if (ret < 0) return ret;
00182 }
00183 }
00184 lab5:
00185 c = c5;
00186 break;
00187 lab4:
00188 c = c5;
00189 { int ret = skip_utf8(p, c, 0, l, 1);
00190 if (ret < 0) goto lab3;
00191 c = ret;
00192 }
00193 }
00194 continue;
00195 lab3:
00196 c = c4;
00197 break;
00198 }
00199 return 1;
00200 }
00201
00202 int Xapian::InternalStemGerman::r_mark_regions() {
00203 I_p1 = l;
00204 I_p2 = l;
00205 { int c_test1 = c;
00206 { int ret = skip_utf8(p, c, 0, l, + 3);
00207 if (ret < 0) return 0;
00208 c = ret;
00209 }
00210 I_x = c;
00211 c = c_test1;
00212 }
00213 { int ret = out_grouping_U(g_v, 97, 252, 1);
00214 if (ret < 0) return 0;
00215 c += ret;
00216 }
00217 { int ret = in_grouping_U(g_v, 97, 252, 1);
00218 if (ret < 0) return 0;
00219 c += ret;
00220 }
00221 I_p1 = c;
00222
00223 if (!(I_p1 < I_x)) goto lab0;
00224 I_p1 = I_x;
00225 lab0:
00226 { int ret = out_grouping_U(g_v, 97, 252, 1);
00227 if (ret < 0) return 0;
00228 c += ret;
00229 }
00230 { int ret = in_grouping_U(g_v, 97, 252, 1);
00231 if (ret < 0) return 0;
00232 c += ret;
00233 }
00234 I_p2 = c;
00235 return 1;
00236 }
00237
00238 int Xapian::InternalStemGerman::r_postlude() {
00239 int among_var;
00240 while(1) {
00241 int c1 = c;
00242 bra = c;
00243 among_var = find_among(s_pool, a_0, 6, 0, 0);
00244 if (!(among_var)) goto lab0;
00245 ket = c;
00246 switch(among_var) {
00247 case 0: goto lab0;
00248 case 1:
00249 { int ret = slice_from_s(1, s_4);
00250 if (ret < 0) return ret;
00251 }
00252 break;
00253 case 2:
00254 { int ret = slice_from_s(1, s_5);
00255 if (ret < 0) return ret;
00256 }
00257 break;
00258 case 3:
00259 { int ret = slice_from_s(1, s_6);
00260 if (ret < 0) return ret;
00261 }
00262 break;
00263 case 4:
00264 { int ret = slice_from_s(1, s_7);
00265 if (ret < 0) return ret;
00266 }
00267 break;
00268 case 5:
00269 { int ret = slice_from_s(1, s_8);
00270 if (ret < 0) return ret;
00271 }
00272 break;
00273 case 6:
00274 { int ret = skip_utf8(p, c, 0, l, 1);
00275 if (ret < 0) goto lab0;
00276 c = ret;
00277 }
00278 break;
00279 }
00280 continue;
00281 lab0:
00282 c = c1;
00283 break;
00284 }
00285 return 1;
00286 }
00287
00288 int Xapian::InternalStemGerman::r_R1() {
00289 if (!(I_p1 <= c)) return 0;
00290 return 1;
00291 }
00292
00293 int Xapian::InternalStemGerman::r_R2() {
00294 if (!(I_p2 <= c)) return 0;
00295 return 1;
00296 }
00297
00298 int Xapian::InternalStemGerman::r_standard_suffix() {
00299 int among_var;
00300 { int m1 = l - c; (void)m1;
00301 ket = c;
00302 if (c <= lb || p[c - 1] >> 5 != 3 || !((811040 >> (p[c - 1] & 0x1f)) & 1)) goto lab0;
00303 among_var = find_among_b(s_pool, a_1, 7, 0, 0);
00304 if (!(among_var)) goto lab0;
00305 bra = c;
00306 { int ret = r_R1();
00307 if (ret == 0) goto lab0;
00308 if (ret < 0) return ret;
00309 }
00310 switch(among_var) {
00311 case 0: goto lab0;
00312 case 1:
00313 if (slice_del() == -1) return -1;
00314 break;
00315 case 2:
00316 if (in_grouping_b_U(g_s_ending, 98, 116, 0)) goto lab0;
00317 if (slice_del() == -1) return -1;
00318 break;
00319 }
00320 lab0:
00321 c = l - m1;
00322 }
00323 { int m2 = l - c; (void)m2;
00324 ket = c;
00325 if (c - 1 <= lb || p[c - 1] >> 5 != 3 || !((1327104 >> (p[c - 1] & 0x1f)) & 1)) goto lab1;
00326 among_var = find_among_b(s_pool, a_2, 4, 0, 0);
00327 if (!(among_var)) goto lab1;
00328 bra = c;
00329 { int ret = r_R1();
00330 if (ret == 0) goto lab1;
00331 if (ret < 0) return ret;
00332 }
00333 switch(among_var) {
00334 case 0: goto lab1;
00335 case 1:
00336 if (slice_del() == -1) return -1;
00337 break;
00338 case 2:
00339 if (in_grouping_b_U(g_st_ending, 98, 116, 0)) goto lab1;
00340 { int ret = skip_utf8(p, c, lb, l, - 3);
00341 if (ret < 0) goto lab1;
00342 c = ret;
00343 }
00344 if (slice_del() == -1) return -1;
00345 break;
00346 }
00347 lab1:
00348 c = l - m2;
00349 }
00350 { int m3 = l - c; (void)m3;
00351 ket = c;
00352 if (c - 1 <= lb || p[c - 1] >> 5 != 3 || !((1051024 >> (p[c - 1] & 0x1f)) & 1)) goto lab2;
00353 among_var = find_among_b(s_pool, a_4, 8, 0, 0);
00354 if (!(among_var)) goto lab2;
00355 bra = c;
00356 { int ret = r_R2();
00357 if (ret == 0) goto lab2;
00358 if (ret < 0) return ret;
00359 }
00360 switch(among_var) {
00361 case 0: goto lab2;
00362 case 1:
00363 if (slice_del() == -1) return -1;
00364 { int m4 = l - c; (void)m4;
00365 ket = c;
00366 if (!(eq_s_b(2, s_9))) { c = l - m4; goto lab3; }
00367 bra = c;
00368 { int m5 = l - c; (void)m5;
00369 if (c <= lb || p[c - 1] != 'e') goto lab4;
00370 c--;
00371 { c = l - m4; goto lab3; }
00372 lab4:
00373 c = l - m5;
00374 }
00375 { int ret = r_R2();
00376 if (ret == 0) { c = l - m4; goto lab3; }
00377 if (ret < 0) return ret;
00378 }
00379 if (slice_del() == -1) return -1;
00380 lab3:
00381 ;
00382 }
00383 break;
00384 case 2:
00385 { int m6 = l - c; (void)m6;
00386 if (c <= lb || p[c - 1] != 'e') goto lab5;
00387 c--;
00388 goto lab2;
00389 lab5:
00390 c = l - m6;
00391 }
00392 if (slice_del() == -1) return -1;
00393 break;
00394 case 3:
00395 if (slice_del() == -1) return -1;
00396 { int m7 = l - c; (void)m7;
00397 ket = c;
00398 { int m8 = l - c; (void)m8;
00399 if (!(eq_s_b(2, s_10))) goto lab8;
00400 goto lab7;
00401 lab8:
00402 c = l - m8;
00403 if (!(eq_s_b(2, s_11))) { c = l - m7; goto lab6; }
00404 }
00405 lab7:
00406 bra = c;
00407 { int ret = r_R1();
00408 if (ret == 0) { c = l - m7; goto lab6; }
00409 if (ret < 0) return ret;
00410 }
00411 if (slice_del() == -1) return -1;
00412 lab6:
00413 ;
00414 }
00415 break;
00416 case 4:
00417 if (slice_del() == -1) return -1;
00418 { int m9 = l - c; (void)m9;
00419 ket = c;
00420 if (c - 1 <= lb || (p[c - 1] != 103 && p[c - 1] != 104)) { c = l - m9; goto lab9; }
00421 among_var = find_among_b(s_pool, a_3, 2, 0, 0);
00422 if (!(among_var)) { c = l - m9; goto lab9; }
00423 bra = c;
00424 { int ret = r_R2();
00425 if (ret == 0) { c = l - m9; goto lab9; }
00426 if (ret < 0) return ret;
00427 }
00428 switch(among_var) {
00429 case 0: { c = l - m9; goto lab9; }
00430 case 1:
00431 if (slice_del() == -1) return -1;
00432 break;
00433 }
00434 lab9:
00435 ;
00436 }
00437 break;
00438 }
00439 lab2:
00440 c = l - m3;
00441 }
00442 return 1;
00443 }
00444
00445 int Xapian::InternalStemGerman::stem() {
00446 { int c1 = c;
00447 { int ret = r_prelude();
00448 if (ret == 0) goto lab0;
00449 if (ret < 0) return ret;
00450 }
00451 lab0:
00452 c = c1;
00453 }
00454 { int c2 = c;
00455 { int ret = r_mark_regions();
00456 if (ret == 0) goto lab1;
00457 if (ret < 0) return ret;
00458 }
00459 lab1:
00460 c = c2;
00461 }
00462 lb = c; c = l;
00463
00464 { int m3 = l - c; (void)m3;
00465 { int ret = r_standard_suffix();
00466 if (ret == 0) goto lab2;
00467 if (ret < 0) return ret;
00468 }
00469 lab2:
00470 c = l - m3;
00471 }
00472 c = lb;
00473 { int c4 = c;
00474 { int ret = r_postlude();
00475 if (ret == 0) goto lab3;
00476 if (ret < 0) return ret;
00477 }
00478 lab3:
00479 c = c4;
00480 }
00481 return 1;
00482 }
00483
00484 Xapian::InternalStemGerman::InternalStemGerman()
00485 : I_x(0), I_p2(0), I_p1(0)
00486 {
00487 }
00488
00489 Xapian::InternalStemGerman::~InternalStemGerman()
00490 {
00491 }
00492
00493 const char *
00494 Xapian::InternalStemGerman::get_description() const
00495 {
00496 return "german";
00497 }