5d7c8357c8efaae5068f6cfde1b139fdb7f728e5
[fms.git] / src / unicode / utfconversion.cpp
1 #include "../../include/unicode/utfconversion.h"\r
2 \r
3 namespace UTFConversion\r
4 {\r
5 \r
6 const bool FromUTF8(const std::vector<std::string::value_type> &utf8string, std::wstring &wcstring)\r
7 {\r
8         if(utf8string.size()==0)\r
9         {\r
10                 wcstring.assign(L"");\r
11                 return true;\r
12         }\r
13 \r
14         std::vector<std::wstring::value_type> dest(utf8string.size(),0);                // dest will never be bigger than the input but could be smaller\r
15         \r
16         const UTF8 *sourcestart=reinterpret_cast<const UTF8 *>(&utf8string[0]);\r
17         const UTF8 *sourceend=sourcestart+utf8string.size();\r
18         \r
19         if(sizeof(wchar_t)==2)\r
20         {       \r
21                 UTF16 *deststart=reinterpret_cast<UTF16 *>(&dest[0]);\r
22                 UTF16 *destend=deststart+dest.size();\r
23                 \r
24                 ConversionResult rval=ConvertUTF8toUTF16(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
25                 \r
26                 if(rval!=conversionOK)\r
27                 {\r
28                         return false;   \r
29                 }\r
30                 \r
31                 wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
32                 \r
33         }\r
34         else if(sizeof(wchar_t)==4)\r
35         {\r
36                 UTF32 *deststart=reinterpret_cast<UTF32 *>(&dest[0]);\r
37                 UTF32 *destend=deststart+dest.size();\r
38                 \r
39                 ConversionResult rval=ConvertUTF8toUTF32(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
40 \r
41                 if(rval!=conversionOK)\r
42                 {\r
43                         return false;\r
44                 }\r
45                 \r
46                 wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
47                 \r
48         }\r
49         else\r
50         {\r
51                 return false;\r
52         }\r
53 \r
54         return true;\r
55 }\r
56 \r
57 const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring)\r
58 {\r
59 \r
60         if(utf8string.size()>0)\r
61         {\r
62                 return FromUTF8(std::vector<std::string::value_type>(utf8string.begin(),utf8string.end()),wcstring);\r
63         }\r
64         else\r
65         {\r
66                 wcstring.assign(L"");\r
67                 return true;\r
68         }\r
69 \r
70 }\r
71 \r
72 const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)\r
73 {\r
74         if(wcstring.size()==0)\r
75         {\r
76                 utf8string.assign("");\r
77                 return true;\r
78         }\r
79 \r
80         std::vector<std::wstring::value_type> source(wcstring.begin(),wcstring.end());\r
81         \r
82         if(sizeof(std::wstring::value_type)==2)\r
83         {\r
84                 std::vector<std::string::value_type> dest(wcstring.size()*2,0);\r
85                 \r
86                 const UTF16 *sourcestart=reinterpret_cast<const UTF16 *>(&source[0]);\r
87                 const UTF16 *sourceend=sourcestart+source.size();\r
88                 \r
89                 UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);\r
90                 UTF8 *destend=deststart+dest.size();\r
91                 \r
92                 ConversionResult rval=ConvertUTF16toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
93                 \r
94                 if(rval!=conversionOK)\r
95                 {\r
96                         return false;\r
97                 }\r
98                 \r
99                 utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
100                 \r
101         }\r
102         else if(sizeof(std::wstring::value_type)==4)\r
103         {\r
104                 std::vector<std::string::value_type> dest(wcstring.size()*4,0);\r
105                 \r
106                 const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source[0]);\r
107                 const UTF32 *sourceend=sourcestart+source.size();\r
108                 \r
109                 UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);\r
110                 UTF8 *destend=deststart+dest.size();\r
111                 \r
112                 ConversionResult rval=ConvertUTF32toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
113                 \r
114                 if(rval!=conversionOK)\r
115                 {\r
116                         return false;\r
117                 }\r
118                 \r
119                 utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
120                 \r
121         }\r
122         else\r
123         {\r
124                 return false;\r
125         }\r
126 \r
127         return true;\r
128 }\r
129 \r
130 }       // namespace\r