in lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java [64:210]
int stem(char[] s, int len) {
if (len > 5 && s[len - 1] == 'x') {
if (s[len - 3] == 'a' && s[len - 2] == 'u' && s[len - 4] != 'e') s[len - 2] = 'l';
len--;
}
if (len > 3 && s[len - 1] == 'x') len--;
if (len > 3 && s[len - 1] == 's') len--;
if (len > 9 && endsWith(s, len, "issement")) {
len -= 6;
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 8 && endsWith(s, len, "issant")) {
len -= 4;
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 6 && endsWith(s, len, "ement")) {
len -= 4;
if (len > 3 && endsWith(s, len, "ive")) {
len--;
s[len - 1] = 'f';
}
return norm(s, len);
}
if (len > 11 && endsWith(s, len, "ficatrice")) {
len -= 5;
s[len - 2] = 'e';
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 10 && endsWith(s, len, "ficateur")) {
len -= 4;
s[len - 2] = 'e';
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 9 && endsWith(s, len, "catrice")) {
len -= 3;
s[len - 4] = 'q';
s[len - 3] = 'u';
s[len - 2] = 'e';
// s[len-1] = 'r' <-- unnecessary, already 'r'.
return norm(s, len);
}
if (len > 8 && endsWith(s, len, "cateur")) {
len -= 2;
s[len - 4] = 'q';
s[len - 3] = 'u';
s[len - 2] = 'e';
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 8 && endsWith(s, len, "atrice")) {
len -= 4;
s[len - 2] = 'e';
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 7 && endsWith(s, len, "ateur")) {
len -= 3;
s[len - 2] = 'e';
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 6 && endsWith(s, len, "trice")) {
len--;
s[len - 3] = 'e';
s[len - 2] = 'u';
s[len - 1] = 'r';
}
if (len > 5 && endsWith(s, len, "ième")) return norm(s, len - 4);
if (len > 7 && endsWith(s, len, "teuse")) {
len -= 2;
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 6 && endsWith(s, len, "teur")) {
len--;
s[len - 1] = 'r';
return norm(s, len);
}
if (len > 5 && endsWith(s, len, "euse")) return norm(s, len - 2);
if (len > 8 && endsWith(s, len, "ère")) {
len--;
s[len - 2] = 'e';
return norm(s, len);
}
if (len > 7 && endsWith(s, len, "ive")) {
len--;
s[len - 1] = 'f';
return norm(s, len);
}
if (len > 4 && (endsWith(s, len, "folle") || endsWith(s, len, "molle"))) {
len -= 2;
s[len - 1] = 'u';
return norm(s, len);
}
if (len > 9 && endsWith(s, len, "nnelle")) return norm(s, len - 5);
if (len > 9 && endsWith(s, len, "nnel")) return norm(s, len - 3);
if (len > 4 && endsWith(s, len, "ète")) {
len--;
s[len - 2] = 'e';
}
if (len > 8 && endsWith(s, len, "ique")) len -= 4;
if (len > 8 && endsWith(s, len, "esse")) return norm(s, len - 3);
if (len > 7 && endsWith(s, len, "inage")) return norm(s, len - 3);
if (len > 9 && endsWith(s, len, "isation")) {
len -= 7;
if (len > 5 && endsWith(s, len, "ual")) s[len - 2] = 'e';
return norm(s, len);
}
if (len > 9 && endsWith(s, len, "isateur")) return norm(s, len - 7);
if (len > 8 && endsWith(s, len, "ation")) return norm(s, len - 5);
if (len > 8 && endsWith(s, len, "ition")) return norm(s, len - 5);
return norm(s, len);
}