From 7c3339c549e21e7526dd32ef8ad14e0af7b0beac Mon Sep 17 00:00:00 2001 From: Marian Krivos Date: Thu, 9 Feb 2012 15:15:39 +0000 Subject: [PATCH] trunk: TextEncoding fixes --- Foundation/include/Poco/Latin2Encoding.h | 2 ++ Foundation/include/Poco/Windows1250Encoding.h | 2 ++ Foundation/include/Poco/Windows1251Encoding.h | 2 ++ Foundation/src/Latin1Encoding.cpp | 6 +++--- Foundation/src/Latin2Encoding.cpp | 20 ++++++++++++++++--- Foundation/src/Windows1250Encoding.cpp | 19 ++++++++++++++++-- Foundation/src/Windows1251Encoding.cpp | 18 +++++++++++++++-- 7 files changed, 59 insertions(+), 10 deletions(-) diff --git a/Foundation/include/Poco/Latin2Encoding.h b/Foundation/include/Poco/Latin2Encoding.h index acb87e830..61470d604 100644 --- a/Foundation/include/Poco/Latin2Encoding.h +++ b/Foundation/include/Poco/Latin2Encoding.h @@ -61,6 +61,8 @@ public: const CharacterMap& characterMap() const; int convert(const unsigned char* bytes) const; int convert(int ch, unsigned char* bytes, int length) const; + int queryConvert(const unsigned char* bytes, int length) const; + int sequenceLength(const unsigned char* bytes, int length) const; private: static const char* _names[]; diff --git a/Foundation/include/Poco/Windows1250Encoding.h b/Foundation/include/Poco/Windows1250Encoding.h index e1f09e64a..229f2790a 100644 --- a/Foundation/include/Poco/Windows1250Encoding.h +++ b/Foundation/include/Poco/Windows1250Encoding.h @@ -59,6 +59,8 @@ public: const CharacterMap& characterMap() const; int convert(const unsigned char* bytes) const; int convert(int ch, unsigned char* bytes, int length) const; + int queryConvert(const unsigned char* bytes, int length) const; + int sequenceLength(const unsigned char* bytes, int length) const; private: static const char* _names[]; diff --git a/Foundation/include/Poco/Windows1251Encoding.h b/Foundation/include/Poco/Windows1251Encoding.h index 424b69452..4c53f11e1 100644 --- a/Foundation/include/Poco/Windows1251Encoding.h +++ b/Foundation/include/Poco/Windows1251Encoding.h @@ -59,6 +59,8 @@ public: const CharacterMap& characterMap() const; int convert(const unsigned char* bytes) const; int convert(int ch, unsigned char* bytes, int length) const; + int queryConvert(const unsigned char* bytes, int length) const; + int sequenceLength(const unsigned char* bytes, int length) const; private: static const char* _names[]; diff --git a/Foundation/src/Latin1Encoding.cpp b/Foundation/src/Latin1Encoding.cpp index bdb4b407f..02053a1bc 100644 --- a/Foundation/src/Latin1Encoding.cpp +++ b/Foundation/src/Latin1Encoding.cpp @@ -106,13 +106,13 @@ const TextEncoding::CharacterMap& Latin1Encoding::characterMap() const int Latin1Encoding::convert(const unsigned char* bytes) const { - return *bytes; + return _charMap[*bytes]; } int Latin1Encoding::convert(int ch, unsigned char* bytes, int length) const { - if (ch >= 0 && ch <= 255) + if (ch >= 0 && ch <= 255 && _charMap[ch] == ch) { if (bytes && length >= 1) *bytes = (unsigned char) ch; @@ -125,7 +125,7 @@ int Latin1Encoding::convert(int ch, unsigned char* bytes, int length) const int Latin1Encoding::queryConvert(const unsigned char* bytes, int length) const { if (1 <= length) - return *bytes; + return _charMap[*bytes]; else return -1; } diff --git a/Foundation/src/Latin2Encoding.cpp b/Foundation/src/Latin2Encoding.cpp index 5d1750126..1abefe9e7 100644 --- a/Foundation/src/Latin2Encoding.cpp +++ b/Foundation/src/Latin2Encoding.cpp @@ -106,16 +106,16 @@ const TextEncoding::CharacterMap& Latin2Encoding::characterMap() const int Latin2Encoding::convert(const unsigned char* bytes) const { - return *bytes; + return _charMap[*bytes]; } int Latin2Encoding::convert(int ch, unsigned char* bytes, int length) const { - if (ch >= 0 && ch <= 255) + if (ch >= 0 && ch <= 255 && _charMap[ch] == ch) { if (bytes && length >= 1) - *bytes = ch; + *bytes = (unsigned char) ch; return 1; } else switch (ch) @@ -133,5 +133,19 @@ int Latin2Encoding::convert(int ch, unsigned char* bytes, int length) const } } +int Latin2Encoding::queryConvert(const unsigned char* bytes, int length) const +{ + if (1 <= length) + return _charMap[*bytes]; + else + return -1; +} + + +int Latin2Encoding::sequenceLength(const unsigned char* bytes, int length) const +{ + return 1; +} + } // namespace Poco diff --git a/Foundation/src/Windows1250Encoding.cpp b/Foundation/src/Windows1250Encoding.cpp index fb6af8f60..1dd4b3367 100644 --- a/Foundation/src/Windows1250Encoding.cpp +++ b/Foundation/src/Windows1250Encoding.cpp @@ -106,13 +106,13 @@ const TextEncoding::CharacterMap& Windows1250Encoding::characterMap() const int Windows1250Encoding::convert(const unsigned char* bytes) const { - return *bytes; + return _charMap[*bytes]; } int Windows1250Encoding::convert(int ch, unsigned char* bytes, int length) const { - if (ch >= 0 && ch <= 255) + if (ch >= 0 && ch <= 255 && _charMap[ch] == ch) { if (bytes && length >= 1) *bytes = (unsigned char) ch; @@ -121,5 +121,20 @@ int Windows1250Encoding::convert(int ch, unsigned char* bytes, int length) const else return 0; } +int Windows1250Encoding::queryConvert(const unsigned char* bytes, int length) const +{ + if (1 <= length) + return _charMap[*bytes]; + else + return -1; +} + + +int Windows1250Encoding::sequenceLength(const unsigned char* bytes, int length) const +{ + return 1; +} + + } // namespace Poco diff --git a/Foundation/src/Windows1251Encoding.cpp b/Foundation/src/Windows1251Encoding.cpp index 8fc5061a3..860b76a4f 100644 --- a/Foundation/src/Windows1251Encoding.cpp +++ b/Foundation/src/Windows1251Encoding.cpp @@ -106,13 +106,13 @@ const TextEncoding::CharacterMap& Windows1251Encoding::characterMap() const int Windows1251Encoding::convert(const unsigned char* bytes) const { - return *bytes; + return _charMap[*bytes]; } int Windows1251Encoding::convert(int ch, unsigned char* bytes, int length) const { - if (ch >= 0 && ch <= 255) + if (ch >= 0 && ch <= 255 && _charMap[ch] == ch) { if (bytes && length >= 1) *bytes = (unsigned char) ch; @@ -121,5 +121,19 @@ int Windows1251Encoding::convert(int ch, unsigned char* bytes, int length) const else return 0; } +int Windows1251Encoding::queryConvert(const unsigned char* bytes, int length) const +{ + if (1 <= length) + return _charMap[*bytes]; + else + return -1; +} + + +int Windows1251Encoding::sequenceLength(const unsigned char* bytes, int length) const +{ + return 1; +} + } // namespace Poco