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