1 | // filesystem windows_file_codecvt.cpp -----------------------------------------// |
2 | |
3 | // Copyright Beman Dawes 2009 |
4 | |
5 | // Distributed under the Boost Software License, Version 1.0. |
6 | // See http://www.boost.org/LICENSE_1_0.txt |
7 | |
8 | // Library home page: http://www.boost.org/libs/filesystem |
9 | |
10 | //--------------------------------------------------------------------------------------// |
11 | |
12 | // define BOOST_FILESYSTEM_SOURCE so that <boost/system/config.hpp> knows |
13 | // the library is being built (possibly exporting rather than importing code) |
14 | #define BOOST_FILESYSTEM_SOURCE |
15 | |
16 | #ifndef BOOST_SYSTEM_NO_DEPRECATED |
17 | # define BOOST_SYSTEM_NO_DEPRECATED |
18 | #endif |
19 | |
20 | #include <boost/filesystem/config.hpp> |
21 | #include <cwchar> // for mbstate_t |
22 | |
23 | #ifdef BOOST_WINDOWS_API |
24 | |
25 | #include "windows_file_codecvt.hpp" |
26 | |
27 | // Versions of MinGW prior to GCC 4.6 requires this |
28 | #ifndef WINVER |
29 | # define WINVER 0x0500 |
30 | #endif |
31 | |
32 | #include <windows.h> |
33 | |
34 | std::codecvt_base::result windows_file_codecvt::do_in( |
35 | std::mbstate_t &, |
36 | const char* from, const char* from_end, const char*& from_next, |
37 | wchar_t* to, wchar_t* to_end, wchar_t*& to_next) const |
38 | { |
39 | UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; |
40 | |
41 | int count; |
42 | if ((count = ::MultiByteToWideChar(codepage, MB_PRECOMPOSED, from, |
43 | static_cast<int>(from_end - from), to, static_cast<int>(to_end - to))) == 0) |
44 | { |
45 | return error; // conversion failed |
46 | } |
47 | |
48 | from_next = from_end; |
49 | to_next = to + count; |
50 | *to_next = L'\0'; |
51 | return ok; |
52 | } |
53 | |
54 | std::codecvt_base::result windows_file_codecvt::do_out( |
55 | std::mbstate_t &, |
56 | const wchar_t* from, const wchar_t* from_end, const wchar_t* & from_next, |
57 | char* to, char* to_end, char* & to_next) const |
58 | { |
59 | UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; |
60 | |
61 | int count; |
62 | if ((count = ::WideCharToMultiByte(codepage, WC_NO_BEST_FIT_CHARS, from, |
63 | static_cast<int>(from_end - from), to, static_cast<int>(to_end - to), 0, 0)) == 0) |
64 | { |
65 | return error; // conversion failed |
66 | } |
67 | |
68 | from_next = from_end; |
69 | to_next = to + count; |
70 | *to_next = '\0'; |
71 | return ok; |
72 | } |
73 | |
74 | # endif // BOOST_WINDOWS_API |
75 | |
76 | |