summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2012-06-05 10:16:50 (GMT)
committerRemko Tronçon <git@el-tramo.be>2012-06-05 10:16:50 (GMT)
commitf727641c659b0c372fb0372b588b59c7dd65e61a (patch)
tree6ac488d24b650852003a155f1387065bd9eda6ea
parente43999d275ff27970ba973edd2be68fb6b998aaf (diff)
downloadswift-contrib-f727641c659b0c372fb0372b588b59c7dd65e61a.zip
swift-contrib-f727641c659b0c372fb0372b588b59c7dd65e61a.tar.bz2
Use faster conversion functions in ICU.
-rw-r--r--Swiften/IDN/ICUConverter.h30
1 files changed, 13 insertions, 17 deletions
diff --git a/Swiften/IDN/ICUConverter.h b/Swiften/IDN/ICUConverter.h
index 6ed760a..c476b54 100644
--- a/Swiften/IDN/ICUConverter.h
+++ b/Swiften/IDN/ICUConverter.h
@@ -8,11 +8,10 @@
#pragma GCC diagnostic ignored "-Wold-style-cast"
-#include <unicode/ucnv.h>
+#include <unicode/ustring.h>
#include <cassert>
#include <string>
#include <vector>
-#include <boost/shared_ptr.hpp>
#include <Swiften/Base/ByteArray.h>
#include <Swiften/Base/SafeByteArray.h>
@@ -22,24 +21,21 @@ namespace Swift {
public:
typedef std::vector<UChar, SafeAllocator<UChar> > ICUString;
- ICUConverter() {
- UErrorCode status = U_ZERO_ERROR;
- icuConverter.reset(ucnv_open("utf-8", &status), ucnv_close);
- assert(U_SUCCESS(status));
- }
-
template<typename T>
ICUString convertToICUString(const T& s) {
ICUString result;
result.resize(s.size());
UErrorCode status = U_ZERO_ERROR;
- int icuResultLength = ucnv_toUChars(icuConverter.get(), vecptr(result), result.size(), toConstCharArray(s), s.size(), &status);
+ int icuResultLength = result.size();
+ u_strFromUTF8Lenient(vecptr(result), result.size(), &icuResultLength, toConstCharArray(s), s.size(), &status);
if (status == U_BUFFER_OVERFLOW_ERROR) {
status = U_ZERO_ERROR;
result.resize(icuResultLength);
- icuResultLength = ucnv_toUChars(icuConverter.get(), vecptr(result), result.size(), toConstCharArray(s), s.size(), &status);
+ u_strFromUTF8Lenient(vecptr(result), result.size(), &icuResultLength, toConstCharArray(s), s.size(), &status);
+ }
+ if (U_FAILURE(status)) {
+ return ICUString();
}
- assert(U_SUCCESS(status));
result.resize(icuResultLength);
return result;
}
@@ -52,13 +48,16 @@ namespace Swift {
std::vector<char, SafeAllocator<char> > result;
result.resize(input.size());
UErrorCode status = U_ZERO_ERROR;
- int inputLength = ucnv_fromUChars(icuConverter.get(), vecptr(result), result.size(), vecptr(input), input.size(), &status);
+ int inputLength = result.size();
+ u_strToUTF8(vecptr(result), result.size(), &inputLength, vecptr(input), input.size(), &status);
if (status == U_BUFFER_OVERFLOW_ERROR) {
status = U_ZERO_ERROR;
result.resize(inputLength);
- inputLength = ucnv_fromUChars(icuConverter.get(), vecptr(result), result.size(), vecptr(input), input.size(), &status);
+ u_strToUTF8(vecptr(result), result.size(), &inputLength, vecptr(input), input.size(), &status);
+ }
+ if (U_FAILURE(status)) {
+ return std::vector<char, SafeAllocator<char> >();
}
- assert(U_SUCCESS(status));
result.resize(inputLength + 1);
result[result.size() - 1] = '\0';
@@ -73,9 +72,6 @@ namespace Swift {
static const char* toConstCharArray(const std::vector<unsigned char, SafeAllocator<unsigned char> >& input) {
return reinterpret_cast<const char*>(vecptr(input));
}
-
- private:
- boost::shared_ptr<UConverter> icuConverter;
};
}