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
util/lex.cpp@99:e369fc75c000, 2015-05-07 (annotated)
- Committer:
- xinlei
- Date:
- Thu May 07 09:57:55 2015 +0000
- Revision:
- 99:e369fc75c000
- Parent:
- 94:61d44636f020
prepare for v2.1rc3.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
xinlei | 94:61d44636f020 | 1 | #include <ctype.h> |
xinlei | 94:61d44636f020 | 2 | #include <string.h> |
xinlei | 94:61d44636f020 | 3 | #include "lex.h" |
xinlei | 99:e369fc75c000 | 4 | #include "logging.h" |
xinlei | 94:61d44636f020 | 5 | |
xinlei | 94:61d44636f020 | 6 | const char* skipHTTPHeader(const char* p) |
xinlei | 94:61d44636f020 | 7 | { |
xinlei | 94:61d44636f020 | 8 | const char* ptr = p; |
xinlei | 94:61d44636f020 | 9 | if (p) |
xinlei | 94:61d44636f020 | 10 | ptr = strstr(p, "\r\n\r\n"); |
xinlei | 94:61d44636f020 | 11 | |
xinlei | 94:61d44636f020 | 12 | if (ptr) { |
xinlei | 94:61d44636f020 | 13 | return ptr+4; |
xinlei | 94:61d44636f020 | 14 | } else { |
xinlei | 94:61d44636f020 | 15 | return NULL; |
xinlei | 94:61d44636f020 | 16 | } |
xinlei | 94:61d44636f020 | 17 | } |
xinlei | 94:61d44636f020 | 18 | |
xinlei | 94:61d44636f020 | 19 | const char* lex(const char *p, Token& t) |
xinlei | 94:61d44636f020 | 20 | { |
xinlei | 94:61d44636f020 | 21 | if (p == NULL) { |
xinlei | 94:61d44636f020 | 22 | t.type = Token::NONE; |
xinlei | 94:61d44636f020 | 23 | t.p = NULL; |
xinlei | 94:61d44636f020 | 24 | t.len = 0; |
xinlei | 94:61d44636f020 | 25 | return NULL; |
xinlei | 94:61d44636f020 | 26 | } |
xinlei | 94:61d44636f020 | 27 | t.type = Token::NONE; |
xinlei | 94:61d44636f020 | 28 | size_t i = 0; |
xinlei | 94:61d44636f020 | 29 | while (p[i] && isspace(p[i])) ++i; |
xinlei | 94:61d44636f020 | 30 | bool opening = false; |
xinlei | 94:61d44636f020 | 31 | if (p[i] == '"') { |
xinlei | 94:61d44636f020 | 32 | opening = true; |
xinlei | 94:61d44636f020 | 33 | ++i; |
xinlei | 94:61d44636f020 | 34 | } |
xinlei | 94:61d44636f020 | 35 | size_t j = i; |
xinlei | 94:61d44636f020 | 36 | size_t dots = 0; |
xinlei | 94:61d44636f020 | 37 | bool hasChar = false; |
xinlei | 94:61d44636f020 | 38 | bool escaping = false; |
xinlei | 94:61d44636f020 | 39 | bool hasDigit = false; |
xinlei | 94:61d44636f020 | 40 | for (;p[j]; ++j) { |
xinlei | 94:61d44636f020 | 41 | if (p[j] == '"') { |
xinlei | 94:61d44636f020 | 42 | if (!opening) { // inline quote |
xinlei | 94:61d44636f020 | 43 | t.type = Token::ERROR; |
xinlei | 94:61d44636f020 | 44 | } else if (!escaping) { // escaping quote |
xinlei | 94:61d44636f020 | 45 | escaping = true; |
xinlei | 94:61d44636f020 | 46 | } else { |
xinlei | 94:61d44636f020 | 47 | hasChar = true; |
xinlei | 94:61d44636f020 | 48 | escaping = false; |
xinlei | 94:61d44636f020 | 49 | } |
xinlei | 94:61d44636f020 | 50 | } else { |
xinlei | 94:61d44636f020 | 51 | if (escaping && opening) { |
xinlei | 94:61d44636f020 | 52 | break; |
xinlei | 94:61d44636f020 | 53 | } else if (p[j] == '.') { |
xinlei | 94:61d44636f020 | 54 | hasChar = true; |
xinlei | 94:61d44636f020 | 55 | dots++; |
xinlei | 94:61d44636f020 | 56 | } else if (p[j] == ',' || iscntrl(p[j])) { |
xinlei | 94:61d44636f020 | 57 | if (opening) |
xinlei | 94:61d44636f020 | 58 | hasChar = true; |
xinlei | 94:61d44636f020 | 59 | else |
xinlei | 94:61d44636f020 | 60 | break; |
xinlei | 94:61d44636f020 | 61 | } else if (isdigit(p[j])) { |
xinlei | 94:61d44636f020 | 62 | hasDigit = true; |
xinlei | 94:61d44636f020 | 63 | } else { |
xinlei | 94:61d44636f020 | 64 | hasChar = true; |
xinlei | 94:61d44636f020 | 65 | } |
xinlei | 94:61d44636f020 | 66 | } |
xinlei | 94:61d44636f020 | 67 | } |
xinlei | 94:61d44636f020 | 68 | t.p = p+i; |
xinlei | 94:61d44636f020 | 69 | size_t k = j; |
xinlei | 94:61d44636f020 | 70 | while (k > i && (p[k]==',' || isspace(p[k]))) --k; |
xinlei | 94:61d44636f020 | 71 | t.len = k-i+1; |
xinlei | 94:61d44636f020 | 72 | if (escaping && opening) { |
xinlei | 94:61d44636f020 | 73 | opening = false; |
xinlei | 94:61d44636f020 | 74 | t.len -= 1; |
xinlei | 94:61d44636f020 | 75 | } |
xinlei | 94:61d44636f020 | 76 | if (t.type != Token::ERROR) { |
xinlei | 94:61d44636f020 | 77 | if (opening) { |
xinlei | 94:61d44636f020 | 78 | t.type = Token::ERROR; |
xinlei | 94:61d44636f020 | 79 | } else if (hasChar) { |
xinlei | 94:61d44636f020 | 80 | t.type = Token::STRING; |
xinlei | 94:61d44636f020 | 81 | } else if (hasDigit) { |
xinlei | 94:61d44636f020 | 82 | switch (dots) { |
xinlei | 94:61d44636f020 | 83 | case 0: t.type = Token::INT; break; |
xinlei | 94:61d44636f020 | 84 | case 1: t.type = Token::FLOAT; break; |
xinlei | 94:61d44636f020 | 85 | default: t.type = Token::STRING; break; |
xinlei | 94:61d44636f020 | 86 | } |
xinlei | 94:61d44636f020 | 87 | } else { |
xinlei | 94:61d44636f020 | 88 | t.type = Token::NONE; |
xinlei | 94:61d44636f020 | 89 | } |
xinlei | 94:61d44636f020 | 90 | } |
xinlei | 94:61d44636f020 | 91 | while (p[j]) { |
xinlei | 94:61d44636f020 | 92 | if (isspace(p[j])) { |
xinlei | 94:61d44636f020 | 93 | ++j; |
xinlei | 94:61d44636f020 | 94 | } else if (p[j]==',') { |
xinlei | 94:61d44636f020 | 95 | ++j; |
xinlei | 94:61d44636f020 | 96 | break; |
xinlei | 94:61d44636f020 | 97 | } else { |
xinlei | 94:61d44636f020 | 98 | break; |
xinlei | 94:61d44636f020 | 99 | } |
xinlei | 94:61d44636f020 | 100 | } |
xinlei | 94:61d44636f020 | 101 | return p+j; |
xinlei | 94:61d44636f020 | 102 | } |
xinlei | 94:61d44636f020 | 103 | |
xinlei | 99:e369fc75c000 | 104 | const char* lexConfig(const char* p, Token& tok) |
xinlei | 99:e369fc75c000 | 105 | { |
xinlei | 99:e369fc75c000 | 106 | size_t j = 0; |
xinlei | 99:e369fc75c000 | 107 | for (; p[j] && !isgraph(p[j]); ++j); |
xinlei | 99:e369fc75c000 | 108 | size_t i = j; |
xinlei | 99:e369fc75c000 | 109 | tok.p = p+j; |
xinlei | 99:e369fc75c000 | 110 | if (p[i] == 0) { |
xinlei | 99:e369fc75c000 | 111 | tok.type = Token::NONE; |
xinlei | 99:e369fc75c000 | 112 | } else if (p[i] == '=') { |
xinlei | 99:e369fc75c000 | 113 | ++i; |
xinlei | 99:e369fc75c000 | 114 | tok.type = Token::ASSIGN; |
xinlei | 99:e369fc75c000 | 115 | } else if (p[i] == ';') { |
xinlei | 99:e369fc75c000 | 116 | ++i; |
xinlei | 99:e369fc75c000 | 117 | tok.type = Token::SEMICOLON; |
xinlei | 99:e369fc75c000 | 118 | } else if (isalpha(p[i])) { |
xinlei | 99:e369fc75c000 | 119 | for (++i; isalnum(p[i]); ++i); |
xinlei | 99:e369fc75c000 | 120 | tok.type = Token::STRING; |
xinlei | 99:e369fc75c000 | 121 | } else if (isdigit(p[i])) { |
xinlei | 99:e369fc75c000 | 122 | for (++i; isdigit(p[i]); ++i); |
xinlei | 99:e369fc75c000 | 123 | if (p[i] == '.') { |
xinlei | 99:e369fc75c000 | 124 | for (++i; isdigit(p[i]); ++i); |
xinlei | 99:e369fc75c000 | 125 | tok.type = Token::FLOAT; |
xinlei | 99:e369fc75c000 | 126 | } else if (isalnum(p[i])) { |
xinlei | 99:e369fc75c000 | 127 | for (++i; isalnum(p[i]); ++i); |
xinlei | 99:e369fc75c000 | 128 | tok.type = Token::STRING; |
xinlei | 99:e369fc75c000 | 129 | } else { |
xinlei | 99:e369fc75c000 | 130 | tok.type = Token::INT; |
xinlei | 99:e369fc75c000 | 131 | } |
xinlei | 99:e369fc75c000 | 132 | } else { |
xinlei | 99:e369fc75c000 | 133 | aError("lexConfig: %c\n", p[i]); |
xinlei | 99:e369fc75c000 | 134 | for (++i; isgraph(p[i]); ++i); |
xinlei | 99:e369fc75c000 | 135 | tok.type = Token::ERROR; |
xinlei | 99:e369fc75c000 | 136 | } |
xinlei | 99:e369fc75c000 | 137 | tok.len = i - j; |
xinlei | 99:e369fc75c000 | 138 | for (; p[i] && !isgraph(p[i]); ++i); |
xinlei | 99:e369fc75c000 | 139 | return p+i; |
xinlei | 99:e369fc75c000 | 140 | } |
xinlei | 99:e369fc75c000 | 141 | |
xinlei | 94:61d44636f020 | 142 | size_t strncpyEscape(char* dest, const char *source, size_t num) |
xinlei | 94:61d44636f020 | 143 | { |
xinlei | 94:61d44636f020 | 144 | if (source == NULL) return 0; |
xinlei | 94:61d44636f020 | 145 | size_t i = 0, j = 0; |
xinlei | 94:61d44636f020 | 146 | for (bool escaping = false; i < num; ++i) { |
xinlei | 94:61d44636f020 | 147 | if (source[i] != '"') { |
xinlei | 94:61d44636f020 | 148 | dest[j++] = source[i]; |
xinlei | 94:61d44636f020 | 149 | } else { |
xinlei | 94:61d44636f020 | 150 | if (escaping) { |
xinlei | 94:61d44636f020 | 151 | dest[j++] = source[i]; |
xinlei | 94:61d44636f020 | 152 | escaping = false; |
xinlei | 94:61d44636f020 | 153 | } else { |
xinlei | 94:61d44636f020 | 154 | escaping = true; |
xinlei | 94:61d44636f020 | 155 | } |
xinlei | 94:61d44636f020 | 156 | } |
xinlei | 94:61d44636f020 | 157 | } |
xinlei | 94:61d44636f020 | 158 | return j; |
xinlei | 94:61d44636f020 | 159 | } |