Official reference client implementation for Cumulocity SmartREST on u-blox C027.

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Vincent Wochnik

Committer:
xinlei
Date:
Fri May 08 13:03:41 2015 +0000
Revision:
103:ede6611e064e
Parent:
101:dbcd3bc51758
Child:
106:c61f0d62b625
hotfix: validate configuration content.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 99:e369fc75c000 1 #include <string.h>
xinlei 99:e369fc75c000 2 #include "ConfigParser.h"
xinlei 99:e369fc75c000 3 #include "logging.h"
xinlei 99:e369fc75c000 4
xinlei 99:e369fc75c000 5 bool ConfigParser::parse(const char *buf)
xinlei 99:e369fc75c000 6 {
xinlei 99:e369fc75c000 7 if (buf == NULL) return false;
xinlei 99:e369fc75c000 8 Token tok;
xinlei 99:e369fc75c000 9 ptrPF = &ConfigParser::parseKey;
xinlei 99:e369fc75c000 10 parseOK = true;
xinlei 103:ede6611e064e 11 dict.clear();
xinlei 99:e369fc75c000 12 for (const char*p = buf; *p;) {
xinlei 99:e369fc75c000 13 p = lexConfig(p, tok);
xinlei 99:e369fc75c000 14 (this->*ptrPF)(tok);
xinlei 99:e369fc75c000 15 }
xinlei 99:e369fc75c000 16 return parseOK;
xinlei 99:e369fc75c000 17 }
xinlei 99:e369fc75c000 18
xinlei 99:e369fc75c000 19 void ConfigParser::parseKey(Token& tok)
xinlei 99:e369fc75c000 20 {
xinlei 99:e369fc75c000 21 if (tok.type == Token::STRING) {
xinlei 99:e369fc75c000 22 memset(key, 0, MAX_KEY_LEN);
xinlei 99:e369fc75c000 23 size_t num = tok.len<MAX_VALUE_LEN ? tok.len : MAX_VALUE_LEN;
xinlei 99:e369fc75c000 24 strncpy(key, tok.p, num);
xinlei 99:e369fc75c000 25 ptrPF = &ConfigParser::parseAssignOp;
xinlei 99:e369fc75c000 26 } else {
xinlei 99:e369fc75c000 27 parseError(tok);
xinlei 99:e369fc75c000 28 }
xinlei 99:e369fc75c000 29 }
xinlei 99:e369fc75c000 30
xinlei 99:e369fc75c000 31 void ConfigParser::parseAssignOp(Token& tok)
xinlei 99:e369fc75c000 32 {
xinlei 99:e369fc75c000 33 if (tok.type == Token::ASSIGN) {
xinlei 99:e369fc75c000 34 ptrPF = &ConfigParser::parseValue;
xinlei 99:e369fc75c000 35 } else {
xinlei 99:e369fc75c000 36 parseError(tok);
xinlei 99:e369fc75c000 37 }
xinlei 99:e369fc75c000 38 }
xinlei 99:e369fc75c000 39
xinlei 99:e369fc75c000 40 void ConfigParser::parseValue(Token& tok)
xinlei 99:e369fc75c000 41 {
xinlei 99:e369fc75c000 42 if (tok.type != Token::NONE) {
xinlei 99:e369fc75c000 43 if (strncmp(key, "interval", MAX_KEY_LEN) == 0 &&
xinlei 99:e369fc75c000 44 tok.type != Token::INT) {
xinlei 99:e369fc75c000 45 parseError(tok);
xinlei 99:e369fc75c000 46 } else {
xinlei 99:e369fc75c000 47 memset(value, 0, MAX_VALUE_LEN);
xinlei 99:e369fc75c000 48 size_t num = tok.len<MAX_VALUE_LEN ? tok.len : MAX_VALUE_LEN;
xinlei 99:e369fc75c000 49 strncpy(value, tok.p, num);
xinlei 99:e369fc75c000 50 dict.set(key, value);
xinlei 99:e369fc75c000 51 ptrPF = &ConfigParser::parseSemiColon;
xinlei 99:e369fc75c000 52 }
xinlei 99:e369fc75c000 53 } else {
xinlei 99:e369fc75c000 54 parseError(tok);
xinlei 99:e369fc75c000 55 }
xinlei 99:e369fc75c000 56 }
xinlei 99:e369fc75c000 57
xinlei 99:e369fc75c000 58 void ConfigParser::parseSemiColon(Token& tok)
xinlei 99:e369fc75c000 59 {
xinlei 99:e369fc75c000 60 if (tok.type == Token::SEMICOLON) {
xinlei 99:e369fc75c000 61 ptrPF = &ConfigParser::parseKey;
xinlei 99:e369fc75c000 62 } else {
xinlei 99:e369fc75c000 63 parseError(tok);
xinlei 99:e369fc75c000 64 }
xinlei 99:e369fc75c000 65 }
xinlei 99:e369fc75c000 66
xinlei 99:e369fc75c000 67 void ConfigParser::parseError(Token& tok)
xinlei 99:e369fc75c000 68 {
xinlei 99:e369fc75c000 69 parseOK = false;
xinlei 101:dbcd3bc51758 70 aError("ConfParse: (%d) %.*s\n", tok.type, (int)tok.len, tok.p);
xinlei 99:e369fc75c000 71 parseRecover(tok);
xinlei 99:e369fc75c000 72 }
xinlei 99:e369fc75c000 73
xinlei 99:e369fc75c000 74 void ConfigParser::parseRecover(Token& tok)
xinlei 99:e369fc75c000 75 {
xinlei 99:e369fc75c000 76 if (tok.type == Token::SEMICOLON) {
xinlei 99:e369fc75c000 77 ptrPF = &ConfigParser::parseKey;
xinlei 99:e369fc75c000 78 } else {
xinlei 99:e369fc75c000 79 ptrPF = &ConfigParser::parseRecover;
xinlei 99:e369fc75c000 80 }
xinlei 99:e369fc75c000 81 }