intermediate changes

This commit is contained in:
3lswear
2022-01-13 09:25:04 +03:00
parent 7c6d0783f1
commit ebd09bbcdc
5 changed files with 115 additions and 79 deletions

View File

@@ -26,7 +26,7 @@ class toml_node;
/* typedef std::vector<TOMLMap *> TOMLArray; */ /* typedef std::vector<TOMLMap *> TOMLArray; */
/* typedef std::vector<TOMLArray *> TOMLArrayOfMap; */ /* typedef std::vector<TOMLArray *> TOMLArrayOfMap; */
typedef std::map<std::string, toml_node *> TOMLMap; // = JSONObject typedef std::map<std::string, toml_node *> TOMLMap; // = JSONObject
typedef std::vector<TOMLMap *> TOMLMapArray; typedef std::pair<std::string, std::vector<TOMLMap *> *> TOMLMapArray;
typedef std::vector<toml_node *> TOMLArray; typedef std::vector<toml_node *> TOMLArray;
void display(TOMLMap *config); void display(TOMLMap *config);

View File

@@ -16,10 +16,6 @@
class toml_node class toml_node
{ {
enum e_type
{
STRING, NUM, BOOL, ARRAY, MAP, MAPARRAY, NIL
} type;
union u_value union u_value
{ {
@@ -35,6 +31,11 @@ class toml_node
} value; } value;
public: public:
enum e_type
{
STRING, NUM, BOOL, ARRAY, MAP, MAPARRAY, NIL
} type;
enum e_type get_type(void) enum e_type get_type(void)
{ {
@@ -45,6 +46,12 @@ class toml_node
{ {
return (value.map); return (value.map);
} }
TOMLMapArray *getMapArray(void)
{
return (value.map_array);
}
void setString(std::string *str) void setString(std::string *str)
{ {
value.str = str; value.str = str;

View File

@@ -101,10 +101,10 @@ namespace config
std::cerr << "Parsing MapArray" << std::endl; std::cerr << "Parsing MapArray" << std::endl;
toml_node *node = new toml_node; toml_node *node = new toml_node;
TOMLMapArray *servers = new TOMLMapArray; TOMLMapArray *servers = new TOMLMapArray;
s_token current;
while (tokenizer.hasMoreTokens()) while (tokenizer.hasMoreTokens())
{ {
s_token current;
try { current = tokenizer.getToken(); } try { current = tokenizer.getToken(); }
catch (std::logic_error e) catch (std::logic_error e)
{ {
@@ -112,9 +112,21 @@ namespace config
break; break;
} }
if (current.type == MAPARRAY_DECL) if (current.type == MAPARRAY_DECL)
servers->push_back(parseMap()->getMap()); {
if (tokenizer.getToken().type != NEWLINE)
throw std::logic_error("no newline after map_array declaration");
servers->second->push_back(parseMap()->getMap());
}
else else
throw std::logic_error("unexpected token in parseMapArray"); throw std::logic_error("unexpected token in parseMapArray");
if (tokenizer.hasMoreTokens())
current = tokenizer.getToken();
else
break;
if (current.type != NEWLINE)
{
throw std::logic_error("EXPECTED newline");
}
} }
node->setMapArray(servers); node->setMapArray(servers);
return (node); return (node);
@@ -245,72 +257,73 @@ namespace config
std::string key; std::string key;
key = ""; key = "";
root = parseMap(); /* root = parseMap(); */
root = parseMapArray();
return (root); return (root);
while (tokenizer.hasMoreTokens()) /* while (tokenizer.hasMoreTokens()) */
{ /* { */
s_token token; /* s_token token; */
try /* try */
{ /* { */
token = tokenizer.getToken(); /* token = tokenizer.getToken(); */
/* std::cout << token.to_string() << std::endl; */ /* /1* std::cout << token.to_string() << std::endl; *1/ */
switch (token.type) /* switch (token.type) */
{ /* { */
case KEY: /* case KEY: */
{ /* { */
toml_node *parsedObject = parseString(); /* toml_node *parsedObject = parseString(); */
if (!root) /* if (!root) */
root = parsedObject; /* root = parsedObject; */
} /* } */
case ARR_OPEN: /* case ARR_OPEN: */
{ /* { */
toml_node *parsedObject = parseMap(); /* toml_node *parsedObject = parseMap(); */
/* parsedObject->printNode(0); */ /* /1* parsedObject->printNode(0); *1/ */
if (!root) /* if (!root) */
root = parsedObject; /* root = parsedObject; */
} /* } */
break; /* break; */
case NUMBER: /* case NUMBER: */
{ /* { */
tokenizer.rollBackToken(); /* tokenizer.rollBackToken(); */
toml_node *parsedNumber = parseNumber(); /* toml_node *parsedNumber = parseNumber(); */
if (!root) /* if (!root) */
root = parsedNumber; /* root = parsedNumber; */
} /* } */
break; /* break; */
case STRING: /* case STRING: */
{ /* { */
tokenizer.rollBackToken(); /* tokenizer.rollBackToken(); */
toml_node *parsedString = parseString(); /* toml_node *parsedString = parseString(); */
if (!root) /* if (!root) */
root = parsedString; /* root = parsedString; */
} /* } */
break; /* break; */
case BOOL: /* case BOOL: */
{ /* { */
tokenizer.rollBackToken(); /* tokenizer.rollBackToken(); */
toml_node *parsedBool = parseBool(); /* toml_node *parsedBool = parseBool(); */
if (!root) /* if (!root) */
root = parsedBool; /* root = parsedBool; */
} /* } */
break; /* break; */
case MAPARRAY_DECL: /* case MAPARRAY_DECL: */
{ /* { */
} /* } */
default: /* default: */
{ /* { */
throw std::logic_error("JOPA :("); /* throw std::logic_error("JOPA :("); */
} /* } */
} /* } */
} /* } */
catch (std::logic_error err) /* catch (std::logic_error err) */
{ /* { */
break; /* break; */
} /* } */
} /* } */
return (root); return (root);
} }
} }

View File

@@ -35,6 +35,14 @@ namespace config
/* std::string to_string(void); */ /* std::string to_string(void); */
}; };
bool isspace(char c)
{
if (c == ' ' || c == '\t')
return (true);
else
return (false);
}
bool istomlkey(char c) bool istomlkey(char c)
{ {
if (isalnum(c) || c == '-' || c == '_') if (isalnum(c) || c == '-' || c == '_')
@@ -75,7 +83,7 @@ namespace config
char Tokenizer::getWithoutWhiteSpace(void) char Tokenizer::getWithoutWhiteSpace(void)
{ {
char c = ' '; char c = ' ';
while (c == ' ') while (config::isspace(c))
{ {
file.get(c); file.get(c);
if ((c == ' ') && !file.good()) if ((c == ' ') && !file.good())

View File

@@ -23,19 +23,27 @@
/* } */ /* } */
namespace config namespace config
{ {
void display(TOMLMap *config) void display(toml_node *config)
{ {
std::cout << ">>> printing config: <<<" << std::endl; std::cout << ">>> printing config: <<<" << std::endl;
if (config->get_type() != toml_node::MAPARRAY)
throw std::logic_error("Attempting to display not map_array");
TOMLMapArray *root_map_array = config->getMapArray();
TOMLMapArray::iterator root_it;
TOMLMap::iterator it; TOMLMap::iterator it;
for (it = config->begin(); it != config->end(); ++it)
{
std::cout << it->first
<< ": "
<< *(it->second->toString())
<< std::endl;
}
for (root_it = root_map_array->begin(); root_it != root_map_array->end(); ++root_it)
{
for (it = (*root_it)->begin(); it != (*root_it)->end(); ++it)
{
std::cout << it->first
<< ": "
<< *(it->second->toString())
<< std::endl;
}
std::cout << "-------" << std::endl;
}
} }
} }
@@ -44,5 +52,5 @@ void parse(void)
std::string filename = "config/simple.toml"; std::string filename = "config/simple.toml";
config::TOMLParser parser(filename); config::TOMLParser parser(filename);
toml_node *root = parser.parse(); toml_node *root = parser.parse();
config::display(root->getMap()); config::display(root);
} }