diff options
author | Max Kellermann <max@duempel.org> | 2016-04-12 22:04:35 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2016-04-12 22:08:48 +0200 |
commit | 4eaa82fd22cc213618fc9b06654720507efe272e (patch) | |
tree | 9f13d50952ecd96b0dd87cd2bfbbaf5853a784ec /src/lib/icu | |
parent | a497cc46f9878bd41c84d717a5398767c7cc4dcf (diff) |
lib/icu/Util: add overload which throws exception
Diffstat (limited to 'src/lib/icu')
-rw-r--r-- | src/lib/icu/Util.cxx | 23 | ||||
-rw-r--r-- | src/lib/icu/Util.hxx | 8 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/lib/icu/Util.cxx b/src/lib/icu/Util.cxx index 57cf2f59f..bd276756a 100644 --- a/src/lib/icu/Util.cxx +++ b/src/lib/icu/Util.cxx @@ -27,6 +27,7 @@ #include <unicode/ustring.h> #include <memory> +#include <stdexcept> #include <assert.h> #include <string.h> @@ -73,3 +74,25 @@ UCharToUTF8(ConstBuffer<UChar> src) dest[dest_length] = 0; return AllocatedString<>::Donate(dest.release()); } + +AllocatedString<> +UCharToUTF8Throw(ConstBuffer<UChar> src) +{ + assert(!src.IsNull()); + + /* worst-case estimate */ + size_t dest_capacity = 4 * src.size; + + std::unique_ptr<char[]> dest(new char[dest_capacity + 1]); + + UErrorCode error_code = U_ZERO_ERROR; + int32_t dest_length; + u_strToUTF8(dest.get(), dest_capacity, &dest_length, + src.data, src.size, + &error_code); + if (U_FAILURE(error_code)) + throw std::runtime_error(u_errorName(error_code)); + + dest[dest_length] = 0; + return AllocatedString<>::Donate(dest.release()); +} diff --git a/src/lib/icu/Util.hxx b/src/lib/icu/Util.hxx index e2dd3713c..c72d6330f 100644 --- a/src/lib/icu/Util.hxx +++ b/src/lib/icu/Util.hxx @@ -40,4 +40,12 @@ UCharFromUTF8(const char *src); AllocatedString<char> UCharToUTF8(ConstBuffer<UChar> src); +/** + * Wrapper for u_strToUTF8(). + * + * Throws std::runtime_error on error. + */ +AllocatedString<char> +UCharToUTF8Throw(ConstBuffer<UChar> src); + #endif |