Added the parser class for the custom config files

This commit is contained in:
anschrammh 2019-03-24 23:09:37 +01:00
parent ca48c5665a
commit af793d44ac
4 changed files with 259 additions and 0 deletions

View File

@ -0,0 +1,12 @@
#include "AbstractParser.h"
AbstractParser::AbstractParser(const char *resource) : _resource(NULL)
{
_resource = (char *) malloc((strlen(resource) * sizeof(char)) + 1); //+1 for the string terminating character
strcpy(_resource, resource);
}
AbstractParser::~AbstractParser()
{
free(_resource);
}

21
src/app/AbstractParser.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef ABSTRACTPARSER_H
#define ABSTRACTPARSER_H
#include <Arduino.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
class AbstractParser
{
public:
AbstractParser(const char *resource);
~AbstractParser();
virtual void *parseFile() = 0;
virtual boolean save(void *data) = 0;
protected:
char *_resource;
private:
};
#endif //ABSTRACTPARSER_H

198
src/app/CFGFileParser.cpp Normal file
View File

@ -0,0 +1,198 @@
#include "CFGFileParser.h"
CFGFileParser::CFGFileParser(SDCardManager &sdCardManager, const char *file):AbstractParser(file), _state(INIT), _type(PARAMETER), _sdCardManager(sdCardManager)
{
}
void *CFGFileParser::parseFile()
{
//Here is the logic for the file parser
File file;
CFGDictionary *dictioRef = new CFGDictionary;
char readChar(0), *parsedParameter(NULL), *parsedValue(NULL);
file = _sdCardManager.open(_resource);
if(!file)
{
delete dictioRef;
return NULL;
}
while(file.available())
{
readChar = (char)file.read();
//Do work
switch(_state)
{
case INIT:
if(readChar == '#') _state = COMMENT_SECTION;
else if((readChar >= 65 && readChar <= 90) || (readChar >= 97 && readChar <= 122) || (readChar >= 48 && readChar <= 57))
{
_state = PARAM_SECTION;
parsedParameter = addChar(parsedParameter, readChar);
if(parsedParameter == NULL)
_state = ERROR;
//printf("%c",readChar);
}
else
_state = ERROR;
break;
case COMMENT_SECTION:
if(readChar == '\r') _state = LINE_BREAK;
if(readChar == '\n') _state = LINE_BREAK;
break;
case LINE_BREAK:
if(readChar == '#')
_state = COMMENT_SECTION;
else if(readChar == '\n') _state = LINE_BREAK;
else if(readChar == '\r') _state = LINE_BREAK;
else if((readChar >= 65 && readChar <= 90) || (readChar >= 97 && readChar <= 122) || (readChar >= 48 && readChar <= 57))
{
_state = PARAM_SECTION;
//printf("%c",readChar);
_type = PARAMETER;
parsedParameter = addChar(parsedParameter, readChar);
if(parsedParameter == NULL)
_state = ERROR;
}
else if(readChar == '\'')
{
_state = OPENING_QUOTE;
_type = PARAMETER;
}
else
_state = ERROR;
break;
case PARAM_SECTION:
if(readChar == '\'')_state = OPENING_QUOTE;
else if(readChar == ':') _state = SEPARATION;
else if(readChar == '\n')
{
_state = LINE_BREAK;
if(parsedParameter != NULL)
{
//printf("%s --> %s\n", parsedParameter, parsedValue);
dictioRef->addParameter(parsedParameter, parsedValue == NULL ? "":parsedValue);
free(parsedParameter);free(parsedValue);
parsedParameter = NULL;
parsedValue = NULL;
}
}
else if(readChar == '\r')
{
_state = LINE_BREAK;
if(parsedParameter != NULL)
{
//printf("%s --> %s\n", parsedParameter, parsedValue);
dictioRef->addParameter(parsedParameter, parsedValue == NULL ? "":parsedValue);
free(parsedParameter);free(parsedValue);
parsedParameter = NULL;
parsedValue = NULL;
}
}
else if(readChar == ' ') _state = PARAM_SECTION;
else if((readChar >= 65 && readChar <= 90) || (readChar >= 97 && readChar <= 122) || readChar == '_' || (readChar >= 48 && readChar <= 57))
{
if(_type == PARAMETER)
{
parsedParameter = addChar(parsedParameter, readChar);
if(parsedParameter == NULL)
_state = ERROR;
}
else
{
parsedValue = addChar(parsedValue, readChar);
if(parsedValue == NULL)
_state = ERROR;
}
//printf("%c",readChar);
}
else
_state = ERROR;
break;
case OPENING_QUOTE:
if(readChar == '\'') _state = PARAM_SECTION;
else if((readChar >= 65 && readChar <= 90) || (readChar >= 97 && readChar <= 122) || readChar == ' ' || readChar == '_' || (readChar >= 48 && readChar <= 57))
{
//printf("%c",readChar);
if(_type == PARAMETER)
{
parsedParameter = addChar(parsedParameter, readChar);
if(parsedParameter == NULL)
_state = ERROR;
}
else
{
parsedValue = addChar(parsedValue, readChar);
if(parsedValue == NULL)
_state = ERROR;
}
}
else
_state = ERROR;
break;
case SEPARATION:
_type = VALUE;
if(readChar == '\'')_state = OPENING_QUOTE;
else _state = PARAM_SECTION;
break;
case ERROR:
dictioRef->dispose();
delete dictioRef;
free(parsedValue);
free(parsedParameter);
parsedValue = NULL;
parsedParameter = NULL;
file.close();
return NULL;
break;
}
}
file.close();
return dictioRef;
}
boolean CFGFileParser::save(void *data)
{
return true;
}
char *CFGFileParser::addChar(char *pointer, const char character)
{
char *tempAddr = NULL;
if(pointer == NULL)
{
tempAddr = (char *) realloc(pointer, 2*sizeof(char));
if(tempAddr == NULL)
return NULL;
else
{
pointer = tempAddr;
pointer[0] = character;
pointer[1] = '\0';
}
}
else
{
tempAddr = (char *) realloc(pointer, (strlen(pointer)+2)*sizeof(char));
if(tempAddr == NULL)
{
free(pointer);
return NULL;
}
else
{
pointer = tempAddr;
pointer[strlen(pointer)+1] = '\0';
pointer[strlen(pointer)] = character;
}
}
return pointer;
}

28
src/app/CFGFileParser.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef CFGFILEPARSER_H
#define CFGFILEPARSER_H
#include "AbstractParser.h"
#include "CFGDictionary.h"
#include "SDCardManager.h"
#include "definition.h"
class CFGFileParser : public AbstractParser
{
public:
CFGFileParser(SDCardManager &sdCardManager, const char *file);
virtual void *parseFile();
virtual boolean save(void *data);
protected:
private:
//This part handles the _buff realloc
char *addChar(char *pointer, const char character);
enum State {INIT, COMMENT_SECTION, LINE_BREAK, PARAM_SECTION, ERROR, OPENING_QUOTE, SEPARATION};
enum Type {PARAMETER, VALUE};
State _state;
Type _type;
SDCardManager &_sdCardManager;
};
#endif //CFGFILEPARSER_H