示例#1
0
文件: TextParser.cs 项目: amacal/jinx
        public static JsonToken Parse(JsonReaderBuffer buffer, JsonTokenType textOrProperty)
        {
            char character;
            bool escaped = false;

            int start = buffer.Offset + 1;
            int length = 0;

            Action forward = () =>
            {
                ForwardOrThrow(buffer, true);
                length++;
            };

            ForwardOrThrow(buffer, true);

            while (buffer.Data[buffer.Offset] != '"')
            {
                if (buffer.Data[buffer.Offset] != '\\')
                {
                    forward();
                    continue;
                }

                escaped = true;
                forward();

                character = buffer.Data[buffer.Offset];

                switch (character)
                {
                    case 'n':
                    case 't':
                    case 'r':
                    case 'b':
                    case 'f':
                    case '/':
                    case '\\':
                    case '\"':
                        forward();
                        continue;
                }

                if (character != 'u')
                    throw new JsonReaderSyntaxException();

                for (int i = 0; i < 4; i++)
                {
                    forward();
                    character = buffer.Data[buffer.Offset];

                    if ('0' <= character && character <= '9')
                        continue;

                    if ('a' <= character && character <= 'f')
                        continue;

                    throw new JsonReaderSyntaxException();
                }

                forward();
                continue;
            }

            buffer.Forward(true);

            if (escaped)
                return new EscapingToken(textOrProperty, buffer.Data, start, length);

            return new DataToken(textOrProperty, buffer.Data, start, length);
        }
示例#2
0
文件: TextParser.cs 项目: amacal/jinx
 private static void ForwardOrThrow(JsonReaderBuffer buffer, bool consistent)
 {
     if (buffer.Forward(consistent) == false)
         throw new JsonReaderStreamException();
 }
示例#3
0
        public static JsonToken Parse(JsonReaderBuffer buffer)
        {
            bool isReal = false;
            bool isNegative = false;
            bool isScientific = false;

            int start = buffer.Offset;
            int length = 0;

            Action forward = () =>
            {
                if (buffer.Forward(true) == false)
                    throw new JsonReaderStreamException();

                length++;
            };

            Func<bool> tryForward = () =>
            {
                length++;
                return buffer.Forward(true);
            };

            if (buffer.Data[buffer.Offset] == '-')
            {
                isNegative = true;
                forward();
            }

            if (buffer.Data[buffer.Offset] == '0')
            {
                tryForward();
            }
            else if (Char.IsDigit(buffer.Data[buffer.Offset]))
            {
                while (Char.IsDigit(buffer.Data[buffer.Offset]))
                    if (tryForward() == false)
                        break;
            }
            else
                throw new JsonReaderSyntaxException();

            if (buffer.Ensure(true))
            {
                if (buffer.Data[buffer.Offset] == '.')
                {
                    forward();
                    isReal = true;

                    if (Char.IsDigit(buffer.Data[buffer.Offset]) == false)
                        throw new JsonReaderSyntaxException();

                    while (Char.IsDigit(buffer.Data[buffer.Offset]))
                        if (tryForward() == false)
                            break;
                }

                if (buffer.Ensure(true))
                {
                    if (buffer.Data[buffer.Offset] == 'e' ||
                        buffer.Data[buffer.Offset] == 'E')
                    {
                        forward();
                        isScientific = true;

                        if (buffer.Data[buffer.Offset] == '-' ||
                            buffer.Data[buffer.Offset] == '+')
                        {
                            forward();
                        }

                        while (Char.IsDigit(buffer.Data[buffer.Offset]))
                            if (tryForward() == false)
                                break;
                    }
                }
            }

            if (length == 0)
                throw new JsonReaderSyntaxException();

            return new DataToken(JsonTokenType.Number, buffer.Data, start, length);
        }