new tree file format
This commit is contained in:
+157
@@ -0,0 +1,157 @@
|
||||
#include <iostream>
|
||||
/* #include <string_view> */
|
||||
#include <string>
|
||||
#include "tree.hpp"
|
||||
#include "utils.hpp"
|
||||
|
||||
using std::cerr;
|
||||
using std::string_view;
|
||||
using std::string;
|
||||
|
||||
namespace /* internal */
|
||||
{
|
||||
char* data;
|
||||
char* data_end; /* past the end pointer */
|
||||
unsigned line = 1;
|
||||
|
||||
/* state */
|
||||
void (*state)(); /* current state */
|
||||
void state_neutral();
|
||||
void state_person();
|
||||
/* void state_person_attribute() */
|
||||
|
||||
/* result */
|
||||
Tree* cur_tree;
|
||||
|
||||
|
||||
void unexpected_char(char c)
|
||||
{
|
||||
cerr << "Line " << line << ": Unexpected '" << c << "'\n";
|
||||
exit(1);
|
||||
/* throw 0; */
|
||||
}
|
||||
|
||||
void unexpected_end()
|
||||
{
|
||||
cerr << "Unexpected end of file";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void proceedToNameEnd()
|
||||
{
|
||||
while(data < data_end &&
|
||||
*data != ',' &&
|
||||
*data != '\n')
|
||||
{
|
||||
if(*data == ':' /* && *data == '-' */)
|
||||
unexpected_char(*data);
|
||||
++data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Sex findSex()
|
||||
{
|
||||
Sex res = M;
|
||||
if(*data == ',')
|
||||
{
|
||||
++data;
|
||||
if(*data == 'M')
|
||||
res = M;
|
||||
else if(*data == 'F')
|
||||
res = F;
|
||||
else
|
||||
unexpected_char(*data);
|
||||
|
||||
++data;
|
||||
if(*data != '\n')
|
||||
unexpected_char(*data);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void processAtribute()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void state_neutral()
|
||||
{
|
||||
for(; data < data_end; ++data)
|
||||
{
|
||||
switch(*data)
|
||||
{
|
||||
default:
|
||||
state_person();
|
||||
return;
|
||||
break;
|
||||
case '\n':
|
||||
++line;
|
||||
break;
|
||||
/* case '#': */
|
||||
/* state = state_comment; */
|
||||
/* return; */
|
||||
case ',':
|
||||
case '-':
|
||||
case 0 ... 9:
|
||||
case ':':
|
||||
unexpected_char(*data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void state_person()
|
||||
{
|
||||
char* name_start = data;
|
||||
person_id parent1;
|
||||
person_id parent2;
|
||||
EventTime birth;
|
||||
EventTime death;
|
||||
|
||||
proceedToNameEnd();
|
||||
/* string_view name(name_start, data); */
|
||||
string name(name_start, data);
|
||||
|
||||
Sex sex = findSex();
|
||||
|
||||
for(; data < data_end; ++data)
|
||||
{
|
||||
switch(*data)
|
||||
{
|
||||
case '\n':
|
||||
++line;
|
||||
if(data[1] == ':') /* todo */
|
||||
{
|
||||
processAtribute();
|
||||
}
|
||||
else
|
||||
{
|
||||
cur_tree->addPerson(name.c_str(), sex/* , parent1, parent2, birth, death */);
|
||||
}
|
||||
break;
|
||||
/* case '#': */
|
||||
/* state = state_comment; */
|
||||
/* return; */
|
||||
/* case 0...9: */
|
||||
/* case ':': */
|
||||
/* unexpected_char(*data); */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Tree parseTftFile(MappedFile file)
|
||||
{
|
||||
data = file.data;
|
||||
data_end = file.data + file.len;
|
||||
|
||||
Tree result("name");
|
||||
cur_tree = &result;
|
||||
|
||||
state_neutral();
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user