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@94:61d44636f020, 2015-04-20 (annotated)
- Committer:
- xinlei
- Date:
- Mon Apr 20 15:04:23 2015 +0000
- Revision:
- 94:61d44636f020
- Child:
- 99:e369fc75c000
Integration of new device push code base.
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 | 94:61d44636f020 | 4 | |
xinlei | 94:61d44636f020 | 5 | const char* skipHTTPHeader(const char* p) |
xinlei | 94:61d44636f020 | 6 | { |
xinlei | 94:61d44636f020 | 7 | const char* ptr = p; |
xinlei | 94:61d44636f020 | 8 | if (p) |
xinlei | 94:61d44636f020 | 9 | ptr = strstr(p, "\r\n\r\n"); |
xinlei | 94:61d44636f020 | 10 | |
xinlei | 94:61d44636f020 | 11 | if (ptr) { |
xinlei | 94:61d44636f020 | 12 | return ptr+4; |
xinlei | 94:61d44636f020 | 13 | } else { |
xinlei | 94:61d44636f020 | 14 | return NULL; |
xinlei | 94:61d44636f020 | 15 | } |
xinlei | 94:61d44636f020 | 16 | } |
xinlei | 94:61d44636f020 | 17 | |
xinlei | 94:61d44636f020 | 18 | const char* lex(const char *p, Token& t) |
xinlei | 94:61d44636f020 | 19 | { |
xinlei | 94:61d44636f020 | 20 | if (p == NULL) { |
xinlei | 94:61d44636f020 | 21 | t.type = Token::NONE; |
xinlei | 94:61d44636f020 | 22 | t.p = NULL; |
xinlei | 94:61d44636f020 | 23 | t.len = 0; |
xinlei | 94:61d44636f020 | 24 | return NULL; |
xinlei | 94:61d44636f020 | 25 | } |
xinlei | 94:61d44636f020 | 26 | t.type = Token::NONE; |
xinlei | 94:61d44636f020 | 27 | size_t i = 0; |
xinlei | 94:61d44636f020 | 28 | while (p[i] && isspace(p[i])) ++i; |
xinlei | 94:61d44636f020 | 29 | bool opening = false; |
xinlei | 94:61d44636f020 | 30 | if (p[i] == '"') { |
xinlei | 94:61d44636f020 | 31 | opening = true; |
xinlei | 94:61d44636f020 | 32 | ++i; |
xinlei | 94:61d44636f020 | 33 | } |
xinlei | 94:61d44636f020 | 34 | size_t j = i; |
xinlei | 94:61d44636f020 | 35 | size_t dots = 0; |
xinlei | 94:61d44636f020 | 36 | bool hasChar = false; |
xinlei | 94:61d44636f020 | 37 | bool escaping = false; |
xinlei | 94:61d44636f020 | 38 | bool hasDigit = false; |
xinlei | 94:61d44636f020 | 39 | for (;p[j]; ++j) { |
xinlei | 94:61d44636f020 | 40 | if (p[j] == '"') { |
xinlei | 94:61d44636f020 | 41 | if (!opening) { // inline quote |
xinlei | 94:61d44636f020 | 42 | t.type = Token::ERROR; |
xinlei | 94:61d44636f020 | 43 | } else if (!escaping) { // escaping quote |
xinlei | 94:61d44636f020 | 44 | escaping = true; |
xinlei | 94:61d44636f020 | 45 | } else { |
xinlei | 94:61d44636f020 | 46 | hasChar = true; |
xinlei | 94:61d44636f020 | 47 | escaping = false; |
xinlei | 94:61d44636f020 | 48 | } |
xinlei | 94:61d44636f020 | 49 | } else { |
xinlei | 94:61d44636f020 | 50 | if (escaping && opening) { |
xinlei | 94:61d44636f020 | 51 | break; |
xinlei | 94:61d44636f020 | 52 | } else if (p[j] == '.') { |
xinlei | 94:61d44636f020 | 53 | hasChar = true; |
xinlei | 94:61d44636f020 | 54 | dots++; |
xinlei | 94:61d44636f020 | 55 | } else if (p[j] == ',' || iscntrl(p[j])) { |
xinlei | 94:61d44636f020 | 56 | if (opening) |
xinlei | 94:61d44636f020 | 57 | hasChar = true; |
xinlei | 94:61d44636f020 | 58 | else |
xinlei | 94:61d44636f020 | 59 | break; |
xinlei | 94:61d44636f020 | 60 | } else if (isdigit(p[j])) { |
xinlei | 94:61d44636f020 | 61 | hasDigit = true; |
xinlei | 94:61d44636f020 | 62 | } else { |
xinlei | 94:61d44636f020 | 63 | hasChar = true; |
xinlei | 94:61d44636f020 | 64 | } |
xinlei | 94:61d44636f020 | 65 | } |
xinlei | 94:61d44636f020 | 66 | } |
xinlei | 94:61d44636f020 | 67 | t.p = p+i; |
xinlei | 94:61d44636f020 | 68 | size_t k = j; |
xinlei | 94:61d44636f020 | 69 | while (k > i && (p[k]==',' || isspace(p[k]))) --k; |
xinlei | 94:61d44636f020 | 70 | t.len = k-i+1; |
xinlei | 94:61d44636f020 | 71 | if (escaping && opening) { |
xinlei | 94:61d44636f020 | 72 | opening = false; |
xinlei | 94:61d44636f020 | 73 | t.len -= 1; |
xinlei | 94:61d44636f020 | 74 | } |
xinlei | 94:61d44636f020 | 75 | if (t.type != Token::ERROR) { |
xinlei | 94:61d44636f020 | 76 | if (opening) { |
xinlei | 94:61d44636f020 | 77 | t.type = Token::ERROR; |
xinlei | 94:61d44636f020 | 78 | } else if (hasChar) { |
xinlei | 94:61d44636f020 | 79 | t.type = Token::STRING; |
xinlei | 94:61d44636f020 | 80 | } else if (hasDigit) { |
xinlei | 94:61d44636f020 | 81 | switch (dots) { |
xinlei | 94:61d44636f020 | 82 | case 0: t.type = Token::INT; break; |
xinlei | 94:61d44636f020 | 83 | case 1: t.type = Token::FLOAT; break; |
xinlei | 94:61d44636f020 | 84 | default: t.type = Token::STRING; break; |
xinlei | 94:61d44636f020 | 85 | } |
xinlei | 94:61d44636f020 | 86 | } else { |
xinlei | 94:61d44636f020 | 87 | t.type = Token::NONE; |
xinlei | 94:61d44636f020 | 88 | } |
xinlei | 94:61d44636f020 | 89 | } |
xinlei | 94:61d44636f020 | 90 | while (p[j]) { |
xinlei | 94:61d44636f020 | 91 | if (isspace(p[j])) { |
xinlei | 94:61d44636f020 | 92 | ++j; |
xinlei | 94:61d44636f020 | 93 | } else if (p[j]==',') { |
xinlei | 94:61d44636f020 | 94 | ++j; |
xinlei | 94:61d44636f020 | 95 | break; |
xinlei | 94:61d44636f020 | 96 | } else { |
xinlei | 94:61d44636f020 | 97 | break; |
xinlei | 94:61d44636f020 | 98 | } |
xinlei | 94:61d44636f020 | 99 | } |
xinlei | 94:61d44636f020 | 100 | return p+j; |
xinlei | 94:61d44636f020 | 101 | } |
xinlei | 94:61d44636f020 | 102 | |
xinlei | 94:61d44636f020 | 103 | size_t strncpyEscape(char* dest, const char *source, size_t num) |
xinlei | 94:61d44636f020 | 104 | { |
xinlei | 94:61d44636f020 | 105 | if (source == NULL) return 0; |
xinlei | 94:61d44636f020 | 106 | size_t i = 0, j = 0; |
xinlei | 94:61d44636f020 | 107 | for (bool escaping = false; i < num; ++i) { |
xinlei | 94:61d44636f020 | 108 | if (source[i] != '"') { |
xinlei | 94:61d44636f020 | 109 | dest[j++] = source[i]; |
xinlei | 94:61d44636f020 | 110 | } else { |
xinlei | 94:61d44636f020 | 111 | if (escaping) { |
xinlei | 94:61d44636f020 | 112 | dest[j++] = source[i]; |
xinlei | 94:61d44636f020 | 113 | escaping = false; |
xinlei | 94:61d44636f020 | 114 | } else { |
xinlei | 94:61d44636f020 | 115 | escaping = true; |
xinlei | 94:61d44636f020 | 116 | } |
xinlei | 94:61d44636f020 | 117 | } |
xinlei | 94:61d44636f020 | 118 | } |
xinlei | 94:61d44636f020 | 119 | return j; |
xinlei | 94:61d44636f020 | 120 | } |