mirror of https://github.com/AxioDL/metaforce.git
LogVisor report additions; Updated RetroCommon
This commit is contained in:
parent
cd0b2f0926
commit
14a368553d
|
@ -15,7 +15,7 @@ public:
|
|||
: ToolBase(info)
|
||||
{
|
||||
if (m_info.args.empty())
|
||||
throw HECL::Exception(_S("help requires a tool name argument"));
|
||||
LogModule.report(LogVisor::FatalError, "help requires a tool name argument");
|
||||
}
|
||||
|
||||
~ToolHelp()
|
||||
|
@ -78,7 +78,7 @@ public:
|
|||
helpFunc = ToolHelp::Help;
|
||||
else
|
||||
{
|
||||
throw HECL::Exception(_S("unrecognized tool '") + toolName + _S("' - can't help"));
|
||||
LogModule.report(LogVisor::FatalError, _S("unrecognized tool '%s' - can't help"), toolName.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,19 +20,19 @@ public:
|
|||
|
||||
if (HECL::Stat(dir->c_str(), &theStat))
|
||||
{
|
||||
throw HECL::Exception(_S("unable to stat '") + *dir + _S("'"));
|
||||
LogModule.report(LogVisor::FatalError, _S("unable to stat '%s'"), dir->c_str());
|
||||
return;
|
||||
}
|
||||
if (!S_ISDIR(theStat.st_mode))
|
||||
{
|
||||
throw HECL::Exception(_S("'") + *dir + _S("' is not a directory"));
|
||||
LogModule.report(LogVisor::FatalError, _S("'%s' is not a directory"), dir->c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
HECL::SystemString testPath = *dir + _S("/.hecl/beacon");
|
||||
if (!HECL::Stat(testPath.c_str(), &theStat))
|
||||
{
|
||||
throw HECL::Exception(_S("project already exists at '") + *dir + _S("'"));
|
||||
LogModule.report(LogVisor::FatalError, _S("project already exists at '%s'"), dir->c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -48,12 +48,12 @@ public:
|
|||
HECL::Database::Project proj((HECL::ProjectRootPath(*m_dir)));
|
||||
proj.enableDataSpecs({_S("hecl-little")});
|
||||
}
|
||||
catch (HECL::Exception& e)
|
||||
catch (std::exception& e)
|
||||
{
|
||||
LogModule.report(LogVisor::Error, _S("unable to init project: '%s'\n"), e.swhat());
|
||||
LogModule.report(LogVisor::Error, "unable to init project");
|
||||
return -1;
|
||||
}
|
||||
LogModule.report(LogVisor::Info, _S("initialized project at '%s/.hecl'\n"), m_dir->c_str());
|
||||
LogModule.report(LogVisor::Info, _S("initialized project at '%s/.hecl'"), m_dir->c_str());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
return;
|
||||
|
||||
if (!info.project)
|
||||
throw HECL::Exception(_S("hecl spec must be ran within a project directory"));
|
||||
LogModule.report(LogVisor::FatalError, "hecl spec must be ran within a project directory");
|
||||
|
||||
const auto& specs = info.project->getDataSpecs();
|
||||
HECL::SystemString firstArg = info.args[0];
|
||||
|
@ -37,7 +37,7 @@ public:
|
|||
return;
|
||||
|
||||
if (info.args.size() < 2)
|
||||
throw HECL::Exception(_S("Speclist argument required"));
|
||||
LogModule.report(LogVisor::FatalError, "Speclist argument required");
|
||||
|
||||
for (auto it = info.args.begin()+1;
|
||||
it != info.args.end();
|
||||
|
@ -54,7 +54,7 @@ public:
|
|||
}
|
||||
}
|
||||
if (!found)
|
||||
throw HECL::Exception(_S("'") + *it + _S("' is not found in the dataspec registry"));
|
||||
LogModule.report(LogVisor::FatalError, _S("'%s' is not found in the dataspec registry"), it->c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,11 +13,19 @@ INCLUDEPATH += ../include \
|
|||
LIBPATH += $$OUT_PWD/../lib \
|
||||
$$OUT_PWD/../blender \
|
||||
$$OUT_PWD/../extern/LogVisor \
|
||||
$$OUT_PWD/../extern/RetroCommon/NODLib/lib \
|
||||
$$OUT_PWD/../extern/blowfish \
|
||||
$$OUT_PWD/../extern/libpng
|
||||
$$OUT_PWD/../extern/libpng \
|
||||
$$OUT_PWD/../extern/Athena/lib \
|
||||
$$OUT_PWD/../extern/RetroCommon/DataSpec \
|
||||
$$OUT_PWD/../extern/RetroCommon/NODLib/lib
|
||||
|
||||
LIBS += -lhecl -lhecl-blender -lblowfish -lNOD -lLogVisor -lpng -lpthread
|
||||
LIBS += -lhecl -lhecl-blender -lblowfish -lpng -lpthread
|
||||
LIBS += -Wl,--whole-archive -lRetroDataSpec -Wl,--no-whole-archive -lNOD -lLogVisor
|
||||
CONFIG(debug, debug|release) {
|
||||
LIBS += -lAthena-d
|
||||
} else {
|
||||
LIBS += -lAthena
|
||||
}
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/main.cpp
|
||||
|
|
|
@ -49,12 +49,17 @@ static void printHelp(const HECL::SystemChar* pname)
|
|||
}
|
||||
|
||||
/* Regex patterns */
|
||||
static const HECL::SystemRegex regOPEN(_S("-o([^\"]*|\\S*))"), std::regex::ECMAScript|std::regex::optimize);
|
||||
static const HECL::SystemRegex regOPEN(_S("-o([^\"]*|\\S*)"), std::regex::ECMAScript|std::regex::optimize);
|
||||
static const HECL::SystemRegex regVERBOSE(_S("-v(v*)"), std::regex::ECMAScript|std::regex::optimize);
|
||||
static const HECL::SystemRegex regFORCE(_S("-f"), std::regex::ECMAScript|std::regex::optimize);
|
||||
|
||||
#include "../blender/CBlenderConnection.hpp"
|
||||
|
||||
namespace Retro
|
||||
{
|
||||
extern HECL::Database::DataSpecEntry SpecMP1;
|
||||
}
|
||||
|
||||
#if HECL_UCS2
|
||||
int wmain(int argc, const wchar_t** argv)
|
||||
#else
|
||||
|
@ -66,6 +71,8 @@ int main(int argc, const char** argv)
|
|||
if (!strncmp(term, "xterm", 5))
|
||||
XTERM_COLOR = true;
|
||||
|
||||
//fprintf(stderr, "%s\n", Retro::SpecMP1.m_name.c_str());
|
||||
|
||||
//CBlenderConnection bconn(false);
|
||||
//return 0;
|
||||
|
||||
|
@ -166,11 +173,11 @@ int main(int argc, const char** argv)
|
|||
project.reset(new HECL::Database::Project(*rootPath));
|
||||
info.project = project.get();
|
||||
}
|
||||
catch (HECL::Exception& ex)
|
||||
catch (std::exception&)
|
||||
{
|
||||
LogModule.report(LogVisor::Error,
|
||||
_S("Unable to open discovered project at '%s':\n%s\n"),
|
||||
rootPath->getAbsolutePath().c_str(), ex.swhat());
|
||||
_S("Unable to open discovered project at '%s'"),
|
||||
rootPath->getAbsolutePath().c_str());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -202,12 +209,12 @@ int main(int argc, const char** argv)
|
|||
else if (toolName == _S("help"))
|
||||
tool.reset(new ToolHelp(info));
|
||||
else
|
||||
throw HECL::Exception(_S("unrecognized tool '") + toolName + _S("'"));
|
||||
LogModule.report(LogVisor::FatalError, _S("unrecognized tool '%s'"), toolName.c_str());
|
||||
}
|
||||
catch (HECL::Exception& ex)
|
||||
catch (std::exception&)
|
||||
{
|
||||
LogModule.report(LogVisor::Error, _S("Unable to construct HECL tool '%s':\n%s\n"),
|
||||
toolName.c_str(), ex.swhat());
|
||||
LogModule.report(LogVisor::Error, _S("Unable to construct HECL tool '%s'"),
|
||||
toolName.c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -221,10 +228,10 @@ int main(int argc, const char** argv)
|
|||
{
|
||||
retval = tool->run();
|
||||
}
|
||||
catch (HECL::Exception& ex)
|
||||
catch (std::exception&)
|
||||
{
|
||||
LogModule.report(LogVisor::Error, _S("Error running HECL tool '%s':\n%s\n"),
|
||||
toolName.c_str(), ex.swhat());
|
||||
LogModule.report(LogVisor::Error, _S("Error running HECL tool '%s'"),
|
||||
toolName.c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 47a7a95098fe13543450c132cae91a195c06840c
|
||||
Subproject commit c3dc632dd0f2f750697ccd6ee10898b4f45fb502
|
|
@ -1 +1 @@
|
|||
Subproject commit a0ec6da17111a416e6eeaf876ce81cbb5216bcb6
|
||||
Subproject commit 6c0b9785d0e6826ac4cf874e2544750f8e74cf51
|
|
@ -15,6 +15,7 @@
|
|||
#include <stdint.h>
|
||||
|
||||
#include <Athena/IStreamReader.hpp>
|
||||
#include <LogVisor/LogVisor.hpp>
|
||||
|
||||
#include "HECL.hpp"
|
||||
|
||||
|
@ -24,6 +25,8 @@ namespace Database
|
|||
{
|
||||
class Project;
|
||||
|
||||
extern LogVisor::LogModule LogModule;
|
||||
|
||||
/**
|
||||
* @brief Nodegraph class for gathering dependency-resolved objects for packaging
|
||||
*/
|
||||
|
@ -71,8 +74,8 @@ public:
|
|||
ProjectPath subpath;
|
||||
bool cookedonly;
|
||||
};
|
||||
virtual bool canExtract(const ExtractPassInfo& info, SystemString& reasonNo)
|
||||
{(void)info;reasonNo=_S("not implemented");return false;}
|
||||
virtual bool canExtract(const ExtractPassInfo& info)
|
||||
{(void)info;LogModule.report(LogVisor::Error, "not implemented");return false;}
|
||||
virtual void doExtract(const Project& project, const ExtractPassInfo& info)
|
||||
{(void)project;(void)info;}
|
||||
|
||||
|
@ -234,7 +237,6 @@ public:
|
|||
private:
|
||||
ProjectRootPath m_rootPath;
|
||||
CompiledSpecs m_compiledSpecs;
|
||||
FLogger m_logger;
|
||||
public:
|
||||
Project(const HECL::ProjectRootPath& rootPath);
|
||||
|
||||
|
@ -286,14 +288,6 @@ public:
|
|||
C_HEAVY
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Register an optional callback to report log-messages using
|
||||
* @param logger logger-callback
|
||||
*
|
||||
* If this method is never called, all project operations will run silently.
|
||||
*/
|
||||
void registerLogger(HECL::FLogger logger);
|
||||
|
||||
/**
|
||||
* @brief Get the path of the project's root-directory
|
||||
* @param absolute return as absolute-path
|
||||
|
|
|
@ -21,11 +21,15 @@ char* win_realpath(const char* name, char* restrict resolved);
|
|||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <regex>
|
||||
#include <LogVisor/LogVisor.hpp>
|
||||
#include <Athena/DNA.hpp>
|
||||
#include "../extern/blowfish/blowfish.h"
|
||||
|
||||
namespace HECL
|
||||
{
|
||||
|
||||
extern LogVisor::LogModule LogModule;
|
||||
|
||||
#if _WIN32 && UNICODE
|
||||
#define HECL_UCS2 1
|
||||
#endif
|
||||
|
@ -87,31 +91,6 @@ public:
|
|||
#endif
|
||||
#endif
|
||||
|
||||
class Exception : public std::exception
|
||||
{
|
||||
SystemString m_what;
|
||||
#if HECL_UCS2
|
||||
std::string m_utf8what;
|
||||
#endif
|
||||
public:
|
||||
Exception(const SystemString& what) noexcept
|
||||
: m_what(what)
|
||||
{
|
||||
#if HECL_UCS2
|
||||
m_utf8what = WideToUTF8(what);
|
||||
#endif
|
||||
}
|
||||
const char* what() const noexcept
|
||||
{
|
||||
#if HECL_UCS2
|
||||
return m_utf8what.c_str();
|
||||
#else
|
||||
return m_what.c_str();
|
||||
#endif
|
||||
}
|
||||
inline const SystemChar* swhat() const noexcept {return m_what.c_str();}
|
||||
};
|
||||
|
||||
static inline void MakeDir(const SystemString& dir)
|
||||
{
|
||||
#if _WIN32
|
||||
|
@ -231,29 +210,17 @@ typedef std::match_results<SystemString::const_iterator> SystemRegexMatch;
|
|||
|
||||
class ProjectRootPath;
|
||||
|
||||
/**
|
||||
* @brief Severity of a log event
|
||||
*/
|
||||
enum LogType
|
||||
{
|
||||
LOG_INFO,
|
||||
LOG_WARN,
|
||||
LOG_ERROR
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Logger callback type
|
||||
*/
|
||||
typedef std::function<void(LogType, std::string&)> FLogger;
|
||||
|
||||
/**
|
||||
* @brief FourCC representation used within HECL's database
|
||||
*
|
||||
* FourCCs are efficient, mnemonic four-char-sequences used to represent types
|
||||
* while fitting comfortably in a 32-bit word. HECL uses a four-char array
|
||||
* to remain endian-independent.
|
||||
*
|
||||
* This class also functions as a read/write Athena DNA type,
|
||||
* for easy initialization of FourCCs in DNA data records.
|
||||
*/
|
||||
class FourCC final
|
||||
class FourCC final : public Athena::io::DNA<Athena::BigEndian>
|
||||
{
|
||||
union
|
||||
{
|
||||
|
@ -270,6 +237,12 @@ public:
|
|||
inline bool operator==(const char* other) const {return num == *(uint32_t*)other;}
|
||||
inline bool operator!=(const char* other) const {return num != *(uint32_t*)other;}
|
||||
inline std::string toString() const {return std::string(fcc, 4);}
|
||||
|
||||
Delete expl;
|
||||
inline void read(Athena::io::IStreamReader& reader)
|
||||
{reader.readUBytesToBuf(fcc, 4);}
|
||||
inline void write(Athena::io::IStreamWriter& writer) const
|
||||
{writer.writeUBytes((atUint8*)fcc, 4);}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -1 +1,6 @@
|
|||
#include "HECL/HECL.hpp"
|
||||
|
||||
namespace HECL
|
||||
{
|
||||
LogVisor::LogModule LogModule("HECL");
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ Time ProjectPath::getModtime() const
|
|||
return Time(latestTime);
|
||||
}
|
||||
}
|
||||
throw HECL::Exception(_S("invalid path type"));
|
||||
LogModule.report(LogVisor::Error, _S("invalid path type for computing modtime"));
|
||||
return Time();
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,8 @@ namespace HECL
|
|||
namespace Database
|
||||
{
|
||||
|
||||
LogVisor::LogModule LogModule("HECLDatabase");
|
||||
|
||||
/**********************************************
|
||||
* Project::ConfigFile
|
||||
**********************************************/
|
||||
|
@ -92,7 +94,10 @@ void Project::ConfigFile::addLine(const std::string& line)
|
|||
void Project::ConfigFile::removeLine(const std::string& refLine)
|
||||
{
|
||||
if (!m_lockedFile)
|
||||
throw HECL::Exception(_S("Project::ConfigFile::lockAndRead not yet called"));
|
||||
{
|
||||
LogModule.reportSource(LogVisor::FatalError, __FILE__, __LINE__, "Project::ConfigFile::lockAndRead not yet called");
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto it = m_lines.begin();
|
||||
it != m_lines.end();)
|
||||
|
@ -109,7 +114,10 @@ void Project::ConfigFile::removeLine(const std::string& refLine)
|
|||
bool Project::ConfigFile::checkForLine(const std::string& refLine)
|
||||
{
|
||||
if (!m_lockedFile)
|
||||
throw HECL::Exception(_S("Project::ConfigFile::lockAndRead not yet called"));
|
||||
{
|
||||
LogModule.reportSource(LogVisor::FatalError, __FILE__, __LINE__, "Project::ConfigFile::lockAndRead not yet called");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const std::string& line : m_lines)
|
||||
{
|
||||
|
@ -122,7 +130,10 @@ bool Project::ConfigFile::checkForLine(const std::string& refLine)
|
|||
void Project::ConfigFile::unlockAndDiscard()
|
||||
{
|
||||
if (!m_lockedFile)
|
||||
throw HECL::Exception(_S("Project::ConfigFile::lockAndRead not yet called"));
|
||||
{
|
||||
LogModule.reportSource(LogVisor::FatalError, __FILE__, __LINE__, "Project::ConfigFile::lockAndRead not yet called");
|
||||
return;
|
||||
}
|
||||
|
||||
m_lines.clear();
|
||||
fclose(m_lockedFile);
|
||||
|
@ -132,7 +143,10 @@ void Project::ConfigFile::unlockAndDiscard()
|
|||
bool Project::ConfigFile::unlockAndCommit()
|
||||
{
|
||||
if (!m_lockedFile)
|
||||
throw HECL::Exception(_S("Project::ConfigFile::lockAndRead not yet called"));
|
||||
{
|
||||
LogModule.reportSource(LogVisor::FatalError, __FILE__, __LINE__, "Project::ConfigFile::lockAndRead not yet called");
|
||||
return false;
|
||||
}
|
||||
|
||||
SystemString newPath = m_filepath + _S(".part");
|
||||
FILE* newFile = HECL::Fopen(newPath.c_str(), _S("w"), LWRITE);
|
||||
|
@ -208,17 +222,15 @@ Project::Project(const ProjectRootPath& rootPath)
|
|||
fclose(bf);
|
||||
if (beacon.magic != hecl ||
|
||||
SBig(beacon.version) != DATA_VERSION)
|
||||
throw Exception(_S("incompatible HECL project"));
|
||||
{
|
||||
LogModule.report(LogVisor::FatalError, "incompatible project version");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Compile current dataspec */
|
||||
rescanDataSpecs();
|
||||
}
|
||||
|
||||
void Project::registerLogger(FLogger logger)
|
||||
{
|
||||
m_logger = logger;
|
||||
}
|
||||
|
||||
bool Project::addPaths(const std::vector<ProjectPath>& paths)
|
||||
{
|
||||
m_paths.lockAndRead();
|
||||
|
|
|
@ -4,7 +4,11 @@ TARGET = hecl
|
|||
CONFIG -= Qt
|
||||
QT =
|
||||
|
||||
INCLUDEPATH += $$PWD ../include ../extern ../extern/Athena/include
|
||||
INCLUDEPATH += $$PWD \
|
||||
../include \
|
||||
../extern \
|
||||
../extern/Athena/include \
|
||||
../extern/LogVisor/include
|
||||
|
||||
include (frontend/frontend.pri)
|
||||
include (backend/backend.pri)
|
||||
|
|
Loading…
Reference in New Issue