diff --git a/includes/TOMLParser.hpp b/includes/TOMLParser.hpp index e06e41a..6cc5c8a 100644 --- a/includes/TOMLParser.hpp +++ b/includes/TOMLParser.hpp @@ -16,6 +16,10 @@ namespace config TOMLMap *root; //root of TOML tree /* toml_node *current; //node currently being parsed */ Tokenizer tokenizer; + static std::vector split_name(std::string name); + static void put_to_subtable(TOMLMap *root, + std::vector full_name, + toml_node *map_node); public: TOMLParser(const std::string filename); diff --git a/src/config/TOMLParser.cpp b/src/config/TOMLParser.cpp index ac61b05..b07d220 100644 --- a/src/config/TOMLParser.cpp +++ b/src/config/TOMLParser.cpp @@ -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 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::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 TOMLParser::split_name(std::string name) + { + std::vector 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 full_name, + toml_node *map_node) + { + std::vector::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; + } + } }