示例#1
0
        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);
        }
示例#2
0
        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);
        }