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