support duplicate names

This commit is contained in:
vrd
2023-03-02 21:57:54 +02:00
parent 81963b0663
commit c796f69331
4 changed files with 57 additions and 21 deletions
+43 -12
View File
@@ -39,6 +39,11 @@ namespace /* internal */
/* result */
Tree* cur_tree;
bool isNum(char c)
{
return c >= '0' && c <= '9';
}
void unexpected_char(char c)
{
cerr << "Line " << line << ": Unexpected '" << c << "'\n";
@@ -56,7 +61,8 @@ namespace /* internal */
{
while(it_data < end_data &&
*it_data != ',' &&
*it_data != '\n')
*it_data != '\n' &&
!isNum(*it_data))
{
if(*it_data == ':' /* && *it_data == '-' */)
unexpected_char(*it_data);
@@ -65,6 +71,17 @@ namespace /* internal */
}
U32 sameNamedIndex(char*& it_data)
{
U32 res = 0;
if(isNum(*it_data))
{
res = *it_data - '0'; /* todo many digits */
++it_data;
}
return res;
}
Sex findSex(char*& it_data)
{
Sex res = M;
@@ -137,6 +154,7 @@ namespace /* internal */
pair<person_id, person_id> processParents(char*& it_data)
{
pair<person_id, person_id> res(Nobody, Nobody);
U32 same_name_index = 0;
string name; /* todo dont use string */
for(; it_data < end_data; ++it_data)
{
@@ -144,11 +162,12 @@ namespace /* internal */
{
case ',':
if(res.first == Nobody)
res.first = cur_tree->findId(name.data());
res.first = cur_tree->findId(name.data())[same_name_index]; /* todo validate index */
else if(res.second == Nobody)
res.second = cur_tree->findId(name.data());
res.second = cur_tree->findId(name.data())[same_name_index];
else
/* todo */exit(1);
same_name_index = 0;
name.clear();
break;
case '-':
@@ -159,23 +178,27 @@ namespace /* internal */
case '\n':
++line;
if(res.first == Nobody)
res.first = cur_tree->findId(name.data());
res.first = cur_tree->findId(name.data())[same_name_index];
else
res.second = cur_tree->findId(name.data());
res.second = cur_tree->findId(name.data())[same_name_index];
return prev_parents = res;
case '_':
name.push_back(' ');
break;
case '0' ... '9':
same_name_index = *it_data - '0';
break;
default:
name.push_back(*it_data);
}
}
unexpected_end();
}
vector<person_id> parseSpouses(char*& it_data)
{
vector<person_id> res;
U32 same_name_index = 0;
string name;
for(; it_data < end_data; ++it_data)
{
@@ -184,25 +207,29 @@ namespace /* internal */
case ',':
if(!name.empty())
{
res.push_back( cur_tree->findId(name.data()) );
res.push_back( cur_tree->findId(name.data())[same_name_index] );
name.clear();
same_name_index = 0;
}
else
unexpected_char(',');
break;
case '\n':
++line;
res.push_back( cur_tree->findId(name.data()) );
res.push_back( cur_tree->findId(name.data())[same_name_index] );
return res;
case '_':
name.push_back(' ');
break;
case '0' ... '9':
same_name_index = *it_data - '0';
break;
default:
name.push_back(*it_data);
}
}
if(!name.empty())
res.push_back( cur_tree->findId(name.data()) );
res.push_back( cur_tree->findId(name.data())[same_name_index] );
return res;
}
@@ -235,15 +262,19 @@ namespace /* internal */
EventTime birth{};
EventTime death{};
proceedToNameEnd(it_data);
/* string_view name(name_start, it_data); */
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); */
for(char& c: name)
{
if(c == '_')
c = ' ';
}
Sex sex = findSex(it_data);
for(; it_data < end_data; ++it_data)
@@ -332,7 +363,7 @@ namespace /* internal */
Tree parseTftFile(fd_t file)
{
Tree result("name");
Tree result("t");
cur_tree = &result;
MappedFile mapedfile = mapfile(file);