mbed.org implementation of the abstract SmartREST library for the Cumulocity Platform SmartREST protocol.
Dependents: MbedSmartRestMain MbedSmartRestMain
Diff: CharValue.cpp
- 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; +} +