mirror of
https://github.com/3lswear/webserv.git
synced 2025-10-28 21:07:59 +03:00
changes...
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
#include "webserv.hpp"
|
||||
#include "parse.cpp"
|
||||
|
||||
namespace config
|
||||
{
|
||||
}
|
||||
Reference in New Issue
Block a user