new tree file format

This commit is contained in:
vrd
2023-02-21 22:35:45 +02:00
parent ee152edbad
commit 78408bd223
11 changed files with 286 additions and 77 deletions
+157
View File
@@ -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;
}