add hashes
This commit is contained in:
@@ -26,9 +26,10 @@ namespace Generated
|
|||||||
{
|
{
|
||||||
)END";
|
)END";
|
||||||
|
|
||||||
constexpr char StructHeader1[] =
|
constexpr char StructHeader2[] =
|
||||||
R"END( struct %s
|
R"END( struct %s
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = %u;
|
||||||
)END";
|
)END";
|
||||||
|
|
||||||
constexpr char StructField4[] =
|
constexpr char StructField4[] =
|
||||||
@@ -39,9 +40,10 @@ namespace Generated
|
|||||||
R"END( };
|
R"END( };
|
||||||
)END";
|
)END";
|
||||||
|
|
||||||
constexpr char EnumHeader3[] =
|
constexpr char EnumHeader4[] =
|
||||||
R"END( struct %s
|
R"END( struct %s
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = %u;
|
||||||
static constexpr int32_t EntryCount = %u;
|
static constexpr int32_t EntryCount = %u;
|
||||||
enum Enum : %s
|
enum Enum : %s
|
||||||
{
|
{
|
||||||
@@ -192,8 +194,11 @@ void CppFileWriter::WriteEnums(const Def::DefinitionFile& definitions)
|
|||||||
{
|
{
|
||||||
const Def::Enum& e = definitions.Enums[enumIdx];
|
const Def::Enum& e = definitions.Enums[enumIdx];
|
||||||
|
|
||||||
Write(
|
Write(WriteTemplates::EnumHeader4,
|
||||||
WriteTemplates::EnumHeader3, e.Name, e.EntryCount, Generated::KnownType::CName[(int32_t)e.EnumType.Native]);
|
e.Name,
|
||||||
|
e.Hash,
|
||||||
|
e.EntryCount,
|
||||||
|
Generated::KnownType::CName[(int32_t)e.EnumType.Native]);
|
||||||
for (int32_t entryIdx = 0; entryIdx < e.EntryCount; ++entryIdx)
|
for (int32_t entryIdx = 0; entryIdx < e.EntryCount; ++entryIdx)
|
||||||
{
|
{
|
||||||
Write(WriteTemplates::EnumField1, e.EntryNames[entryIdx]);
|
Write(WriteTemplates::EnumField1, e.EntryNames[entryIdx]);
|
||||||
@@ -223,7 +228,7 @@ void CppFileWriter::WriteTypes(const Def::DefinitionFile& definitions)
|
|||||||
{
|
{
|
||||||
const Def::Type& t = definitions.Types[typeIdx];
|
const Def::Type& t = definitions.Types[typeIdx];
|
||||||
|
|
||||||
Write(WriteTemplates::StructHeader1, t.Name);
|
Write(WriteTemplates::StructHeader2, t.Name, t.Hash);
|
||||||
for (int32_t fieldIdx = 0; fieldIdx < t.FieldCount; ++fieldIdx)
|
for (int32_t fieldIdx = 0; fieldIdx < t.FieldCount; ++fieldIdx)
|
||||||
{
|
{
|
||||||
char Type[64]{0};
|
char Type[64]{0};
|
||||||
@@ -234,7 +239,7 @@ void CppFileWriter::WriteTypes(const Def::DefinitionFile& definitions)
|
|||||||
{
|
{
|
||||||
bx::snprintf(Array, sizeof(Array), "[%u]", ArraySize);
|
bx::snprintf(Array, sizeof(Array), "[%u]", ArraySize);
|
||||||
}
|
}
|
||||||
Write(WriteTemplates::StructField4, Type, t.FieldNames[fieldIdx], Array, t.FieldVaules[fieldIdx]);
|
Write(WriteTemplates::StructField4, Type, t.FieldNames[fieldIdx], Array, t.FieldValues[fieldIdx]);
|
||||||
}
|
}
|
||||||
Write(WriteTemplates::StructEnd);
|
Write(WriteTemplates::StructEnd);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
#include "MiniDef.h"
|
#include "MiniDef.h"
|
||||||
|
|
||||||
|
#include "TypeDef.h"
|
||||||
|
#include "bx/hash.h"
|
||||||
#include "bx/string.h"
|
#include "bx/string.h"
|
||||||
#include <bx/filepath.h>
|
#include <bx/filepath.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -165,7 +167,7 @@ Parser::Result Parser::HandleType()
|
|||||||
Def::Type& t = Definitions.Types[Definitions.TypeCount];
|
Def::Type& t = Definitions.Types[Definitions.TypeCount];
|
||||||
for (int32_t i = 0; i < Def::MaxFields; ++i)
|
for (int32_t i = 0; i < Def::MaxFields; ++i)
|
||||||
{
|
{
|
||||||
bx::strCopy(t.FieldVaules[i], sizeof(t.FieldVaules[i]), "{}");
|
bx::strCopy(t.FieldValues[i], sizeof(t.FieldValues[i]), "{}");
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK(ReadName(t.Name));
|
CHECK(ReadName(t.Name));
|
||||||
@@ -203,11 +205,11 @@ Parser::Result Parser::HandleType()
|
|||||||
CHECK(ExpectChar("("));
|
CHECK(ExpectChar("("));
|
||||||
CHECK(ExpectChar("\""));
|
CHECK(ExpectChar("\""));
|
||||||
|
|
||||||
int32_t Remaining = bx::min(GetRemaining(), (int32_t)BX_COUNTOF(Def::Type::FieldVaules[0]));
|
int32_t Remaining = bx::min(GetRemaining(), (int32_t)BX_COUNTOF(Def::Type::FieldValues[0]));
|
||||||
for (int32_t i = 0; i < Remaining; ++i)
|
for (int32_t i = 0; i < Remaining; ++i)
|
||||||
{
|
{
|
||||||
if (*ReadPtr != '\\' && CmpAdvance("\"", Res)) break;
|
if (*ReadPtr != '\\' && CmpAdvance("\"", Res)) break;
|
||||||
t.FieldVaules[t.FieldCount][i] = *ReadPtr;
|
t.FieldValues[t.FieldCount][i] = *ReadPtr;
|
||||||
ReadPtr++;
|
ReadPtr++;
|
||||||
}
|
}
|
||||||
if (Res != OK) return Res;
|
if (Res != OK) return Res;
|
||||||
@@ -404,7 +406,7 @@ Parser::Result Parser::ReadOptionalEnumValues(Def::Enum& Enum, int32_t EntryIdx)
|
|||||||
for (int32_t i = 0; i < Remaining; ++i)
|
for (int32_t i = 0; i < Remaining; ++i)
|
||||||
{
|
{
|
||||||
if (CmpAdvance("\"", Res)) break;
|
if (CmpAdvance("\"", Res)) break;
|
||||||
Enum.ExtraStringFields[extraIdx][EntryIdx][i] = *ReadPtr;
|
Enum.ExtraStringFields[EntryIdx][extraIdx][i] = *ReadPtr;
|
||||||
ReadPtr++;
|
ReadPtr++;
|
||||||
}
|
}
|
||||||
if (Res != OK) return Res;
|
if (Res != OK) return Res;
|
||||||
@@ -425,6 +427,59 @@ int32_t Parser::GetRemaining()
|
|||||||
{
|
{
|
||||||
return &Buffer[BufferSize] - ReadPtr;
|
return &Buffer[BufferSize] - ReadPtr;
|
||||||
}
|
}
|
||||||
|
uint32_t Parser::CalculateTypeHash(const Def::Type& t)
|
||||||
|
{
|
||||||
|
bx::HashMurmur2A hash;
|
||||||
|
hash.begin();
|
||||||
|
for (int32_t i = 0; i < t.FieldCount; ++i)
|
||||||
|
{
|
||||||
|
hash.add(t.FieldNames[i]);
|
||||||
|
hash.add(t.FieldArraySizes[i]);
|
||||||
|
|
||||||
|
Def::EFieldType fieldType = t.FieldTypes[i].FieldKind;
|
||||||
|
if (fieldType == Def::EFieldType::Native)
|
||||||
|
{
|
||||||
|
hash.add(t.FieldTypes[i].Native);
|
||||||
|
}
|
||||||
|
else if (fieldType == Def::EFieldType::DefinedClass)
|
||||||
|
{
|
||||||
|
Def::Type& dependType = Definitions.Types[t.FieldTypes[i].TypeIdx];
|
||||||
|
if (dependType.Hash == 0)
|
||||||
|
{
|
||||||
|
CalculateTypeHash(dependType);
|
||||||
|
}
|
||||||
|
hash.add(dependType.Hash);
|
||||||
|
}
|
||||||
|
else if (fieldType == Def::EFieldType::DefinedEnum)
|
||||||
|
{
|
||||||
|
hash.add(Definitions.Enums[t.FieldTypes[i].TypeIdx].Hash);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERROR(0, "TODO!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hash.end();
|
||||||
|
}
|
||||||
|
void Parser::CalculateHashes()
|
||||||
|
{
|
||||||
|
for (int32_t i = 0; i < Definitions.EnumCount; ++i)
|
||||||
|
{
|
||||||
|
Def::Enum& e = Definitions.Enums[i];
|
||||||
|
bx::HashMurmur2A hash;
|
||||||
|
hash.begin();
|
||||||
|
hash.add(e.EnumType.Native);
|
||||||
|
e.Hash = hash.end();
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < Definitions.TypeCount; ++i)
|
||||||
|
{
|
||||||
|
Def::Type& t = Definitions.Types[i];
|
||||||
|
if (t.Hash == 0)
|
||||||
|
{
|
||||||
|
t.Hash = CalculateTypeHash(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Parser FileParser;
|
Parser FileParser;
|
||||||
CppFileWriter Writer;
|
CppFileWriter Writer;
|
||||||
@@ -460,6 +515,8 @@ int main(int argc, const char** argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
LOG(0, "Finished parsing!");
|
LOG(0, "Finished parsing!");
|
||||||
|
|
||||||
|
FileParser.CalculateHashes();
|
||||||
Writer.GenerateCpp(outPath, FileParser.Definitions);
|
Writer.GenerateCpp(outPath, FileParser.Definitions);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ class Parser
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
Result Parse();
|
Result Parse();
|
||||||
|
void CalculateHashes();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int32_t GetRemaining();
|
int32_t GetRemaining();
|
||||||
@@ -94,6 +95,8 @@ class Parser
|
|||||||
Result ReadTypeToken();
|
Result ReadTypeToken();
|
||||||
Result ReadOptionalEnumValues(Def::Enum& Enum, int32_t EntryIdx);
|
Result ReadOptionalEnumValues(Def::Enum& Enum, int32_t EntryIdx);
|
||||||
|
|
||||||
|
uint32_t CalculateTypeHash(const Def::Type& t);
|
||||||
|
|
||||||
void ErrorLine()
|
void ErrorLine()
|
||||||
{
|
{
|
||||||
char line[64]{0};
|
char line[64]{0};
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace Def
|
|||||||
{
|
{
|
||||||
constexpr int32_t MaxNameLength = 64;
|
constexpr int32_t MaxNameLength = 64;
|
||||||
constexpr int32_t MaxFields = 64;
|
constexpr int32_t MaxFields = 64;
|
||||||
constexpr int32_t MaxExtraEnumFields = 1;
|
constexpr int32_t MaxExtraEnumFields = 2;
|
||||||
enum class EFieldType
|
enum class EFieldType
|
||||||
{
|
{
|
||||||
Native,
|
Native,
|
||||||
@@ -26,8 +26,9 @@ namespace Def
|
|||||||
FieldType FieldTypes[MaxFields];
|
FieldType FieldTypes[MaxFields];
|
||||||
char FieldNames[MaxFields][MaxNameLength];
|
char FieldNames[MaxFields][MaxNameLength];
|
||||||
uint32_t FieldArraySizes[MaxFields]{0};
|
uint32_t FieldArraySizes[MaxFields]{0};
|
||||||
char FieldVaules[MaxFields][128]{0};
|
char FieldValues[MaxFields][128]{0};
|
||||||
char Name[MaxNameLength]{0};
|
char Name[MaxNameLength]{0};
|
||||||
|
uint32_t Hash = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Enum
|
struct Enum
|
||||||
@@ -39,6 +40,7 @@ namespace Def
|
|||||||
char ExtraStringFieldNames[MaxExtraEnumFields][MaxNameLength];
|
char ExtraStringFieldNames[MaxExtraEnumFields][MaxNameLength];
|
||||||
char ExtraStringFields[MaxFields][MaxExtraEnumFields][MaxNameLength];
|
char ExtraStringFields[MaxFields][MaxExtraEnumFields][MaxNameLength];
|
||||||
char Name[MaxNameLength]{0};
|
char Name[MaxNameLength]{0};
|
||||||
|
uint32_t Hash = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DefinitionFile
|
struct DefinitionFile
|
||||||
|
|||||||
@@ -17,6 +17,17 @@ namespace Generated
|
|||||||
return Err.isOk();
|
return Err.isOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T> bool WriteT(const char* _4cc, const T& data)
|
||||||
|
{
|
||||||
|
Writer.write(_4cc, 4, &Err);
|
||||||
|
if (!Err.isOk()) return false;
|
||||||
|
uint32_t hash = data.Hash;
|
||||||
|
Writer.write(&hash, sizeof(hash), &Err);
|
||||||
|
uint32_t size = sizeof(T);
|
||||||
|
Writer.write(&size, sizeof(size), &Err);
|
||||||
|
return Err.isOk() && Save(&data, 1, *this);
|
||||||
|
}
|
||||||
|
|
||||||
bool Write(const void* data, uint32_t size)
|
bool Write(const void* data, uint32_t size)
|
||||||
{
|
{
|
||||||
Writer.write(data, size, &Err);
|
Writer.write(data, size, &Err);
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ namespace Generated
|
|||||||
bool isOk = true;
|
bool isOk = true;
|
||||||
for (uint32_t i = 0; i < count; ++i)
|
for (uint32_t i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
|
isOk = Save(&obj[i].CardCount, 1, serializer) && isOk;
|
||||||
isOk = Save(obj[i].Cards, 64, serializer) && isOk;
|
isOk = Save(obj[i].Cards, 64, serializer) && isOk;
|
||||||
}
|
}
|
||||||
return isOk;
|
return isOk;
|
||||||
@@ -132,6 +133,7 @@ namespace Generated
|
|||||||
bool isOk = true;
|
bool isOk = true;
|
||||||
for (uint32_t i = 0; i < count; ++i)
|
for (uint32_t i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
|
isOk = Load(&obj[i].CardCount, 1, serializer) && isOk;
|
||||||
isOk = Load(obj[i].Cards, 64, serializer) && isOk;
|
isOk = Load(obj[i].Cards, 64, serializer) && isOk;
|
||||||
}
|
}
|
||||||
return isOk;
|
return isOk;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ namespace Generated
|
|||||||
{
|
{
|
||||||
struct PuzzleElementType
|
struct PuzzleElementType
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 2024002654;
|
||||||
static constexpr int32_t EntryCount = 8;
|
static constexpr int32_t EntryCount = 8;
|
||||||
enum Enum : int32_t
|
enum Enum : int32_t
|
||||||
{
|
{
|
||||||
@@ -39,42 +40,62 @@ namespace Generated
|
|||||||
"Blocked",
|
"Blocked",
|
||||||
"Bridge",
|
"Bridge",
|
||||||
};
|
};
|
||||||
|
static constexpr char ShortName[EntryCount][64]
|
||||||
|
{
|
||||||
|
" ",
|
||||||
|
"~+",
|
||||||
|
"~-",
|
||||||
|
"~",
|
||||||
|
"e+",
|
||||||
|
"e-",
|
||||||
|
"█",
|
||||||
|
"#",
|
||||||
|
};
|
||||||
};
|
};
|
||||||
struct PuzPos
|
struct PuzPos
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 1834398141;
|
||||||
int8_t X = {};
|
int8_t X = {};
|
||||||
int8_t Y = {};
|
int8_t Y = {};
|
||||||
};
|
};
|
||||||
struct ElemPos
|
struct ElemPos
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 3966109730;
|
||||||
PuzPos Position = {};
|
PuzPos Position = {};
|
||||||
uint8_t ElemIdx = {};
|
uint8_t ElemIdx = {};
|
||||||
};
|
};
|
||||||
struct PuzzleNode
|
struct PuzzleNode
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 1417779061;
|
||||||
PuzzleElementType::Enum PlacedTypes[4] = {};
|
PuzzleElementType::Enum PlacedTypes[4] = {};
|
||||||
};
|
};
|
||||||
struct StaticPuzzleCard
|
struct StaticPuzzleCard
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 110653106;
|
||||||
PuzzleNode Nodes[4] = {};
|
PuzzleNode Nodes[4] = {};
|
||||||
uint16_t ModelHandle = {};
|
uint16_t ModelHandle = {};
|
||||||
};
|
};
|
||||||
struct StaticPuzzleCardHandle
|
struct StaticPuzzleCardHandle
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 1742502768;
|
||||||
uint16_t Idx = UINT16_MAX;
|
uint16_t Idx = UINT16_MAX;
|
||||||
};
|
};
|
||||||
struct StaticPuzzleData
|
struct StaticPuzzleData
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 2220151575;
|
||||||
|
uint16_t CardCount = {};
|
||||||
StaticPuzzleCard Cards[64] = {};
|
StaticPuzzleCard Cards[64] = {};
|
||||||
};
|
};
|
||||||
struct PuzzleCardStack
|
struct PuzzleCardStack
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 53538532;
|
||||||
StaticPuzzleCardHandle RefCard = {};
|
StaticPuzzleCardHandle RefCard = {};
|
||||||
uint8_t MaxAvailableCount = {};
|
uint8_t MaxAvailableCount = {};
|
||||||
uint8_t UsedCount = {};
|
uint8_t UsedCount = {};
|
||||||
};
|
};
|
||||||
struct PlacedPuzzleCard
|
struct PlacedPuzzleCard
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 3555575973;
|
||||||
StaticPuzzleCardHandle RefCard = {};
|
StaticPuzzleCardHandle RefCard = {};
|
||||||
PuzPos Position = {};
|
PuzPos Position = {};
|
||||||
uint8_t Rotation = {};
|
uint8_t Rotation = {};
|
||||||
@@ -82,6 +103,7 @@ namespace Generated
|
|||||||
};
|
};
|
||||||
struct PuzzleData
|
struct PuzzleData
|
||||||
{
|
{
|
||||||
|
static constexpr uint32_t Hash = 2015691597;
|
||||||
uint8_t WidthTiles = {};
|
uint8_t WidthTiles = {};
|
||||||
uint8_t HeightTiles = {};
|
uint8_t HeightTiles = {};
|
||||||
uint32_t AvailableCardCount = {};
|
uint32_t AvailableCardCount = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user