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