It compiles!
This commit is contained in:
parent
defbb33ce8
commit
b1523d13a6
|
@ -1,37 +1,15 @@
|
|||
module;
|
||||
|
||||
import <string>;
|
||||
|
||||
import shadow_utils;
|
||||
/*
|
||||
module;
|
||||
|
||||
module Shadow.FileFormat:SFFElement;
|
||||
|
||||
import <string>;
|
||||
import shadow_utils;
|
||||
|
||||
namespace Shadow::SFF {
|
||||
|
||||
|
||||
SFFElement* SFFElement::GetFirstChild()
|
||||
{
|
||||
return children.size() > 0 ? children.begin()->second : nullptr;
|
||||
}
|
||||
|
||||
SFFElement* SFFElement::GetChildByIndex(int index)
|
||||
{
|
||||
ChildrenMap::iterator it = children.begin();
|
||||
for (size_t i = 0; i < index; i++)
|
||||
{
|
||||
it++;
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
SFFElement* SFFElement::GetChildByName(std::string name)
|
||||
{
|
||||
ChildrenMap::iterator it = children.find(name);
|
||||
if (it != children.end()) {
|
||||
return it->second;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
|
@ -1,15 +1,14 @@
|
|||
module;
|
||||
|
||||
export module Shadow.FileFormat:SFFElement;
|
||||
|
||||
import <string>;
|
||||
import <map>;
|
||||
import <list>;
|
||||
|
||||
export module Shadow.FileFormat:SFFElement;
|
||||
namespace Shadow::SFF {
|
||||
|
||||
|
||||
export namespace Shadow::SFF {
|
||||
|
||||
class SFFElement
|
||||
export class SFFElement
|
||||
{
|
||||
public:
|
||||
SFFElement* parent;
|
||||
|
@ -26,12 +25,29 @@ export namespace Shadow::SFF {
|
|||
|
||||
std::string GetStringProperty(std::string name);
|
||||
|
||||
SFFElement* GetFirstChild()
|
||||
{
|
||||
return children.size() > 0 ? children.begin()->second : nullptr;
|
||||
}
|
||||
|
||||
SFFElement* GetFirstChild();
|
||||
SFFElement* GetChildByIndex(int index)
|
||||
{
|
||||
ChildrenMap::iterator it = children.begin();
|
||||
for (size_t i = 0; i < index; i++)
|
||||
{
|
||||
it++;
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
SFFElement* GetChildByIndex(int index);
|
||||
|
||||
SFFElement* GetChildByName(std::string name);
|
||||
SFFElement* GetChildByName(std::string name)
|
||||
{
|
||||
ChildrenMap::iterator it = children.find(name);
|
||||
if (it != children.end()) {
|
||||
return it->second;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
~SFFElement();
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/*
|
||||
module;
|
||||
import <string>;
|
||||
import <iostream>;
|
||||
|
@ -13,112 +14,5 @@ import :SFFVersion;
|
|||
|
||||
namespace Shadow::SFF {
|
||||
|
||||
SFFElement* SFFParser::ReadFromStream(std::istream& stream)
|
||||
{
|
||||
auto version = ReadVersionFromHeader(stream);
|
||||
if (version.invalid) {
|
||||
//SH_CORE_WARN("Shadow File is invalid");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
//The current node that we are building
|
||||
auto* context = new SFFElement;
|
||||
|
||||
//Top level Element
|
||||
SFFElement* base = context;
|
||||
|
||||
//The new node that will be a child of the context
|
||||
auto* current = new SFFElement;
|
||||
|
||||
|
||||
std::string buffer;
|
||||
|
||||
char c;
|
||||
while (!stream.eof())
|
||||
{
|
||||
stream.get(c);
|
||||
if (c == ':')
|
||||
{
|
||||
//The stuff in the buffer is a parameter name
|
||||
std::cout << "Name: " << buffer;
|
||||
current->name = buffer;
|
||||
buffer = "";
|
||||
}
|
||||
else if (c == '{')
|
||||
{
|
||||
//Start of a new block
|
||||
current->isBlock = true;
|
||||
current->parent = context;
|
||||
context->children[current->name] = current;
|
||||
context = current;
|
||||
|
||||
current = new SFFElement;
|
||||
}
|
||||
else if (c == ',')
|
||||
{
|
||||
// End of a property
|
||||
//The stuff is the value
|
||||
std::cout << "Value: " << buffer << std::endl;
|
||||
current->value = buffer;
|
||||
current->parent = context;
|
||||
current->isBlock = false;
|
||||
buffer = "";
|
||||
|
||||
context->children[current->name] = current;
|
||||
|
||||
current = new SFFElement();
|
||||
}
|
||||
else if (c == '}')
|
||||
{
|
||||
// End of a block
|
||||
context = context->parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (std::isspace(c) == 0)
|
||||
{
|
||||
buffer += c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "END" << std::endl;
|
||||
|
||||
return base;
|
||||
}
|
||||
|
||||
SFFVersion SFFParser::ReadVersionFromHeader(std::istream& stream) {
|
||||
std::string line;
|
||||
std::getline(stream, line);
|
||||
auto parts = explode(line, '_');
|
||||
if (parts[0] != "ShadowFileFormat") {
|
||||
return SFFVersion(-1,-1,-1);
|
||||
}
|
||||
else {
|
||||
int mayor = std::stoi(parts[1]);
|
||||
int minor = std::stoi(parts[2]);
|
||||
int patch = std::stoi(parts[3]);
|
||||
return SFFVersion(mayor, minor, patch);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
SFFElement* SFFParser::ReadFromFile(std::string path)
|
||||
{
|
||||
std::ifstream inputFileStream(path);
|
||||
|
||||
if (errno)
|
||||
{
|
||||
//SH_CORE_ERROR("Error: {0} | File: {1}", strerror(errno), path);
|
||||
//std::cerr << "Error: " << strerror(errno) << std::endl;
|
||||
//std::cerr << "File: " << path << std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return ReadFromStream(inputFileStream);
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
|
@ -1,24 +1,130 @@
|
|||
module;
|
||||
|
||||
export module Shadow.FileFormat:SFFParser;
|
||||
|
||||
import <string>;
|
||||
import <iostream>;
|
||||
|
||||
export module Shadow.FileFormat:SFFParser;
|
||||
import <fstream>;
|
||||
import <string>;
|
||||
import shadow_utils;
|
||||
|
||||
import :SFFElement;
|
||||
import :SFFVersion;
|
||||
|
||||
export namespace Shadow::SFF {
|
||||
namespace Shadow::SFF {
|
||||
|
||||
class SFFParser
|
||||
export class SFFParser
|
||||
{
|
||||
public:
|
||||
|
||||
static SFFElement* ReadFromStream(std::istream& stream);
|
||||
static SFFElement* ReadFromStream(std::istream& stream)
|
||||
{
|
||||
auto version = ReadVersionFromHeader(stream);
|
||||
if (version.invalid) {
|
||||
//SH_CORE_WARN("Shadow File is invalid");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static SFFVersion ReadVersionFromHeader(std::istream& stream);
|
||||
|
||||
static SFFElement* ReadFromFile(std::string path);
|
||||
//The current node that we are building
|
||||
auto* context = new SFFElement;
|
||||
|
||||
//Top level Element
|
||||
SFFElement* base = context;
|
||||
|
||||
//The new node that will be a child of the context
|
||||
auto* current = new SFFElement;
|
||||
|
||||
|
||||
std::string buffer;
|
||||
|
||||
char c;
|
||||
while (!stream.eof())
|
||||
{
|
||||
stream.get(c);
|
||||
if (c == ':')
|
||||
{
|
||||
//The stuff in the buffer is a parameter name
|
||||
std::cout << "Name: " << buffer;
|
||||
current->name = buffer;
|
||||
buffer = "";
|
||||
}
|
||||
else if (c == '{')
|
||||
{
|
||||
//Start of a new block
|
||||
current->isBlock = true;
|
||||
current->parent = context;
|
||||
context->children[current->name] = current;
|
||||
context = current;
|
||||
|
||||
current = new SFFElement;
|
||||
}
|
||||
else if (c == ',')
|
||||
{
|
||||
// End of a property
|
||||
//The stuff is the value
|
||||
std::cout << "Value: " << buffer << std::endl;
|
||||
current->value = buffer;
|
||||
current->parent = context;
|
||||
current->isBlock = false;
|
||||
buffer = "";
|
||||
|
||||
context->children[current->name] = current;
|
||||
|
||||
current = new SFFElement();
|
||||
}
|
||||
else if (c == '}')
|
||||
{
|
||||
// End of a block
|
||||
context = context->parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (std::isspace(c) == 0)
|
||||
{
|
||||
buffer += c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "END" << std::endl;
|
||||
|
||||
return base;
|
||||
}
|
||||
|
||||
static SFFVersion ReadVersionFromHeader(std::istream& stream) {
|
||||
std::string line;
|
||||
std::getline(stream, line);
|
||||
auto parts = explode(line, '_');
|
||||
if (parts[0] != "ShadowFileFormat") {
|
||||
return SFFVersion(-1, -1, -1);
|
||||
}
|
||||
else {
|
||||
int mayor = std::stoi(parts[1]);
|
||||
int minor = std::stoi(parts[2]);
|
||||
int patch = std::stoi(parts[3]);
|
||||
return SFFVersion(mayor, minor, patch);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static SFFElement* ReadFromFile(std::string path)
|
||||
{
|
||||
std::ifstream inputFileStream(path);
|
||||
|
||||
if (errno)
|
||||
{
|
||||
//SH_CORE_ERROR("Error: {0} | File: {1}", strerror(errno), path);
|
||||
//std::cerr << "Error: " << strerror(errno) << std::endl;
|
||||
//std::cerr << "File: " << path << std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return ReadFromStream(inputFileStream);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
module;
|
||||
|
||||
module shadow_utils;
|
||||
|
||||
import <string>;
|
||||
import <vector>;
|
||||
|
||||
module shadow_utils;
|
||||
|
||||
inline std::vector<std::string> explode(const std::string& s, const char& c)
|
||||
{
|
||||
std::string buff;
|
||||
|
|
Loading…
Reference in New Issue
Block a user