feat: update IO helper.

- add utf8 path to std::filesystem::path convertion function.
- add left-padding zero format string for printing pointer.
- update exception handler, but not finished because console helper need update.
This commit is contained in:
2024-06-13 15:24:12 +08:00
parent 015ff874f8
commit 0ef1939e6e
4 changed files with 78 additions and 30 deletions

View File

@ -1,25 +1,22 @@
#include "IOHelper.hpp"
#if YYCC_OS == YYCC_OS_WINDOWS
#include "EncodingHelper.hpp"
#include <cstdio>
#include <iostream>
#include <string>
#include <stdexcept>
#if YYCC_OS == YYCC_OS_WINDOWS
#include "WinImportPrefix.hpp"
#include <Windows.h>
#include <io.h>
#include <fcntl.h>
#include "WinImportSuffix.hpp"
#endif
namespace YYCC::IOHelper {
bool futf8(FILE* fs) {
// https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setmode?view=msvc-170
return _setmode(_fileno(fs), _O_U8TEXT) != -1;
}
FILE* UTF8FOpen(const char* u8_filepath, const char* u8_mode) {
#if YYCC_OS == YYCC_OS_WINDOWS
FILE* fopen(const char* u8_filepath, const char* u8_mode) {
// convert mode and file path to wchar
std::wstring wmode, wpath;
if (!YYCC::EncodingHelper::UTF8ToWchar(u8_mode, wmode))
@ -29,8 +26,28 @@ namespace YYCC::IOHelper {
// call microsoft specified fopen which support wchar as argument.
return _wfopen(wpath.c_str(), wmode.c_str());
#else
return std::fopen(u8_filepath, u8_mode);
#endif
}
std::filesystem::path UTF8Path(const char* u8_path) {
#if YYCC_OS == YYCC_OS_WINDOWS
// convert path to wchar
std::wstring wpath;
if (!YYCC::EncodingHelper::UTF8ToWchar(u8_path, wpath))
throw std::invalid_argument("Fail to convert given UTF8 string.");
// call microsoft specified fopen which support wchar as argument.
return std::filesystem::path(wpath);
#else
return std::filesystem::path(u8_path);
#endif
}
}
#endif