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