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