fix: change the behavior of printf in string op.
- add compiler hint for checking the arguments of printf. - change the return value of printf. from std::expected to normal value. use C++ exception to indicate error. * the error of printf usually caused by programmer. so it can be found when testing program. * so i use std::logic_error to indicate this and programmer should fix this before releasing program. - change the use of encoding convertion. for those cases that convertion must be safe, we unwrap it directly.
This commit is contained in:
@@ -18,19 +18,9 @@ namespace yycc::patch::fopen {
|
||||
|
||||
std::FILE* fopen(const char8_t* u8_filepath, const char8_t* u8_mode) {
|
||||
#if defined(YYCC_OS_WINDOWS)
|
||||
// convert mode and file path to wchar
|
||||
auto wmode = ENC::to_wchar(u8_mode);
|
||||
auto wpath = ENC::to_wchar(u8_filepath);
|
||||
|
||||
// check convertion success
|
||||
if (wmode.has_value() && wpath.has_value()) {
|
||||
// Call MSVCRT specified fopen which support wchar as argument.
|
||||
// Reference: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen?view=msvc-170
|
||||
return _wfopen(wpath.value().c_str(), wmode.value().c_str());
|
||||
} else {
|
||||
// fail to convert encoding
|
||||
return nullptr;
|
||||
}
|
||||
// Convert encoding first, and call MSVCRT specified fopen which support wchar as argument.
|
||||
// Reference: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen?view=msvc-170
|
||||
return _wfopen(ENC::to_wchar(u8_filepath).value().c_str(), ENC::to_wchar(u8_mode).value().c_str());
|
||||
#else
|
||||
return std::fopen(REINTERPRET::as_ordinary(u8_filepath), REINTERPRET::as_ordinary(u8_mode));
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user