1 
2 #include "config.h"
3 
4 #include "strutils.h"
5 
6 #include <cstdlib>
7 
8 
9 #ifdef _WIN32
10 #define WIN32_LEAN_AND_MEAN
11 #include <windows.h>
12 
wstr_to_utf8(const WCHAR * wstr)13 std::string wstr_to_utf8(const WCHAR *wstr)
14 {
15     std::string ret;
16 
17     int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, nullptr, 0, nullptr, nullptr);
18     if(len > 0)
19     {
20         ret.resize(len);
21         WideCharToMultiByte(CP_UTF8, 0, wstr, -1, &ret[0], len, nullptr, nullptr);
22         ret.pop_back();
23     }
24 
25     return ret;
26 }
27 
utf8_to_wstr(const char * str)28 std::wstring utf8_to_wstr(const char *str)
29 {
30     std::wstring ret;
31 
32     int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, nullptr, 0);
33     if(len > 0)
34     {
35         ret.resize(len);
36         MultiByteToWideChar(CP_UTF8, 0, str, -1, &ret[0], len);
37         ret.pop_back();
38     }
39 
40     return ret;
41 }
42 #endif
43 
44 namespace al {
45 
getenv(const char * envname)46 al::optional<std::string> getenv(const char *envname)
47 {
48     const char *str{std::getenv(envname)};
49     if(str && str[0] != '\0')
50         return al::make_optional<std::string>(str);
51     return al::nullopt;
52 }
53 
54 #ifdef _WIN32
getenv(const WCHAR * envname)55 al::optional<std::wstring> getenv(const WCHAR *envname)
56 {
57     const WCHAR *str{_wgetenv(envname)};
58     if(str && str[0] != L'\0')
59         return al::make_optional<std::wstring>(str);
60     return al::nullopt;
61 }
62 #endif
63 
64 } // namespace al
65