#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; }