From ebd09bbcdc50b55dc0f99602b3cfe40770e52e31 Mon Sep 17 00:00:00 2001 From: 3lswear Date: Thu, 13 Jan 2022 09:25:04 +0300 Subject: [PATCH] intermediate changes --- includes/webserv.hpp | 2 +- src/config/TOMLNode.hpp | 15 ++-- src/config/TOMLParser.hpp | 141 +++++++++++++++++++++----------------- src/config/Tokenizer.hpp | 10 ++- src/config/parse.cpp | 26 ++++--- 5 files changed, 115 insertions(+), 79 deletions(-) diff --git a/includes/webserv.hpp b/includes/webserv.hpp index 926a93e..2620e81 100644 --- a/includes/webserv.hpp +++ b/includes/webserv.hpp @@ -26,7 +26,7 @@ class toml_node; /* typedef std::vector TOMLArray; */ /* typedef std::vector TOMLArrayOfMap; */ typedef std::map TOMLMap; // = JSONObject -typedef std::vector TOMLMapArray; +typedef std::pair *> TOMLMapArray; typedef std::vector TOMLArray; void display(TOMLMap *config); diff --git a/src/config/TOMLNode.hpp b/src/config/TOMLNode.hpp index 5638b46..b7b1175 100644 --- a/src/config/TOMLNode.hpp +++ b/src/config/TOMLNode.hpp @@ -16,10 +16,6 @@ class toml_node { - enum e_type - { - STRING, NUM, BOOL, ARRAY, MAP, MAPARRAY, NIL - } type; union u_value { @@ -35,6 +31,11 @@ class toml_node } value; public: + + enum e_type + { + STRING, NUM, BOOL, ARRAY, MAP, MAPARRAY, NIL + } type; enum e_type get_type(void) { @@ -45,6 +46,12 @@ class toml_node { return (value.map); } + + TOMLMapArray *getMapArray(void) + { + return (value.map_array); + } + void setString(std::string *str) { value.str = str; diff --git a/src/config/TOMLParser.hpp b/src/config/TOMLParser.hpp index 404d339..6f423aa 100644 --- a/src/config/TOMLParser.hpp +++ b/src/config/TOMLParser.hpp @@ -101,10 +101,10 @@ namespace config std::cerr << "Parsing MapArray" << std::endl; toml_node *node = new toml_node; TOMLMapArray *servers = new TOMLMapArray; + s_token current; while (tokenizer.hasMoreTokens()) { - s_token current; try { current = tokenizer.getToken(); } catch (std::logic_error e) { @@ -112,9 +112,21 @@ namespace config break; } if (current.type == MAPARRAY_DECL) - servers->push_back(parseMap()->getMap()); + { + if (tokenizer.getToken().type != NEWLINE) + throw std::logic_error("no newline after map_array declaration"); + servers->second->push_back(parseMap()->getMap()); + } else throw std::logic_error("unexpected token in parseMapArray"); + if (tokenizer.hasMoreTokens()) + current = tokenizer.getToken(); + else + break; + if (current.type != NEWLINE) + { + throw std::logic_error("EXPECTED newline"); + } } node->setMapArray(servers); return (node); @@ -245,72 +257,73 @@ namespace config std::string key; key = ""; - root = parseMap(); + /* root = parseMap(); */ + root = parseMapArray(); return (root); - while (tokenizer.hasMoreTokens()) - { - s_token token; - try - { - token = tokenizer.getToken(); - /* std::cout << token.to_string() << std::endl; */ - switch (token.type) - { - case KEY: - { - toml_node *parsedObject = parseString(); - if (!root) - root = parsedObject; - } + /* while (tokenizer.hasMoreTokens()) */ + /* { */ + /* s_token token; */ + /* try */ + /* { */ + /* token = tokenizer.getToken(); */ + /* /1* std::cout << token.to_string() << std::endl; *1/ */ + /* switch (token.type) */ + /* { */ + /* case KEY: */ + /* { */ + /* toml_node *parsedObject = parseString(); */ + /* if (!root) */ + /* root = parsedObject; */ + /* } */ - case ARR_OPEN: - { - toml_node *parsedObject = parseMap(); - /* parsedObject->printNode(0); */ - if (!root) - root = parsedObject; - } - break; - case NUMBER: - { - tokenizer.rollBackToken(); - toml_node *parsedNumber = parseNumber(); - if (!root) - root = parsedNumber; - } - break; - case STRING: - { - tokenizer.rollBackToken(); - toml_node *parsedString = parseString(); - if (!root) - root = parsedString; - } - break; - case BOOL: - { - tokenizer.rollBackToken(); - toml_node *parsedBool = parseBool(); - if (!root) - root = parsedBool; - } - break; - case MAPARRAY_DECL: - { + /* case ARR_OPEN: */ + /* { */ + /* toml_node *parsedObject = parseMap(); */ + /* /1* parsedObject->printNode(0); *1/ */ + /* if (!root) */ + /* root = parsedObject; */ + /* } */ + /* break; */ + /* case NUMBER: */ + /* { */ + /* tokenizer.rollBackToken(); */ + /* toml_node *parsedNumber = parseNumber(); */ + /* if (!root) */ + /* root = parsedNumber; */ + /* } */ + /* break; */ + /* case STRING: */ + /* { */ + /* tokenizer.rollBackToken(); */ + /* toml_node *parsedString = parseString(); */ + /* if (!root) */ + /* root = parsedString; */ + /* } */ + /* break; */ + /* case BOOL: */ + /* { */ + /* tokenizer.rollBackToken(); */ + /* toml_node *parsedBool = parseBool(); */ + /* if (!root) */ + /* root = parsedBool; */ + /* } */ + /* break; */ + /* case MAPARRAY_DECL: */ + /* { */ - } - default: - { - throw std::logic_error("JOPA :("); - } - } - } - catch (std::logic_error err) - { - break; - } - } + /* } */ + /* default: */ + /* { */ + /* throw std::logic_error("JOPA :("); */ + /* } */ + /* } */ + /* } */ + /* catch (std::logic_error err) */ + /* { */ + /* break; */ + /* } */ + /* } */ return (root); } } diff --git a/src/config/Tokenizer.hpp b/src/config/Tokenizer.hpp index 73148b7..791f8a8 100644 --- a/src/config/Tokenizer.hpp +++ b/src/config/Tokenizer.hpp @@ -35,6 +35,14 @@ namespace config /* std::string to_string(void); */ }; + bool isspace(char c) + { + if (c == ' ' || c == '\t') + return (true); + else + return (false); + } + bool istomlkey(char c) { if (isalnum(c) || c == '-' || c == '_') @@ -75,7 +83,7 @@ namespace config char Tokenizer::getWithoutWhiteSpace(void) { char c = ' '; - while (c == ' ') + while (config::isspace(c)) { file.get(c); if ((c == ' ') && !file.good()) diff --git a/src/config/parse.cpp b/src/config/parse.cpp index 420e774..c9c31a0 100644 --- a/src/config/parse.cpp +++ b/src/config/parse.cpp @@ -23,19 +23,27 @@ /* } */ namespace config { - void display(TOMLMap *config) + void display(toml_node *config) { std::cout << ">>> printing config: <<<" << std::endl; + if (config->get_type() != toml_node::MAPARRAY) + throw std::logic_error("Attempting to display not map_array"); + TOMLMapArray *root_map_array = config->getMapArray(); + TOMLMapArray::iterator root_it; TOMLMap::iterator it; - for (it = config->begin(); it != config->end(); ++it) - { - std::cout << it->first - << ": " - << *(it->second->toString()) - << std::endl; - } + for (root_it = root_map_array->begin(); root_it != root_map_array->end(); ++root_it) + { + for (it = (*root_it)->begin(); it != (*root_it)->end(); ++it) + { + std::cout << it->first + << ": " + << *(it->second->toString()) + << std::endl; + } + std::cout << "-------" << std::endl; + } } } @@ -44,5 +52,5 @@ void parse(void) std::string filename = "config/simple.toml"; config::TOMLParser parser(filename); toml_node *root = parser.parse(); - config::display(root->getMap()); + config::display(root); }