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:
Mon Aug 08 11:05:57 2016 +0000
Revision:
139:f8ab852e83e7
Parent:
99:e369fc75c000
Etisalat and Teleena APN.

Who changed what in which revision?

UserRevisionLine numberNew 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 }