private ScanState ScanDelimitedString(char quotationChar) { StringBuilder stringBuilder = new StringBuilder(); ScanStringState scanStringState = ScanStringState.Continue; UnicodeCharacter unicodeCharacter = default(UnicodeCharacter); char c; while (reader.ReadNext(out c)) { switch (scanStringState) { case ScanStringState.Continue: if (c == quotationChar) { scanStringState = ScanStringState.Done; } else if (c == '\\') { scanStringState = ScanStringState.ReadEscapedCharacter; } break; case ScanStringState.ReadEscapedCharacter: if (c == 'u') { unicodeCharacter = default(UnicodeCharacter); scanStringState = ScanStringState.ReadUnicodeCharacter; break; } switch (c) { case '\'': c = '\''; break; case '"': c = '"'; break; case '\\': c = '\\'; break; case '/': c = '/'; 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; } scanStringState = ScanStringState.Continue; break; case ScanStringState.ReadUnicodeCharacter: if (SchemaUtil.IsHexCharacter(c)) { unicodeCharacter.Value <<= 4; unicodeCharacter.Value += SchemaUtil.GetHexValue(c); unicodeCharacter.DigitCount++; if (unicodeCharacter.DigitCount == 4) { c = (char)unicodeCharacter.Value; scanStringState = ScanStringState.Continue; } } else { scanStringState = ScanStringState.Error; } break; } switch (scanStringState) { case ScanStringState.Continue: stringBuilder.Append(c); continue; default: continue; case ScanStringState.Done: case ScanStringState.Error: break; } break; } if (scanStringState == ScanStringState.Done) { currentToken = JsonToken.StringToken(stringBuilder.ToString(), reader.GetAtomText()); return(ScanState.HasValue); } return(ScanState.Error); }
private ScanState ScanDelimitedString(char quotationChar) { Debug.Assert(quotationChar == '"' || quotationChar == '\'' || quotationChar == '/'); char current; StringBuilder stringBuilder = new StringBuilder(); ScanStringState scanState = ScanStringState.Continue; UnicodeCharacter unicodeChar = new UnicodeCharacter(); while (this.reader.ReadNext(out current)) { switch (scanState) { case ScanStringState.Continue: if (current == quotationChar) { scanState = ScanStringState.Done; } else if (current == '\\') { scanState = ScanStringState.ReadEscapedCharacter; } break; case ScanStringState.ReadEscapedCharacter: if (current == 'u') { unicodeChar = new UnicodeCharacter(); scanState = ScanStringState.ReadUnicodeCharacter; } else { switch (current) { case '\'': current = '\''; break; case '"': current = '"'; break; case '\\': current = '\\'; break; case '/': current = '/'; break; case 'b': current = '\b'; break; case 'f': current = '\f'; break; case 'n': current = '\n'; break; case 'r': current = '\r'; break; case 't': current = '\t'; break; default: break; } scanState = ScanStringState.Continue; } break; case ScanStringState.ReadUnicodeCharacter: if (Util.IsHexCharacter(current)) { unicodeChar.Value = unicodeChar.Value << 4; unicodeChar.Value += Util.GetHexValue(current); unicodeChar.DigitCount++; if (unicodeChar.DigitCount == 4) { current = (char)unicodeChar.Value; scanState = ScanStringState.Continue; } } else { scanState = ScanStringState.Error; } break; default: Debug.Assert(false); break; } if (scanState == ScanStringState.Continue) { stringBuilder.Append(current); } else if (scanState == ScanStringState.Done || scanState == ScanStringState.Error) { break; } } if (scanState == ScanStringState.Done) { this.currentToken = JsonToken.StringToken(stringBuilder.ToString(), this.reader.GetAtomText()); return(ScanState.HasValue); } return(ScanState.Error); }
/// <summary> /// Constructs a new instance of <see cref="CharacterEvent"/>. /// </summary> public CharacterEvent(UnicodeCharacter character) { Character = character; }