Own fork of MbedSmartRestMain

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Cumulocity Official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ConfigParser.cpp Source File

ConfigParser.cpp

00001 #include <string.h>
00002 #include "ConfigParser.h"
00003 #include "logging.h"
00004 
00005 bool ConfigParser::parse(const char *buf)
00006 {
00007         if (buf == NULL) return false;
00008         Token tok;
00009         ptrPF = &ConfigParser::parseKey;
00010         parseOK = true;
00011         dict.clear();
00012         for (const char*p = buf; *p;) {
00013                 p = lexConfig(p, tok);
00014                 (this->*ptrPF)(tok);
00015         }
00016         return parseOK;
00017 }
00018 
00019 void ConfigParser::parseKey(Token& tok)
00020 {
00021         if (tok.type == Token::STRING) {
00022                 memset(key, 0, MAX_KEY_LEN);
00023                 size_t num = tok.len<MAX_VALUE_LEN ? tok.len : MAX_VALUE_LEN;
00024                 strncpy(key, tok.p, num);
00025                 ptrPF = &ConfigParser::parseAssignOp;
00026         } else {
00027                 parseError(tok);
00028         }
00029 }
00030 
00031 void ConfigParser::parseAssignOp(Token& tok)
00032 {
00033         if (tok.type == Token::ASSIGN) {
00034                 ptrPF = &ConfigParser::parseValue;
00035         } else {
00036                 parseError(tok);
00037         }
00038 }
00039 
00040 void ConfigParser::parseValue(Token& tok)
00041 {
00042         if (tok.type != Token::NONE) {
00043                 memset(value, 0, MAX_VALUE_LEN);
00044                 size_t num = tok.len<MAX_VALUE_LEN ? tok.len : MAX_VALUE_LEN;
00045                 strncpy(value, tok.p, num);
00046                 dict.set(key, value);
00047                 ptrPF = &ConfigParser::parseSemiColon;
00048         } else {
00049                 parseError(tok);
00050         }
00051 }
00052 
00053 void ConfigParser::parseSemiColon(Token& tok)
00054 {
00055         if (tok.type == Token::SEMICOLON) {
00056                 ptrPF = &ConfigParser::parseKey;
00057         } else {
00058                 parseError(tok);
00059         }
00060 }
00061 
00062 void ConfigParser::parseError(Token& tok)
00063 {
00064         parseOK = false;
00065         aError("ConfParse: (%d) %.*s\n", tok.type, (int)tok.len, tok.p);
00066         parseRecover(tok);
00067 }
00068 
00069 void ConfigParser::parseRecover(Token& tok)
00070 {
00071         if (tok.type == Token::SEMICOLON) {
00072                 ptrPF = &ConfigParser::parseKey;
00073         } else {
00074                 ptrPF = &ConfigParser::parseRecover;
00075         }
00076 }