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 #include "platform_config.hpp"
13 
14 #include <cwchar>  // for mbstate_t
15 
16 #ifdef BOOST_WINDOWS_API
17 
18 #include "windows_file_codecvt.hpp"
19 
20 #include <windows.h>
21 
do_in(std::mbstate_t &,const char * from,const char * from_end,const char * & from_next,wchar_t * to,wchar_t * to_end,wchar_t * & to_next) const22 std::codecvt_base::result windows_file_codecvt::do_in(
23   std::mbstate_t &,
24   const char* from, const char* from_end, const char*& from_next,
25   wchar_t* to, wchar_t* to_end, wchar_t*& to_next) const
26 {
27   UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
28 
29   int count;
30   if ((count = ::MultiByteToWideChar(codepage, MB_PRECOMPOSED, from,
31     static_cast<int>(from_end - from), to, static_cast<int>(to_end - to))) == 0)
32   {
33     return error;  // conversion failed
34   }
35 
36   from_next = from_end;
37   to_next = to + count;
38   *to_next = L'\0';
39   return ok;
40 }
41 
do_out(std::mbstate_t &,const wchar_t * from,const wchar_t * from_end,const wchar_t * & from_next,char * to,char * to_end,char * & to_next) const42 std::codecvt_base::result windows_file_codecvt::do_out(
43   std::mbstate_t &,
44   const wchar_t* from, const wchar_t* from_end, const wchar_t*  & from_next,
45   char* to, char* to_end, char* & to_next) const
46 {
47   UINT codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
48 
49   int count;
50   if ((count = ::WideCharToMultiByte(codepage, WC_NO_BEST_FIT_CHARS, from,
51     static_cast<int>(from_end - from), to, static_cast<int>(to_end - to), 0, 0)) == 0)
52   {
53     return error;  // conversion failed
54   }
55 
56   from_next = from_end;
57   to_next = to + count;
58   *to_next = '\0';
59   return ok;
60 }
61 
62 #endif  // BOOST_WINDOWS_API
63