diff options
author | Bernard Normier <bernard@zeroc.com> | 2008-04-03 11:57:07 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2008-04-03 11:57:07 -0400 |
commit | a259625f00b0321e4899f9d6ef81a7df988ac8a3 (patch) | |
tree | 3674ac5339777d7ecd232b8c35683865a2a5e1b2 /cpp | |
parent | Bug 2990 - Do not install Ice.dll.config on Windows (diff) | |
download | ice-a259625f00b0321e4899f9d6ef81a7df988ac8a3.tar.bz2 ice-a259625f00b0321e4899f9d6ef81a7df988ac8a3.tar.xz ice-a259625f00b0321e4899f9d6ef81a7df988ac8a3.zip |
Fixed bug #2984
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/IceUtil/Unicode.h | 27 | ||||
-rw-r--r-- | cpp/src/IceUtil/ConvertUTF.h | 8 | ||||
-rw-r--r-- | cpp/src/IceUtil/Unicode.cpp | 32 |
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; } |