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