فهرست منبع

Added escaped char replacement

Benoit Blanchon 11 سال پیش
والد
کامیت
0154fc15cb
3فایلهای تغییر یافته به همراه55 افزوده شده و 6 حذف شده
  1. 47 0
      JsonParser/JsonToken.cpp
  2. 1 5
      JsonParser/JsonToken.h
  3. 7 1
      JsonParserTests/JsonStringTests.cpp

+ 47 - 0
JsonParser/JsonToken.cpp

@@ -7,6 +7,53 @@
 
 using namespace ArduinoJson::Parser;
 
+static char unescapeChar(char c)
+{
+    switch (c)
+    {
+    case 'b': return '\b';
+    case 'f': return '\f';
+    case 'n': return '\n';
+    case 'r': return '\r';
+    case 't': return '\t';
+    default: return c;
+    }
+}
+
+static void unescapeString(char* s)
+{
+    char* readPtr = s;
+    char* writePtr = s;
+
+    while (true)
+    {
+        if (*readPtr == '\\')
+        {
+            readPtr++;
+            *writePtr = unescapeChar(*readPtr);
+        }
+        else
+        {
+            *writePtr = *readPtr;
+        }
+
+        if (*writePtr == 0) break;
+
+        readPtr++;
+        writePtr++;
+    }
+}
+
+char* JsonToken::getText()
+{
+    char* s = json + token->start;
+    json[token->end] = 0;
+
+    unescapeString(s);
+
+    return s;
+}
+
 JsonToken JsonToken::nextSibling() const
 {
     // start with current token

+ 1 - 5
JsonParser/JsonToken.h

@@ -29,11 +29,7 @@ namespace ArduinoJson
             }
 
             // Get content of the JSON token
-            char* getText()
-            {
-                json[token->end] = 0;
-                return json + token->start;
-            }
+            char* getText();
 
             // Get the number of children tokens
             int childrenCount()

+ 7 - 1
JsonParserTests/JsonStringTests.cpp

@@ -31,6 +31,12 @@ namespace ArduinoJsonParserTests
             outputMustBe(0);
         }
 
+        TEST_METHOD(SimpleString)
+        {
+            whenInputIs("\"Hi!\"");
+            outputMustBe("Hi!");
+        }
+
         TEST_METHOD(EscapedQuote)
         {
             whenInputIs("\"12\\\"34\"");  // ie 12\"34
@@ -81,7 +87,7 @@ namespace ArduinoJsonParserTests
 
         TEST_METHOD(AllEscapedCharsTogether)
         {
-            whenInputIs("1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"");
+            whenInputIs("\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"");
             outputMustBe("1\"2\\3/4\b5\f6\n7\r8\t9");
         }