summaryrefslogtreecommitdiff
path: root/louloulibs
diff options
context:
space:
mode:
authorlouiz’ <louiz@louiz.org>2016-06-15 12:19:19 +0200
committerlouiz’ <louiz@louiz.org>2016-06-15 15:50:45 +0200
commit4b1c580bb9bc03d656e59d702c72c3e793a1bbe0 (patch)
treea0e6c78955d1a06f54d39f55f16d280cd8e80a21 /louloulibs
parent6235fb2d0326b18a9e013ae13dfb1fd0577ffd9f (diff)
downloadbiboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.tar.gz
biboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.tar.bz2
biboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.tar.xz
biboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.zip
cut messages at 512 bytes, taking into account the UTF-8 codepoints
ref #3067
Diffstat (limited to 'louloulibs')
-rw-r--r--louloulibs/utils/string.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/louloulibs/utils/string.cpp b/louloulibs/utils/string.cpp
index 7ed1aa3..2447f84 100644
--- a/louloulibs/utils/string.cpp
+++ b/louloulibs/utils/string.cpp
@@ -1,4 +1,5 @@
#include <utils/string.hpp>
+#include <utils/encoding.hpp>
bool to_bool(const std::string& val)
{
@@ -11,8 +12,17 @@ std::vector<std::string> cut(const std::string& val, const std::size_t size)
std::string::size_type pos = 0;
while (pos < val.size())
{
- res.emplace_back(val.substr(pos, size));
- pos += size;
+ // Get the number of chars, <= size, that contain only whole
+ // UTF-8 codepoints.
+ std::size_t s = 0;
+ auto codepoint_size = utils::get_next_codepoint_size(val[pos + s]);
+ while (s + codepoint_size <= size)
+ {
+ s += codepoint_size;
+ codepoint_size = utils::get_next_codepoint_size(val[pos + s]);
+ }
+ res.emplace_back(val.substr(pos, s));
+ pos += s;
}
return res;
}