Added the parser class for the custom config files
This commit is contained in:
parent
ca48c5665a
commit
af793d44ac
12
src/app/AbstractParser.cpp
Normal file
12
src/app/AbstractParser.cpp
Normal 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
21
src/app/AbstractParser.h
Normal 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
198
src/app/CFGFileParser.cpp
Normal 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
28
src/app/CFGFileParser.h
Normal 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
|
Loading…
Reference in New Issue
Block a user