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_partitive_stem.h"
00031 #include "ffpriv_genitive_stem.h"
00032 #include "ffutil.h"
00033 #include "ffstring.h"
00034 #include "ffregex.h"
00035 #include "ffpriv_ie_vowel_change.h"
00036 #include "ffconfig.h"
00037
00038
00039
00040
00041
00042
00043 ffint32 ffpriv_partitive_stem(ffword* word) {
00044 ffint32 err;
00045 ffword gen;
00046
00047
00048
00049
00050 if((err = ffpriv_ie_partitive(word)) > 0) {
00051 return 0;
00052 } else if (err < 0) {
00053 return err;
00054 }
00055
00056
00057
00058
00059
00060
00061
00062
00063 if(!word->metadata.loan) {
00064
00065
00066
00067 if((err = ffword_copy(word, &gen))) {
00068 return err;
00069 }
00070
00071
00072
00073
00074
00075 gen.metadata.cg = 0;
00076
00077
00078
00079
00080 if((err = ffpriv_genitive_stem(&gen))) {
00081 ffword_delete(&gen);
00082 return err;
00083 }
00084
00085
00086
00087
00088
00089
00090
00091 if(ffregex_match_ci("^.*([aeiouyåäöÅÄÖ][aeiouyåäöÅÄÖ]|kse|he)$", &gen.data)) {
00092 ffword_delete(&gen);
00093 return 0;
00094 }
00095
00096
00097
00098
00099 if(ffstring_tail_equals_ci(&gen.data, 2, "de") || ffstring_tail_equals_ci(&gen.data, 3, "nne")) {
00100 ffword_delete(&gen);
00101 return ffstring_rfe(&word->data, 1, "t");
00102 }
00103
00104
00105
00106
00107 if(ffstring_tail_equals_ci(&word->data, 3, "nen")) {
00108 ffword_delete(&gen);
00109 return ffstring_rfe(&word->data, 3, "s");
00110 }
00111
00112
00113
00114
00115 if(ffregex_match_ci("^.*(n|[ae]l|[aäÄ]r|[aäÄuy]t)$", &word->data)) {
00116 ffword_delete(&gen);
00117 return 0;
00118 }
00119
00120 if (ffpriv_is_vowel(ffstring_last(&word->data))) {
00121 ffword_delete(&gen);
00122 return 0;
00123 }
00124
00125
00126
00127
00128
00129 }
00130
00131
00132
00133
00134
00135 word->metadata.loan = 1;
00136 if(ffstring_last_equals(&word->data, 'i')) {
00137 return 0;
00138 } else {
00139 return ffstring_append(&word->data, "i");
00140 }
00141 }