From 3e02890b739b4b7331a6f5d65fb3fdc1bcd57db6 Mon Sep 17 00:00:00 2001 From: frosch Date: Sat, 9 Feb 2013 17:31:07 +0000 Subject: (svn r24983) -Change: Apply the same name sorting rules to content and NewGRF list as for the server list. --- src/network/network_content_gui.cpp | 2 +- src/network/network_gui.cpp | 16 +--------------- src/newgrf_gui.cpp | 2 +- src/string.cpp | 21 ++++++++++++++++++++- src/string_func.h | 2 +- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 9f8ee75c6..efc3a93bb 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -323,7 +323,7 @@ class NetworkContentListWindow : public Window, ContentCallback { /** Sort content by name. */ static int CDECL NameSorter(const ContentInfo * const *a, const ContentInfo * const *b) { - return strnatcmp((*a)->name, (*b)->name); // Sort by name (natural sorting). + return strnatcmp((*a)->name, (*b)->name, true); // Sort by name (natural sorting). } /** Sort content by type. */ diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index c0a73d808..91eacfcee 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -263,24 +263,10 @@ protected: this->UpdateListPos(); } - /** - * Skip some of the 'garbage' in the string that we don't want to use - * to sort on. This way the alphabetical sorting will work better as - * we would be actually using those characters instead of some other - * characters such as spaces and tildes at the begin of the name. - * @param str The string to skip the initial garbage of. - * @return The string with the garbage skipped. - */ - static const char *SkipGarbage(const char *str) - { - while (*str != '\0' && (*str < 'A' || IsInsideMM(*str, '[', '`' + 1) || IsInsideMM(*str, '{', '~' + 1))) str++; - return str; - } - /** Sort servers by name. */ static int CDECL NGameNameSorter(NetworkGameList * const *a, NetworkGameList * const *b) { - int r = strnatcmp(SkipGarbage((*a)->info.server_name), SkipGarbage((*b)->info.server_name)); // Sort by name (natural sorting). + int r = strnatcmp((*a)->info.server_name, (*b)->info.server_name, true); // Sort by name (natural sorting). return r == 0 ? (*a)->address.CompareTo((*b)->address) : r; } diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 84e48da45..8f73ee4f3 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -1368,7 +1368,7 @@ private: /** Sort grfs by name. */ static int CDECL NameSorter(const GRFConfig * const *a, const GRFConfig * const *b) { - int i = strnatcmp((*a)->GetName(), (*b)->GetName()); // Sort by name (natural sorting). + int i = strnatcmp((*a)->GetName(), (*b)->GetName(), true); // Sort by name (natural sorting). if (i != 0) return i; i = (*a)->version - (*b)->version; diff --git a/src/string.cpp b/src/string.cpp index 3d0073d38..32f45ade8 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -596,15 +596,34 @@ char *strcasestr(const char *haystack, const char *needle) } #endif /* DEFINE_STRCASESTR */ +/** + * Skip some of the 'garbage' in the string that we don't want to use + * to sort on. This way the alphabetical sorting will work better as + * we would be actually using those characters instead of some other + * characters such as spaces and tildes at the begin of the name. + * @param str The string to skip the initial garbage of. + * @return The string with the garbage skipped. + */ +static const char *SkipGarbage(const char *str) +{ + while (*str != '\0' && (*str < 'A' || IsInsideMM(*str, '[', '`' + 1) || IsInsideMM(*str, '{', '~' + 1))) str++; + return str; +} + /** * Compares two strings using case insensitive natural sort. * * @param s1 First string to compare. * @param s2 Second string to compare. + * @param ignore_garbage_at_front Skip punctuation characters in the front * @return Less than zero if s1 < s2, zero if s1 == s2, greater than zero if s1 > s2. */ -int strnatcmp(const char *s1, const char *s2) +int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front) { + if (ignore_garbage_at_front) { + s1 = SkipGarbage(s1); + s2 = SkipGarbage(s2); + } #ifdef WITH_ICU if (_current_collator != NULL) { UErrorCode status = U_ZERO_ERROR; diff --git a/src/string_func.h b/src/string_func.h index 0760c380b..32d3d7e6a 100644 --- a/src/string_func.h +++ b/src/string_func.h @@ -211,6 +211,6 @@ char *strndup(const char *s, size_t len); char *strcasestr(const char *haystack, const char *needle); #endif /* strcasestr is available */ -int strnatcmp(const char *s1, const char *s2); +int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front = false); #endif /* STRING_FUNC_H */ -- cgit v1.2.3-54-g00ecf