static Result parseString (const juce_wchar quoteChar, String::CharPointerType& t, var& result) { MemoryOutputStream buffer (256); for (;;) { juce_wchar c = t.getAndAdvance(); if (c == quoteChar) break; if (c == '\\') { c = t.getAndAdvance(); switch (c) { case '"': case '\'': case '\\': case '/': break; case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'u': { c = 0; for (int i = 4; --i >= 0;) { const int digitValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); if (digitValue < 0) return createFail ("Syntax error in unicode escape sequence"); c = (juce_wchar) ((c << 4) + digitValue); } break; } } } if (c == 0) return createFail ("Unexpected end-of-input in string constant"); buffer.appendUTF8Char (c); } result = buffer.toUTF8(); return Result::ok(); }
static Result parseAny (String::CharPointerType& t, var& result) { t = t.findEndOfWhitespace(); auto t2 = t; switch (t2.getAndAdvance()) { case '{': t = t2; return parseObject (t, result); case '[': t = t2; return parseArray (t, result); case '"': t = t2; return parseString ('"', t, result); case '\'': t = t2; return parseString ('\'', t, result); case '-': t2 = t2.findEndOfWhitespace(); if (! CharacterFunctions::isDigit (*t2)) break; t = t2; return parseNumber (t, result, true); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return parseNumber (t, result, false); case 't': // "true" if (t2.getAndAdvance() == 'r' && t2.getAndAdvance() == 'u' && t2.getAndAdvance() == 'e') { t = t2; result = var (true); return Result::ok(); } break; case 'f': // "false" if (t2.getAndAdvance() == 'a' && t2.getAndAdvance() == 'l' && t2.getAndAdvance() == 's' && t2.getAndAdvance() == 'e') { t = t2; result = var (false); return Result::ok(); } break; case 'n': // "null" if (t2.getAndAdvance() == 'u' && t2.getAndAdvance() == 'l' && t2.getAndAdvance() == 'l') { t = t2; result = var(); return Result::ok(); } break; default: break; } return createFail ("Syntax error", &t); }
static Result parseObjectOrArray (String::CharPointerType t, var& result) { t = t.findEndOfWhitespace(); switch (t.getAndAdvance()) { case 0: result = var::null; return Result::ok(); case '{': return parseObject (t, result); case '[': return parseArray (t, result); } return createFail ("Expected '{' or '['", &t); }