version 0.3.33
[fms.git] / src / unicode / utfconversion.cpp
index 112ed17..8d62b88 100644 (file)
@@ -1,9 +1,13 @@
 #include "../../include/unicode/utfconversion.h"\r
 \r
+#ifdef _WIN32\r
+#include "../../include/pstdint.h"\r
+#endif\r
+\r
 namespace UTFConversion\r
 {\r
 \r
-const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)\r
+const bool FromUTF8(const std::vector<std::string::value_type> &utf8string, std::wstring &wcstring)\r
 {\r
        if(utf8string.size()==0)\r
        {\r
@@ -11,12 +15,12 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
                return true;\r
        }\r
 \r
-       std::vector<wchar_t> dest(utf8string.size(),0);         // dest will never be bigger than the input but could be smaller\r
+       std::vector<std::wstring::value_type> dest(utf8string.size(),0);                // dest will never be bigger than the input but could be smaller\r
        \r
        const UTF8 *sourcestart=reinterpret_cast<const UTF8 *>(&utf8string[0]);\r
        const UTF8 *sourceend=sourcestart+utf8string.size();\r
        \r
-       if(sizeof(wchar_t)==2)\r
+       if(sizeof(std::wstring::value_type)==2 && sizeof(UTF16)==2)\r
        {       \r
                UTF16 *deststart=reinterpret_cast<UTF16 *>(&dest[0]);\r
                UTF16 *destend=deststart+dest.size();\r
@@ -31,7 +35,7 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
                wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
                \r
        }\r
-       else if(sizeof(wchar_t)==4)\r
+       else if(sizeof(std::wstring::value_type)==4 && sizeof(UTF32)==4)\r
        {\r
                UTF32 *deststart=reinterpret_cast<UTF32 *>(&dest[0]);\r
                UTF32 *destend=deststart+dest.size();\r
@@ -40,7 +44,7 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
 \r
                if(rval!=conversionOK)\r
                {\r
-                       return false;   \r
+                       return false;\r
                }\r
                \r
                wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
@@ -48,7 +52,19 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
        }\r
        else\r
        {\r
-               return false;   \r
+               std::vector<uint32_t> dest2(utf8string.size(),0);\r
+               UTF32 *deststart=reinterpret_cast<UTF32 *>(&dest2[0]);\r
+               UTF32 *destend=deststart+dest2.size();\r
+\r
+               ConversionResult rval=ConvertUTF8toUTF32(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
+\r
+               if(rval!=conversionOK)\r
+               {\r
+                       return false;\r
+               }\r
+\r
+               wcstring.assign(dest2.begin(),dest2.end()-(destend-deststart));\r
+\r
        }\r
 \r
        return true;\r
@@ -57,7 +73,15 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
 const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring)\r
 {\r
 \r
-       return FromUTF8(std::vector<char>(utf8string.begin(),utf8string.end()),wcstring);\r
+       if(utf8string.size()>0)\r
+       {\r
+               return FromUTF8(std::vector<std::string::value_type>(utf8string.begin(),utf8string.end()),wcstring);\r
+       }\r
+       else\r
+       {\r
+               wcstring.assign(L"");\r
+               return true;\r
+       }\r
 \r
 }\r
 \r
@@ -69,11 +93,11 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
                return true;\r
        }\r
 \r
-       std::vector<wchar_t> source(wcstring.begin(),wcstring.end());\r
-       \r
-       if(sizeof(wchar_t)==2)\r
+       std::vector<std::wstring::value_type> source(wcstring.begin(),wcstring.end());\r
+\r
+       if(sizeof(std::wstring::value_type)==2 && sizeof(UTF16)==2)\r
        {\r
-               std::vector<char> dest(wcstring.size()*2,0);\r
+               std::vector<std::string::value_type> dest(wcstring.size()*2,0);\r
                \r
                const UTF16 *sourcestart=reinterpret_cast<const UTF16 *>(&source[0]);\r
                const UTF16 *sourceend=sourcestart+source.size();\r
@@ -85,15 +109,15 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
                \r
                if(rval!=conversionOK)\r
                {\r
-                       return false;   \r
+                       return false;\r
                }\r
                \r
                utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
                \r
        }\r
-       else if(sizeof(wchar_t)==4)\r
+       else if(sizeof(std::wstring::value_type)==4 && sizeof(UTF32)==4)\r
        {\r
-               std::vector<char> dest(wcstring.size()*4,0);\r
+               std::vector<std::string::value_type> dest(wcstring.size()*4,0);\r
                \r
                const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source[0]);\r
                const UTF32 *sourceend=sourcestart+source.size();\r
@@ -105,7 +129,7 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
                \r
                if(rval!=conversionOK)\r
                {\r
-                       return false;   \r
+                       return false;\r
                }\r
                \r
                utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
@@ -113,7 +137,24 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
        }\r
        else\r
        {\r
-               return false;\r
+               std::vector<uint32_t> source2(wcstring.begin(),wcstring.end());\r
+               std::vector<std::string::value_type> dest(wcstring.size()*sizeof(std::wstring::value_type),0);\r
+               \r
+               const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source2[0]);\r
+               const UTF32 *sourceend=sourcestart+source2.size();\r
+\r
+               UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);\r
+               UTF8 *destend=deststart+dest.size();\r
+\r
+               ConversionResult rval=ConvertUTF32toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
+\r
+               if(rval!=conversionOK)\r
+               {\r
+                       return false;\r
+               }\r
+\r
+               utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
+\r
        }\r
 \r
        return true;\r