refactor: refactor old IOHelper.
- move pointer left padding macro into single header file. - move utf8 fopen into single header but not finished. - add testbench for pointer left padding macro. - add system pointer size detector according to new migrated features requested.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
// Check OS macro
|
||||
#if (defined(YYCC_OS_WINDOWS) + defined(YYCC_OS_LINUX)) != 1
|
||||
#if (defined(YYCC_OS_WINDOWS) + defined(YYCC_OS_LINUX) + defined(YYCC_OS_MACOS)) != 1
|
||||
#error "Current operating system is not supported!"
|
||||
#endif
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace yycc::macro::os {
|
||||
enum class OsKind {
|
||||
Windows, ///< Microsoft Windows
|
||||
Linux, ///< GNU/Linux
|
||||
MacOs, ///< Apple macOS
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -20,8 +21,10 @@ namespace yycc::macro::os {
|
||||
inline constexpr OsKind get_os() {
|
||||
#if defined(YYCC_OS_WINDOWS)
|
||||
return OsKind::Windows;
|
||||
#else
|
||||
#elif defined(YYCC_OS_LINUX)
|
||||
return OsKind::Linux;
|
||||
#else
|
||||
return OsKind::MacOs;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
6
src/yycc/macro/ptr_size_detector.hpp
Normal file
6
src/yycc/macro/ptr_size_detector.hpp
Normal file
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
// Check pointer size macro
|
||||
#if (defined(YYCC_PTRSIZE_32) + defined(YYCC_PTRSIZE_64)) != 1
|
||||
#error "Current environment used pointer size is not supported!"
|
||||
#endif
|
||||
35
src/yycc/patch/fopen.cpp
Normal file
35
src/yycc/patch/fopen.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include "fopen.hpp"
|
||||
#include "../macro/os_detector.hpp"
|
||||
#include "../string/reinterpret.hpp"
|
||||
|
||||
#if defined(YYCC_OS_WINDOWS)
|
||||
#include "../windows/import_guard_head.hpp"
|
||||
#include <Windows.h>
|
||||
#include "../windows/import_guard_tail.hpp"
|
||||
#endif
|
||||
|
||||
#define REINTERPRET ::yycc::string::reinterpret
|
||||
|
||||
namespace yycc::patch::fopen {
|
||||
|
||||
std::FILE* fopen(const char8_t* u8_filepath, const char8_t* u8_mode) {
|
||||
// TODO: Fix this after finish Windows encoding
|
||||
// #if defined(YYCC_OS_WINDOWS)
|
||||
|
||||
// // convert mode and file path to wchar
|
||||
// std::wstring wmode, wpath;
|
||||
// if (!YYCC::EncodingHelper::UTF8ToWchar(u8_mode, wmode))
|
||||
// return nullptr;
|
||||
// if (!YYCC::EncodingHelper::UTF8ToWchar(u8_filepath, wpath))
|
||||
// return nullptr;
|
||||
|
||||
// // call microsoft specified fopen which support wchar as argument.
|
||||
// return _wfopen(wpath.c_str(), wmode.c_str());
|
||||
|
||||
// #else
|
||||
// return std::fopen(REINTERPRET::as_ordinary(u8_filepath), REINTERPRET::as_ordinary(u8_mode));
|
||||
// #endif
|
||||
return std::fopen(REINTERPRET::as_ordinary(u8_filepath), REINTERPRET::as_ordinary(u8_mode));
|
||||
}
|
||||
|
||||
}
|
||||
30
src/yycc/patch/fopen.hpp
Normal file
30
src/yycc/patch/fopen.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
#include <memory>
|
||||
|
||||
namespace yycc::patch::fopen {
|
||||
|
||||
/// @brief C++ standard deleter for std::FILE*
|
||||
class StdFileDeleter {
|
||||
public:
|
||||
StdFileDeleter() {}
|
||||
void operator() (std::FILE* ptr) {
|
||||
if (ptr != nullptr) {
|
||||
std::fclose(ptr);
|
||||
}
|
||||
}
|
||||
};
|
||||
/// @brief Smart unique pointer of \c std::FILE*
|
||||
using SmartStdFile = std::unique_ptr<std::FILE, StdFileDeleter>;
|
||||
|
||||
/**
|
||||
* @brief The UTF8 version of \c std::fopen.
|
||||
* @param[in] u8_filepath The UTF8 encoded path to the file to be opened.
|
||||
* @param[in] u8_mode UTF8 encoded mode string of the file to be opened.
|
||||
* @remarks
|
||||
* This function is suit for Windows because std::fopen do not support UTF8 on Windows.
|
||||
* On other platforms, this function will delegate request directly to std::fopen.
|
||||
* @return \c FILE* of the file to be opened, or nullptr if failed.
|
||||
*/
|
||||
std::FILE* fopen(const char8_t* u8_filepath, const char8_t* u8_mode);
|
||||
|
||||
}
|
||||
20
src/yycc/patch/ptr_pad.hpp
Normal file
20
src/yycc/patch/ptr_pad.hpp
Normal file
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
#include "../macro/ptr_size_detector.hpp"
|
||||
#include <cstdint>
|
||||
|
||||
/**
|
||||
* @def PRIXPTR_LPAD
|
||||
* @brief The left-padding zero format string of HEX-printed pointer type.
|
||||
* @details
|
||||
* When printing a pointer with HEX style, we usually hope it can be left-padded with some zero for easy reading.
|
||||
* In different architecture, the size of this padding is differnet too so we create this macro.
|
||||
*
|
||||
* In 32-bit environment, it will be "08" meaning left pad zero until 8 number position.
|
||||
* In 64-bit environment, it will be "016" meaning left pad zero until 16 number position.
|
||||
*/
|
||||
|
||||
#if defined(YYCC_PTRSIZE_32)
|
||||
#define PRIXPTR_LPAD "08"
|
||||
#else
|
||||
#define PRIXPTR_LPAD "016"
|
||||
#endif
|
||||
@@ -5,5 +5,5 @@
|
||||
// YYC MARK:
|
||||
// Since YYCC 2.0 version, we use CMake to handle Windows shitty macros,
|
||||
// so we do not need declare WIN32_LEAN_AND_MEAN or NOMINMAX in there.
|
||||
// But for keep the pair of this guard, we still keep this header file,
|
||||
// But for keeping the pair of this guard, we still keep this header file,
|
||||
// although it do nothing.
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
|
||||
#if defined(YYCC_OS_WINDOWS)
|
||||
|
||||
// Windows also will generate following macros
|
||||
// which may cause the function sign is different in Windows and other platforms.
|
||||
// Windows also will generate following macros which may cause
|
||||
// the function sign is different in Windows and other platforms.
|
||||
// So we simply remove them.
|
||||
// Because #undef will not throw error if there are no matched macro,
|
||||
// so we simply #undef them directly.
|
||||
// At the same time, because `#undef` will not throw error if there are no matched macro,
|
||||
// we can simply use `#undef` to remove them directly.
|
||||
#undef GetObject
|
||||
#undef GetClassName
|
||||
#undef LoadImage
|
||||
|
||||
Reference in New Issue
Block a user