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
00037
00038
00039
00040
00041
00042 ffint32 ffpriv_partitive_stem(ffword* word)
00043 {
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 if(!word->metadata.loan) {
00063
00064
00065
00066
00067 if((err = ffword_copy(word, &gen)))
00068 return err;
00069
00070
00071
00072
00073
00074
00075
00076 if(gen.metadata.cg != 0)
00077 return -10;
00078
00079
00080
00081
00082 if((err = ffpriv_genitive_stem(&gen)))
00083 return err;
00084
00085
00086
00087
00088
00089
00090
00091
00092 if(ffregex_match_ci("^.*([aeiouyåäöÅÄÖ][aeiouyåäöÅÄÖ]|kse|he)$", &gen.data))
00093 return ffword_delete(&gen);
00094
00095
00096
00097
00098 else if(ffstring_tail_equals_ci(&gen.data, 2, "de") || ffstring_tail_equals_ci(&gen.data, 3, "nne")) {
00099 ffword_delete(&gen);
00100 return ffstring_rfe(&word->data, 1, "t");
00101 }
00102
00103
00104
00105
00106 else if(ffstring_tail_equals_ci(&word->data, 3, "nen")) {
00107 if((err = ffword_delete(&gen)))
00108 return err;
00109 else
00110 return ffstring_rfe(&word->data, 3, "s");
00111 }
00112
00113
00114
00115
00116 else if(ffregex_match_ci("^.*(n|[ae]l|[aäÄ]r|[aäÄuy]t)$", &word->data))
00117 return ffword_delete(&gen);
00118
00119
00120
00121
00122 else
00123 ffword_delete(&gen);
00124
00125 return 0;
00126
00127 }
00128
00129
00130
00131
00132
00133 if(ffstring_last_equals(&word->data, 'i'))
00134 return 0;
00135 else
00136 return ffstring_append(&word->data, "i");
00137 }