internal static ParseException forCharactersAfterEnd(ParseStringRunner parseStrignRunner) { StringPointer sp = parseStrignRunner.getStringPointer(); string fullMessage = "Unexpected non-white character after end of object - " + sp.getLineAndColumnForException() + ", near: " + sp.getSubStringForException(32) + getExceptionMessageTail(parseStrignRunner); return(new ParseException(fullMessage)); }
internal static ParseException forInvalidEnd(ParseStringRunner parseStrignRunner) { StringPointer sp = parseStrignRunner.getStringPointer(); string fullMessage = "Unexpected end of input - " + sp.getLineAndColumnForException() + ", near: " + sp.getSubStringForException(16) + getExceptionMessageTail(parseStrignRunner); return(new ParseException(fullMessage)); }
internal static ParseException forInvalidCharacter(String message, ParseStringRunner parseStrignRunner) { StringPointer sp = parseStrignRunner.getStringPointer(); string fullMessage = message + " - " + sp.getLineAndColumnForException() + ", near: " + sp.getSubStringForException(32) + getExceptionMessageTail(parseStrignRunner); return(new ParseException(fullMessage)); }
internal static JBoolean zParse(ParseStringRunner parseStringRunner, bool expectingTrue) { StringPointer sp = parseStringRunner.getStringPointer(); if (expectingTrue) { if (sp.isNextChars(TRUE.Substring(1))) { return(new JBoolean(true)); } else { throw ParseException.forInvalidCharacter("Invalid string when expecting '" + TRUE + "'", parseStringRunner); } } else { if (sp.isNextChars(FALSE.Substring(1))) { return(new JBoolean(false)); } else { throw ParseException.forInvalidCharacter("Invalid string when expecting '" + FALSE + "'", parseStringRunner); } } }
internal static JNull zParse(ParseStringRunner parseStringRunner) { StringPointer sp = parseStringRunner.getStringPointer(); if (sp.isNextChars(NULL.Substring(1))) { return(new JNull()); } else { throw ParseException.forInvalidCharacter("Invalid string when expecting '" + NULL + "'", parseStringRunner); } }
internal static JNumber zParse(ParseStringRunner parseStringRunner, char firstChr) { StringPointer sp = parseStringRunner.getStringPointer(); int start = sp.getCurrentIndex() - 1; // -1 since first character is already read bool valid = parseCheck(sp, firstChr); if (!valid) { throw ParseException.forInvalidCharacter("Invalid number value \"" + sp.getSubStringStartingFrom(start) + "\"", parseStringRunner); } else { sp.stepBack(); string validNumber = sp.getSubStringStartingFrom(start); return(new JNumber(validNumber, parseStringRunner)); } }
internal static JString zParse(ParseStringRunner parseStringRunner, bool expectStartOfString) { StringPointer sp = parseStringRunner.getStringPointer(); if (expectStartOfString) { char chr; if (!sp.tryGetNextNonWhiteChar(out chr)) { throw ParseException.forInvalidStart("Parameter string didn't contain any non-white characters", parseStringRunner); } if (chr != '"') { throw ParseException.forInvalidStart("Invalid character '" + chr + "' when expecting start of string '\"'", parseStringRunner); } } return(new JString(decode(parseStringRunner))); }
internal static string decode(ParseStringRunner parseStringRunner) { // At this point, StringPointer has passed starting " StringPointer sp = parseStringRunner.getStringPointer(); StringBuilder sb = new StringBuilder(); do { char chr = sp.getNextChar(); if (chr == '"') { return(sb.ToString()); } if (chr == '\\') { chr = sp.getNextChar(); if (chr == '"' || chr == '\\' || chr == '/') { // 'chr' works as is } else if (chr == 'b') { chr = '\b'; } else if (chr == 'f') { chr = '\f'; } else if (chr == 'n') { chr = '\n'; } else if (chr == 'r') { chr = '\r'; } else if (chr == 't') { chr = '\t'; } else if (chr == 'u') { int ucode = 0; for (int n = 0; n < 4; n++) { chr = sp.getNextChar(); int uvalue = HEX.IndexOf(char.ToUpperInvariant(chr)); if (uvalue < 0) { throw ParseException.forInvalidCharacter("Invalid hexadecimal character '" + chr + "' after '\\u' in string value", parseStringRunner); } ucode = ucode * 16 + uvalue; } chr = (char)(ucode); } else { throw ParseException.forInvalidCharacter("Invalid character '" + chr + "' after '\\' in string value", parseStringRunner); } } sb.Append(chr); } while (true); }