mirror of https://github.com/bsnes-emu/bsnes.git
87 lines
2.2 KiB
C++
87 lines
2.2 KiB
C++
#pragma once
|
|
|
|
using uint = unsigned;
|
|
|
|
namespace nall {
|
|
//UTF-8 to UTF-16
|
|
struct utf16_t {
|
|
utf16_t(const char* s = "") { operator=(s); }
|
|
~utf16_t() { reset(); }
|
|
|
|
utf16_t(const utf16_t&) = delete;
|
|
auto operator=(const utf16_t&) -> utf16_t& = delete;
|
|
|
|
auto operator=(const char* s) -> utf16_t& {
|
|
reset();
|
|
if(!s) s = "";
|
|
length = MultiByteToWideChar(CP_UTF8, 0, s, -1, nullptr, 0);
|
|
buffer = new wchar_t[length + 1];
|
|
MultiByteToWideChar(CP_UTF8, 0, s, -1, buffer, length);
|
|
buffer[length] = 0;
|
|
return *this;
|
|
}
|
|
|
|
operator wchar_t*() { return buffer; }
|
|
operator const wchar_t*() const { return buffer; }
|
|
|
|
auto reset() -> void {
|
|
delete[] buffer;
|
|
length = 0;
|
|
}
|
|
|
|
auto data() -> wchar_t* { return buffer; }
|
|
auto data() const -> const wchar_t* { return buffer; }
|
|
|
|
auto size() const -> uint { return length; }
|
|
|
|
private:
|
|
wchar_t* buffer = nullptr;
|
|
uint length = 0;
|
|
};
|
|
|
|
//UTF-16 to UTF-8
|
|
struct utf8_t {
|
|
utf8_t(const wchar_t* s = L"") { operator=(s); }
|
|
~utf8_t() { reset(); }
|
|
|
|
utf8_t(const utf8_t&) = delete;
|
|
auto operator=(const utf8_t&) -> utf8_t& = delete;
|
|
|
|
auto operator=(const wchar_t* s) -> utf8_t& {
|
|
reset();
|
|
if(!s) s = L"";
|
|
length = WideCharToMultiByte(CP_UTF8, 0, s, -1, nullptr, 0, nullptr, nullptr);
|
|
buffer = new char[length + 1];
|
|
WideCharToMultiByte(CP_UTF8, 0, s, -1, buffer, length, nullptr, nullptr);
|
|
buffer[length] = 0;
|
|
return *this;
|
|
}
|
|
|
|
auto reset() -> void {
|
|
delete[] buffer;
|
|
length = 0;
|
|
}
|
|
|
|
operator char*() { return buffer; }
|
|
operator const char*() const { return buffer; }
|
|
|
|
auto data() -> char* { return buffer; }
|
|
auto data() const -> const char* { return buffer; }
|
|
|
|
auto size() const -> uint { return length; }
|
|
|
|
private:
|
|
char* buffer = nullptr;
|
|
uint length = 0;
|
|
};
|
|
|
|
inline auto utf8_arguments(int& argc, char**& argv) -> void {
|
|
wchar_t** wargv = CommandLineToArgvW(GetCommandLineW(), &argc);
|
|
argv = new char*[argc + 1]();
|
|
for(uint i = 0; i < argc; i++) {
|
|
argv[i] = new char[PATH_MAX];
|
|
strcpy(argv[i], nall::utf8_t(wargv[i]));
|
|
}
|
|
}
|
|
}
|