diff --git a/inferno/src/inferno/file.cpp b/inferno/src/inferno/file.cpp new file mode 100644 index 0000000..8afc9b7 --- /dev/null +++ b/inferno/src/inferno/file.cpp @@ -0,0 +1,41 @@ +#include // std::ios +#include // std::make_unique + +#include "inferno/file.h" + +namespace Inferno { + + std::string File::read(const std::string &path) + { + // Create input stream object and open file + std::ifstream file(path.c_str()); + NF_CORE_ASSERT(file.is_open(), "File could not open: %s", path.c_str()); + + // Check if file exists + if (!file.is_open()) { + return nullptr; + } + + // Get length of the file + file.seekg(0, std::ios::end); + int length = file.tellg(); + file.seekg(0, std::ios::beg); + NF_CORE_ASSERT(length != -1, "File could not determine length: %s", path.c_str()); + + // Check for valid file length + if (length == -1) { + return nullptr; + } + + // Allocate memory filled with zeros + auto buffer = std::make_unique(length + 1); + + // Fill buffer with file contents + file.read(buffer.get(), length); + file.close(); + + // Create string from the buffer and return + return std::string(buffer.get(), length + 1); + } + +} diff --git a/inferno/src/inferno/file.h b/inferno/src/inferno/file.h new file mode 100644 index 0000000..de14b5d --- /dev/null +++ b/inferno/src/inferno/file.h @@ -0,0 +1,45 @@ +#ifndef FILE_H +#define FILE_H + +#include // std::ifstream, std::ofstream +#include // std::setfill, std::setw +#include // std::string + +#include "inferno/core.h" +#include "inferno/log.h" + +namespace Inferno { + + class File { + public: + static std::string read(const std::string &path); + + template + static void ioRead(T &t, const std::string &path) + { + std::ifstream file(path); + NF_CORE_ASSERT(file.is_open(), "File could not open: %s", path.c_str()); + + if (file.is_open()) { + file >> t; + file.close(); + } + } + + template + static void ioWrite(T &t, const std::string &path) + { + std::ofstream file (path); + NF_CORE_ASSERT(file.is_open(), "File could not open: %s", path.c_str()); + + if (file.is_open()) { + // Write file with single tabs, nicely formatted + file << std::setfill ('\t') << std::setw(1) << t << std::endl; + file.close(); + } + } + }; + +} + +#endif // FILE_H diff --git a/inferno/src/inferno/settings.cpp b/inferno/src/inferno/settings.cpp index 6c5e4f1..6e4aceb 100644 --- a/inferno/src/inferno/settings.cpp +++ b/inferno/src/inferno/settings.cpp @@ -3,6 +3,7 @@ #include // std::string #include "inferno/core.h" +#include "inferno/file.h" #include "inferno/log.h" #include "inferno/settings.h" @@ -26,14 +27,14 @@ namespace Inferno { void Settings::initialize() { - nlohmann::json m_json = this->load(); + nlohmann::json json = this->load(); try { - m_properties.window.title = strdup(m_json["window"]["title"].get().c_str()); - m_properties.window.width = m_json["window"]["width"].get(); - m_properties.window.height = m_json["window"]["height"].get(); - m_properties.window.fullscreen = strdup(m_json["window"]["fullscreen"].get().c_str()); - m_properties.window.vsync = m_json["window"]["vsync"].get(); + m_properties.window.title = strdup(json["window"]["title"].get().c_str()); + m_properties.window.width = json["window"]["width"].get(); + m_properties.window.height = json["window"]["height"].get(); + m_properties.window.fullscreen = strdup(json["window"]["fullscreen"].get().c_str()); + m_properties.window.vsync = json["window"]["vsync"].get(); } catch (...) { NF_CORE_WARN("Settings syntax error: using default values"); @@ -51,15 +52,7 @@ namespace Inferno { { nlohmann::json json; - std::ifstream file(m_path); - NF_CORE_ASSERT(file.is_open(), "Could not open settings file!"); - - if (file.is_open()) { - // Read the JSON file - file >> json; - file.close(); - } - + File::ioRead(json, m_path); NF_CORE_INFO("Settings loaded"); return json; @@ -74,15 +67,7 @@ namespace Inferno { json["window"]["fullscreen"] = m_properties.window.fullscreen; json["window"]["vsync"] = m_properties.window.vsync; - std::ofstream file (m_path); - NF_CORE_ASSERT(file.is_open(), "Could not open settings file!"); - - if (file.is_open()) { - // Write the JSON file with single tabs, nicely formatted - file << std::setfill ('\t') << std::setw(1) << json << std::endl; - file.close(); - } - + File::ioWrite(json, m_path); NF_CORE_INFO("Settings saved"); return true;