123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- //
- // UTFString.h
- //
- // Library: Foundation
- // Package: Text
- // Module: UTFString
- //
- // Definitions of strings for UTF encodings.
- //
- // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef Foundation_UTFString_INCLUDED
- #define Foundation_UTFString_INCLUDED
- #include "Poco/Foundation.h"
- #include "Poco/Types.h"
- #include <string>
- namespace Poco {
- struct UTF16CharTraits
- {
- typedef std::fpos<std::mbstate_t> u16streampos;
- typedef UInt16 char_type;
- typedef int int_type;
- typedef std::streamoff off_type;
- typedef u16streampos pos_type;
- typedef std::mbstate_t state_type;
- static void assign(char_type& c1, const char_type& c2)
- {
- c1 = c2;
- }
-
- static bool eq(char_type c1, char_type c2)
- {
- return c1 == c2;
- }
-
- static bool lt(char_type c1, char_type c2)
- {
- return c1 < c2;
- }
- static int compare(const char_type* s1, const char_type* s2, std::size_t n)
- {
- for (; n; --n, ++s1, ++s2)
- {
- if (lt(*s1, *s2))
- return -1;
- if (lt(*s2, *s1))
- return 1;
- }
- return 0;
- }
- static std::size_t length(const char_type* s)
- {
- std::size_t len = 0;
- for (; !eq(*s, char_type(0)); ++s)
- ++len;
- return len;
- }
- static const char_type* find(const char_type* s, std::size_t n, const char_type& a)
- {
- for (; n; --n)
- {
- if (eq(*s, a))
- return s;
- ++s;
- }
- return 0;
- }
- static char_type* move(char_type* s1, const char_type* s2, std::size_t n)
- {
- char_type* r = s1;
- if (s1 < s2)
- {
- for (; n; --n, ++s1, ++s2)
- assign(*s1, *s2);
- }
- else if (s2 < s1)
- {
- s1 += n;
- s2 += n;
- for (; n; --n)
- assign(*--s1, *--s2);
- }
- return r;
- }
- static char_type* copy(char_type* s1, const char_type* s2, std::size_t n)
- {
- poco_assert(s2 < s1 || s2 >= s1 + n);
- char_type* r = s1;
- for (; n; --n, ++s1, ++s2)
- assign(*s1, *s2);
- return r;
- }
- static char_type* assign(char_type* s, std::size_t n, char_type a)
- {
- char_type* r = s;
- for (; n; --n, ++s)
- assign(*s, a);
- return r;
- }
- static int_type not_eof(int_type c)
- {
- return eq_int_type(c, eof()) ? ~eof() : c;
- }
-
- static char_type to_char_type(int_type c)
- {
- return char_type(c);
- }
-
- static int_type to_int_type(char_type c)
- {
- return int_type(c);
- }
-
- static bool eq_int_type(int_type c1, int_type c2)
- {
- return c1 == c2;
- }
-
- static int_type eof()
- {
- return int_type(0xDFFF);
- }
- };
- struct UTF32CharTraits
- {
- typedef std::fpos<std::mbstate_t> u32streampos;
- typedef UInt32 char_type;
- typedef int int_type;
- typedef std::streamoff off_type;
- typedef u32streampos pos_type;
- typedef std::mbstate_t state_type;
- static void assign(char_type& c1, const char_type& c2)
- {
- c1 = c2;
- }
-
- static bool eq(char_type c1, char_type c2)
- {
- return c1 == c2;
- }
-
- static bool lt(char_type c1, char_type c2)
- {
- return c1 < c2;
- }
- static int compare(const char_type* s1, const char_type* s2, std::size_t n)
- {
- for (; n; --n, ++s1, ++s2)
- {
- if (lt(*s1, *s2))
- return -1;
- if (lt(*s2, *s1))
- return 1;
- }
- return 0;
- }
- static std::size_t length(const char_type* s)
- {
- std::size_t len = 0;
- for (; !eq(*s, char_type(0)); ++s)
- ++len;
- return len;
- }
- static const char_type* find(const char_type* s, std::size_t n, const char_type& a)
- {
- for (; n; --n)
- {
- if (eq(*s, a))
- return s;
- ++s;
- }
- return 0;
- }
- static char_type* move(char_type* s1, const char_type* s2, std::size_t n)
- {
- char_type* r = s1;
- if (s1 < s2)
- {
- for (; n; --n, ++s1, ++s2)
- assign(*s1, *s2);
- }
- else if (s2 < s1)
- {
- s1 += n;
- s2 += n;
- for (; n; --n)
- assign(*--s1, *--s2);
- }
- return r;
- }
- static char_type* copy(char_type* s1, const char_type* s2, std::size_t n)
- {
- poco_assert(s2 < s1 || s2 >= s1 + n);
- char_type* r = s1;
- for (; n; --n, ++s1, ++s2)
- assign(*s1, *s2);
- return r;
- }
- static char_type* assign(char_type* s, std::size_t n, char_type a)
- {
- char_type* r = s;
- for (; n; --n, ++s)
- assign(*s, a);
- return r;
- }
- static int_type not_eof(int_type c)
- {
- return eq_int_type(c, eof()) ? ~eof() : c;
- }
-
- static char_type to_char_type(int_type c)
- {
- return char_type(c);
- }
-
- static int_type to_int_type(char_type c)
- {
- return int_type(c);
- }
-
- static bool eq_int_type(int_type c1, int_type c2)
- {
- return c1 == c2;
- }
-
- static int_type eof()
- {
- return int_type(0xDFFF);
- }
- };
- //#if defined(POCO_ENABLE_CPP11) //TODO
- // typedef char16_t UTF16Char;
- // typedef std::u16string UTF16String;
- // typedef char32_t UTF32Char;
- // typedef std::u32string UTF32String;
- //#else
- #ifdef POCO_NO_WSTRING
- typedef Poco::UInt16 UTF16Char;
- typedef std::basic_string<UTF16Char, UTF16CharTraits> UTF16String;
- typedef UInt32 UTF32Char;
- typedef std::basic_string<UTF32Char, UTF32CharTraits> UTF32String;
- #else // POCO_NO_WSTRING
- #if defined(POCO_OS_FAMILY_WINDOWS)
- typedef wchar_t UTF16Char;
- typedef std::wstring UTF16String;
- typedef UInt32 UTF32Char;
- typedef std::basic_string<UTF32Char, UTF32CharTraits> UTF32String;
- #elif defined(__SIZEOF_WCHAR_T__) //gcc
- #if (__SIZEOF_WCHAR_T__ == 2)
- typedef wchar_t UTF16Char;
- typedef std::wstring UTF16String;
- typedef UInt32 UTF32Char;
- typedef std::basic_string<UTF32Char, UTF32CharTraits> UTF32String;
- #elif (__SIZEOF_WCHAR_T__ == 4)
- typedef Poco::UInt16 UTF16Char;
- typedef std::basic_string<UTF16Char, UTF16CharTraits> UTF16String;
- typedef wchar_t UTF32Char;
- typedef std::wstring UTF32String;
- #endif
- #else // default to 32-bit wchar_t
- typedef Poco::UInt16 UTF16Char;
- typedef std::basic_string<UTF16Char, UTF16CharTraits> UTF16String;
- typedef wchar_t UTF32Char;
- typedef std::wstring UTF32String;
- #endif //POCO_OS_FAMILY_WINDOWS
- #endif //POCO_NO_WSTRING
- //#endif // POCO_ENABLE_CPP11
- } // namespace Poco
- #endif // Foundation_UTFString_INCLUDED
|