From 7cd9583bdd2fa06b12a08d074a17ab29316adb5a Mon Sep 17 00:00:00 2001 From: Chris Beck Date: Tue, 3 Jun 2014 21:04:41 -0400 Subject: [PATCH] Fix utf8::lowercase (bug #22139) As ucs4::char is unsigned, we don't need to compare against the min value of the type. Worse, we cast the (possibly signed) min value to ucs4::char, which on plenty of systems, results in 2^31, excluding all valid unicode codepoints. Fix by gfgtdf. Patch by iceiceice. (PR #189) Commit message by ai0867. Conflicts: src/serialization/unicode.cpp src/tests/test_util.cpp --- src/serialization/string_utils.cpp | 3 +-- src/tests/test_util.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/serialization/string_utils.cpp b/src/serialization/string_utils.cpp index ae33ab7c5cc9..20d2dbbf9d79 100644 --- a/src/serialization/string_utils.cpp +++ b/src/serialization/string_utils.cpp @@ -1065,8 +1065,7 @@ utf8_string lowercase(const utf8_string& s) for(;itor != utf8_iterator::end(s); ++itor) { ucs4char uchar = *itor; // If wchar_t is less than 32 bits wide, we cannot apply towlower() to all codepoints - if(uchar <= static_cast(std::numeric_limits::max()) && - uchar >= static_cast(std::numeric_limits::min())) + if(uchar <= static_cast(std::numeric_limits::max())) uchar = towlower(static_cast(uchar)); res += utils::ucs4char_to_string(uchar); } diff --git a/src/tests/test_util.cpp b/src/tests/test_util.cpp index f03130877c74..cba6baea732b 100644 --- a/src/tests/test_util.cpp +++ b/src/tests/test_util.cpp @@ -16,6 +16,7 @@ #include +#include "serialization/string_utils.hpp" #include "util.hpp" BOOST_AUTO_TEST_SUITE( util ) @@ -74,6 +75,11 @@ BOOST_AUTO_TEST_CASE( test_lexical_cast_default ) BOOST_CHECK( result6 >= 0.499 && result6 <= 0.511 ); } +BOOST_AUTO_TEST_CASE( test_lowercase ) +{ + BOOST_CHECK_EQUAL ( utils::lowercase("FOO") , "foo" ); +} + /* vim: set ts=4 sw=4: */ BOOST_AUTO_TEST_SUITE_END()