summaryrefslogtreecommitdiff
path: root/src/lib/icu
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2016-04-12 22:04:35 +0200
committerMax Kellermann <max@duempel.org>2016-04-12 22:08:48 +0200
commit4eaa82fd22cc213618fc9b06654720507efe272e (patch)
tree9f13d50952ecd96b0dd87cd2bfbbaf5853a784ec /src/lib/icu
parenta497cc46f9878bd41c84d717a5398767c7cc4dcf (diff)
lib/icu/Util: add overload which throws exception
Diffstat (limited to 'src/lib/icu')
-rw-r--r--src/lib/icu/Util.cxx23
-rw-r--r--src/lib/icu/Util.hxx8
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