From 7a3c87b58de2683c077bd5341052c2e3cebeb048 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Tue, 1 Jun 2021 16:58:07 -0400 Subject: JSONValue / Container (#1864) * #include an absolute path didn't work - because paths were taken to always be relative. * WIP JSONWriter/JSONParser. * Checking different Layout styles for JSON. * Add slang-json-parser.h/.cpp * WIP JSONValue. * Added JSONValue::destroy/Recursive. * Improvement to JSONValue. * Improve text double conversion precision. Testing. * Simplify double parsing (just use atof). JSON comparison More testing of conversions and start of JSONValue. * Add for isnan, isinf etc. * Small improvement with object comparison. * Fix typo in getArgsByName. * Removed use of isnan and isinf as includes don't work on linux. * Improve JSON unit test. * Added asInteger/asFloat/asBool to JSONValue. * Change comment to trigger CI build. --- source/core/slang-string-escape-util.cpp | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'source/core/slang-string-escape-util.cpp') diff --git a/source/core/slang-string-escape-util.cpp b/source/core/slang-string-escape-util.cpp index a91d88e05..ffc43a7cb 100644 --- a/source/core/slang-string-escape-util.cpp +++ b/source/core/slang-string-escape-util.cpp @@ -18,6 +18,8 @@ public: virtual bool isQuotingNeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE { return isEscapingNeeded(slice); } virtual bool isEscapingNeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE; + virtual bool isUnescapingNeeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE; + virtual SlangResult appendEscaped(const UnownedStringSlice& slice, StringBuilder& out) SLANG_OVERRIDE; virtual SlangResult appendUnescaped(const UnownedStringSlice& slice, StringBuilder& out) SLANG_OVERRIDE; virtual SlangResult lexQuoted(const char* cursor, const char** outCursor) SLANG_OVERRIDE; @@ -30,6 +32,13 @@ bool SpaceStringEscapeHandler::isEscapingNeeded(const UnownedStringSlice& slice) return slice.indexOf(' ') >= 0; } +bool SpaceStringEscapeHandler::isUnescapingNeeeded(const UnownedStringSlice& slice) +{ + SLANG_UNUSED(slice); + // As it stands we never have to unescape + return false; +} + SlangResult SpaceStringEscapeHandler::appendUnescaped(const UnownedStringSlice& slice, StringBuilder& out) { if (slice.indexOf('"') >= 0) @@ -98,6 +107,7 @@ public: virtual bool isQuotingNeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE { SLANG_UNUSED(slice); return true; } virtual bool isEscapingNeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE; + virtual bool isUnescapingNeeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE; virtual SlangResult appendEscaped(const UnownedStringSlice& slice, StringBuilder& out) SLANG_OVERRIDE; virtual SlangResult appendUnescaped(const UnownedStringSlice& slice, StringBuilder& out) SLANG_OVERRIDE; virtual SlangResult lexQuoted(const char* cursor, const char** outCursor) SLANG_OVERRIDE; @@ -167,6 +177,12 @@ static char _getCppUnescapedChar(char c) } } + +bool CppStringEscapeHandler::isUnescapingNeeeded(const UnownedStringSlice& slice) +{ + return slice.indexOf('\\') >= 0; +} + /* static */bool CppStringEscapeHandler::isEscapingNeeded(const UnownedStringSlice& slice) { const char* cur = slice.begin(); @@ -456,6 +472,7 @@ public: virtual bool isQuotingNeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE { SLANG_UNUSED(slice); return true; } virtual bool isEscapingNeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE; + virtual bool isUnescapingNeeeded(const UnownedStringSlice& slice) SLANG_OVERRIDE; virtual SlangResult appendEscaped(const UnownedStringSlice& slice, StringBuilder& out) SLANG_OVERRIDE; virtual SlangResult appendUnescaped(const UnownedStringSlice& slice, StringBuilder& out) SLANG_OVERRIDE; virtual SlangResult lexQuoted(const char* cursor, const char** outCursor) SLANG_OVERRIDE; @@ -463,6 +480,11 @@ public: JSONStringEscapeHandler() : Super('"') {} }; +bool JSONStringEscapeHandler::isUnescapingNeeeded(const UnownedStringSlice& slice) +{ + return slice.indexOf('\\') >= 0; +} + bool JSONStringEscapeHandler::isEscapingNeeded(const UnownedStringSlice& slice) { const char* cur = slice.begin(); @@ -868,6 +890,23 @@ StringEscapeUtil::Handler* StringEscapeUtil::getHandler(Style style) } } +/* static */bool StringEscapeUtil::isQuoted(char quoteChar, UnownedStringSlice& slice) +{ + const Index len = slice.getLength(); + return len >= 2 && slice[0] == quoteChar && slice[len - 1] == quoteChar; +} + +/* static */UnownedStringSlice StringEscapeUtil::unquote(char quoteChar, const UnownedStringSlice& slice) +{ + const Index len = slice.getLength(); + if (len >= 2 && slice[0] == quoteChar && slice[len - 1] == quoteChar) + { + return UnownedStringSlice(slice.begin() + 1, len - 2); + } + SLANG_ASSERT(!"Not quoted!"); + return UnownedStringSlice(); +} + /* static */SlangResult StringEscapeUtil::appendMaybeUnquoted(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out) { const char quoteChar = handler->getQuoteChar(); @@ -885,6 +924,10 @@ StringEscapeUtil::Handler* StringEscapeUtil::getHandler(Style style) } } +/* static */SlangResult StringEscapeUtil::isUnescapeShellLikeNeeded(Handler* handler, const UnownedStringSlice& slice) +{ + return slice.indexOf(handler->getQuoteChar()) >= 0; +} /* static */SlangResult StringEscapeUtil::unescapeShellLike(Handler* handler, const UnownedStringSlice& slice, StringBuilder& out) { -- cgit v1.2.3