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); }