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
config/ConfigParser.cpp@103:ede6611e064e, 2015-05-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |