version 0.3.25
[fms.git] / src / unicode / utfconversion.cpp
diff --git a/src/unicode/utfconversion.cpp b/src/unicode/utfconversion.cpp
new file mode 100644 (file)
index 0000000..112ed17
--- /dev/null
@@ -0,0 +1,122 @@
+#include "../../include/unicode/utfconversion.h"\r
+\r
+namespace UTFConversion\r
+{\r
+\r
+const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)\r
+{\r
+       if(utf8string.size()==0)\r
+       {\r
+               wcstring.assign(L"");\r
+               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
+       \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
+       {       \r
+               UTF16 *deststart=reinterpret_cast<UTF16 *>(&dest[0]);\r
+               UTF16 *destend=deststart+dest.size();\r
+               \r
+               ConversionResult rval=ConvertUTF8toUTF16(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
+               \r
+               if(rval!=conversionOK)\r
+               {\r
+                       return false;   \r
+               }\r
+               \r
+               wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
+               \r
+       }\r
+       else if(sizeof(wchar_t)==4)\r
+       {\r
+               UTF32 *deststart=reinterpret_cast<UTF32 *>(&dest[0]);\r
+               UTF32 *destend=deststart+dest.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(dest.begin(),dest.end()-(destend-deststart));\r
+               \r
+       }\r
+       else\r
+       {\r
+               return false;   \r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring)\r
+{\r
+\r
+       return FromUTF8(std::vector<char>(utf8string.begin(),utf8string.end()),wcstring);\r
+\r
+}\r
+\r
+const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)\r
+{\r
+       if(wcstring.size()==0)\r
+       {\r
+               utf8string.assign("");\r
+               return true;\r
+       }\r
+\r
+       std::vector<wchar_t> source(wcstring.begin(),wcstring.end());\r
+       \r
+       if(sizeof(wchar_t)==2)\r
+       {\r
+               std::vector<char> dest(wcstring.size()*2,0);\r
+               \r
+               const UTF16 *sourcestart=reinterpret_cast<const UTF16 *>(&source[0]);\r
+               const UTF16 *sourceend=sourcestart+source.size();\r
+               \r
+               UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);\r
+               UTF8 *destend=deststart+dest.size();\r
+               \r
+               ConversionResult rval=ConvertUTF16toUTF8(&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
+       else if(sizeof(wchar_t)==4)\r
+       {\r
+               std::vector<char> dest(wcstring.size()*4,0);\r
+               \r
+               const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source[0]);\r
+               const UTF32 *sourceend=sourcestart+source.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
+       else\r
+       {\r
+               return false;\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+}      // namespace\r