diff --git a/src/app/AbstractParser.cpp b/src/app/AbstractParser.cpp new file mode 100644 index 0000000..015dbc2 --- /dev/null +++ b/src/app/AbstractParser.cpp @@ -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); +} diff --git a/src/app/AbstractParser.h b/src/app/AbstractParser.h new file mode 100644 index 0000000..f5abc2e --- /dev/null +++ b/src/app/AbstractParser.h @@ -0,0 +1,21 @@ +#ifndef ABSTRACTPARSER_H +#define ABSTRACTPARSER_H + +#include +#include +#include +#include + +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 diff --git a/src/app/CFGFileParser.cpp b/src/app/CFGFileParser.cpp new file mode 100644 index 0000000..6241583 --- /dev/null +++ b/src/app/CFGFileParser.cpp @@ -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; +} + diff --git a/src/app/CFGFileParser.h b/src/app/CFGFileParser.h new file mode 100644 index 0000000..aedbedd --- /dev/null +++ b/src/app/CFGFileParser.h @@ -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