Forráskód Böngészése

Add sjson::parse_verbatim()

Daniele Bartolini 8 éve
szülő
commit
59b23753a7
3 módosított fájl, 36 hozzáadás és 1 törlés
  1. 27 1
      src/core/json/sjson.cpp
  2. 3 0
      src/core/json/sjson.h
  3. 6 0
      src/core/unit_tests.cpp

+ 27 - 1
src/core/json/sjson.cpp

@@ -51,7 +51,19 @@ namespace sjson
 
 		switch (*json)
 		{
-		case '"': json = skip_string(json); break;
+		case '"':
+			json = skip_string(json);
+			if (*json == '"')
+			{
+				++json;
+				json = strstr(json, "\"\"\"");
+				CE_ENSURE(json);
+				++json;
+				++json;
+				++json;
+			}
+			break;
+
 		case '[': json = skip_block(json, '[', ']'); break;
 		case '{': json = skip_block(json, '{', '}'); break;
 		default: for (; *json != '\0' && *json != ',' && *json != '\n' && *json != ' ' && *json != '}' && *json != ']'; ++json) ; break;
@@ -490,6 +502,20 @@ namespace sjson
 		return guid::parse(str.c_str());
 	}
 
+	void parse_verbatim(const char* json, DynamicString& string)
+	{
+		CE_ENSURE(NULL != json);
+
+		json = next(json, '"');
+		json = next(json, '"');
+		json = next(json, '"');
+
+		const char* end = strstr(json, "\"\"\"");
+		CE_ASSERT(end, "Bad verbatim string");
+
+		string.set(json, u32(end - json));
+	}
+
 } // namespace json
 
 } // namespace crown

+ 3 - 0
src/core/json/sjson.h

@@ -79,6 +79,9 @@ namespace sjson
 	/// Returns the string @a json as Guid.
 	Guid parse_guid(const char* json);
 
+	/// Parses the SJSON verbatim string @a json and puts it into @a string.
+	void parse_verbatim(const char* json, DynamicString& string);
+
 } // namespace sjson
 
 } // namespace crown

+ 6 - 0
src/core/unit_tests.cpp

@@ -1115,6 +1115,12 @@ static void test_sjson()
 		const Guid parsed = sjson::parse_guid("\"0f6c3b1c-9cba-4282-9096-2a77ca047b1b\"");
 		ENSURE(guid == parsed);
 	}
+	{
+		TempAllocator128 ta;
+		DynamicString str(ta);
+		sjson::parse_verbatim("\"\"\"verbatim\"\"\"", str);
+		ENSURE(strcmp(str.c_str(), "verbatim") == 0);
+	}
 	memory_globals::shutdown();
 }