示例#1
0
            private int ReadString()
            {
                m_PrevChar = '\0';

                while (m_CharBufferPosition < CharBufferLength)
                {
                    var c = CharBuffer[m_CharBufferPosition];

                    if (c == '"' && m_PrevChar != '\\')
                    {
                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                        {
                            m_Stack.Push(JsonType.String);
                            m_Expected = JsonType.MemberSeparator;
                        }
                        break;

                        case JsonType.BeginArray:
                        {
                            m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                        }
                        break;

                        case JsonType.String:
                        {
                            m_Stack.Pop();

                            switch (m_Stack.Peek())
                            {
                            case JsonType.BeginObject:
                                m_Expected = JsonType.ValueSeparator | JsonType.EndObject;
                                break;

                            case JsonType.BeginArray:
                                m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                                break;

                            default:
                                m_Expected = JsonType.Undefined;
                                break;
                            }
                        }
                        break;
                        }

                        return(k_ResultSuccess);
                    }

                    m_PrevChar = c;
                    m_CharBufferPosition++;
                }

                return(k_ResultEndOfStream);
            }
示例#2
0
            int ReadString()
            {
                m_PrevChar = '\0';

                while (m_CharBufferPosition < CharBufferLength)
                {
                    var c = CharBuffer[m_CharBufferPosition];

                    if (c == '"' && m_PrevChar != '\\')
                    {
                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                        {
                            m_Stack.Push(JsonType.String);
                            m_Expected = JsonType.MemberSeparator;
                        }
                        break;

                        case JsonType.BeginArray:
                        {
                            m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                        }
                        break;

                        case JsonType.String:
                        {
                            m_Stack.Pop();

                            switch (m_Stack.Peek())
                            {
                            case JsonType.BeginObject:
                                m_Expected = JsonType.ValueSeparator | JsonType.EndObject;
                                break;

                            case JsonType.BeginArray:
                                m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                                break;

                            default:
                                m_Expected = JsonType.Undefined;
                                break;
                            }
                        }
                        break;

                        case JsonType.Undefined:
                        {
                            // Special case of reading a string at the root. The assumption is this is a single string value and can not be followed by anything.
                            m_Expected = JsonType.EOF;
                        }
                        break;
                        }

                        return(k_ResultSuccess);
                    }

                    m_PrevChar = c;
                    m_CharBufferPosition++;
                }

                return(k_ResultEndOfStream);
            }
示例#3
0
            public void Execute()
            {
                // Copy to locals from data ptr
                m_CharBufferPosition = Data->CharBufferPosition;
                m_Stack             = Data->Stack;
                m_PrevChar          = Data->PrevChar;
                m_Expected          = Data->Expected;
                m_LineCount         = Data->LineCount;
                m_LineStart         = Data->LineStart;
                m_PartialTokenType  = Data->PartialTokenType;
                m_PartialTokenState = Data->PartialTokenState;

                switch (m_PartialTokenType)
                {
                case JsonType.String:
                {
                    var result = ReadString();
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType  = JsonType.String;
                        m_PartialTokenState = m_PartialTokenState + m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                    m_CharBufferPosition++;
                }
                break;

                case JsonType.Number:
                {
                    var state  = m_PartialTokenState;
                    var result = ReadNumber(ref state);

                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType  = JsonType.Number;
                        m_PartialTokenState = state;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.True:
                {
                    var result = ReadTrue(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.True;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.False:
                {
                    var result = ReadFalse(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.False;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }


                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.NaN | JsonType.Null:
                {
                    // First try reading the value as `null`
                    var start  = m_CharBufferPosition;
                    var result = ReadNull(m_PartialTokenState);

                    if (result == k_ResultSuccess)
                    {
                        m_PartialTokenType  = JsonType.Undefined;
                        m_PartialTokenState = 0;
                        break;
                    }

                    if (result == k_ResultEndOfStream)
                    {
                        // Otherwise we know it can only be `null`
                        m_PartialTokenState += m_CharBufferPosition;
                        m_PartialTokenType   = JsonType.Null;
                        Break(JsonType.EOF);
                        return;
                    }

                    // The value can not be `null` at this point.
                    // Check for `nan`
                    m_CharBufferPosition = start;
                    result = ReadNaN(m_PartialTokenState);

                    if (result == k_ResultSuccess)
                    {
                        m_PartialTokenType  = JsonType.Undefined;
                        m_PartialTokenState = 0;
                        break;
                    }

                    if (result == k_ResultEndOfStream)
                    {
                        m_PartialTokenState += m_CharBufferPosition;
                        m_PartialTokenType   = JsonType.NaN;
                        Break(JsonType.EOF);
                        return;
                    }

                    Break(JsonType.Undefined);
                }
                break;

                case JsonType.Null:
                {
                    var result = ReadNull(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.Null;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.NaN:
                {
                    var result = ReadNaN(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.NaN;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.Infinity:
                {
                    var result = ReadInfinity(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.Infinity;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;
                }

                while (m_CharBufferPosition < CharBufferLength)
                {
                    var c = CharBuffer[m_CharBufferPosition];

                    switch (c)
                    {
                    case '{':
                    {
                        if (!IsExpected(JsonType.BeginObject))
                        {
                            Break(JsonType.BeginObject);
                            return;
                        }

                        m_Stack.Push(JsonType.BeginObject);
                        m_Expected = JsonType.String | JsonType.EndObject;
                    }
                    break;

                    case '[':
                    {
                        if (!IsExpected(JsonType.BeginArray))
                        {
                            Break(JsonType.BeginArray);
                            return;
                        }

                        m_Stack.Push(JsonType.BeginArray);
                        m_Expected = JsonType.Value | JsonType.EndArray;
                    }
                    break;

                    case '}':
                    {
                        if (!IsExpected(JsonType.EndObject))
                        {
                            Break(JsonType.EndObject);
                            return;
                        }

                        m_Stack.Pop();

                        if (m_Stack.Peek() == JsonType.String)
                        {
                            m_Stack.Pop();
                        }

                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndObject;
                            break;

                        case JsonType.BeginArray:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                            break;

                        default:
                            m_Expected = JsonType.EOF;
                            break;
                        }
                    }
                    break;

                    case ']':
                    {
                        if (!IsExpected(JsonType.EndArray))
                        {
                            Break(JsonType.EndArray);
                            return;
                        }

                        m_Stack.Pop();

                        if (m_Stack.Peek() == JsonType.String)
                        {
                            m_Stack.Pop();
                        }

                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndObject;
                            break;

                        case JsonType.BeginArray:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                            break;

                        default:
                            m_Expected = JsonType.EOF;
                            break;
                        }
                    }
                    break;

                    case ' ':
                    case '\t':
                    case '\r':
                        break;

                    case '\n':
                    {
                        m_LineCount++;
                        m_LineStart = m_CharBufferPosition;
                    }
                    break;

                    case ':':
                    {
                        if (!IsExpected(JsonType.MemberSeparator))
                        {
                            Break(JsonType.MemberSeparator);
                            return;
                        }

                        m_Expected = JsonType.Value;
                    }
                    break;

                    case ',':
                    {
                        if (!IsExpected(JsonType.ValueSeparator))
                        {
                            Break(JsonType.ValueSeparator);
                            return;
                        }

                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                            m_Expected = JsonType.String;
                            break;

                        case JsonType.BeginArray:
                            m_Expected = JsonType.Value;
                            break;

                        default:
                            m_Expected = JsonType.Undefined;
                            break;
                        }
                    }
                    break;

                    case '"':
                    {
                        if (!IsExpected(JsonType.String))
                        {
                            Break(JsonType.String);
                            return;
                        }

                        var start = m_CharBufferPosition;

                        m_CharBufferPosition++;

                        var result = ReadString();

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.String;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }
                    }
                    break;

                    case '-':
                    {
                        if (!IsExpected(JsonType.Negative))
                        {
                            Break(JsonType.Negative);
                            return;
                        }

                        m_Expected = JsonType.Number | JsonType.Infinity;
                    }
                    break;

                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                    {
                        if (!IsExpected(JsonType.Number))
                        {
                            Break(JsonType.Number);
                            return;
                        }

                        var state  = 0;
                        var result = ReadNumber(ref state);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.Number;
                            m_PartialTokenState = state;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    case 'T':
                    case 't':
                    {
                        if (!IsExpected(JsonType.True))
                        {
                            Break(JsonType.True);
                            return;
                        }

                        var start  = m_CharBufferPosition;
                        var result = ReadTrue(0);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.True;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    case 'F':
                    case 'f':
                    {
                        if (!IsExpected(JsonType.False))
                        {
                            Break(JsonType.False);
                            return;
                        }

                        var start  = m_CharBufferPosition;
                        var result = ReadFalse(0);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.False;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    case 'N':
                    case 'n':
                    {
                        if (!IsExpected(JsonType.Null) && !IsExpected(JsonType.NaN))
                        {
                            Break(JsonType.Null | JsonType.NaN);
                            return;
                        }

                        // First try reading the value as `null`
                        var start  = m_CharBufferPosition;
                        var result = ReadNull(0);

                        if (result == k_ResultSuccess)
                        {
                            m_CharBufferPosition--;
                            break;
                        }

                        if (result == k_ResultEndOfStream)
                        {
                            if (m_CharBufferPosition - start == 1)
                            {
                                // Very special case. We only looked at the first character "n" then hit EndOfStream
                                // which means it could still be a `NaN` or `Null`
                                m_PartialTokenState = m_CharBufferPosition - start;
                                m_PartialTokenType  = JsonType.Null | JsonType.NaN;
                                Break(JsonType.EOF);
                            }
                            else
                            {
                                // Otherwise we know it can only be `null`
                                m_PartialTokenState = m_CharBufferPosition - start;
                                m_PartialTokenType  = JsonType.Null;
                                Break(JsonType.EOF);
                            }

                            return;
                        }

                        // The value can not be `null` at this point.
                        // Check for `nan`
                        m_CharBufferPosition = start;
                        result = ReadNaN(0);

                        if (result == k_ResultSuccess)
                        {
                            m_CharBufferPosition--;
                            break;
                        }

                        if (result == k_ResultEndOfStream)
                        {
                            m_PartialTokenState = m_CharBufferPosition - start;
                            m_PartialTokenType  = JsonType.NaN;
                            Break(JsonType.EOF);
                            return;
                        }

                        Break(JsonType.Undefined);
                    }
                    break;

                    case 'I':
                    case 'i':
                    {
                        if (!IsExpected(JsonType.Infinity))
                        {
                            Break(JsonType.Infinity);
                            return;
                        }

                        var start  = m_CharBufferPosition;
                        var result = ReadInfinity(0);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.Infinity;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    default:
                    {
                        Break(JsonType.Undefined);
                        return;
                    }
                    }

                    m_CharBufferPosition++;
                }

                m_PartialTokenType = JsonType.Undefined;
                Break(JsonType.EOF);
            }
示例#4
0
            public void Execute()
            {
                // Copy to locals from data ptr
                m_CharBufferPosition = Data->CharBufferPosition;
                m_Stack             = Data->Stack;
                m_PrevChar          = Data->PrevChar;
                m_Expected          = Data->Expected;
                m_LineCount         = Data->LineCount;
                m_LineStart         = Data->LineStart;
                m_PartialTokenType  = Data->PartialTokenType;
                m_PartialTokenState = Data->PartialTokenState;

                switch (m_PartialTokenType)
                {
                case JsonType.String:
                {
                    var result = ReadString();
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType  = JsonType.String;
                        m_PartialTokenState = m_PartialTokenState + m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                    m_CharBufferPosition++;
                }
                break;

                case JsonType.Number:
                {
                    var state  = m_PartialTokenState;
                    var result = ReadNumber(ref state);

                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType  = JsonType.Number;
                        m_PartialTokenState = state;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.True:
                {
                    var result = ReadTrue(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.True;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.False:
                {
                    var result = ReadFalse(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.False;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }


                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;

                case JsonType.Null:
                {
                    var result = ReadNull(m_PartialTokenState);
                    if (result != k_ResultSuccess)
                    {
                        m_PartialTokenType   = JsonType.Null;
                        m_PartialTokenState += m_CharBufferPosition;
                        Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                        return;
                    }

                    m_PartialTokenType  = JsonType.Undefined;
                    m_PartialTokenState = 0;
                }
                break;
                }

                while (m_CharBufferPosition < CharBufferLength)
                {
                    var c = CharBuffer[m_CharBufferPosition];

                    switch (c)
                    {
                    case '{':
                    {
                        if (!IsExpected(JsonType.BeginObject))
                        {
                            Break(JsonType.BeginObject);
                            return;
                        }

                        m_Stack.Push(JsonType.BeginObject);
                        m_Expected = JsonType.String | JsonType.EndObject;
                    }
                    break;

                    case '[':
                    {
                        if (!IsExpected(JsonType.BeginArray))
                        {
                            Break(JsonType.BeginArray);
                            return;
                        }

                        m_Stack.Push(JsonType.BeginArray);
                        m_Expected = JsonType.Value | JsonType.EndArray;
                    }
                    break;

                    case '}':
                    {
                        if (!IsExpected(JsonType.EndObject))
                        {
                            Break(JsonType.EndObject);
                            return;
                        }

                        m_Stack.Pop();

                        if (m_Stack.Peek() == JsonType.String)
                        {
                            m_Stack.Pop();
                        }

                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndObject;
                            break;

                        case JsonType.BeginArray:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                            break;

                        default:
                            m_Expected = JsonType.EOF;
                            break;
                        }
                    }
                    break;

                    case ']':
                    {
                        if (!IsExpected(JsonType.EndArray))
                        {
                            Break(JsonType.EndArray);
                            return;
                        }

                        m_Stack.Pop();

                        if (m_Stack.Peek() == JsonType.String)
                        {
                            m_Stack.Pop();
                        }

                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndObject;
                            break;

                        case JsonType.BeginArray:
                            m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                            break;

                        default:
                            m_Expected = JsonType.EOF;
                            break;
                        }
                    }
                    break;

                    case ' ':
                    case '\t':
                    case '\r':
                        break;

                    case '\n':
                    {
                        m_LineCount++;
                        m_LineStart = m_CharBufferPosition;
                    }
                    break;

                    case ':':
                    {
                        if (!IsExpected(JsonType.MemberSeparator))
                        {
                            Break(JsonType.MemberSeparator);
                            return;
                        }

                        m_Expected = JsonType.Value;
                    }
                    break;

                    case ',':
                    {
                        if (!IsExpected(JsonType.ValueSeparator))
                        {
                            Break(JsonType.ValueSeparator);
                            return;
                        }

                        switch (m_Stack.Peek())
                        {
                        case JsonType.BeginObject:
                            m_Expected = JsonType.String;
                            break;

                        case JsonType.BeginArray:
                            m_Expected = JsonType.Value;
                            break;

                        default:
                            m_Expected = JsonType.Undefined;
                            break;
                        }
                    }
                    break;

                    case '"':
                    {
                        if (!IsExpected(JsonType.String))
                        {
                            Break(JsonType.String);
                            return;
                        }

                        var start = m_CharBufferPosition;

                        m_CharBufferPosition++;

                        var result = ReadString();

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.String;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }
                    }
                    break;

                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                    case '-':
                    {
                        if (!IsExpected(JsonType.Number))
                        {
                            Break(JsonType.Number);
                            return;
                        }

                        var state  = 0;
                        var result = ReadNumber(ref state);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.Number;
                            m_PartialTokenState = state;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    case 't':
                    {
                        if (!IsExpected(JsonType.True))
                        {
                            Break(JsonType.True);
                            return;
                        }

                        var start  = m_CharBufferPosition;
                        var result = ReadTrue(0);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.True;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    case 'f':
                    {
                        if (!IsExpected(JsonType.False))
                        {
                            Break(JsonType.False);
                            return;
                        }

                        var start  = m_CharBufferPosition;
                        var result = ReadFalse(0);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.False;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    case 'n':
                    {
                        if (!IsExpected(JsonType.Null))
                        {
                            Break(JsonType.Null);
                            return;
                        }

                        var start  = m_CharBufferPosition;
                        var result = ReadNull(0);

                        if (result != k_ResultSuccess)
                        {
                            m_PartialTokenType  = JsonType.Null;
                            m_PartialTokenState = m_CharBufferPosition - start;
                            Break(result == k_ResultEndOfStream ? JsonType.EOF : JsonType.Undefined);
                            return;
                        }

                        m_CharBufferPosition--;
                    }
                    break;

                    default:
                    {
                        Break(JsonType.Undefined);
                        return;
                    }
                    }

                    m_CharBufferPosition++;
                }

                Break(JsonType.EOF);
            }
示例#5
0
            int ReadPrimitive()
            {
                while (m_CharBufferPosition < CharBufferLength)
                {
                    var c = CharBuffer[m_CharBufferPosition];

                    if (c == '\t' ||
                        c == '\r' ||
                        c == '\n' ||
                        c == ',' ||
                        c == ' ' ||
                        c == ':' ||
                        c == '=' ||
                        c == ']' ||
                        c == '}' ||
                        c == '{' ||
                        c == '[')
                    {
                        switch (m_Stack.Peek())
                        {
                        case JsonType.Undefined:
                        case JsonType.BeginObject:
                        {
                            m_Stack.Push(JsonType.String);
                            m_Expected = JsonType.MemberSeparator;
                        }
                        break;

                        case JsonType.BeginArray:
                        {
                            m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                        }
                        break;

                        case JsonType.String:
                        {
                            m_Stack.Pop();

                            switch (m_Stack.Peek())
                            {
                            case JsonType.BeginObject:
                                m_Expected = JsonType.ValueSeparator | JsonType.EndObject;
                                break;

                            case JsonType.BeginArray:
                                m_Expected = JsonType.ValueSeparator | JsonType.EndArray;
                                break;

                            default:
                                m_Expected = JsonType.Undefined;
                                break;
                            }
                        }
                        break;
                        }

                        m_CharBufferPosition--;
                        return(k_ResultSuccess);
                    }

                    m_PrevChar = c;
                    m_CharBufferPosition++;
                }

                // Special case, we are looking at a partial value of a root un scoped object.
                // This is technically valid even though we may be receiving more data.
                if (m_Stack.Peek() == JsonType.String && m_Stack.Peek(1) == JsonType.Undefined)
                {
                    m_Expected |= JsonType.EOF;
                }

                m_PartialTokenType = JsonType.Value;
                return(k_ResultEndOfStream);
            }