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); }
private static bool parseCheck(StringPointer sp, char chr) { int state; if (chr == '-') { chr = sp.getNextChar(); } if (chr == '0') { chr = sp.getNextChar(); if (chr == '.') { state = 5; } else if (chr == 'e' || chr == 'E') { state = 7; } else { return(true); // (-)0 } } else if (chr >= '1' && chr <= '9') { state = 4; } else { return(false); } do { chr = sp.getNextChar(); if (state == 4) { if (chr >= '0' && chr <= '9') { state = 4; } else if (chr == '.') { state = 5; } else if (chr == 'e' || chr == 'E') { state = 7; } else { return(true); // (-)## } } else if (state == 5) { if (chr >= '0' && chr <= '9') { state = 6; } else { return(false); } } else if (state == 6) { if (chr >= '0' && chr <= '9') { state = 6; } else if (chr == 'e' || chr == 'E') { state = 7; } else { return(true); // (-)(##).## } } else if (state == 7) { if (chr == '+' || chr == '-') { chr = sp.getNextChar(); if (chr >= '0' && chr <= '9') { state = 9; } else { return(false); } } else if (chr >= '0' && chr <= '9') { state = 9; } else { return(false); } } else if (state == 9) { if (chr >= '0' && chr <= '9') { state = 9; } else { return(true); // (-)(##).##[e/E](+/-)## } } } while (true); }