00001
00002
00003
00004 #include "header.h"
00005
00006 #ifdef __cplusplus
00007 extern "C" {
00008 #endif
00009 extern int danish_ISO_8859_1_stem(struct SN_env * z);
00010 #ifdef __cplusplus
00011 }
00012 #endif
00013 static int r_undouble(struct SN_env * z);
00014 static int r_other_suffix(struct SN_env * z);
00015 static int r_consonant_pair(struct SN_env * z);
00016 static int r_main_suffix(struct SN_env * z);
00017 static int r_mark_regions(struct SN_env * z);
00018 #ifdef __cplusplus
00019 extern "C" {
00020 #endif
00021
00022
00023 extern struct SN_env * danish_ISO_8859_1_create_env(void);
00024 extern void danish_ISO_8859_1_close_env(struct SN_env * z);
00025
00026
00027 #ifdef __cplusplus
00028 }
00029 #endif
00030 static const symbol s_0_0[3] = { 'h', 'e', 'd' };
00031 static const symbol s_0_1[5] = { 'e', 't', 'h', 'e', 'd' };
00032 static const symbol s_0_2[4] = { 'e', 'r', 'e', 'd' };
00033 static const symbol s_0_3[1] = { 'e' };
00034 static const symbol s_0_4[5] = { 'e', 'r', 'e', 'd', 'e' };
00035 static const symbol s_0_5[4] = { 'e', 'n', 'd', 'e' };
00036 static const symbol s_0_6[6] = { 'e', 'r', 'e', 'n', 'd', 'e' };
00037 static const symbol s_0_7[3] = { 'e', 'n', 'e' };
00038 static const symbol s_0_8[4] = { 'e', 'r', 'n', 'e' };
00039 static const symbol s_0_9[3] = { 'e', 'r', 'e' };
00040 static const symbol s_0_10[2] = { 'e', 'n' };
00041 static const symbol s_0_11[5] = { 'h', 'e', 'd', 'e', 'n' };
00042 static const symbol s_0_12[4] = { 'e', 'r', 'e', 'n' };
00043 static const symbol s_0_13[2] = { 'e', 'r' };
00044 static const symbol s_0_14[5] = { 'h', 'e', 'd', 'e', 'r' };
00045 static const symbol s_0_15[4] = { 'e', 'r', 'e', 'r' };
00046 static const symbol s_0_16[1] = { 's' };
00047 static const symbol s_0_17[4] = { 'h', 'e', 'd', 's' };
00048 static const symbol s_0_18[2] = { 'e', 's' };
00049 static const symbol s_0_19[5] = { 'e', 'n', 'd', 'e', 's' };
00050 static const symbol s_0_20[7] = { 'e', 'r', 'e', 'n', 'd', 'e', 's' };
00051 static const symbol s_0_21[4] = { 'e', 'n', 'e', 's' };
00052 static const symbol s_0_22[5] = { 'e', 'r', 'n', 'e', 's' };
00053 static const symbol s_0_23[4] = { 'e', 'r', 'e', 's' };
00054 static const symbol s_0_24[3] = { 'e', 'n', 's' };
00055 static const symbol s_0_25[6] = { 'h', 'e', 'd', 'e', 'n', 's' };
00056 static const symbol s_0_26[5] = { 'e', 'r', 'e', 'n', 's' };
00057 static const symbol s_0_27[3] = { 'e', 'r', 's' };
00058 static const symbol s_0_28[3] = { 'e', 't', 's' };
00059 static const symbol s_0_29[5] = { 'e', 'r', 'e', 't', 's' };
00060 static const symbol s_0_30[2] = { 'e', 't' };
00061 static const symbol s_0_31[4] = { 'e', 'r', 'e', 't' };
00062
00063 static const struct among a_0[32] =
00064 {
00065 { 3, s_0_0, -1, 1, 0},
00066 { 5, s_0_1, 0, 1, 0},
00067 { 4, s_0_2, -1, 1, 0},
00068 { 1, s_0_3, -1, 1, 0},
00069 { 5, s_0_4, 3, 1, 0},
00070 { 4, s_0_5, 3, 1, 0},
00071 { 6, s_0_6, 5, 1, 0},
00072 { 3, s_0_7, 3, 1, 0},
00073 { 4, s_0_8, 3, 1, 0},
00074 { 3, s_0_9, 3, 1, 0},
00075 { 2, s_0_10, -1, 1, 0},
00076 { 5, s_0_11, 10, 1, 0},
00077 { 4, s_0_12, 10, 1, 0},
00078 { 2, s_0_13, -1, 1, 0},
00079 { 5, s_0_14, 13, 1, 0},
00080 { 4, s_0_15, 13, 1, 0},
00081 { 1, s_0_16, -1, 2, 0},
00082 { 4, s_0_17, 16, 1, 0},
00083 { 2, s_0_18, 16, 1, 0},
00084 { 5, s_0_19, 18, 1, 0},
00085 { 7, s_0_20, 19, 1, 0},
00086 { 4, s_0_21, 18, 1, 0},
00087 { 5, s_0_22, 18, 1, 0},
00088 { 4, s_0_23, 18, 1, 0},
00089 { 3, s_0_24, 16, 1, 0},
00090 { 6, s_0_25, 24, 1, 0},
00091 { 5, s_0_26, 24, 1, 0},
00092 { 3, s_0_27, 16, 1, 0},
00093 { 3, s_0_28, 16, 1, 0},
00094 { 5, s_0_29, 28, 1, 0},
00095 { 2, s_0_30, -1, 1, 0},
00096 { 4, s_0_31, 30, 1, 0}
00097 };
00098
00099 static const symbol s_1_0[2] = { 'g', 'd' };
00100 static const symbol s_1_1[2] = { 'd', 't' };
00101 static const symbol s_1_2[2] = { 'g', 't' };
00102 static const symbol s_1_3[2] = { 'k', 't' };
00103
00104 static const struct among a_1[4] =
00105 {
00106 { 2, s_1_0, -1, -1, 0},
00107 { 2, s_1_1, -1, -1, 0},
00108 { 2, s_1_2, -1, -1, 0},
00109 { 2, s_1_3, -1, -1, 0}
00110 };
00111
00112 static const symbol s_2_0[2] = { 'i', 'g' };
00113 static const symbol s_2_1[3] = { 'l', 'i', 'g' };
00114 static const symbol s_2_2[4] = { 'e', 'l', 'i', 'g' };
00115 static const symbol s_2_3[3] = { 'e', 'l', 's' };
00116 static const symbol s_2_4[4] = { 'l', 0xF8, 's', 't' };
00117
00118 static const struct among a_2[5] =
00119 {
00120 { 2, s_2_0, -1, 1, 0},
00121 { 3, s_2_1, 0, 1, 0},
00122 { 4, s_2_2, 1, 1, 0},
00123 { 3, s_2_3, -1, 1, 0},
00124 { 4, s_2_4, -1, 2, 0}
00125 };
00126
00127 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 };
00128
00129 static const unsigned char g_s_ending[] = { 239, 254, 42, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 };
00130
00131 static const symbol s_0[] = { 's', 't' };
00132 static const symbol s_1[] = { 'i', 'g' };
00133 static const symbol s_2[] = { 'l', 0xF8, 's' };
00134
00135 static int r_mark_regions(struct SN_env * z) {
00136 z->I[0] = z->l;
00137 { int c_test = z->c;
00138 { int ret = z->c + 3;
00139 if (0 > ret || ret > z->l) return 0;
00140 z->c = ret;
00141 }
00142 z->I[1] = z->c;
00143 z->c = c_test;
00144 }
00145 if (out_grouping(z, g_v, 97, 248, 1) < 0) return 0;
00146 {
00147 int ret = in_grouping(z, g_v, 97, 248, 1);
00148 if (ret < 0) return 0;
00149 z->c += ret;
00150 }
00151 z->I[0] = z->c;
00152
00153 if (!(z->I[0] < z->I[1])) goto lab0;
00154 z->I[0] = z->I[1];
00155 lab0:
00156 return 1;
00157 }
00158
00159 static int r_main_suffix(struct SN_env * z) {
00160 int among_var;
00161 { int mlimit;
00162 int m1 = z->l - z->c; (void)m1;
00163 if (z->c < z->I[0]) return 0;
00164 z->c = z->I[0];
00165 mlimit = z->lb; z->lb = z->c;
00166 z->c = z->l - m1;
00167 z->ket = z->c;
00168 if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851440 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
00169 among_var = find_among_b(z, a_0, 32);
00170 if (!(among_var)) { z->lb = mlimit; return 0; }
00171 z->bra = z->c;
00172 z->lb = mlimit;
00173 }
00174 switch(among_var) {
00175 case 0: return 0;
00176 case 1:
00177 { int ret = slice_del(z);
00178 if (ret < 0) return ret;
00179 }
00180 break;
00181 case 2:
00182 if (in_grouping_b(z, g_s_ending, 97, 229, 0)) return 0;
00183 { int ret = slice_del(z);
00184 if (ret < 0) return ret;
00185 }
00186 break;
00187 }
00188 return 1;
00189 }
00190
00191 static int r_consonant_pair(struct SN_env * z) {
00192 { int m_test = z->l - z->c;
00193 { int mlimit;
00194 int m1 = z->l - z->c; (void)m1;
00195 if (z->c < z->I[0]) return 0;
00196 z->c = z->I[0];
00197 mlimit = z->lb; z->lb = z->c;
00198 z->c = z->l - m1;
00199 z->ket = z->c;
00200 if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 116)) { z->lb = mlimit; return 0; }
00201 if (!(find_among_b(z, a_1, 4))) { z->lb = mlimit; return 0; }
00202 z->bra = z->c;
00203 z->lb = mlimit;
00204 }
00205 z->c = z->l - m_test;
00206 }
00207 if (z->c <= z->lb) return 0;
00208 z->c--;
00209 z->bra = z->c;
00210 { int ret = slice_del(z);
00211 if (ret < 0) return ret;
00212 }
00213 return 1;
00214 }
00215
00216 static int r_other_suffix(struct SN_env * z) {
00217 int among_var;
00218 { int m1 = z->l - z->c; (void)m1;
00219 z->ket = z->c;
00220 if (!(eq_s_b(z, 2, s_0))) goto lab0;
00221 z->bra = z->c;
00222 if (!(eq_s_b(z, 2, s_1))) goto lab0;
00223 { int ret = slice_del(z);
00224 if (ret < 0) return ret;
00225 }
00226 lab0:
00227 z->c = z->l - m1;
00228 }
00229 { int mlimit;
00230 int m2 = z->l - z->c; (void)m2;
00231 if (z->c < z->I[0]) return 0;
00232 z->c = z->I[0];
00233 mlimit = z->lb; z->lb = z->c;
00234 z->c = z->l - m2;
00235 z->ket = z->c;
00236 if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
00237 among_var = find_among_b(z, a_2, 5);
00238 if (!(among_var)) { z->lb = mlimit; return 0; }
00239 z->bra = z->c;
00240 z->lb = mlimit;
00241 }
00242 switch(among_var) {
00243 case 0: return 0;
00244 case 1:
00245 { int ret = slice_del(z);
00246 if (ret < 0) return ret;
00247 }
00248 { int m3 = z->l - z->c; (void)m3;
00249 { int ret = r_consonant_pair(z);
00250 if (ret == 0) goto lab1;
00251 if (ret < 0) return ret;
00252 }
00253 lab1:
00254 z->c = z->l - m3;
00255 }
00256 break;
00257 case 2:
00258 { int ret = slice_from_s(z, 3, s_2);
00259 if (ret < 0) return ret;
00260 }
00261 break;
00262 }
00263 return 1;
00264 }
00265
00266 static int r_undouble(struct SN_env * z) {
00267 { int mlimit;
00268 int m1 = z->l - z->c; (void)m1;
00269 if (z->c < z->I[0]) return 0;
00270 z->c = z->I[0];
00271 mlimit = z->lb; z->lb = z->c;
00272 z->c = z->l - m1;
00273 z->ket = z->c;
00274 if (out_grouping_b(z, g_v, 97, 248, 0)) { z->lb = mlimit; return 0; }
00275 z->bra = z->c;
00276 z->S[0] = slice_to(z, z->S[0]);
00277 if (z->S[0] == 0) return -1;
00278 z->lb = mlimit;
00279 }
00280 if (!(eq_v_b(z, z->S[0]))) return 0;
00281 { int ret = slice_del(z);
00282 if (ret < 0) return ret;
00283 }
00284 return 1;
00285 }
00286
00287 extern int danish_ISO_8859_1_stem(struct SN_env * z) {
00288 { int c1 = z->c;
00289 { int ret = r_mark_regions(z);
00290 if (ret == 0) goto lab0;
00291 if (ret < 0) return ret;
00292 }
00293 lab0:
00294 z->c = c1;
00295 }
00296 z->lb = z->c; z->c = z->l;
00297
00298 { int m2 = z->l - z->c; (void)m2;
00299 { int ret = r_main_suffix(z);
00300 if (ret == 0) goto lab1;
00301 if (ret < 0) return ret;
00302 }
00303 lab1:
00304 z->c = z->l - m2;
00305 }
00306 { int m3 = z->l - z->c; (void)m3;
00307 { int ret = r_consonant_pair(z);
00308 if (ret == 0) goto lab2;
00309 if (ret < 0) return ret;
00310 }
00311 lab2:
00312 z->c = z->l - m3;
00313 }
00314 { int m4 = z->l - z->c; (void)m4;
00315 { int ret = r_other_suffix(z);
00316 if (ret == 0) goto lab3;
00317 if (ret < 0) return ret;
00318 }
00319 lab3:
00320 z->c = z->l - m4;
00321 }
00322 { int m5 = z->l - z->c; (void)m5;
00323 { int ret = r_undouble(z);
00324 if (ret == 0) goto lab4;
00325 if (ret < 0) return ret;
00326 }
00327 lab4:
00328 z->c = z->l - m5;
00329 }
00330 z->c = z->lb;
00331 return 1;
00332 }
00333
00334 extern struct SN_env * danish_ISO_8859_1_create_env(void) { return SN_create_env(1, 2, 0); }
00335
00336 extern void danish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z, 1); }
00337