summaryrefslogtreecommitdiff
path: root/platform/default/string_stdlib.cpp
diff options
context:
space:
mode:
authorartemp <artem@mapnik.org>2014-10-31 14:43:46 -0400
committerartemp <artem@mapnik.org>2014-10-31 14:43:46 -0400
commitea2416c7cf0bc1bc745dd4d219057d9d979a2dbe (patch)
tree2f70fa896d57247e82890bc8b409b3769ce31a78 /platform/default/string_stdlib.cpp
parent15cf30652cf6b6d9a52bc6eb9815fd2e19ab78e3 (diff)
downloadqtlocation-mapboxgl-ea2416c7cf0bc1bc745dd4d219057d9d979a2dbe.tar.gz
use nunicode for proper to_upper/to_lower string conversions
Diffstat (limited to 'platform/default/string_stdlib.cpp')
-rw-r--r--platform/default/string_stdlib.cpp55
1 files changed, 41 insertions, 14 deletions
diff --git a/platform/default/string_stdlib.cpp b/platform/default/string_stdlib.cpp
index 1acbfa8508..d2c02e2881 100644
--- a/platform/default/string_stdlib.cpp
+++ b/platform/default/string_stdlib.cpp
@@ -1,24 +1,51 @@
#include <mbgl/platform/platform.hpp>
-
-#include <locale>
+#include <mbgl/util/utf.hpp>
+#define NU_WITH_TOUPPER
+#define NU_WITH_TOLOWER
+#define NU_WITH_UTF8_WRITER
+#include <libnu/libnu.h>
namespace mbgl {
namespace platform {
-std::string uppercase(const std::string& string) {
- // TODO: Use a proper Unicode Special Casing-aware algorithm.
- const auto &convert = std::use_facet<std::ctype<char>>(std::locale());
- std::string converted = string;
- convert.toupper(&converted[0], &converted[0] + converted.size());
- return converted;
+std::string uppercase(const std::string& str)
+{
+ boost::u8_to_u32_iterator<std::string::const_iterator> itr(str.begin());
+ boost::u8_to_u32_iterator<std::string::const_iterator> end(str.end());
+ std::string output;
+ char buf[4];
+ for (; itr!=end; ++itr)
+ {
+ char const* up = nu_toupper(*itr);
+ if (up != 0) output.append(up);
+ else
+ {
+ std::memset(buf, 0, 4);
+ nu_utf8_write(*itr, buf);
+ output.append(buf);
+ }
+ }
+ return output;
}
-std::string lowercase(const std::string& string) {
- // TODO: Use a proper Unicode Special Casing-aware algorithm.
- const auto &convert = std::use_facet<std::ctype<char>>(std::locale());
- std::string converted = string;
- convert.tolower(&converted[0], &converted[0] + converted.size());
- return converted;
+std::string lowercase(const std::string& str)
+{
+ boost::u8_to_u32_iterator<std::string::const_iterator> itr(str.begin());
+ boost::u8_to_u32_iterator<std::string::const_iterator> end(str.end());
+ std::string output;
+ char buf[4];
+ for (; itr!=end; ++itr)
+ {
+ char const* up = nu_tolower(*itr);
+ if (up != 0) output.append(up);
+ else
+ {
+ std::memset(buf, 0, 4);
+ nu_utf8_write(*itr, buf);
+ output.append(buf);
+ }
+ }
+ return output;
}
}