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 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?

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