00001
00002
00003 #include <limits.h>
00004 #include "swedish.h"
00005
00006 #define s_0_0 (s_0_1 + 3)
00007 #define s_0_1 s_0_23
00008 #define s_0_2 (s_0_3 + 3)
00009 static const symbol s_pool[] = {
00010 #define s_0_3 0
00011 'h', 'e', 't', 'e', 'r', 'n', 'a',
00012 #define s_0_4 s_0_25
00013 #define s_0_5 s_0_7
00014 #define s_0_6 s_0_2
00015 #define s_0_7 s_0_27
00016 #define s_0_8 s_0_13
00017 #define s_0_9 7
00018 'a', 'r', 'n', 'e',
00019 #define s_0_10 s_0_14
00020 #define s_0_11 11
00021 'a', 's', 't', 'e',
00022 #define s_0_12 (s_0_13 + 3)
00023 #define s_0_13 15
00024 'a', 'n', 'd', 'e', 'n',
00025 #define s_0_14 s_0_30
00026 #define s_0_15 s_0_31
00027 #define s_0_16 s_0_2
00028 #define s_0_17 s_0_1
00029 #define s_0_18 s_0_2
00030 #define s_0_19 s_0_3
00031 #define s_0_20 s_0_4
00032 #define s_0_21 (s_0_11 + 1)
00033 #define s_0_22 s_0_11
00034 #define s_0_23 20
00035 'a', 'r', 'n', 'a', 's',
00036 #define s_0_24 25
00037 'e', 'r', 'n', 'a', 's',
00038 #define s_0_25 30
00039 'o', 'r', 'n', 'a', 's',
00040 #define s_0_26 (s_0_27 + 2)
00041 #define s_0_27 35
00042 'a', 'd', 'e', 's',
00043 #define s_0_28 39
00044 'a', 'n', 'd', 'e', 's',
00045 #define s_0_29 (s_0_30 + 2)
00046 #define s_0_30 44
00047 'a', 'r', 'e', 'n', 's',
00048 #define s_0_31 49
00049 'h', 'e', 't', 'e', 'n', 's',
00050 #define s_0_32 55
00051 'e', 'r', 'n', 's',
00052 #define s_0_33 59
00053 'a', 't',
00054 #define s_0_34 61
00055 'a', 'n', 'd', 'e', 't',
00056 #define s_0_35 s_0_3
00057 #define s_0_36 s_0_11
00058 #define s_1_0 66
00059 'd', 'd',
00060 #define s_1_1 68
00061 'g', 'd',
00062 #define s_1_2 70
00063 'n', 'n',
00064 #define s_1_3 72
00065 'd', 't',
00066 #define s_1_4 74
00067 'g', 't',
00068 #define s_1_5 76
00069 'k', 't',
00070 #define s_1_6 78
00071 't', 't',
00072 #define s_2_0 (s_2_1 + 1)
00073 #define s_2_1 80
00074 'l', 'i', 'g',
00075 #define s_2_2 83
00076 'e', 'l', 's',
00077 #define s_2_3 86
00078 'f', 'u', 'l', 'l', 't',
00079 #define s_2_4 91
00080 'l', 0xC3, 0xB6, 's', 't',
00081 };
00082
00083
00084 static const struct among a_0[37] =
00085 {
00086 { 1, s_0_0, -1, 1},
00087 { 4, s_0_1, 0, 1},
00088 { 4, s_0_2, 0, 1},
00089 { 7, s_0_3, 2, 1},
00090 { 4, s_0_4, 0, 1},
00091 { 2, s_0_5, -1, 1},
00092 { 1, s_0_6, -1, 1},
00093 { 3, s_0_7, 6, 1},
00094 { 4, s_0_8, 6, 1},
00095 { 4, s_0_9, 6, 1},
00096 { 3, s_0_10, 6, 1},
00097 { 4, s_0_11, 6, 1},
00098 { 2, s_0_12, -1, 1},
00099 { 5, s_0_13, 12, 1},
00100 { 4, s_0_14, 12, 1},
00101 { 5, s_0_15, 12, 1},
00102 { 3, s_0_16, -1, 1},
00103 { 2, s_0_17, -1, 1},
00104 { 2, s_0_18, -1, 1},
00105 { 5, s_0_19, 18, 1},
00106 { 2, s_0_20, -1, 1},
00107 { 1, s_0_21, -1, 2},
00108 { 2, s_0_22, 21, 1},
00109 { 5, s_0_23, 22, 1},
00110 { 5, s_0_24, 22, 1},
00111 { 5, s_0_25, 22, 1},
00112 { 2, s_0_26, 21, 1},
00113 { 4, s_0_27, 26, 1},
00114 { 5, s_0_28, 26, 1},
00115 { 3, s_0_29, 21, 1},
00116 { 5, s_0_30, 29, 1},
00117 { 6, s_0_31, 29, 1},
00118 { 4, s_0_32, 21, 1},
00119 { 2, s_0_33, -1, 1},
00120 { 5, s_0_34, -1, 1},
00121 { 3, s_0_35, -1, 1},
00122 { 3, s_0_36, -1, 1}
00123 };
00124
00125
00126 static const struct among a_1[7] =
00127 {
00128 { 2, s_1_0, -1, -1},
00129 { 2, s_1_1, -1, -1},
00130 { 2, s_1_2, -1, -1},
00131 { 2, s_1_3, -1, -1},
00132 { 2, s_1_4, -1, -1},
00133 { 2, s_1_5, -1, -1},
00134 { 2, s_1_6, -1, -1}
00135 };
00136
00137
00138 static const struct among a_2[5] =
00139 {
00140 { 2, s_2_0, -1, 1},
00141 { 3, s_2_1, 0, 1},
00142 { 3, s_2_2, -1, 1},
00143 { 5, s_2_3, -1, 3},
00144 { 5, s_2_4, -1, 2}
00145 };
00146
00147 static const unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 32 };
00148
00149 static const unsigned char g_s_ending[] = { 119, 127, 149 };
00150
00151 static const symbol s_0[] = { 'l', 0xC3, 0xB6, 's' };
00152 static const symbol s_1[] = { 'f', 'u', 'l', 'l' };
00153
00154 int Xapian::InternalStemSwedish::r_mark_regions() {
00155 I_p1 = l;
00156 { int c_test1 = c;
00157 { int ret = skip_utf8(p, c, 0, l, + 3);
00158 if (ret < 0) return 0;
00159 c = ret;
00160 }
00161 I_x = c;
00162 c = c_test1;
00163 }
00164 if (out_grouping_U(g_v, 97, 246, 1) < 0) return 0;
00165 { int ret = in_grouping_U(g_v, 97, 246, 1);
00166 if (ret < 0) return 0;
00167 c += ret;
00168 }
00169 I_p1 = c;
00170
00171 if (!(I_p1 < I_x)) goto lab0;
00172 I_p1 = I_x;
00173 lab0:
00174 return 1;
00175 }
00176
00177 int Xapian::InternalStemSwedish::r_main_suffix() {
00178 int among_var;
00179 { int m1 = l - c; (void)m1;
00180 int mlimit1;
00181 if (c < I_p1) return 0;
00182 c = I_p1;
00183 mlimit1 = lb; lb = c;
00184 c = l - m1;
00185 ket = c;
00186 if (c <= lb || p[c - 1] >> 5 != 3 || !((1851442 >> (p[c - 1] & 0x1f)) & 1)) { lb = mlimit1; return 0; }
00187 among_var = find_among_b(s_pool, a_0, 37, 0, 0);
00188 if (!(among_var)) { lb = mlimit1; return 0; }
00189 bra = c;
00190 lb = mlimit1;
00191 }
00192 switch(among_var) {
00193 case 0: return 0;
00194 case 1:
00195 if (slice_del() == -1) return -1;
00196 break;
00197 case 2:
00198 if (in_grouping_b_U(g_s_ending, 98, 121, 0)) return 0;
00199 if (slice_del() == -1) return -1;
00200 break;
00201 }
00202 return 1;
00203 }
00204
00205 int Xapian::InternalStemSwedish::r_consonant_pair() {
00206 { int m1 = l - c; (void)m1;
00207 int mlimit1;
00208 if (c < I_p1) return 0;
00209 c = I_p1;
00210 mlimit1 = lb; lb = c;
00211 c = l - m1;
00212 { int m2 = l - c; (void)m2;
00213 if (c - 1 <= lb || p[c - 1] >> 5 != 3 || !((1064976 >> (p[c - 1] & 0x1f)) & 1)) { lb = mlimit1; return 0; }
00214 if (!(find_among_b(s_pool, a_1, 7, 0, 0))) { lb = mlimit1; return 0; }
00215 c = l - m2;
00216 ket = c;
00217 { int ret = skip_utf8(p, c, lb, 0, -1);
00218 if (ret < 0) { lb = mlimit1; return 0; }
00219 c = ret;
00220 }
00221 bra = c;
00222 if (slice_del() == -1) return -1;
00223 }
00224 lb = mlimit1;
00225 }
00226 return 1;
00227 }
00228
00229 int Xapian::InternalStemSwedish::r_other_suffix() {
00230 int among_var;
00231 { int m1 = l - c; (void)m1;
00232 int mlimit1;
00233 if (c < I_p1) return 0;
00234 c = I_p1;
00235 mlimit1 = lb; lb = c;
00236 c = l - m1;
00237 ket = c;
00238 if (c - 1 <= lb || p[c - 1] >> 5 != 3 || !((1572992 >> (p[c - 1] & 0x1f)) & 1)) { lb = mlimit1; return 0; }
00239 among_var = find_among_b(s_pool, a_2, 5, 0, 0);
00240 if (!(among_var)) { lb = mlimit1; return 0; }
00241 bra = c;
00242 switch(among_var) {
00243 case 0: { lb = mlimit1; return 0; }
00244 case 1:
00245 if (slice_del() == -1) return -1;
00246 break;
00247 case 2:
00248 { int ret = slice_from_s(4, s_0);
00249 if (ret < 0) return ret;
00250 }
00251 break;
00252 case 3:
00253 { int ret = slice_from_s(4, s_1);
00254 if (ret < 0) return ret;
00255 }
00256 break;
00257 }
00258 lb = mlimit1;
00259 }
00260 return 1;
00261 }
00262
00263 int Xapian::InternalStemSwedish::stem() {
00264 { int c1 = c;
00265 { int ret = r_mark_regions();
00266 if (ret == 0) goto lab0;
00267 if (ret < 0) return ret;
00268 }
00269 lab0:
00270 c = c1;
00271 }
00272 lb = c; c = l;
00273
00274 { int m2 = l - c; (void)m2;
00275 { int ret = r_main_suffix();
00276 if (ret == 0) goto lab1;
00277 if (ret < 0) return ret;
00278 }
00279 lab1:
00280 c = l - m2;
00281 }
00282 { int m3 = l - c; (void)m3;
00283 { int ret = r_consonant_pair();
00284 if (ret == 0) goto lab2;
00285 if (ret < 0) return ret;
00286 }
00287 lab2:
00288 c = l - m3;
00289 }
00290 { int m4 = l - c; (void)m4;
00291 { int ret = r_other_suffix();
00292 if (ret == 0) goto lab3;
00293 if (ret < 0) return ret;
00294 }
00295 lab3:
00296 c = l - m4;
00297 }
00298 c = lb;
00299 return 1;
00300 }
00301
00302 Xapian::InternalStemSwedish::InternalStemSwedish()
00303 : I_x(0), I_p1(0)
00304 {
00305 }
00306
00307 Xapian::InternalStemSwedish::~InternalStemSwedish()
00308 {
00309 }
00310
00311 std::string
00312 Xapian::InternalStemSwedish::get_description() const
00313 {
00314 return "swedish";
00315 }