changes...

This commit is contained in:
3lswear
2022-01-04 18:31:10 +03:00
parent 4cc8dfeace
commit 4aec6d4657
6 changed files with 248 additions and 45 deletions

View File

@@ -16,4 +16,19 @@
#include <stdlib.h> #include <stdlib.h>
#include <fstream> #include <fstream>
#include <map>
#include <vector>
void parse(void);
class toml_node;
/* typedef std::vector<TOMLMap *> TOMLArray; */
/* typedef std::vector<TOMLArray *> TOMLArrayOfMap; */
typedef std::map<std::string, toml_node *> TOMLMap; // = JSONObject
typedef std::vector<std::string, TOMLMap *> TOMLMapArray;
typedef std::vector<toml_node *> TOMLArray;
void display(TOMLMap *config);
#endif #endif

View File

@@ -1,3 +1,6 @@
#ifndef TOMLNODE_HPP
#define TOMLNODE_HPP
#include "webserv.hpp" #include "webserv.hpp"
#include <map> #include <map>
#include <vector> #include <vector>
@@ -7,13 +10,6 @@
#include <exception> #include <exception>
class toml_node;
/* typedef std::vector<TOMLMap *> TOMLArray; */
/* typedef std::vector<TOMLArray *> TOMLArrayOfMap; */
typedef std::map<std::string, toml_node *> TOMLMap; // = JSONObject
typedef std::vector<std::string, TOMLMap *> TOMLMapArray;
typedef std::vector<toml_node *> TOMLArray;
class toml_node class toml_node
@@ -21,7 +17,7 @@ class toml_node
enum e_type enum e_type
{ {
STRING, NUM, BOOL, ARRAY, MAP, MAPARRAY, NIL STRING, NUM, BOOL, ARRAY, MAP, MAPARRAY, NIL
} type; } type;
union u_value union u_value
{ {
@@ -34,9 +30,13 @@ class toml_node
TOMLMap *map; TOMLMap *map;
/* std::vector<std::map<std::string, toml_node> > *map_array; */ /* std::vector<std::map<std::string, toml_node> > *map_array; */
TOMLMapArray *map_array; TOMLMapArray *map_array;
} value; } value;
public: public:
TOMLMap *getMap(void)
{
return (value.map);
}
void setString(std::string *str) void setString(std::string *str)
{ {
value.str = str; value.str = str;
@@ -63,4 +63,11 @@ class toml_node
{ {
type = NIL; type = NIL;
} }
void setObject(TOMLMap *obj)
{
value.map = obj;
type = MAP;
}
}; };
#endif

View File

@@ -1,5 +1,9 @@
#ifndef TOMLPARSER_HPP
#define TOMLPARSER_HPP
#include "TOMLNode.hpp" #include "TOMLNode.hpp"
#include "Tokenizer.hpp" #include "Tokenizer.hpp"
#include <string>
namespace config namespace config
{ {
@@ -8,22 +12,184 @@ namespace config
private: private:
std::fstream file; std::fstream file;
toml_node *root; //root of TOML tree toml_node *root; //root of TOML tree
toml_node *current; //node currently being parsed /* toml_node *current; //node currently being parsed */
Tokenizer tokenizer; Tokenizer tokenizer;
public: public:
TOMLParser(const std::string filename) : tokenizer(filename) {} TOMLParser(const std::string filename) : tokenizer(filename) {}
void parse(void); toml_node *parse(void);
toml_node *parseObject(void); toml_node *parseObject(void)
toml_node *parseString(void); {
toml_node *parseNumber(void); std::cout << "Parsing object" << std::endl;
toml_node *parseArray(void); toml_node *node = new toml_node;
toml_node *parseBool(void); TOMLMap *mapObject = new TOMLMap;
toml_node *parseNil(void); 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; std::string key;
key = ""; key = "";
@@ -34,7 +200,7 @@ namespace config
try try
{ {
token = tokenizer.getToken(); token = tokenizer.getToken();
std::cout << token.to_string() << std::endl; /* std::cout << token.to_string() << std::endl; */
switch (token.type) switch (token.type)
{ {
case ARR_OPEN: case ARR_OPEN:
@@ -52,6 +218,7 @@ namespace config
if (!root) if (!root)
root = parsedNumber; root = parsedNumber;
} }
break;
case STRING: case STRING:
{ {
tokenizer.rollBackToken(); tokenizer.rollBackToken();
@@ -59,6 +226,7 @@ namespace config
if (!root) if (!root)
root = parsedString; root = parsedString;
} }
break;
case BOOL: case BOOL:
{ {
tokenizer.rollBackToken(); tokenizer.rollBackToken();
@@ -66,6 +234,7 @@ namespace config
if (!root) if (!root)
root = parsedBool; root = parsedBool;
} }
break;
default: default:
{ {
throw std::logic_error("JOPA :("); throw std::logic_error("JOPA :(");
@@ -77,17 +246,7 @@ namespace config
break; break;
} }
} }
} return (root);
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);
} }
} }
#endif

View File

@@ -1,3 +1,6 @@
#ifndef TOKENIZER_HPP
#define TOKENIZER_HPP
#include "webserv.hpp" #include "webserv.hpp"
#include <map> #include <map>
#include <vector> #include <vector>
@@ -6,7 +9,6 @@
#include <iostream> #include <iostream>
#include <exception> #include <exception>
namespace config namespace config
{ {
enum e_token enum e_token
@@ -29,7 +31,7 @@ namespace config
{ {
std::string value; std::string value;
e_token type; e_token type;
std::string to_string(void); /* std::string to_string(void); */
}; };
class Tokenizer class Tokenizer
@@ -38,10 +40,17 @@ namespace config
std::fstream file; std::fstream file;
size_t prev_pos; size_t prev_pos;
public: 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(); char getWithoutWhiteSpace();
struct s_token getToken(); struct s_token getToken();
void *hasMoreTokens(); bool hasMoreTokens();
void rollBackToken(); void rollBackToken();
}; };
@@ -61,6 +70,11 @@ namespace config
return (c); return (c);
} }
bool Tokenizer::hasMoreTokens(void)
{
return (!file.eof());
}
void Tokenizer::rollBackToken(void) void Tokenizer::rollBackToken(void)
{ {
if (file.eof()) if (file.eof())
@@ -143,3 +157,5 @@ namespace config
return (token); return (token);
} }
} }
#endif

View File

@@ -6,8 +6,9 @@
#include <iostream> #include <iostream>
#include <exception> #include <exception>
#include "TOMLNode.cpp" #include "TOMLNode.hpp"
#include "TOMLParser.cpp" #include "TOMLParser.hpp"
#include "Tokenizer.hpp"
/* struct location */ /* struct location */
/* { */ /* { */
@@ -20,9 +21,20 @@
/* { */ /* { */
/* std::string name; */ /* std::string name; */
/* } */ /* } */
namespace config 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());
}

View File

@@ -1,6 +0,0 @@
#include "webserv.hpp"
#include "parse.cpp"
namespace config
{
}