in src/main/java/org/apache/commons/codec/language/DoubleMetaphone.java [820:865]
private int handleS(final String value, final DoubleMetaphoneResult result, int index,
final boolean slavoGermanic) {
if (contains(value, index - 1, 3, "ISL", "YSL")) {
//-- special cases "island", "isle", "carlisle", "carlysle" --//
index++;
} else if (index == 0 && contains(value, index, 5, "SUGAR")) {
//-- special case "sugar-" --//
result.append('X', 'S');
index++;
} else if (contains(value, index, 2, "SH")) {
if (contains(value, index + 1, 4, "HEIM", "HOEK", "HOLM", "HOLZ")) {
//-- germanic --//
result.append('S');
} else {
result.append('X');
}
index += 2;
} else if (contains(value, index, 3, "SIO", "SIA") || contains(value, index, 4, "SIAN")) {
//-- Italian and Armenian --//
if (slavoGermanic) {
result.append('S');
} else {
result.append('S', 'X');
}
index += 3;
} else if (index == 0 && contains(value, index + 1, 1, "M", "N", "L", "W") ||
contains(value, index + 1, 1, "Z")) {
//-- german & anglicisations, for example "smith" match "schmidt" //
// "snider" match "schneider" --//
//-- also, -sz- in slavic language although in hungarian it //
// is pronounced "s" --//
result.append('S', 'X');
index = contains(value, index + 1, 1, "Z") ? index + 2 : index + 1;
} else if (contains(value, index, 2, "SC")) {
index = handleSC(value, result, index);
} else {
if (index == value.length() - 1 && contains(value, index - 2, 2, "AI", "OI")) {
//-- french for example "resnais", "artois" --//
result.appendAlternate('S');
} else {
result.append('S');
}
index = contains(value, index + 1, 1, "S", "Z") ? index + 2 : index + 1;
}
return index;
}