refactor: add helper parser funcs

This commit is contained in:
3lswear
2022-01-22 18:10:02 +03:00
parent d9f3330440
commit 24e49f63e8
2 changed files with 81 additions and 60 deletions

View File

@@ -16,6 +16,10 @@ namespace config
TOMLMap *root; //root of TOML tree
/* toml_node *current; //node currently being parsed */
Tokenizer tokenizer;
static std::vector<std::string> split_name(std::string name);
static void put_to_subtable(TOMLMap *root,
std::vector<std::string> full_name,
toml_node *map_node);
public:
TOMLParser(const std::string filename);

View File

@@ -121,7 +121,6 @@ namespace config
std::cerr << "Parsing MapArray" << std::endl;
toml_node *map_node;
toml_node *maparr_node;
s_token current;
try { current = tokenizer.getToken(); }
@@ -143,68 +142,11 @@ namespace config
std::cout << current.value << std::endl;
std::string name = current.value;
std::vector<std::string> full_name;
size_t dot;
while (1)
{
dot = name.find('.');
if (dot == std::string::npos)
break;
/* std::cout << dot << std::endl; */
full_name.push_back(name.substr(0, dot));
name.erase(0, dot + 1);
}
full_name.push_back(name);
for (size_t i = 0; i < full_name.size(); i++)
std::cout << full_name[i] << ", ";
std::cout << std::endl;
full_name = split_name(name);
/* throw std::logic_error("tha end"); */
TOMLMap *local_root;
std::vector<std::string>::iterator subname = full_name.begin();
local_root = root;
while (1)
{
if (subname + 1 == full_name.end())
{
it = local_root->find(*subname);
if (it == local_root->end())
{
maparr_node = new toml_node;
TOMLMapArray *map_array = new TOMLMapArray;
map_array->push_back(map_node->getMap());
maparr_node->setMapArray(map_array);
(*local_root)[*subname] = maparr_node;
}
else
(it->second)->getMapArray()->push_back(map_node->getMap());
break;
}
else
{
it = local_root->find(*subname);
toml_node *map_node2;
map_node2 = new toml_node;
TOMLMap *map = new TOMLMap;
map_node2->setObject(map);
/* subname not found in local_root */
if (it == local_root->end())
{
(*local_root)[*subname] = map_node2;
local_root = map;
}
/* subname found in local_root */
else
{
local_root = *((it->second)->getMapArray()->end() - 1);
}
}
++subname;
}
put_to_subtable(root, full_name, map_node);
}
@@ -408,4 +350,79 @@ namespace config
}
return (root);
}
std::vector<std::string> TOMLParser::split_name(std::string name)
{
std::vector<std::string> full_name;
size_t dot;
while (1)
{
dot = name.find('.');
if (dot == std::string::npos)
break;
/* std::cout << dot << std::endl; */
full_name.push_back(name.substr(0, dot));
name.erase(0, dot + 1);
}
full_name.push_back(name);
for (size_t i = 0; i < full_name.size(); i++)
std::cout << full_name[i] << ", ";
std::cout << std::endl;
return (full_name);
}
void TOMLParser::put_to_subtable(TOMLMap *root,
std::vector<std::string> full_name,
toml_node *map_node)
{
std::vector<std::string>::iterator subname = full_name.begin();
toml_node *maparr_node;
TOMLMap::iterator it;
TOMLMap *local_root = root;
while (1)
{
if (subname + 1 == full_name.end())
{
it = local_root->find(*subname);
if (it == local_root->end())
{
maparr_node = new toml_node;
TOMLMapArray *map_array = new TOMLMapArray;
map_array->push_back(map_node->getMap());
maparr_node->setMapArray(map_array);
(*local_root)[*subname] = maparr_node;
}
else
(it->second)->getMapArray()->push_back(map_node->getMap());
break;
}
else
{
it = local_root->find(*subname);
toml_node *map_node2;
map_node2 = new toml_node;
TOMLMap *map = new TOMLMap;
map_node2->setObject(map);
/* subname not found in local_root */
if (it == local_root->end())
{
(*local_root)[*subname] = map_node2;
local_root = map;
}
/* subname found in local_root */
else
{
local_root = *((it->second)->getMapArray()->end() - 1);
}
}
++subname;
}
}
}