correct _nu_tolower/_nu_toupper usage

This commit is contained in:
artemp
2014-11-17 18:15:48 +01:00
parent 66d64c7c12
commit b9ebe16224

View File

@@ -6,51 +6,71 @@
#include <libnu/libnu.h>
#include <cstring>
namespace mbgl {
namespace platform {
namespace mbgl { namespace platform {
std::string uppercase(const std::string& str)
std::string uppercase(std::string const& 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[5];
for (; itr!=end; ++itr)
std::stringstream output;
char const *itr = str.c_str(), *nitr = itr;
char const *end = itr + str.length();
char lo[5] = { 0 };
for (; itr < end; itr = nitr)
{
char const* up = nu_toupper(*itr);
if (up != 0) output.append(up);
uint32_t code_point = 0;
char const* buf = 0;
nitr = _nu_toupper(itr, end, nu_utf8_read, &code_point, &buf, 0);
if (buf != 0)
{
do
{
buf = NU_CASEMAP_DECODING_FUNCTION(buf, &code_point);
if (code_point == 0) break;
output.write(lo, nu_utf8_write(code_point, lo) - lo);
}
while (code_point != 0);
}
else
{
std::memset(buf, 0, 5);
nu_utf8_write(*itr, buf);
output.append(buf);
output.write(itr, nitr - itr);
}
}
return output;
return output.str();
}
std::string lowercase(const std::string& str)
std::string lowercase(std::string const& str)
{
std::string output;
char lo[5];
char const* itr = str.c_str();
char const* end = itr + str.length();
char const* buf = 0;
uint32_t code_point;
for ( ; itr!=end;)
{
std::stringstream output;
char const *itr = str.c_str(), *nitr = itr;
char const *end = itr + str.length();
char lo[5] = { 0 };
itr = _nu_tolower(itr, end, nu_utf8_read, &code_point, &buf, 0);
if (buf != 0) output.append(buf);
for (; itr < end; itr = nitr)
{
uint32_t code_point = 0;
char const* buf = 0;
nitr = _nu_tolower(itr, end, nu_utf8_read, &code_point, &buf, 0);
if (buf != 0)
{
do
{
buf = NU_CASEMAP_DECODING_FUNCTION(buf, &code_point);
if (code_point == 0) break;
output.write(lo, nu_utf8_write(code_point, lo) - lo);
}
while (code_point != 0);
}
else
{
std::memset(lo, 0, 5);
nu_utf8_write(code_point, lo);
output.append(lo);
output.write(itr, nitr - itr);
}
}
return output;
return output.str();
}
}
}
}}