summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2008-04-03 11:57:07 -0400
committerBernard Normier <bernard@zeroc.com>2008-04-03 11:57:07 -0400
commita259625f00b0321e4899f9d6ef81a7df988ac8a3 (patch)
tree3674ac5339777d7ecd232b8c35683865a2a5e1b2 /cpp
parentBug 2990 - Do not install Ice.dll.config on Windows (diff)
downloadice-a259625f00b0321e4899f9d6ef81a7df988ac8a3.tar.bz2
ice-a259625f00b0321e4899f9d6ef81a7df988ac8a3.tar.xz
ice-a259625f00b0321e4899f9d6ef81a7df988ac8a3.zip
Fixed bug #2984
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/IceUtil/Unicode.h27
-rw-r--r--cpp/src/IceUtil/ConvertUTF.h8
-rw-r--r--cpp/src/IceUtil/Unicode.cpp32
3 files changed, 37 insertions, 30 deletions
diff --git a/cpp/include/IceUtil/Unicode.h b/cpp/include/IceUtil/Unicode.h
index 95e0d0cc562..3eaa154021c 100644
--- a/cpp/include/IceUtil/Unicode.h
+++ b/cpp/include/IceUtil/Unicode.h
@@ -88,12 +88,10 @@ typedef unsigned char Byte;
ICE_UTIL_API bool
isLegalUTF8Sequence(const Byte* source, const Byte* end);
-enum ConversionResult
+enum ConversionError
{
- conversionOK, /* conversion successful */
- sourceExhausted, /* partial character in source, but hit end */
- targetExhausted, /* insuff. room in target for conversion */
- sourceIllegal /* source sequence is illegal/malformed */
+ partialCharacter,
+ badEncoding
};
//
@@ -104,16 +102,16 @@ class ICE_UTIL_API UTFConversionException : public Exception
{
public:
- UTFConversionException(const char*, int, ConversionResult);
+ UTFConversionException(const char*, int, ConversionError);
virtual std::string ice_name() const;
virtual void ice_print(std::ostream&) const;
virtual Exception* ice_clone() const;
virtual void ice_throw() const;
- ConversionResult conversionResult() const;
+ ConversionError conversionError() const;
private:
- const ConversionResult _conversionResult;
+ const ConversionError _conversionError;
static const char* _name;
};
@@ -137,16 +135,23 @@ enum ConversionFlags
lenientConversion
};
+enum ConversionResult
+{
+ conversionOK, /* conversion successful */
+ sourceExhausted, /* partial character in source, but hit end */
+ targetExhausted, /* insuff. room in target for conversion */
+ sourceIllegal /* source sequence is illegal/malformed */
+};
-ICE_UTIL_API IceUtil::ConversionResult
+ICE_UTIL_API ConversionResult
convertUTFWstringToUTF8(const wchar_t*& sourceStart, const wchar_t* sourceEnd,
IceUtil::Byte*& targetStart, IceUtil::Byte* targetEnd, ConversionFlags flags);
-ICE_UTIL_API IceUtil::ConversionResult
+ICE_UTIL_API ConversionResult
convertUTF8ToUTFWstring(const IceUtil::Byte*& sourceStart, const IceUtil::Byte* sourceEnd,
wchar_t*& targetStart, wchar_t* targetEnd, ConversionFlags flags);
-ICE_UTIL_API IceUtil::ConversionResult
+ICE_UTIL_API ConversionResult
convertUTF8ToUTFWstring(const IceUtil::Byte*& sourceStart, const IceUtil::Byte* sourceEnd,
std::wstring& target, ConversionFlags flags);
diff --git a/cpp/src/IceUtil/ConvertUTF.h b/cpp/src/IceUtil/ConvertUTF.h
index db25674998c..40973ac0e84 100644
--- a/cpp/src/IceUtil/ConvertUTF.h
+++ b/cpp/src/IceUtil/ConvertUTF.h
@@ -118,19 +118,19 @@ typedef bool Boolean; /* 0 or 1 */
#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
-IceUtil::ConversionResult ConvertUTF8toUTF16(
+ConversionResult ConvertUTF8toUTF16(
const UTF8** sourceStart, const UTF8* sourceEnd,
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
-IceUtil::ConversionResult ConvertUTF16toUTF8 (
+ConversionResult ConvertUTF16toUTF8 (
const UTF16** sourceStart, const UTF16* sourceEnd,
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
-IceUtil::ConversionResult ConvertUTF8toUTF32(
+ConversionResult ConvertUTF8toUTF32(
const UTF8** sourceStart, const UTF8* sourceEnd,
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
-IceUtil::ConversionResult ConvertUTF32toUTF8(
+ConversionResult ConvertUTF32toUTF8(
const UTF32** sourceStart, const UTF32* sourceEnd,
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
diff --git a/cpp/src/IceUtil/Unicode.cpp b/cpp/src/IceUtil/Unicode.cpp
index 01073d69ad7..226259bd21d 100644
--- a/cpp/src/IceUtil/Unicode.cpp
+++ b/cpp/src/IceUtil/Unicode.cpp
@@ -136,9 +136,9 @@ IceUtilInternal::convertUTF8ToUTFWstring(const Byte*& sourceStart, const Byte* s
const char* IceUtil::UTFConversionException::_name = "IceUtil::UTFConversionException";
IceUtil::UTFConversionException::UTFConversionException(const char* file, int line,
- ConversionResult cr):
+ ConversionError ce):
Exception(file, line),
- _conversionResult(cr)
+ _conversionError(ce)
{}
string
@@ -151,16 +151,13 @@ void
IceUtil::UTFConversionException::ice_print(ostream& os) const
{
Exception::ice_print(os);
- switch(_conversionResult)
+ switch(_conversionError)
{
- case sourceExhausted:
- os << ": source exhausted";
+ case partialCharacter:
+ os << ": partial character";
break;
- case targetExhausted:
- os << ": target exhausted";
- break;
- case sourceIllegal:
- os << ": illegal source";
+ case badEncoding:
+ os << ": bad encoding";
break;
default:
assert(0);
@@ -180,10 +177,10 @@ IceUtil::UTFConversionException::ice_throw() const
throw *this;
}
-IceUtil::ConversionResult
-IceUtil::UTFConversionException::conversionResult() const
+IceUtil::ConversionError
+IceUtil::UTFConversionException::conversionError() const
{
- return _conversionResult;
+ return _conversionError;
}
@@ -208,7 +205,9 @@ IceUtil::wstringToString(const wstring& wstr)
if(cr != conversionOK)
{
delete[] outBuf;
- throw UTFConversionException(__FILE__, __LINE__, cr);
+ assert(cr == sourceExhausted || cr == sourceIllegal);
+ throw UTFConversionException(__FILE__, __LINE__,
+ cr == sourceExhausted ? partialCharacter : badEncoding);
}
string s(reinterpret_cast<char*>(outBuf),
@@ -230,7 +229,10 @@ IceUtil::stringToWstring(const string& str)
if(cr != conversionOK)
{
- throw UTFConversionException(__FILE__, __LINE__, cr);
+ assert(cr == sourceExhausted || cr == sourceIllegal);
+
+ throw UTFConversionException(__FILE__, __LINE__,
+ cr == sourceExhausted ? partialCharacter : badEncoding);
}
return result;
}