From 0cd2ecf48f3297985844f3546aa789fc8f1080e8 Mon Sep 17 00:00:00 2001 From: Niels Date: Fri, 9 Jan 2015 20:48:16 +0100 Subject: [PATCH] minor style adjustments --- header_only/json.h | 74 ++++++++++++++++++++++++++++++++++++----- src/json.cc | 82 +++++++++++++++++++++++++++++++--------------- 2 files changed, 121 insertions(+), 35 deletions(-) diff --git a/header_only/json.h b/header_only/json.h index 74db9e0b..2a35fddd 100644 --- a/header_only/json.h +++ b/header_only/json.h @@ -2482,35 +2482,91 @@ Parses a string after opening quotes (\p ") where read. @post The character after the closing quote \p " is the current character @ref current_. Whitespace is skipped. + +@todo Unicode escapes such as \uxxxx are missing - see + https://github.com/nlohmann/json/issues/12 */ std::string json::parser::parseString() { - // remember the position where the first character of the string was - const auto startPos = pos_; // true if and only if the amount of backslashes before the current // character is even bool evenAmountOfBackslashes = true; + // the result of the parse process + std::string result; + // iterate with pos_ over the whole string for (; pos_ < buffer_.size(); pos_++) { char currentChar = buffer_[pos_]; - // currentChar is a quote, so we might have found the end of the string - if (currentChar == '"') + // uneven amount of backslashes means the user wants to escape something + if (!evenAmountOfBackslashes) { - // but only if the amount of backslashes before that quote is even - if (evenAmountOfBackslashes) + // slash, backslash and quote are copied as is + if (currentChar == '/' or currentChar == '\\' or currentChar == '"') { + result += currentChar; + } + else + { + // all other characters are replaced by their respective + // special character + switch (currentChar) + { + case 't': + { + result += '\t'; + break; + } + case 'b': + { + result += '\b'; + break; + } + case 'f': + { + result += '\f'; + break; + } + case 'n': + { + result += '\n'; + break; + } + case 'r': + { + result += '\r'; + break; + } + default: + { + error("expected one of \\, /, b, f, n, r, t behind backslash."); + } + } + // TODO implement \uXXXX + } + } + else + { + if (currentChar == '"') + { + // currentChar is a quote, so we found the end of the string - const auto stringLength = pos_ - startPos; // set pos_ behind the trailing quote pos_++; // find next char to parse next(); - // return string inside the quotes - return buffer_.substr(startPos, stringLength); + // bring the result of the parsing process back to the caller + return result; + } + else if (currentChar != '\\') + { + // All non-backslash characters are added to the end of the + // result string. The only backslashes we want in the result + // are the ones that are escaped (which happens above). + result += currentChar; } } diff --git a/src/json.cc b/src/json.cc index 1666b23c..f2c4456c 100644 --- a/src/json.cc +++ b/src/json.cc @@ -2039,6 +2039,9 @@ Parses a string after opening quotes (\p ") where read. @post The character after the closing quote \p " is the current character @ref current_. Whitespace is skipped. + +@todo Unicode escapes such as \uxxxx are missing - see + https://github.com/nlohmann/json/issues/12 */ std::string json::parser::parseString() { @@ -2050,39 +2053,63 @@ std::string json::parser::parseString() std::string result; // iterate with pos_ over the whole string - for (; pos_ < buffer_.size(); pos_++) { + for (; pos_ < buffer_.size(); pos_++) + { char currentChar = buffer_[pos_]; // uneven amount of backslashes means the user wants to escape something - if (!evenAmountOfBackslashes) { - + if (!evenAmountOfBackslashes) + { // slash, backslash and quote are copied as is - if ( currentChar == '/' - || currentChar == '\\' - || currentChar == '"') { + if (currentChar == '/' or currentChar == '\\' or currentChar == '"') + { result += currentChar; - } else { - // All other characters are replaced by their respective special character - if (currentChar == 't') { - result += '\t'; - } else if (currentChar == 'b') { - result += '\b'; - } else if (currentChar == 'f') { - result += '\f'; - } else if (currentChar == 'n') { - result += '\n'; - } else if (currentChar == 'r') { - result += '\r'; - } else { - error("expected one of \\,/,b,f,n,r,t behind backslash."); + } + else + { + // all other characters are replaced by their respective + // special character + switch (currentChar) + { + case 't': + { + result += '\t'; + break; + } + case 'b': + { + result += '\b'; + break; + } + case 'f': + { + result += '\f'; + break; + } + case 'n': + { + result += '\n'; + break; + } + case 'r': + { + result += '\r'; + break; + } + default: + { + error("expected one of \\, /, b, f, n, r, t behind backslash."); + } } // TODO implement \uXXXX } - } else { - if (currentChar == '"') { + } + else + { + if (currentChar == '"') + { // currentChar is a quote, so we found the end of the string - // set pos_ behind the trailing quote pos_++; // find next char to parse @@ -2090,9 +2117,12 @@ std::string json::parser::parseString() // bring the result of the parsing process back to the caller return result; - } else if (currentChar != '\\') { - // all non-backslash characters are added to the end of the result string. - // the only backslashes we want in the result are the ones that are escaped (which happens above). + } + else if (currentChar != '\\') + { + // All non-backslash characters are added to the end of the + // result string. The only backslashes we want in the result + // are the ones that are escaped (which happens above). result += currentChar; } }