From ec3acec8ccf3bcc8376294d3c549943bdb9841f0 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Sat, 26 Oct 2024 14:21:23 +0000 Subject: [PATCH] Implemented JSON5 line ending escapings --- lib/json/JsonParser.cpp | 59 ++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/lib/json/JsonParser.cpp b/lib/json/JsonParser.cpp index eb45d69d8..32b5de0d2 100644 --- a/lib/json/JsonParser.cpp +++ b/lib/json/JsonParser.cpp @@ -158,40 +158,58 @@ bool JsonParser::extractEscaping(std::string & str) switch(input[pos]) { + case '\r': + if(settings.mode == JsonParsingSettings::JsonFormatMode::JSON5 && input.size() > pos && input[pos+1] == '\n') + { + pos += 2; + return true; + } + break; + case '\n': + if(settings.mode == JsonParsingSettings::JsonFormatMode::JSON5) + { + pos += 1; + return true; + } + break; case '\"': str += '\"'; - break; + pos++; + return true; case '\\': str += '\\'; - break; + pos++; + return true; case 'b': str += '\b'; - break; + pos++; + return true; case 'f': str += '\f'; - break; + pos++; + return true; case 'n': str += '\n'; - break; + pos++; + return true; case 'r': str += '\r'; - break; + pos++; + return true; case 't': str += '\t'; - break; + pos++; + return true; case '/': str += '/'; - break; - default: - return error("Unknown escape sequence!", true); + pos++; + return true; } - return true; + return error("Unknown escape sequence!", true); } bool JsonParser::extractString(std::string & str) { - //TODO: JSON5 - line breaks escaping - if(settings.mode < JsonParsingSettings::JsonFormatMode::JSON5) { if(input[pos] != '\"') @@ -216,27 +234,30 @@ bool JsonParser::extractString(std::string & str) pos++; return true; } - if(input[pos] == '\\') // Escaping + else if(input[pos] == '\\') // Escaping { str.append(&input[first], pos - first); pos++; if(pos == input.size()) break; + extractEscaping(str); - first = pos + 1; + first = pos; } - if(input[pos] == '\n') // end-of-line + else if(input[pos] == '\n') // end-of-line { str.append(&input[first], pos - first); return error("Closing quote not found!", true); } - if(static_cast(input[pos]) < ' ') // control character + else if(static_cast(input[pos]) < ' ') // control character { str.append(&input[first], pos - first); - first = pos + 1; + pos++; + first = pos; error("Illegal character in the string!", true); } - pos++; + else + pos++; } return error("Unterminated string!"); }