diff -r ea891871f481 -r bb5522e88ab2 misc/libphysfs/physfs_unicode.c --- a/misc/libphysfs/physfs_unicode.c Mon Apr 10 09:05:16 2017 -0400 +++ b/misc/libphysfs/physfs_unicode.c Mon Apr 10 12:06:43 2017 -0400 @@ -4,7 +4,7 @@ /* * From rfc3629, the UTF-8 spec: - * http://www.ietf.org/rfc/rfc3629.txt + * https://www.ietf.org/rfc/rfc3629.txt * * Char. number range | UTF-8 octet sequence * (hexadecimal) | (binary) @@ -447,11 +447,27 @@ static int utf8codepointcmp(const PHYSFS_uint32 cp1, const PHYSFS_uint32 cp2) { PHYSFS_uint32 folded1[3], folded2[3]; + + if (cp1 == cp2) + return 0; /* obviously matches. */ + locate_case_fold_mapping(cp1, folded1); locate_case_fold_mapping(cp2, folded2); - return ( (folded1[0] == folded2[0]) && - (folded1[1] == folded2[1]) && - (folded1[2] == folded2[2]) ); + + if (folded1[0] < folded2[0]) + return -1; + else if (folded1[0] > folded2[0]) + return 1; + else if (folded1[1] < folded2[1]) + return -1; + else if (folded1[1] > folded2[1]) + return 1; + else if (folded1[2] < folded2[2]) + return -1; + else if (folded1[2] > folded2[2]) + return 1; + + return 0; /* complete match. */ } /* utf8codepointcmp */ @@ -461,8 +477,11 @@ { const PHYSFS_uint32 cp1 = utf8codepoint(&str1); const PHYSFS_uint32 cp2 = utf8codepoint(&str2); - if (!utf8codepointcmp(cp1, cp2)) break; - if (cp1 == 0) return 1; + const int rc = utf8codepointcmp(cp1, cp2); + if (rc != 0) + return rc; + else if (cp1 == 0) + break; /* complete match. */ } /* while */ return 0; @@ -475,12 +494,15 @@ { const PHYSFS_uint32 cp1 = utf8codepoint(&str1); const PHYSFS_uint32 cp2 = utf8codepoint(&str2); - if (!utf8codepointcmp(cp1, cp2)) return 0; - if (cp1 == 0) return 1; + const int rc = utf8codepointcmp(cp1, cp2); + if (rc != 0) + return rc; + else if (cp1 == 0) + return 0; n--; } /* while */ - return 1; /* matched to n chars. */ + return 0; /* matched to n chars. */ } /* __PHYSFS_utf8strnicmp */