moved retro-specific stuff out of hecl

This commit is contained in:
Jack Andersen 2015-07-01 13:53:05 -10:00
parent be43fb19c0
commit a8fbfcb361
30 changed files with 41 additions and 490 deletions

View File

@ -1,30 +0,0 @@
#include "HECLDatabase.hpp"
namespace HECL
{
namespace Database
{
IDataSpec* NewDataSpec_little();
IDataSpec* NewDataSpec_big();
IDataSpec* NewDataSpec_revolution();
IDataSpec* NewDataSpec_cafe();
IDataSpec* NewDataSpec_mp1();
IDataSpec* NewDataSpec_mp2();
IDataSpec* NewDataSpec_mp3();
const DataSpecEntry DATA_SPEC_REGISTRY[] =
{
{_S("hecl-little"), _S("Targets little-endian PC apps using the HECL runtime"), NewDataSpec_little},
{_S("hecl-big"), _S("Targets big-endian PC apps using the HECL runtime"), NewDataSpec_big},
{_S("hecl-revolution"), _S("Targets Wii apps using the HECL runtime"), NewDataSpec_revolution},
{_S("hecl-cafe"), _S("Targets Wii U apps using the HECL runtime"), NewDataSpec_cafe},
{_S("mp1"), _S("Targets original Metroid Prime engine"), NewDataSpec_mp1},
{_S("mp2"), _S("Targets original Metroid Prime 2 engine"), NewDataSpec_mp2},
{_S("mp3"), _S("Targets original Metroid Prime 3 engine"), NewDataSpec_mp3},
{}
};
}
}

View File

@ -1,29 +0,0 @@
TEMPLATE = lib
CONFIG += staticlib
TARGET = hecl-dataspec
CONFIG -= Qt
QT =
unix:QMAKE_CXXFLAGS += -std=c++11
unix:QMAKE_CFLAGS += -std=c99
unix:LIBS += -std=c++11
clang:QMAKE_CXXFLAGS += -stdlib=libc++
clang:LIBS += -stdlib=libc++ -lc++abi
INCLUDEPATH += $$PWD ../include ../extern \
../extern/Athena/include
../extern/RetroCommon/include
include(../extern/RetroCommon/RetroCommon.pri)
include(hecl/hecl.pri)
include(mp1/mp1.pri)
include(mp2/mp2.pri)
include(mp3/mp3.pri)
HEADERS += \
helpers.hpp
SOURCES += \
helpers.cpp \
dataspec.cpp

View File

@ -1,40 +0,0 @@
#ifndef DUMB_HPP
#define DUMB_HPP
#include "HECLDatabase.hpp"
#include "HECLRuntime.hpp"
class CDUMBProject : public HECL::Database::ObjectBase
{
using HECL::Database::ObjectBase::ObjectBase;
bool _cookObject(FDataAppender dataAppender,
DataEndianness endianness, DataPlatform platform)
{
return true;
}
void _gatherDeps(FDepAdder depAdder)
{
}
};
class CDUMBRuntime : public HECL::Runtime::ObjectBase
{
using HECL::Runtime::ObjectBase::ObjectBase;
bool _objectFinishedLoading(const void* data, size_t len)
{
return true;
}
void _objectWillUnload()
{
}
};
#endif // DUMB_HPP

View File

@ -1,38 +0,0 @@
#ifndef HMDL_HPP
#define HMDL_HPP
#include "HECLDatabase.hpp"
#include "HECLRuntime.hpp"
class CHMDLProject : public HECL::Database::ObjectBase
{
using HECL::Database::ObjectBase::ObjectBase;
bool _cookObject(FDataAppender dataAppender,
DataEndianness endianness, DataPlatform platform)
{
return true;
}
void _gatherDeps(FDepAdder depAdder)
{
}
};
class CHMDLRuntime : public HECL::Runtime::ObjectBase
{
using HECL::Runtime::ObjectBase::ObjectBase;
bool _objectFinishedLoading(const void* data, size_t len)
{
return true;
}
void _objectWillUnload()
{
}
};
#endif // HMDL_HPP

View File

@ -1,38 +0,0 @@
#ifndef MATR_HPP
#define MATR_HPP
#include "HECLDatabase.hpp"
#include "HECLRuntime.hpp"
class CMATRProject : public HECL::Database::ObjectBase
{
using HECL::Database::ObjectBase::ObjectBase;
bool _cookObject(FDataAppender dataAppender,
DataEndianness endianness, DataPlatform platform)
{
return true;
}
void _gatherDeps(FDepAdder depAdder)
{
}
};
class CMATRRuntime : public HECL::Runtime::ObjectBase
{
using HECL::Runtime::ObjectBase::ObjectBase;
bool _objectFinishedLoading(const void* data, size_t len)
{
return true;
}
void _objectWillUnload()
{
}
};
#endif // MATR_HPP

View File

@ -1,38 +0,0 @@
#ifndef STRG_HPP
#define STRG_HPP
#include "HECLDatabase.hpp"
#include "HECLRuntime.hpp"
class CSTRGProject : public HECL::Database::ObjectBase
{
using HECL::Database::ObjectBase::ObjectBase;
bool _cookObject(FDataAppender dataAppender,
DataEndianness endianness, DataPlatform platform)
{
return true;
}
void _gatherDeps(FDepAdder depAdder)
{
}
};
class CSTRGRuntime : public HECL::Runtime::ObjectBase
{
using HECL::Runtime::ObjectBase::ObjectBase;
bool _objectFinishedLoading(const void* data, size_t len)
{
return true;
}
void _objectWillUnload()
{
}
};
#endif // STRG_HPP

View File

@ -1,49 +0,0 @@
#ifndef TXTR_HPP
#define TXTR_HPP
#include "HECLDatabase.hpp"
#include "HECLRuntime.hpp"
#include "helpers.hpp"
class CTXTRProject : public HECL::Database::ObjectBase
{
using HECL::Database::ObjectBase::ObjectBase;
bool _cookObject(FDataAppender dataAppender,
DataEndianness endianness, DataPlatform platform)
{
return true;
}
void _gatherDeps(FDepAdder depAdder)
{
}
public:
static bool ClaimPath(const std::string& path, const std::string&)
{
if (!HECLHelpers::IsRegularFile(path))
return false;
if (!HECLHelpers::ContainsMagic(path, "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", 8))
return false;
return true;
}
};
class CTXTRRuntime : public HECL::Runtime::ObjectBase
{
using HECL::Runtime::ObjectBase::ObjectBase;
bool _objectFinishedLoading(const void* data, size_t len)
{
return true;
}
void _objectWillUnload()
{
}
};
#endif // TXTR_HPP

View File

@ -1,50 +0,0 @@
#include "HECLDatabase.hpp"
namespace HECL
{
namespace Database
{
class HECLBaseDataSpec : public IDataSpec
{
};
class HECLLittleDataSpec : public HECLBaseDataSpec
{
};
class HECLBigDataSpec : public HECLBaseDataSpec
{
};
class HECLRevolutionDataSpec : public HECLBaseDataSpec
{
};
class HECLCafeDataSpec : public HECLBaseDataSpec
{
};
IDataSpec* NewDataSpec_little()
{
return new HECLLittleDataSpec();
}
IDataSpec* NewDataSpec_big()
{
return new HECLBigDataSpec();
}
IDataSpec* NewDataSpec_revolution()
{
return new HECLRevolutionDataSpec();
}
IDataSpec* NewDataSpec_cafe()
{
return new HECLCafeDataSpec();
}
}
}

View File

@ -1,2 +0,0 @@
SOURCES += \
$$PWD/hecl.cpp

View File

@ -1,51 +0,0 @@
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include "helpers.hpp"
namespace HECLHelpers
{
bool IsRegularFile(const std::string& path)
{
struct stat theStat;
if (stat(path.c_str(), &theStat))
return false;
if (!S_ISREG(theStat.st_mode))
return false;
return true;
}
bool IsDirectoryFile(const std::string& path)
{
struct stat theStat;
if (stat(path.c_str(), &theStat))
return false;
if (!S_ISDIR(theStat.st_mode))
return false;
return true;
}
bool ContainsMagic(const std::string& path, const char* magicBuf,
size_t magicLen, size_t magicOff)
{
if (!IsRegularFile(path))
return false;
FILE* fp = fopen(path.c_str(), "rb");
if (!fp)
return false;
char* readBuf[magicLen];
fseek(fp, magicOff, SEEK_SET);
size_t readLen = fread(readBuf, 1, magicLen, fp);
fclose(fp);
if (readLen < magicLen)
return false;
if (memcmp(readBuf, magicBuf, magicLen))
return false;
return true;
}
}

View File

@ -1,17 +0,0 @@
#ifndef HELPERS_HPP
#define HELPERS_HPP
#include <string>
namespace HECLHelpers
{
bool IsRegularFile(const std::string& path);
bool IsDirectoryFile(const std::string& path);
bool ContainsMagic(const std::string& path, const char* magicBuf,
size_t magicLen, size_t magicOff=0);
bool IsBlenderFile(const std::string& path);
}
#endif // HELPERS_HPP

View File

@ -1,22 +0,0 @@
#include "HECLDatabase.hpp"
#include "CMDL.hpp"
#include "MREA.hpp"
namespace HECL
{
namespace Database
{
class MP1DataSpec : public IDataSpec
{
};
IDataSpec* NewDataSpec_mp1()
{
return new MP1DataSpec();
}
}
}

View File

@ -1,6 +0,0 @@
SOURCES += \
$$PWD/mp1.cpp
HEADERS += \
$$PWD/MREA.hpp \
$$PWD/CMDL.hpp

View File

@ -1,22 +0,0 @@
#include "HECLDatabase.hpp"
#include "CMDL.hpp"
#include "MREA.hpp"
namespace HECL
{
namespace Database
{
class MP2DataSpec : public IDataSpec
{
};
IDataSpec* NewDataSpec_mp2()
{
return new MP2DataSpec();
}
}
}

View File

@ -1,6 +0,0 @@
SOURCES += \
$$PWD/mp2.cpp
HEADERS += \
$$PWD/MREA.hpp \
$$PWD/CMDL.hpp

View File

@ -1,22 +0,0 @@
#include "HECLDatabase.hpp"
#include "CMDL.hpp"
#include "MREA.hpp"
namespace HECL
{
namespace Database
{
class MP3DataSpec : public IDataSpec
{
};
IDataSpec* NewDataSpec_mp3()
{
return new MP3DataSpec();
}
}
}

View File

@ -1,6 +0,0 @@
SOURCES += \
$$PWD/mp3.cpp
HEADERS += \
$$PWD/MREA.hpp \
$$PWD/CMDL.hpp

View File

@ -47,7 +47,7 @@ public:
bool found = false; bool found = false;
for (auto& spec : specs) for (auto& spec : specs)
{ {
if (!spec.first.name.compare(*it)) if (!spec.first.m_name.compare(*it))
{ {
found = true; found = true;
break; break;
@ -90,15 +90,13 @@ public:
{ {
if (!m_info.project) if (!m_info.project)
{ {
for (const HECL::Database::DataSpecEntry* spec = HECL::Database::DATA_SPEC_REGISTRY; for (const HECL::Database::DataSpecEntry* spec : HECL::Database::DATA_SPEC_REGISTRY)
spec->name.size();
++spec)
{ {
if (XTERM_COLOR) if (XTERM_COLOR)
HECL::Printf(_S("" BOLD CYAN "%s" NORMAL "\n"), spec->name.c_str()); HECL::Printf(_S("" BOLD CYAN "%s" NORMAL "\n"), spec->m_name.c_str());
else else
HECL::Printf(_S("%s\n"), spec->name.c_str()); HECL::Printf(_S("%s\n"), spec->m_name.c_str());
HECL::Printf(_S(" %s\n"), spec->desc.c_str()); HECL::Printf(_S(" %s\n"), spec->m_desc.c_str());
} }
return 0; return 0;
} }
@ -109,9 +107,9 @@ public:
for (auto& spec : specs) for (auto& spec : specs)
{ {
if (XTERM_COLOR) if (XTERM_COLOR)
HECL::Printf(_S("" BOLD CYAN "%s" NORMAL ""), spec.first.name.c_str()); HECL::Printf(_S("" BOLD CYAN "%s" NORMAL ""), spec.first.m_name.c_str());
else else
HECL::Printf(_S("%s"), spec.first.name.c_str()); HECL::Printf(_S("%s"), spec.first.m_name.c_str());
if (spec.second) if (spec.second)
{ {
if (XTERM_COLOR) if (XTERM_COLOR)
@ -119,7 +117,7 @@ public:
else else
HECL::Printf(_S(" [ENABLED]")); HECL::Printf(_S(" [ENABLED]"));
} }
HECL::Printf(_S("\n %s\n"), spec.first.desc.c_str()); HECL::Printf(_S("\n %s\n"), spec.first.m_desc.c_str());
} }
return 0; return 0;
} }
@ -133,9 +131,9 @@ public:
HECL::ToLower(itName); HECL::ToLower(itName);
for (auto& spec : specs) for (auto& spec : specs)
{ {
if (!spec.first.name.compare(itName)) if (!spec.first.m_name.compare(itName))
{ {
opSpecs.push_back(spec.first.name); opSpecs.push_back(spec.first.m_name);
break; break;
} }
} }

@ -1 +1 @@
Subproject commit af64e55395e2e262d2d25715e15c2518024d21f2 Subproject commit 1e7f39e4c540b675f472fe0d60a2ed8dc8073634

@ -1 +1 @@
Subproject commit 7c67895430d88d4971e3197f9a4eeba3ba0f6d35 Subproject commit 1d3ed2763636ef7d049644c7ddc7fb905e52e254

View File

@ -20,13 +20,15 @@ HEADERS += \
SUBDIRS += \ SUBDIRS += \
extern/blowfish \ extern/blowfish \
extern/libpng \ extern/libpng \
extern/libSquish \
extern/RetroCommon \
blender \ blender \
lib \ lib \
dataspec \
driver driver
driver.depends = extern/blowfish driver.depends = extern/blowfish
driver.depends = extern/libpng driver.depends = extern/libpng
driver.depends = extern/libSquish
driver.depends = extern/RetroCommon
driver.depends = blender driver.depends = blender
driver.depends = lib driver.depends = lib
driver.depends = dataspec

View File

@ -10,6 +10,7 @@ char* win_realpath(const char* name, char* restrict resolved);
#include <sys/file.h> #include <sys/file.h>
#include <dirent.h> #include <dirent.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h>
#endif #endif
#include <time.h> #include <time.h>

View File

@ -117,16 +117,34 @@ public:
{(void)project;(void)info;} {(void)project;(void)info;}
}; };
/**
* @brief Pre-emptive indication of what the constructed DataSpec is used for
*/
enum DataSpecTool
{
TOOL_EXTRACT,
TOOL_COOK,
TOOL_PACKAGE
};
extern std::vector<const struct DataSpecEntry*> DATA_SPEC_REGISTRY;
/** /**
* @brief IDataSpec registry entry * @brief IDataSpec registry entry
*
* Auto-registers with data spec registry
*/ */
struct DataSpecEntry struct DataSpecEntry
{ {
SystemString name; SystemString m_name;
SystemString desc; SystemString m_desc;
std::function<IDataSpec*(void)> factory; std::function<IDataSpec*(DataSpecTool)> m_factory;
DataSpecEntry(SystemString&& name, SystemString&& desc,
std::function<IDataSpec*(DataSpecTool)>&& factory)
: m_name(std::move(name)), m_desc(std::move(desc)), m_factory(std::move(factory))
{DATA_SPEC_REGISTRY.push_back(this);}
}; };
extern const HECL::Database::DataSpecEntry DATA_SPEC_REGISTRY[];
/** /**
* @brief Base object to subclass for integrating with key project operations * @brief Base object to subclass for integrating with key project operations

View File

@ -271,11 +271,9 @@ void Project::rescanDataSpecs()
{ {
m_compiledSpecs.clear(); m_compiledSpecs.clear();
m_specs.lockAndRead(); m_specs.lockAndRead();
for (const DataSpecEntry* spec = DATA_SPEC_REGISTRY; for (const DataSpecEntry* spec : DATA_SPEC_REGISTRY)
spec->name.size();
++spec)
{ {
SystemUTF8View specUTF8(spec->name); SystemUTF8View specUTF8(spec->m_name);
m_compiledSpecs.push_back({*spec, m_specs.checkForLine(specUTF8.utf8_str()) ? true : false}); m_compiledSpecs.push_back({*spec, m_specs.checkForLine(specUTF8.utf8_str()) ? true : false});
} }
m_specs.unlockAndDiscard(); m_specs.unlockAndDiscard();