Ver Fonte

core: skip block-closing characters when they appear inside comments

Daniele Bartolini há 3 anos atrás
pai
commit
ebd75aa979
3 ficheiros alterados com 70 adições e 77 exclusões
  1. 11 18
      src/core/json/json.cpp
  2. 49 59
      src/core/json/sjson.cpp
  3. 10 0
      src/core/unit_tests.cpp

+ 11 - 18
src/core/json/json.cpp

@@ -53,32 +53,25 @@ namespace json
 		case '"':
 			json = skip_string(json);
 			break;
-		case '[': {
-			u32 num = 0;
 
-			for (char ch = *json++; ch != '\0'; ch = *json++) {
-				if (ch == '[') {
-					++num;
-				} else if (ch == ']') {
-					if (--num == 0)
-						break;
-				} else if (ch == '"') {
-					json = skip_string(json);
-				}
-			}
-			break;
-		}
+		case '[':
 		case '{': {
 			u32 num = 0;
+			char aa = *json;
+			char bb = aa == '[' ? ']' : '}';
 
-			for (char ch = *json++; ch != '\0'; ch = *json++) {
-				if (ch == '{') {
+			while (*json != '\0') {
+				if (*json == aa) {
+					++json;
 					++num;
-				} else if (ch == '}') {
+				} else if (*json == bb) {
+					++json;
 					if (--num == 0)
 						break;
-				} else if (ch == '"') {
+				} else if (*json == '"') {
 					json = skip_string(json);
+				} else {
+					++json;
 				}
 			}
 			break;

+ 49 - 59
src/core/json/sjson.cpp

@@ -45,65 +45,6 @@ namespace sjson
 		return json;
 	}
 
-	static const char *skip_value(const char *json)
-	{
-		CE_ENSURE(NULL != json);
-
-		switch (*json) {
-		case '"':
-			json = skip_string(json);
-			if (*json == '"') {
-				json = strstr(json + 1, "\"\"\"");
-				CE_ENSURE(json);
-				json += 3;
-			}
-			break;
-		case '[': {
-			u32 num = 0;
-
-			for (char ch = *json++; ch != '\0'; ch = *json++) {
-				if (ch == '[') {
-					++num;
-				} else if (ch == ']') {
-					if (--num == 0)
-						break;
-				} else if (ch == '"') {
-					json = skip_string(json - 1);
-					if (*json == '"') {
-						json = strstr(json + 1, "\"\"\"");
-						CE_ENSURE(json);
-						json += 3;
-					}
-				}
-			}
-			break;
-		}
-		case '{': {
-			u32 num = 0;
-
-			for (char ch = *json++; ch != '\0'; ch = *json++) {
-				if (ch == '{') {
-					++num;
-				} else if (ch == '}') {
-					if (--num == 0)
-						break;
-				} else if (ch == '"') {
-					json = skip_string(json - 1);
-					if (*json == '"') {
-						json = strstr(json + 1, "\"\"\"");
-						CE_ENSURE(json);
-						json += 3;
-					}
-				}
-			}
-			break;
-		}
-		default: for (; *json != '\0' && *json != ',' && *json != '\n' && *json != ' ' && *json != '}' && *json != ']'; ++json); break;
-		}
-
-		return json;
-	}
-
 	static const char *skip_comments(const char *json)
 	{
 		CE_ENSURE(NULL != json);
@@ -144,6 +85,55 @@ namespace sjson
 		return json;
 	}
 
+	static const char *skip_value(const char *json)
+	{
+		CE_ENSURE(NULL != json);
+
+		switch (*json) {
+		case '"':
+			json = skip_string(json);
+			if (*json == '"') {
+				json = strstr(json + 1, "\"\"\"");
+				CE_ENSURE(json);
+				json += 3;
+			}
+			break;
+
+		case '[':
+		case '{': {
+			u32 num = 0;
+			char aa = *json;
+			char bb = aa == '[' ? ']' : '}';
+
+			while (*json != '\0') {
+				if (*json == aa) {
+					++json;
+					++num;
+				} else if (*json == bb) {
+					++json;
+					if (--num == 0)
+						break;
+				} else if (*json == '"') {
+					json = skip_string(json);
+					if (*json == '"') {
+						json = strstr(json + 1, "\"\"\"");
+						CE_ENSURE(json);
+						json += 3;
+					}
+				} else if (*json == '/') {
+					json = skip_comments(json);
+				} else {
+					++json;
+				}
+			}
+			break;
+		}
+		default: for (; *json != '\0' && *json != ',' && *json != '\n' && *json != ' ' && *json != '}' && *json != ']'; ++json); break;
+		}
+
+		return json;
+	}
+
 	JsonValueType::Enum type(const char *json)
 	{
 		CE_ENSURE(NULL != json);

+ 10 - 0
src/core/unit_tests.cpp

@@ -1317,6 +1317,16 @@ static void test_sjson()
 		JsonObject obj(ta);
 		sjson::parse_object(obj, "{foo=[\"]\"]}");
 	}
+	{
+		TempAllocator1024 ta;
+		JsonObject obj(ta);
+		sjson::parse_object(obj, "{foo=[/*]*/]}");
+	}
+	{
+		TempAllocator1024 ta;
+		JsonObject obj(ta);
+		sjson::parse_object(obj, "{foo=[//]\n]}");
+	}
 	memory_globals::shutdown();
 }