cleanup and minor changes

This commit is contained in:
vrd
2023-03-07 21:00:56 +02:00
parent 83d47cbefa
commit 7b05b7c5c1
6 changed files with 67 additions and 279 deletions
+32 -21
View File
@@ -45,20 +45,31 @@ namespace /* internal */
/* result */
Tree* cur_tree;
void err_three_parents(const char* extra_name)
void err_three_parents(const string& extra_name)
{
endwin();
cerr << "Line " << line << " two parents are already defined, "
<< extra_name << " is third" << endl;
exit(1);
}
/* void err_name_index(const string& name, U32 i) */
/* { */
/* endwin(); */
/* cerr << "Line " << line << " the number given after the declaration of a person can" */
/* " only be his place among the same named. " << i << " doesn't satisfy this for '" */
/* << name << '\'' << endl; */
/* exit(1); */
/* } */
bool isNum(char c)
{
return c >= '0' && c <= '9';
}
void proceedToNameEnd(char*& it_data)
string proceedToNameEnd(char*& it_data)
{
char* name_start = it_data;
while(it_data < end_data &&
*it_data != ',' &&
*it_data != '\n' &&
@@ -68,7 +79,7 @@ namespace /* internal */
ERR_UNEXPECTED_CHAR(*it_data);
++it_data;
}
return string(name_start, it_data); /* it_data points past end */
}
U32 sameNamedIndex(char*& it_data)
@@ -162,11 +173,11 @@ namespace /* internal */
{
case ',':
if(res.first == Nobody)
res.first = cur_tree->findId(name.data())[same_name_index]; /* todo validate index */
res.first = cur_tree->findId(name)[same_name_index]; /* todo validate index */
else if(res.second == Nobody)
res.second = cur_tree->findId(name.data())[same_name_index];
res.second = cur_tree->findId(name)[same_name_index];
else
err_three_parents(name.data());
err_three_parents(name);
same_name_index = 0;
name.clear();
@@ -179,9 +190,9 @@ namespace /* internal */
case '\n':
++line;
if(res.first == Nobody)
res.first = cur_tree->findId(name.data())[same_name_index];
res.first = cur_tree->findId(name)[same_name_index];
else
res.second = cur_tree->findId(name.data())[same_name_index];
res.second = cur_tree->findId(name)[same_name_index];
return prev_parents = res;
case '_':
name.push_back(' ');
@@ -214,7 +225,7 @@ namespace /* internal */
case ',':
if(!name.empty())
{
res.push_back( cur_tree->findId(name.data())[same_name_index] );
res.push_back( cur_tree->findId(name)[same_name_index] );
name.clear();
same_name_index = 0;
}
@@ -224,7 +235,7 @@ namespace /* internal */
case '\n':
++line;
if(!name.empty())
res.push_back( cur_tree->findId(name.data())[same_name_index] );
res.push_back( cur_tree->findId(name)[same_name_index] );
return res;
case '_':
name.push_back(' ');
@@ -237,7 +248,7 @@ namespace /* internal */
}
}
if(!name.empty())
res.push_back( cur_tree->findId(name.data())[same_name_index] );
res.push_back( cur_tree->findId(name)[same_name_index] );
return res;
}
@@ -264,24 +275,22 @@ namespace /* internal */
void state_person(char*& it_data)
{
char* name_start = it_data;
pair<person_id, person_id> parents(Nobody, Nobody);
vector<person_id> spouses;
EventTime birth{};
EventTime death{};
proceedToNameEnd(it_data); /* todo merge funcs */
string name(name_start, it_data);
U32 same_name_index = sameNamedIndex(it_data);
/* string_view name(name_start, it_data); */
string name = proceedToNameEnd(it_data);
for(char& c: name)
{
if(c == '_')
c = ' ';
}
U32 same_name_index = sameNamedIndex(it_data);
/* todo */
/* if(cur_tree->findId(name).size() != same_name_index) */
/* err_name_index(name, same_name_index); */
Sex sex = findSex(it_data);
@@ -320,7 +329,7 @@ namespace /* internal */
}
else
{
cur_tree->addPerson(name.c_str(), sex, parents.first, parents.second, birth, death);
cur_tree->addPerson(name.c_str(), sex, parents.first, parents.second, birth, death); /* todo prevent copy */
for(person_id spouse: spouses)
cur_tree->addRelation(spouse, Spouse, cur_tree->last());
--it_data; /* rewind 1 */
@@ -369,9 +378,11 @@ namespace /* internal */
}
Tree parseTftFile(fd_t file)
Tree parseTftFile(const char* path)
{
Tree result("t");
fd_t file = openOrDie(path);
Tree result(path);
cur_tree = &result;
MappedFile mapedfile = mapfile(file);