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