Logo

Programming-Idioms

This language bar is your friend. Select your favorite languages!
  • Erlang

Idiom #213 Case-insensitive string compare

Compare four strings in pair-wise variations. The string comparison can be implemented with an equality test or a containment test, must be case-insensitive and must apply Unicode casefolding.

code (C) when $a =< C andalso C =< $z -> C - $a;
code (C) when $A =< C andalso C =< $Z -> C - $A;
code(C) -> C.

isSame([C | Rest1], [C | Rest2]) when is_integer(C)->
        isSame(Rest1, Rest2);
isSame([C1 | Rest1], [C2 | Rest2]) ->
        (code(C1) == code(C2)) andalso isSame(Rest1, Rest2);
isSame([], []) -> true;
isSame(_, _) -> false.

Without tail call optimization, using the circuit breaker pattern
code (C) when $a =< C andalso C =< $z -> C - $a;
code (C) when $A =< C andalso C =< $Z -> C - $A;
code(C) -> C.

isSame([C | Rest1], [C | Rest2]) when is_integer(C)->
        isSame(Rest1, Rest2);
isSame([C1 | Rest1], [C2 | Rest2]) ->
        case (code(C1) - code(C2)) of
                0 -> isSame(Rest1, Rest2);
                _ -> false
        end;
isSame([], []) -> true;
isSame(_, _) -> false.

with tail call optimization
//no code here: see comments

In FreePascal unicode string comparison is done by the underlying widgetset. Unfortunately at least Windows (10) says the strings are different.
I did not test other widgetsets though.

New implementation...