diff --git a/src/string.cpp b/src/string.cpp index fd3d8c6210..7ea8265575 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -620,6 +620,37 @@ static const char *SkipGarbage(const char *str) return str; } +static int _strnatcmpIntl(const char *s1, const char *s2) { + while (*s1 && *s2) { + if (IsInsideBS(*s1, '0', 10) && IsInsideBS(*s2, '0', 10)) { + uint n1 = 0; + uint n2 = 0; + for (; IsInsideBS(*s1, '0', 10); s1++) { + n1 = (n1 * 10) + (*s1 - '0'); + } + for (; IsInsideBS(*s2, '0', 10); s2++) { + n2 = (n2 * 10) + (*s2 - '0'); + } + if (n1 != n2) return n1 > n2 ? 1 : -1; + } else { + char c1 = tolower(*s1); + char c2 = tolower(*s2); + if (c1 != c2) { + return c1 > c2 ? 1 : -1; + } + s1++; + s2++; + } + } + if (*s1 && !*s2) { + return 1; + } else if (*s2 && !*s1) { + return -1; + } else { + return 0; + } +} + /** * Compares two strings using case insensitive natural sort. * @@ -643,8 +674,8 @@ int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front) #endif /* WITH_ICU_SORT */ - /* Do a normal comparison if ICU is missing or if we cannot create a collator. */ - return strcasecmp(s1, s2); + /* Do a manual natural sort comparison if ICU is missing or if we cannot create a collator. */ + return _strnatcmpIntl(s1, s2); } #ifdef WITH_ICU_SORT