/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: LocaleConvertWide.cpp Date: 2022-9-15 File: Locale.cpp Date: 2021-6-11 Author: Reece ***/ #define I_REALLY_NEED_WIDECHAR_PUBAPI #include #include "Locale.hpp" #if !defined(AU_NO_CPPLOCALE) #include #include #endif #include namespace Aurora::Locale { // Note: [0] out of touch boomers deprecated std::wstring_convert before going for a nappy. we do not have a replacement yet // [1] the native win32 implementation appears to be more optimized than MSVC/stl #if !defined(AU_NO_CPPLOCALE) && !(defined(AURORA_COMPILER_MSVC) && defined(AU_LANG_CPP_20)) static std::wstring_convert> gUtf8Conv; #endif AUKN_SYM AuString ConvertFromWChar(const wchar_t *in) { AU_DEBUG_MEMCRUNCH; try { return ConvertFromWChar(in, wcslen(in)); } catch (...) { SysPushErrorMem("ConvertFromWChar failed"); return {}; } } AUKN_SYM AuString ConvertFromWChar(const wchar_t *in, AuMach length) { AU_DEBUG_MEMCRUNCH; try { #if defined(AU_HAS_MSFT_NATIONALLANGSUPPORT) AuString ret; auto chars = WideCharToMultiByte(CP_UTF8, 0, in, length, NULL, 0, NULL, NULL); if (!chars) { return {}; } ret.resize(chars); WideCharToMultiByte(CP_UTF8, 0, in, length, ret.data(), ret.size(), NULL, NULL); return ret; #elif !defined(AU_NO_CPPLOCALE) return gUtf8Conv.to_bytes(std::wstring(in, wcsnlen(in, length))); #else SysPushErrorUnimplemented("ConvertFromWChar"); return {}; #endif } catch (...) { SysPushErrorMem("ConvertFromWChar failed"); Debug::CheckErrors(); } return {}; } AUKN_SYM std::wstring ConvertFromUTF8(const AuString &in) { AU_DEBUG_MEMCRUNCH; try { #if defined(AU_HAS_MSFT_NATIONALLANGSUPPORT) std::wstring ret; auto chars = MultiByteToWideChar(CP_UTF8, 0, in.c_str(), in.length(), NULL, 0); if (!chars) { return {}; } ret.resize(chars); MultiByteToWideChar(CP_UTF8, 0, in.c_str(), in.length(), ret.data(), ret.size()); return ret; #elif !defined(AU_NO_CPPLOCALE) return gUtf8Conv.from_bytes(in); #else SysPushErrorUnimplemented("ConvertFromUTF8"); return {}; #endif } catch (...) { SysPushErrorMem("ConvertFromUTF8 failed"); Debug::CheckErrors(); } return {}; } }