Own fork of MbedSmartRest

Dependents:   MbedSmartRestMain MbedSmartRestMain

Fork of MbedSmartRest by Cumulocity Official

Revision:
7:8159a2d12e4e
Parent:
0:099f76422485
Child:
11:e1bee9a77652
--- a/CharValue.cpp	Mon Jul 28 12:11:02 2014 +0200
+++ b/CharValue.cpp	Wed Oct 22 16:17:22 2014 +0200
@@ -30,8 +30,7 @@
 #include "NullValue.h"
 #include <stdlib.h>
 #include <string.h>
-
-inline int8_t __charvalue_need_escape(const char *str);
+#include <ctype.h>
 
 CharValue::CharValue(const char *str, bool copy)
 {
@@ -42,9 +41,13 @@
         _alloc = copy;
         if (copy) {
             _str = (const char*)malloc(strlen(str)*sizeof(char));
+            if (_str == NULL)
+                return;
             strcpy((char*)_str, str);
+            _escape = escapeCheck();
         } else {
             _str = str;
+            _escape = escapeCheck();
         }
     }
 }
@@ -79,55 +82,48 @@
 
 size_t CharValue::write(AbstractDataSink& sink) const
 {
+    size_t n;
+    const char *ptr; char c;
+
     if (_str == NULL)
         return 0;
-    size_t n = 0;
-    int8_t esc = __charvalue_need_escape(_str) ? 1 : 0;
-    if (esc) n += sink.write('"');
-    for (char *q = (char*)_str, c; (c = *q) != 0; q++) {
-        if ((esc) && (c == '"'))
+
+    n = 0;
+    if (_escape)
+        n += sink.write('"');
+
+    for (ptr = _str; (c = *ptr) != '\0'; ptr++) {
+        if ((_escape) && (c == '"'))
             n += sink.write('"');
         n += sink.write(c);
     }
-    if (esc) n += sink.write('"');
+
+    if (_escape)
+        n += sink.write('"');
     return n;
 }
 
 size_t CharValue::length() const
 {
+    size_t n;
+    const char *ptr; char c;
+
     if (_str == NULL)
         return 0;
-    size_t n = 0;
-    int8_t esc = __charvalue_need_escape(_str) ? 1 : 0;
-    if (esc)
+
+    n = 0;
+    if (_escape)
         n += 2;
-    for (char *q = (char*)_str, c; (c = *q) != 0; q++) {
-        if ((esc) && (c == '"'))
+
+    for (ptr = _str; (c = *ptr) != '\0'; ptr++) {
+        if ((_escape) && (c == '"'))
             n++;
         n++;
     }
+
     return n;
 }
 
-int8_t __charvalue_need_escape(const char *str)
-{
-    int8_t w = 0;
-    for (char c; (c = *str) != 0; str++) {
-        if ((c == ' ') || (c == '\t')) {
-            if (w == 0)
-                return 1;
-            w = 2;
-        } else {
-            w = 1;
-            if ((c == '"') || (c == ',') || (c == '\r') || (c == '\n'))
-                return 1;
-        }
-    }
-    if (w == 2)
-        return 1;
-    return 0;
-}
-
 Value* CharValue::copy() const
 {
     if (_str == NULL)
@@ -135,3 +131,23 @@
     return new CharValue(_str, true);
 }
 
+bool CharValue::escapeCheck()
+{
+    const char *ptr; char c;
+
+    ptr = _str;
+    while (*ptr != '\0') {
+        c = *ptr;
+        if ((isspace(c)) && ((ptr == _str) || (c != ' ')))
+            return true;
+        else if ((c == '"') || (c == ','))
+            return true;
+        ptr++;
+    }
+
+    if (isspace(c))
+        return true;
+
+    return false;
+}
+