mirror of
https://github.com/ScrelliCopter/tmx2gba.git
synced 2025-02-21 03:29:25 +11:00
correctness
This commit is contained in:
@@ -1,22 +1,10 @@
|
|||||||
cmake_minimum_required(VERSION "3.12" FATAL_ERROR)
|
cmake_minimum_required(VERSION "3.15" FATAL_ERROR)
|
||||||
project(tmx2gba VERSION "0.3")
|
project(tmx2gba VERSION "0.3")
|
||||||
|
|
||||||
# Options
|
# Options
|
||||||
option(TMX2GBA_DKP_INSTALL "Install into DEVKITPRO prefix" OFF)
|
option(TMX2GBA_DKP_INSTALL "Install into DEVKITPRO prefix" OFF)
|
||||||
option(ASAN "Enable address sanitiser" OFF)
|
option(ASAN "Enable address sanitiser" OFF)
|
||||||
|
|
||||||
# C++20 & C99
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
|
||||||
set(CMAKE_C_STANDARD 99)
|
|
||||||
|
|
||||||
# Enable strong warnings
|
|
||||||
if (MSVC)
|
|
||||||
string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
string(REPLACE "/W3" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
|
||||||
else()
|
|
||||||
add_compile_options(-Wall)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ASAN)
|
if (ASAN)
|
||||||
add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
|
add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
|
||||||
add_link_options(-fsanitize=address -shared-libasan)
|
add_link_options(-fsanitize=address -shared-libasan)
|
||||||
|
|||||||
@@ -8,6 +8,17 @@ add_executable(tmx2gba
|
|||||||
headerwriter.hpp headerwriter.cpp
|
headerwriter.hpp headerwriter.cpp
|
||||||
tmx2gba.cpp)
|
tmx2gba.cpp)
|
||||||
|
|
||||||
|
set_target_properties(tmx2gba PROPERTIES
|
||||||
|
# C++20 & C99
|
||||||
|
CXX_STANDARD 20
|
||||||
|
C_STANDARD 99)
|
||||||
|
|
||||||
|
# Enable strong warnings
|
||||||
|
target_compile_options(tmx2gba PRIVATE
|
||||||
|
$<$<CXX_COMPILER_ID:MSVC>:/Wall>
|
||||||
|
$<$<CXX_COMPILER_ID:GNU,Clang,AppleClang>:-Wall -Wextra -pedantic>
|
||||||
|
$<$<CXX_COMPILER_ID:Clang,AppleClang>:-Weverything>)
|
||||||
|
|
||||||
target_link_libraries(tmx2gba
|
target_link_libraries(tmx2gba
|
||||||
External::base64
|
External::base64
|
||||||
External::miniz
|
External::miniz
|
||||||
|
|||||||
@@ -151,6 +151,8 @@ bool ArgParse::ArgParser::CheckParse(ArgParse::ParseErr err) const
|
|||||||
case ParseErr::ARG_RANGE:
|
case ParseErr::ARG_RANGE:
|
||||||
DisplayError("Argument out of range.", false);
|
DisplayError("Argument out of range.", false);
|
||||||
return false;
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,7 +209,7 @@ bool ArgParse::ReadParamFile(std::vector<std::string>& tokens, std::istream& fil
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
quoteStr.push_back(c);
|
quoteStr.push_back(static_cast<char>(c));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,8 +35,7 @@ namespace ArgParse
|
|||||||
{
|
{
|
||||||
const std::vector<Option> options;
|
const std::vector<Option> options;
|
||||||
|
|
||||||
inline Options(const std::initializer_list<Option>&& rhs)
|
inline Options(const std::initializer_list<Option>&& rhs) : options(rhs) {}
|
||||||
: options(std::move(rhs)) {}
|
|
||||||
|
|
||||||
void ShowShortUsage(const std::string_view name, std::ostream& out) const;
|
void ShowShortUsage(const std::string_view name, std::ostream& out) const;
|
||||||
void ShowHelpUsage(const std::string_view name, std::ostream& out) const;
|
void ShowHelpUsage(const std::string_view name, std::ostream& out) const;
|
||||||
@@ -99,7 +98,7 @@ namespace ArgParse
|
|||||||
ParserState state(handler, options);
|
ParserState state(handler, options);
|
||||||
for (auto arg : args)
|
for (auto arg : args)
|
||||||
{
|
{
|
||||||
ParseErr err;
|
ParseErr err = ParseErr::UNEXPECTED;
|
||||||
switch (state.Next(arg))
|
switch (state.Next(arg))
|
||||||
{
|
{
|
||||||
case ParseCtrl::CONTINUE: continue;
|
case ParseCtrl::CONTINUE: continue;
|
||||||
|
|||||||
@@ -11,30 +11,30 @@ template <> constexpr std::string_view DatType<uint32_t>() { return "unsigned in
|
|||||||
void HeaderWriter::WriteSize(int width, int height)
|
void HeaderWriter::WriteSize(int width, int height)
|
||||||
{
|
{
|
||||||
stream << std::endl;
|
stream << std::endl;
|
||||||
WriteDefine(name + "Width", width);
|
WriteDefine(mName + "Width", width);
|
||||||
WriteDefine(name + "Height", height);
|
WriteDefine(mName + "Height", height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderWriter::WriteCharacterMap(const std::span<uint16_t> charData)
|
void HeaderWriter::WriteCharacterMap(const std::span<uint16_t> charData)
|
||||||
{
|
{
|
||||||
stream << std::endl;
|
stream << std::endl;
|
||||||
WriteDefine(name + "TilesLen", charData.size() * 2);
|
WriteDefine(mName + "TilesLen", charData.size() * 2);
|
||||||
WriteSymbol(name + "Tiles", DatType<uint16_t>(), charData.size());
|
WriteSymbol(mName + "Tiles", DatType<uint16_t>(), charData.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderWriter::WriteCollision(const std::span<uint8_t> collisionData)
|
void HeaderWriter::WriteCollision(const std::span<uint8_t> collisionData)
|
||||||
{
|
{
|
||||||
stream << std::endl;
|
stream << std::endl;
|
||||||
WriteDefine(name + "CollisionLen", collisionData.size());
|
WriteDefine(mName + "CollisionLen", collisionData.size());
|
||||||
WriteSymbol(name + "Collision", DatType<uint8_t>(), collisionData.size());
|
WriteSymbol(mName + "Collision", DatType<uint8_t>(), collisionData.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderWriter::WriteObjects(const std::span<uint32_t> objData)
|
void HeaderWriter::WriteObjects(const std::span<uint32_t> objData)
|
||||||
{
|
{
|
||||||
stream << std::endl;
|
stream << std::endl;
|
||||||
WriteDefine(name + "ObjCount", objData.size() / 3);
|
WriteDefine(mName + "ObjCount", objData.size() / 3);
|
||||||
WriteDefine(name + "ObjdatLen", objData.size() * sizeof(int));
|
WriteDefine(mName + "ObjdatLen", objData.size() * sizeof(int));
|
||||||
WriteSymbol(name + "Objdat", DatType<uint32_t>(), objData.size());
|
WriteSymbol(mName + "Objdat", DatType<uint32_t>(), objData.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -49,14 +49,14 @@ static std::string GuardName(const std::string_view name)
|
|||||||
|
|
||||||
void HeaderWriter::WriteGuardStart()
|
void HeaderWriter::WriteGuardStart()
|
||||||
{
|
{
|
||||||
const std::string guard = GuardName(name);
|
const std::string guard = GuardName(mName);
|
||||||
stream << "#ifndef " << guard << std::endl;
|
stream << "#ifndef " << guard << std::endl;
|
||||||
stream << "#define " << guard << std::endl;
|
stream << "#define " << guard << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderWriter::WriteGuardEnd()
|
void HeaderWriter::WriteGuardEnd()
|
||||||
{
|
{
|
||||||
const std::string guard = GuardName(name);
|
const std::string guard = GuardName(mName);
|
||||||
stream << std::endl << "#endif//" << guard << std::endl;
|
stream << std::endl << "#endif//" << guard << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,9 +71,9 @@ HeaderWriter::~HeaderWriter()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool HeaderWriter::Open(const std::string_view path, const std::string_view name)
|
bool HeaderWriter::Open(const std::filesystem::path& path, const std::string_view name)
|
||||||
{
|
{
|
||||||
this->name = name;
|
mName = name;
|
||||||
stream.open(path);
|
stream.open(path);
|
||||||
if (!stream.is_open())
|
if (!stream.is_open())
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <span>
|
#include <span>
|
||||||
#include <concepts>
|
#include <concepts>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
concept NumericType = std::integral<T> || std::floating_point<T>;
|
concept NumericType = std::integral<T> || std::floating_point<T>;
|
||||||
@@ -17,7 +18,7 @@ concept NumericType = std::integral<T> || std::floating_point<T>;
|
|||||||
class HeaderWriter
|
class HeaderWriter
|
||||||
{
|
{
|
||||||
std::ofstream stream;
|
std::ofstream stream;
|
||||||
std::string name;
|
std::string mName;
|
||||||
|
|
||||||
void WriteGuardStart();
|
void WriteGuardStart();
|
||||||
void WriteGuardEnd();
|
void WriteGuardEnd();
|
||||||
@@ -25,7 +26,7 @@ class HeaderWriter
|
|||||||
public:
|
public:
|
||||||
~HeaderWriter();
|
~HeaderWriter();
|
||||||
|
|
||||||
[[nodiscard]] bool Open(const std::string_view path, const std::string_view name);
|
[[nodiscard]] bool Open(const std::filesystem::path& path, const std::string_view name);
|
||||||
|
|
||||||
void WriteDefine(const std::string_view name, const std::string_view value);
|
void WriteDefine(const std::string_view name, const std::string_view value);
|
||||||
void WriteSymbol(const std::string_view name, const std::string_view type, std::size_t count);
|
void WriteSymbol(const std::string_view name, const std::string_view type, std::size_t count);
|
||||||
|
|||||||
@@ -10,16 +10,19 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
namespace GccIsDumb
|
||||||
|
{
|
||||||
|
template <typename T> constexpr const char* DatType();
|
||||||
|
template <> constexpr const char* DatType<uint8_t>() { return ".byte"; }
|
||||||
|
template <> constexpr const char* DatType<uint16_t>() { return ".hword"; }
|
||||||
|
template <> constexpr const char* DatType<uint32_t>() { return ".word"; }
|
||||||
|
}
|
||||||
|
|
||||||
class SWriter
|
class SWriter
|
||||||
{
|
{
|
||||||
std::ofstream stream;
|
std::ofstream stream;
|
||||||
int writes = 0;
|
int writes = 0;
|
||||||
|
|
||||||
template <typename T> static constexpr const char* DatType();
|
|
||||||
template <> constexpr const char* DatType<uint8_t>() { return ".byte"; }
|
|
||||||
template <> constexpr const char* DatType<uint16_t>() { return ".hword"; }
|
|
||||||
template <> constexpr const char* DatType<uint32_t>() { return ".word"; }
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static void WriteArray(std::ostream& aOut, const std::vector<T>& aDat, int aPerCol = 16)
|
static void WriteArray(std::ostream& aOut, const std::vector<T>& aDat, int aPerCol = 16)
|
||||||
{
|
{
|
||||||
@@ -32,7 +35,7 @@ class SWriter
|
|||||||
for (T element : aDat)
|
for (T element : aDat)
|
||||||
{
|
{
|
||||||
if (col == 0)
|
if (col == 0)
|
||||||
aOut << "\t" << DatType<T>() << " ";
|
aOut << "\t" << GccIsDumb::DatType<T>() << " ";
|
||||||
|
|
||||||
aOut << std::hex << (int)element;
|
aOut << std::hex << (int)element;
|
||||||
|
|
||||||
@@ -54,7 +57,7 @@ class SWriter
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] bool Open(const std::string_view path)
|
[[nodiscard]] bool Open(const std::filesystem::path& path)
|
||||||
{
|
{
|
||||||
stream.open(path);
|
stream.open(path);
|
||||||
return stream.is_open();
|
return stream.is_open();
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ bool ParseArgs(int argc, char** argv, Arguments& params)
|
|||||||
default: return ParseCtrl::QUIT_ERR_UNKNOWN;
|
default: return ParseCtrl::QUIT_ERR_UNKNOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::invalid_argument const& e) { return ParseCtrl::QUIT_ERR_INVALID; }
|
catch (std::invalid_argument const&) { return ParseCtrl::QUIT_ERR_INVALID; }
|
||||||
catch (std::out_of_range const& e) { return ParseCtrl::QUIT_ERR_RANGE; }
|
catch (std::out_of_range const&) { return ParseCtrl::QUIT_ERR_RANGE; }
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!parser.Parse(std::span(argv + 1, argc - 1)))
|
if (!parser.Parse(std::span(argv + 1, argc - 1)))
|
||||||
|
|||||||
Reference in New Issue
Block a user