00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "ffpriv_plural_stem.h"
00031 #include "ffpriv_genitive_stem.h"
00032 #include "ffpriv_essive_stem.h"
00033 #include "ffutil.h"
00034 #include "ffstring.h"
00035 #include "ffword.h"
00036 #include "ffregex.h"
00037 #include "ffpriv_ie_vowel_change.h"
00038
00039 ffint32 ffpriv_plural_stem(ffword* word) {
00040
00041 ffword gen;
00042 ffword ess;
00043 ffstring ori;
00044
00045 ffstring_copy(&word->data, &gen.data);
00046
00047
00048 gen.metadata = word->metadata;
00049
00050 ffpriv_genitive_stem(&gen);
00051
00052
00053
00054
00055
00056 if ( ffpriv_is_vowel(ffstring_last(&word->data)) ) {
00057 if ( ffstring_last_equals_ci(&word->data, 'i') ) {
00058 ffstring_copy(&word->data, &ori);
00059 if (ffpriv_ie_genitive(word) > 0) {
00060 if ( ffstring_tail_equals_ci(&ori, 2, "si") ) {
00061 ffstring_delete(&gen.data);
00062 ffstring_delete(&word->data);
00063 word->data = ori;
00064 return 0;
00065 }
00066
00067 ffstring_delete(&gen.data);
00068 ffstring_delete(&ori);
00069 ffstring_rfe(&word->data, 1 , "i");
00070 return 0;
00071
00072
00073 }
00074
00075
00076
00077
00078
00079 ffstring_delete(&ori);
00080 ffstring_delete(&word->data);
00081 ffstring_rfe(&gen.data, 1 , "ei");
00082 word->data = gen.data;
00083
00084 return 0;
00085
00086 }
00087
00088 if ( ffregex_match_ci("^.(ie|uo|yö)$", &word->data) ) {
00089 ffregex_replace_ci("(.).(.)", "${1}${2}i", &word->data);
00090 ffstring_delete(&gen.data);
00091 return 0;
00092 }
00093
00094 if ( ffregex_match_ci("^.(aa|ää|ee|ii|oo|öö|uu|yy)$", &word->data) ) {
00095 ffstring_delete(&word->data);
00096 ffstring_rfe(&gen.data, 1 , "i");
00097 word->data = gen.data;
00098 return 0;
00099 }
00100
00101 if ( ffregex_match_ci("^.[aoeuyäö]i$", &word->data) ) {
00102 ffstring_delete(&gen.data);
00103 return 0;
00104 }
00105
00106 if ( ffstring_tail_equals_ci(&word->data, 2, "aja") || ffstring_tail_equals_ci(&word->data, 2, "äjä") ) {
00107 ffstring_delete(&word->data);
00108 ffstring_rfe(&gen.data, 1 , "i");
00109 word->data = gen.data;
00110 return 0;
00111 }
00112
00113
00114
00115 if ( ffstring_last_equals_ci(&word->data, 'ä') ) {
00116 if ( ffregex_match_ci("^.[aeiouyåäöÅÄÖ][^aeiouyåäöÅÄÖ]+[aeiouyåäöÅÄÖ]+[^aeiouyåäöÅÄÖ]ä$", &word->data) ) {
00117 ffstring_delete(&word->data);
00118 ffstring_rfe(&gen.data, 1 , "öi");
00119 word->data = gen.data;
00120 return 0;
00121 }
00122
00123 ffstring_delete(&word->data);
00124 ffstring_rfe(&gen.data, 1 , "i");
00125 word->data = gen.data;
00126 return 0;
00127
00128 }
00129
00130 if ( ffstring_last_equals_ci(&word->data, 'a') ) {
00131 if ( ffregex_match_ci("^[^aeiouyåäöÅÄÖ][ou][aeiouyåäöÅÄÖ]*[^aeiouyåäöÅÄÖ]+a$", &word->data) ) {
00132 ffstring_delete(&word->data);
00133 ffstring_rfe(&gen.data, 1 , "i");
00134 word->data = gen.data;
00135 return 0;
00136 }
00137
00138 ffstring_delete(&word->data);
00139 ffstring_rfe(&gen.data, 1 , "oi");
00140 word->data = gen.data;
00141 return 0;
00142
00143
00144 }
00145
00146 ffstring_delete(&word->data);
00147 ffstring_append(&gen.data, "i");
00148 word->data = gen.data;
00149 return 0;
00150
00151 } else {
00152
00153 if ( word->metadata.cg ) {
00154
00155 ffstring_copy(&word->data, &ess.data);
00156 ess.metadata = word->metadata;
00157 ffpriv_essive_stem(&ess);
00158
00159 if ( ffstring_tail_equals(&ess.data, 3, "nte") ) {
00160 ffstring_delete(&gen.data);
00161 ffstring_delete(&word->data);
00162 ffstring_rfe(&ess.data, 2, "si");
00163 word->data = ess.data;
00164 return 0;
00165 }
00166
00167 if ( ffstring_tail_equals(&ess.data, 2, "te") ) {
00168 ffstring_delete(&gen.data);
00169 ffstring_delete(&word->data);
00170 ffstring_rfe(&ess.data, 2, "ksi");
00171 word->data = ess.data;
00172 return 0;
00173 }
00174
00175 ffstring_delete(&ess.data);
00176
00177 } else {
00178
00179 if ( ffstring_tail_equals(&gen.data, 2, "de") ) {
00180 ffstring_delete(&word->data);
00181 ffstring_rfe(&gen.data, 2, "ksi");
00182 word->data = gen.data;
00183 return 0;
00184 }
00185
00186 if ( ffstring_tail_equals(&gen.data, 3, "nne") ) {
00187 ffstring_delete(&word->data);
00188 ffstring_rfe(&gen.data, 2, "si");
00189 word->data = gen.data;
00190 return 0;
00191 }
00192
00193 ffstring_delete(&word->data);
00194 ffstring_rfe(&gen.data, 1, "i");
00195 word->data = gen.data;
00196 return 0;
00197 }
00198
00199 }
00200
00201
00202 ffstring_rfe(&gen.data, 1, "ei");
00203 return ffword_swap_delete(&gen,word);
00204
00205 }