4#include "Stroika/Foundation/Containers/Common.h"
14 inline void WideStringToNarrow (
const wchar_t* wsStart,
const wchar_t* wsEnd, CodePage codePage,
string* intoResult)
17 Require (wsStart <= wsEnd);
18 if (wsStart == wsEnd) {
22 Assert ((wsEnd - wsStart) < numeric_limits<int>::max ());
23 constexpr bool kUseOptimizedApporach_ =
true;
24 if (kUseOptimizedApporach_) {
25 int wsLen =
static_cast<int> (wsEnd - wsStart);
26 int guessNewSterlLen = max<int> (wsLen, 2 * 64 - 10);
28 intoResult->resize (guessNewSterlLen);
30 ::WideCharToMultiByte (codePage, 0, wsStart, wsLen,
Containers::Start (*intoResult), guessNewSterlLen,
nullptr,
nullptr);
31 if ((nCharsWritten == 0) and (::GetLastError () == ERROR_INSUFFICIENT_BUFFER)) {
32 guessNewSterlLen = ::WideCharToMultiByte (codePage, 0, wsStart,
static_cast<int> (wsLen),
nullptr, 0,
nullptr,
nullptr);
33 intoResult->resize (guessNewSterlLen);
35 ::WideCharToMultiByte (codePage, 0, wsStart, wsLen,
Containers::Start (*intoResult), guessNewSterlLen,
nullptr,
nullptr);
37 Assert (nCharsWritten != 0);
38 Verify (nCharsWritten != 0);
39 Verify (nCharsWritten > 0);
40 Verify (nCharsWritten <= guessNewSterlLen);
41 if (nCharsWritten != guessNewSterlLen) {
42 intoResult->resize (nCharsWritten);
46 int wsLen =
static_cast<int> (wsEnd - wsStart);
47 int stringLength = ::WideCharToMultiByte (codePage, 0, wsStart, wsLen,
nullptr, 0,
nullptr,
nullptr);
48 intoResult->resize (stringLength);
49 if (stringLength != 0) {
50 Verify (::WideCharToMultiByte (codePage, 0, wsStart, wsLen,
Containers::Start (*intoResult), stringLength,
nullptr,
nullptr) == stringLength);
60 inline void NarrowStringToWide (
const char* sStart,
const char* sEnd, CodePage codePage, wstring* intoResult)
63 Require (sStart <= sEnd);
68 Assert ((sEnd - sStart) < numeric_limits<int>::max ());
69 int sLen =
static_cast<int> (sEnd - sStart);
71 const bool kUseOptimizedApporach_ =
true;
72 if (kUseOptimizedApporach_) {
73 int guessNewSterlLen = sLen;
74 Assert (guessNewSterlLen >= ::MultiByteToWideChar (codePage, 0, sStart,
static_cast<int> (sLen),
nullptr, 0));
75 intoResult->resize (guessNewSterlLen);
76 int nCharsWritten = ::MultiByteToWideChar (codePage, 0, sStart, sLen,
Containers::Start (*intoResult), guessNewSterlLen);
77 Verify (nCharsWritten != 0);
78 Verify (nCharsWritten > 0);
79 Verify (nCharsWritten <= guessNewSterlLen);
80 if (nCharsWritten != guessNewSterlLen) {
81 intoResult->resize (nCharsWritten);
85 int newStrLen = ::MultiByteToWideChar (codePage, 0, sStart, sLen,
nullptr, 0);
86 intoResult->resize (newStrLen);
88 Verify (::MultiByteToWideChar (codePage, 0, sStart, sLen,
Containers::Start (*intoResult), newStrLen) == newStrLen);
98 inline wstring BSTR2wstring (BSTR b)
113 inline CodePage Win32CharSetToCodePage (uint8_t lfCharSet)
128 Assert (CP_ACP == 0);
130 const unsigned char CP_ACP = 0;
133 Assert (ANSI_CHARSET == 0);
135 const unsigned char ANSI_CHARSET = 0;
137#ifdef DEFAULT_CHARSET
138 Assert (DEFAULT_CHARSET == 1);
140 const unsigned char DEFAULT_CHARSET = 1;
143 Assert (MAC_CHARSET == 77);
145 const unsigned char MAC_CHARSET = 77;
147#ifdef SHIFTJIS_CHARSET
148 Assert (SHIFTJIS_CHARSET == 128);
150 const unsigned char SHIFTJIS_CHARSET = 128;
152#ifdef HANGEUL_CHARSET
153 Assert (HANGEUL_CHARSET == 129);
155 const unsigned char HANGEUL_CHARSET = 129;
158 Assert (JOHAB_CHARSET == 130);
160 const unsigned char JOHAB_CHARSET = 130;
163 Assert (GB2312_CHARSET == 134);
165 const unsigned char GB2312_CHARSET = 134;
167#ifdef CHINESEBIG5_CHARSET
168 Assert (CHINESEBIG5_CHARSET == 136);
170 const unsigned char CHINESEBIG5_CHARSET = 136;
173 Assert (GREEK_CHARSET == 161);
175 const unsigned char GREEK_CHARSET = 161;
177#ifdef TURKISH_CHARSET
178 Assert (TURKISH_CHARSET == 162);
180 const unsigned char TURKISH_CHARSET = 162;
182#ifdef VIETNAMESE_CHARSET
183 Assert (VIETNAMESE_CHARSET == 163);
185 const unsigned char VIETNAMESE_CHARSET = 163;
188 Assert (HEBREW_CHARSET == 177);
190 const unsigned char HEBREW_CHARSET = 177;
193 Assert (ARABIC_CHARSET == 178);
195 const unsigned char ARABIC_CHARSET = 178;
198 Assert (BALTIC_CHARSET == 186);
200 const unsigned char BALTIC_CHARSET = 186;
202#ifdef RUSSIAN_CHARSET
203 Assert (RUSSIAN_CHARSET == 204);
205 const unsigned char RUSSIAN_CHARSET = 204;
208 Assert (THAI_CHARSET == 222);
210 const unsigned char THAI_CHARSET = 222;
212#ifdef EASTEUROPE_CHARSET
213 Assert (EASTEUROPE_CHARSET == 238);
215 const unsigned char EASTEUROPE_CHARSET = 238;
218 Assert (OEM_CHARSET == 255);
220 const unsigned char OEM_CHARSET = 255;
225 return WellKnownCodePages::kANSI;
227 return WellKnownCodePages::kMAC;
228 case SHIFTJIS_CHARSET:
229 return WellKnownCodePages::kSJIS;
230 case HANGEUL_CHARSET:
231 return WellKnownCodePages::kKorean;
233 return WellKnownCodePages::kGB2312;
234 case CHINESEBIG5_CHARSET:
235 return WellKnownCodePages::kBIG5;
237 return WellKnownCodePages::kGreek;
238 case TURKISH_CHARSET:
239 return WellKnownCodePages::kTurkish;
240 case VIETNAMESE_CHARSET:
241 return WellKnownCodePages::kVietnamese;
243 return WellKnownCodePages::kHebrew;
245 return WellKnownCodePages::kArabic;
247 return WellKnownCodePages::kArabic;
249 return WellKnownCodePages::kArabic;
251 return WellKnownCodePages::kHebrew;
253 return WellKnownCodePages::kBaltic;
254 case RUSSIAN_CHARSET:
255 return WellKnownCodePages::kCyrilic;
257 return WellKnownCodePages::kThai;
258 case EASTEUROPE_CHARSET:
259 return WellKnownCodePages::kEasternEuropean;
261 return WellKnownCodePages::kPC;
264 return WellKnownCodePages::kPCA;
276 inline CodePage Win32PrimaryLangIDToCodePage (USHORT languageIdenifier)
279 Assert (CP_ACP == 0);
281 const unsigned char CP_ACP = 0;
288 switch (PRIMARYLANGID (languageIdenifier)) {
290 return WellKnownCodePages::kArabic;
292 return WellKnownCodePages::kANSI;
294 return WellKnownCodePages::kANSI;
296 return WellKnownCodePages::kANSI;
298 return WellKnownCodePages::kGreek;
300 return WellKnownCodePages::kHebrew;
302 return WellKnownCodePages::kANSI;
304 return WellKnownCodePages::kANSI;
306 return WellKnownCodePages::kKorean;
308 return WellKnownCodePages::kEasternEuropean;
309 case LANG_PORTUGUESE:
310 return WellKnownCodePages::kANSI;
312 return WellKnownCodePages::kCyrilic;
314 return WellKnownCodePages::kANSI;
316 return WellKnownCodePages::kANSI;
318 return WellKnownCodePages::kThai;
320 return WellKnownCodePages::kTurkish;
322 return WellKnownCodePages::kCyrilic;
323 case LANG_VIETNAMESE:
324 return WellKnownCodePages::kVietnamese;
335 inline PlatformCodePageConverter::PlatformCodePageConverter (CodePage codePage)
336 : fCodePage_{codePage}
#define RequireNotNull(p)
CONTAINER::value_type * Start(CONTAINER &c)
For a contiguous container (such as a vector or basic_string) - find the pointer to the start of the ...