environment_win.hpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. //
  2. // process/environment/detail/environment_win.hpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2021 Klemens D. Morgenstern (klemens dot morgenstern at gmx dot net)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #ifndef BOOST_PROCESS_V2_DETAIL_ENVIRONMENT_WIN_HPP
  11. #define BOOST_PROCESS_V2_DETAIL_ENVIRONMENT_WIN_HPP
  12. #include <boost/process/v2/detail/config.hpp>
  13. #include <boost/process/v2/cstring_ref.hpp>
  14. #include <cwctype>
  15. BOOST_PROCESS_V2_BEGIN_NAMESPACE
  16. namespace environment
  17. {
  18. using char_type = wchar_t;
  19. template<typename Char>
  20. struct key_char_traits
  21. {
  22. typedef Char char_type;
  23. typedef typename std::char_traits<char_type>::int_type int_type;
  24. typedef typename std::char_traits<char_type>::off_type off_type;
  25. typedef typename std::char_traits<char_type>::pos_type pos_type;
  26. typedef typename std::char_traits<char_type>::state_type state_type;
  27. BOOST_CONSTEXPR static char to_lower(char c) {return std::tolower(to_int_type(c));}
  28. BOOST_CONSTEXPR static wchar_t to_lower(wchar_t c) {return std::towlower(to_int_type(c));}
  29. BOOST_CONSTEXPR static int_type to_lower(int_type i, char ) {return std::tolower(i);}
  30. BOOST_CONSTEXPR static int_type to_lower(int_type i, wchar_t) {return std::towlower(i);}
  31. BOOST_CONSTEXPR static
  32. void assign(char_type& c1, const char_type& c2) BOOST_NOEXCEPT
  33. {
  34. c1 = c2;
  35. }
  36. BOOST_CONSTEXPR static
  37. bool eq(char_type c1, char_type c2) BOOST_NOEXCEPT
  38. {
  39. return to_lower(c1) == to_lower(c2);
  40. }
  41. BOOST_CONSTEXPR static
  42. bool lt(char_type c1, char_type c2) BOOST_NOEXCEPT
  43. {
  44. return to_lower(c1) < to_lower(c2);
  45. }
  46. BOOST_CXX14_CONSTEXPR static
  47. int compare(const char_type* s1, const char_type* s2, size_t n) BOOST_NOEXCEPT
  48. {
  49. auto itrs = std::mismatch(s1, s1 + n, s2, &eq);
  50. if (itrs.first == (s1 + n))
  51. return 0;
  52. auto c1 = to_lower(*itrs.first);
  53. auto c2 = to_lower(*itrs.second);
  54. return (c1 < c2 ) ? -1 : 1;
  55. }
  56. static size_t length(const char* s) BOOST_NOEXCEPT { return std::strlen(s); }
  57. static size_t length(const wchar_t* s) BOOST_NOEXCEPT { return std::wcslen(s); }
  58. BOOST_CXX14_CONSTEXPR static
  59. const char_type* find(const char_type* s, size_t n, const char_type& a) BOOST_NOEXCEPT
  60. {
  61. const char_type u = to_lower(a);
  62. return std::find_if(s, s + n, [u](char_type c){return to_lower(c) == u;});
  63. }
  64. BOOST_CXX14_CONSTEXPR static
  65. char_type* move(char_type* s1, const char_type* s2, size_t n) BOOST_NOEXCEPT
  66. {
  67. if (s1 < s2)
  68. return std::move(s2, s2 + n, s1);
  69. else
  70. return std::move_backward(s2, s2 + n, s1);
  71. }
  72. BOOST_CONSTEXPR static
  73. char_type* copy(char_type* s1, const char_type* s2, size_t n) BOOST_NOEXCEPT
  74. {
  75. return std::copy(s2, s2 + n, s1);
  76. }
  77. BOOST_CXX14_CONSTEXPR static
  78. char_type* assign(char_type* s, size_t n, char_type a) BOOST_NOEXCEPT
  79. {
  80. std::fill(s, s + n, a);
  81. return s +n;
  82. }
  83. BOOST_CONSTEXPR static
  84. int_type not_eof(int_type c) BOOST_NOEXCEPT
  85. {
  86. return eq_int_type(c, eof()) ? ~eof() : c;
  87. }
  88. BOOST_CONSTEXPR static
  89. char_type to_char_type(int_type c) BOOST_NOEXCEPT
  90. {
  91. return char_type(c);
  92. }
  93. BOOST_CONSTEXPR static
  94. int_type to_int_type(char c) BOOST_NOEXCEPT
  95. {
  96. return int_type((unsigned char)c);
  97. }
  98. BOOST_CONSTEXPR static
  99. int_type to_int_type(wchar_t c) BOOST_NOEXCEPT
  100. {
  101. return int_type((wchar_t)c);
  102. }
  103. BOOST_CONSTEXPR static
  104. bool eq_int_type(int_type c1, int_type c2) BOOST_NOEXCEPT
  105. {
  106. return to_lower(c1, char_type()) == to_lower(c2, char_type());
  107. }
  108. BOOST_CONSTEXPR static inline int_type eof() BOOST_NOEXCEPT
  109. {
  110. return int_type(EOF);
  111. }
  112. };
  113. namespace detail
  114. {
  115. template<typename Char>
  116. std::size_t hash_step(std::size_t prev, Char c, key_char_traits<Char>)
  117. {
  118. return prev ^ (key_char_traits<Char>::to_lower(c) << 1);
  119. }
  120. }
  121. template<typename Char>
  122. using value_char_traits = std::char_traits<Char>;
  123. BOOST_CONSTEXPR static char_type equality_sign = L'=';
  124. BOOST_CONSTEXPR static char_type delimiter = L';';
  125. using native_handle_type = wchar_t*;
  126. using native_iterator = const wchar_t*;
  127. namespace detail
  128. {
  129. BOOST_PROCESS_V2_DECL
  130. std::basic_string<wchar_t, value_char_traits<wchar_t>> get(
  131. basic_cstring_ref<wchar_t, key_char_traits<wchar_t>> key,
  132. error_code & ec);
  133. BOOST_PROCESS_V2_DECL
  134. void set(basic_cstring_ref<wchar_t, key_char_traits<wchar_t>> key,
  135. basic_cstring_ref<wchar_t, value_char_traits<wchar_t>> value,
  136. error_code & ec);
  137. BOOST_PROCESS_V2_DECL
  138. void unset(basic_cstring_ref<wchar_t, key_char_traits<wchar_t>> key,
  139. error_code & ec);
  140. BOOST_PROCESS_V2_DECL
  141. std::basic_string<char, value_char_traits<char>> get(
  142. basic_cstring_ref<char, key_char_traits<char>> key,
  143. error_code & ec);
  144. BOOST_PROCESS_V2_DECL
  145. void set(basic_cstring_ref<char, key_char_traits<char>> key,
  146. basic_cstring_ref<char, value_char_traits<char>> value,
  147. error_code & ec);
  148. BOOST_PROCESS_V2_DECL
  149. void unset(basic_cstring_ref<char, key_char_traits<char>> key,
  150. error_code & ec);
  151. BOOST_PROCESS_V2_DECL native_handle_type load_native_handle();
  152. struct native_handle_deleter
  153. {
  154. native_handle_deleter() = default;
  155. native_handle_deleter(const native_handle_deleter& ) = default;
  156. BOOST_PROCESS_V2_DECL void operator()(native_handle_type nh) const;
  157. };
  158. inline const char_type * dereference(native_iterator iterator) {return iterator;}
  159. BOOST_PROCESS_V2_DECL native_iterator next(native_iterator nh);
  160. BOOST_PROCESS_V2_DECL native_iterator find_end(native_handle_type nh);
  161. BOOST_PROCESS_V2_DECL bool is_executable(const filesystem::path & pth, error_code & ec);
  162. }
  163. }
  164. BOOST_PROCESS_V2_END_NAMESPACE
  165. #endif //BOOST_PROCESS_V2_DETAIL_ENVIRONMENT_WIN_HPP