From 4aec6d46578f95a5826294019679ae0c0fd9a202 Mon Sep 17 00:00:00 2001 From: 3lswear Date: Tue, 4 Jan 2022 18:31:10 +0300 Subject: [PATCH] changes... --- includes/webserv.hpp | 15 +++ src/config/TOMLNode.hpp | 25 +++-- src/config/TOMLParser.hpp | 203 +++++++++++++++++++++++++++++++++---- src/config/Tokenizer.hpp | 24 ++++- src/config/parse.cpp | 20 +++- src/config/parse_types.cpp | 6 -- 6 files changed, 248 insertions(+), 45 deletions(-) delete mode 100644 src/config/parse_types.cpp diff --git a/includes/webserv.hpp b/includes/webserv.hpp index e1e0a8f..49d3faf 100644 --- a/includes/webserv.hpp +++ b/includes/webserv.hpp @@ -16,4 +16,19 @@ #include #include +#include +#include + +void parse(void); + +class toml_node; + +/* typedef std::vector TOMLArray; */ +/* typedef std::vector TOMLArrayOfMap; */ +typedef std::map TOMLMap; // = JSONObject +typedef std::vector TOMLMapArray; +typedef std::vector TOMLArray; + +void display(TOMLMap *config); + #endif diff --git a/src/config/TOMLNode.hpp b/src/config/TOMLNode.hpp index ad644c2..52e04e7 100644 --- a/src/config/TOMLNode.hpp +++ b/src/config/TOMLNode.hpp @@ -1,3 +1,6 @@ +#ifndef TOMLNODE_HPP +#define TOMLNODE_HPP + #include "webserv.hpp" #include #include @@ -7,13 +10,6 @@ #include -class toml_node; - -/* typedef std::vector TOMLArray; */ -/* typedef std::vector TOMLArrayOfMap; */ -typedef std::map TOMLMap; // = JSONObject -typedef std::vector TOMLMapArray; -typedef std::vector TOMLArray; class toml_node @@ -21,7 +17,7 @@ class toml_node enum e_type { STRING, NUM, BOOL, ARRAY, MAP, MAPARRAY, NIL - } type; + } type; union u_value { @@ -34,9 +30,13 @@ class toml_node TOMLMap *map; /* std::vector > *map_array; */ TOMLMapArray *map_array; - } value; + } value; public: + TOMLMap *getMap(void) + { + return (value.map); + } void setString(std::string *str) { value.str = str; @@ -63,4 +63,11 @@ class toml_node { type = NIL; } + void setObject(TOMLMap *obj) + { + value.map = obj; + type = MAP; + } }; + +#endif diff --git a/src/config/TOMLParser.hpp b/src/config/TOMLParser.hpp index 8f74694..b1f8efa 100644 --- a/src/config/TOMLParser.hpp +++ b/src/config/TOMLParser.hpp @@ -1,5 +1,9 @@ +#ifndef TOMLPARSER_HPP +#define TOMLPARSER_HPP + #include "TOMLNode.hpp" #include "Tokenizer.hpp" +#include namespace config { @@ -8,22 +12,184 @@ namespace config private: std::fstream file; toml_node *root; //root of TOML tree - toml_node *current; //node currently being parsed + /* toml_node *current; //node currently being parsed */ Tokenizer tokenizer; public: TOMLParser(const std::string filename) : tokenizer(filename) {} - void parse(void); + toml_node *parse(void); - toml_node *parseObject(void); - toml_node *parseString(void); - toml_node *parseNumber(void); - toml_node *parseArray(void); - toml_node *parseBool(void); - toml_node *parseNil(void); + toml_node *parseObject(void) + { + std::cout << "Parsing object" << std::endl; + toml_node *node = new toml_node; + TOMLMap *mapObject = new TOMLMap; + bool completed = false; + while (!completed) + { + if (tokenizer.hasMoreTokens()) + { + s_token nextToken = tokenizer.getToken(); + std::string key = nextToken.value; + std::cout << key << std::endl; + tokenizer.getToken(); + nextToken = tokenizer.getToken(); + switch (nextToken.type) + { + case STRING: + { + tokenizer.rollBackToken(); + (*mapObject)[key] = parseString(); + break; + } + case ARR_OPEN: + { + (*mapObject)[key] = parseArray(); + break; + } + case NUMBER: + { + (*mapObject)[key] = parseNumber(); + break; + } + case BOOL: + { + (*mapObject)[key] = parseBool(); + break; + } + default: + { + /* throw std::logic_error("jopa in parseObject"); */ + std::cerr << "Unknown token, marking as complete" << std::endl; + completed = true; + break; + } + } + } + else + { + throw std::logic_error("parseObject: no more tokens"); + } + } + node->setObject(mapObject); + return (node); + } + + toml_node *parseString(void) + { + /* toml_node *node; */ + toml_node *node = new toml_node; + std::string *sValue; + + std::cout << "Parsing string" << std::endl; + s_token token = tokenizer.getToken(); + sValue = new std::string(token.value); + node->setString(sValue); + + return (node); + } + + toml_node *parseNumber(void) + { + toml_node *node = new toml_node; + int value; + + std::cout << "Parsing number" << std::endl; + s_token token = tokenizer.getToken(); + value = std::atoi(token.value.c_str()); + node->setNumber(value); + + return (node); + } + + toml_node *parseArray(void) + { + std::cout << "Parsing array" << std::endl; + toml_node *node = new toml_node; + TOMLArray *array = new TOMLArray; + bool completed = false; + + while (!completed) + { + if (tokenizer.hasMoreTokens()) + { + throw std::logic_error("No more tokens"); + } + else + { + s_token nextToken = tokenizer.getToken(); + switch (nextToken.type) + { + case ARR_OPEN: + { + node = parseArray(); + break; + } + case STRING: + { + tokenizer.rollBackToken(); + node = parseString(); + break; + } + case NUMBER: + { + tokenizer.rollBackToken(); + node = parseNumber(); + break; + } + case BOOL: + { + tokenizer.rollBackToken(); + node = parseBool(); + break; + } + case NIL: + { + node = parseNil(); + break; + } + default: + { + throw std::logic_error("unkown token in parseList"); + } + + } + array->push_back(node); + nextToken = tokenizer.getToken(); + if (nextToken.type == ARR_CLOSE) + completed = true; + } + } + node->setArr(array); + return (node); + } + + toml_node *parseBool(void) + { + toml_node *node = new toml_node; + bool value; + + std::cerr << "Parsing bool" << std::endl; + s_token token = tokenizer.getToken(); + if (token.value == "true") + value = true; + else + value = false; + node->setBool(value); + + return (node); + } + + toml_node *parseNil(void) + { + toml_node *node = new toml_node; + std::cerr << "Parsing NIL" << std::endl; + node->setNil(); + return (node); + } }; - void TOMLParser::parse(void) + toml_node *TOMLParser::parse(void) { std::string key; key = ""; @@ -34,7 +200,7 @@ namespace config try { token = tokenizer.getToken(); - std::cout << token.to_string() << std::endl; + /* std::cout << token.to_string() << std::endl; */ switch (token.type) { case ARR_OPEN: @@ -52,6 +218,7 @@ namespace config if (!root) root = parsedNumber; } + break; case STRING: { tokenizer.rollBackToken(); @@ -59,6 +226,7 @@ namespace config if (!root) root = parsedString; } + break; case BOOL: { tokenizer.rollBackToken(); @@ -66,6 +234,7 @@ namespace config if (!root) root = parsedBool; } + break; default: { throw std::logic_error("JOPA :("); @@ -77,17 +246,7 @@ namespace config break; } } - } - - toml_node *TOMLParser::parseString(void) - { - toml_node *node; - std::string *sValue; - - std::cout << "Parsing string" << std::endl; - s_token token = tokenizer.getToken(); - sValue = new std::string(token.value); - node->setString(sValue); - + return (root); } } +#endif diff --git a/src/config/Tokenizer.hpp b/src/config/Tokenizer.hpp index d467ad7..c2f21c5 100644 --- a/src/config/Tokenizer.hpp +++ b/src/config/Tokenizer.hpp @@ -1,3 +1,6 @@ +#ifndef TOKENIZER_HPP +#define TOKENIZER_HPP + #include "webserv.hpp" #include #include @@ -6,7 +9,6 @@ #include #include - namespace config { enum e_token @@ -29,7 +31,7 @@ namespace config { std::string value; e_token type; - std::string to_string(void); + /* std::string to_string(void); */ }; class Tokenizer @@ -38,10 +40,17 @@ namespace config std::fstream file; size_t prev_pos; public: - Tokenizer(std::string filename); + Tokenizer(std::string filename) + { + file.open(filename.c_str(), std::ios::in); + if (!file.good()) + { + std::cerr << "file didn't open" << std::endl; + } + } char getWithoutWhiteSpace(); struct s_token getToken(); - void *hasMoreTokens(); + bool hasMoreTokens(); void rollBackToken(); }; @@ -61,6 +70,11 @@ namespace config return (c); } + bool Tokenizer::hasMoreTokens(void) + { + return (!file.eof()); + } + void Tokenizer::rollBackToken(void) { if (file.eof()) @@ -143,3 +157,5 @@ namespace config return (token); } } + +#endif diff --git a/src/config/parse.cpp b/src/config/parse.cpp index ea94994..7fece02 100644 --- a/src/config/parse.cpp +++ b/src/config/parse.cpp @@ -6,8 +6,9 @@ #include #include -#include "TOMLNode.cpp" -#include "TOMLParser.cpp" +#include "TOMLNode.hpp" +#include "TOMLParser.hpp" +#include "Tokenizer.hpp" /* struct location */ /* { */ @@ -20,9 +21,20 @@ /* { */ /* std::string name; */ /* } */ - namespace config { + void display(TOMLMap *config) + { + std::cout << "printing config:" << std::endl; + std::cout << (*config)["name"] << std::endl; + std::cout << (*config)["port"] << std::endl; + } } - +void parse(void) +{ + std::string filename = "config/simple.toml"; + config::TOMLParser parser(filename); + toml_node *root = parser.parse(); + config::display(root->getMap()); +} diff --git a/src/config/parse_types.cpp b/src/config/parse_types.cpp deleted file mode 100644 index a2a398d..0000000 --- a/src/config/parse_types.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "webserv.hpp" -#include "parse.cpp" - -namespace config -{ -}