From 57f15b64f7038d05bb26dc0838bd5b2db6c048ef Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Sat, 1 May 2021 18:31:13 +0200 Subject: [PATCH] util/platform: Add Path and String conversion utility functions --- CMakeLists.txt | 2 + source/util/util-platform.cpp | 86 +++++++++++++++++++++++++++++++++++ source/util/util-platform.hpp | 54 ++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 source/util/util-platform.cpp create mode 100644 source/util/util-platform.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d5f6aac..9a32330 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1005,6 +1005,8 @@ list(APPEND PROJECT_PRIVATE_SOURCE "source/util/util-library.hpp" "source/util/util-logging.cpp" "source/util/util-logging.hpp" + "source/util/util-platform.hpp" + "source/util/util-platform.cpp" "source/util/util-threadpool.cpp" "source/util/util-threadpool.hpp" "source/gfx/gfx-source-texture.hpp" diff --git a/source/util/util-platform.cpp b/source/util/util-platform.cpp new file mode 100644 index 0000000..56e63f5 --- /dev/null +++ b/source/util/util-platform.cpp @@ -0,0 +1,86 @@ +// Copyright 2020 Michael Fabian 'Xaymar' Dirks +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "util-platform.hpp" +#include "util-logging.hpp" + +#ifdef _DEBUG +#define ST_PREFIX "<%s> " +#define D_LOG_ERROR(x, ...) P_LOG_ERROR(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__) +#define D_LOG_WARNING(x, ...) P_LOG_WARN(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__) +#define D_LOG_INFO(x, ...) P_LOG_INFO(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__) +#define D_LOG_DEBUG(x, ...) P_LOG_DEBUG(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__) +#else +#define ST_PREFIX " " +#define D_LOG_ERROR(...) P_LOG_ERROR(ST_PREFIX __VA_ARGS__) +#define D_LOG_WARNING(...) P_LOG_WARN(ST_PREFIX __VA_ARGS__) +#define D_LOG_INFO(...) P_LOG_INFO(ST_PREFIX __VA_ARGS__) +#define D_LOG_DEBUG(...) P_LOG_DEBUG(ST_PREFIX __VA_ARGS__) +#endif + +#ifdef WIN32 +#include + +std::string streamfx::util::platform::native_to_utf8(std::wstring const& v) +{ + std::vector buffer((v.length() + 1) * 4, 0); + + DWORD res = WideCharToMultiByte(CP_UTF8, 0, v.c_str(), static_cast(v.length()), buffer.data(), + static_cast(buffer.size()), nullptr, nullptr); + if (res == 0) { + D_LOG_WARNING("Failed to convert '%ls' to UTF-8 format.", v.c_str()); + throw std::runtime_error("Failed to convert Windows-native to UTF-8."); + } + + return {buffer.data()}; +} + +std::filesystem::path streamfx::util::platform::native_to_utf8(std::filesystem::path const& v) +{ + auto wide = v.wstring(); + auto narrow = native_to_utf8(wide); + return std::filesystem::u8path(narrow); +} + +std::wstring streamfx::util::platform::utf8_to_native(std::string const& v) +{ + std::vector buffer(v.length() + 1, 0); + + DWORD res = MultiByteToWideChar(CP_UTF8, 0, v.c_str(), static_cast(v.length()), buffer.data(), + static_cast(buffer.size())); + if (res == 0) { + D_LOG_WARNING("Failed to convert '%s' to native format.", v.c_str()); + throw std::runtime_error("Failed to convert UTF-8 to Windows-native."); + } + + return {buffer.data()}; +} + +std::filesystem::path streamfx::util::platform::utf8_to_native(std::filesystem::path const& v) +{ + auto narrow = v.string(); + auto wide = utf8_to_native(narrow); + return std::filesystem::path(wide); +} + +#endif diff --git a/source/util/util-platform.hpp b/source/util/util-platform.hpp new file mode 100644 index 0000000..16b6068 --- /dev/null +++ b/source/util/util-platform.hpp @@ -0,0 +1,54 @@ +// Copyright 2020 Michael Fabian 'Xaymar' Dirks +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once +#include +#include + +namespace streamfx::util::platform { +#ifdef WIN32 + std::string native_to_utf8(std::wstring const& v); + std::filesystem::path native_to_utf8(std::filesystem::path const& v); + + std::wstring utf8_to_native(std::string const& v); + std::filesystem::path utf8_to_native(std::filesystem::path const& v); +#else + inline std::string native_to_utf8(std::string const& v) + { + return std::string(v); + }; + inline std::filesystem::path native_to_utf8(std::filesystem::path const& v) + { + return std::filesystem::path(v); + }; + + inline std::string utf8_to_native(std::string const& v) + { + return std::string(v); + }; + inline std::filesystem::path utf8_to_native(std::filesystem::path const& v) + { + return std::filesystem::path(v); + }; +#endif +} // namespace streamfx::util::platform