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 <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

View File

@@ -1,3 +1,6 @@
#ifndef TOMLNODE_HPP
#define TOMLNODE_HPP
#include "webserv.hpp"
#include <map>
#include <vector>
@@ -7,13 +10,6 @@
#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
@@ -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<std::map<std::string, toml_node> > *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

View File

@@ -1,5 +1,9 @@
#ifndef TOMLPARSER_HPP
#define TOMLPARSER_HPP
#include "TOMLNode.hpp"
#include "Tokenizer.hpp"
#include <string>
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

View File

@@ -1,3 +1,6 @@
#ifndef TOKENIZER_HPP
#define TOKENIZER_HPP
#include "webserv.hpp"
#include <map>
#include <vector>
@@ -6,7 +9,6 @@
#include <iostream>
#include <exception>
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

View File

@@ -6,8 +6,9 @@
#include <iostream>
#include <exception>
#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());
}

View File

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