strutils.cpp 1.5 KB

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