Пример #1
0
        private unsafe void parseEnum <valueType>(ref valueType value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = default(valueType);
            }
            else
            {
                current = bufferStart + indexs->StartIndex;
                *(current + indexs->Length) = *(current - 1) = (byte)'"';
                Json.Parser parser = Interlocked.Exchange(ref enumJsonParser, null);
                if (parser == null)
                {
                    parser = Json.Parser.YieldPool.Default.Pop() ?? new Json.Parser();
                    parser.SetEnum();
                }
                if (!parser.ParseEnum(header.UnescapeUtf8(bufferStart, indexs->StartIndex - 1, indexs->Length + 2), ref value))
                {
                    state = HeaderQueryParseState.Unknown;
                }
                if ((parser = Interlocked.Exchange(ref enumJsonParser, parser)) != null)
                {
                    parser.Free();
                }
            }
        }
Пример #2
0
        /// <summary>
        /// 解析16进制数字
        /// </summary>
        /// <param name="value">数值</param>
        private void parseHex32(ref uint value)
        {
            uint number = (uint)(*current - '0');

            if (number > 9)
            {
                if ((number = (number - ('A' - '0')) & 0xffdfU) > 5)
                {
                    state = HeaderQueryParseState.NotHex;
                    return;
                }
                number += 10;
            }
            value = number;
            if (++current == end)
            {
                return;
            }
            do
            {
                if ((number = (uint)(*current - '0')) > 9)
                {
                    if ((number = (number - ('A' - '0')) & 0xffdfU) > 5)
                    {
                        return;
                    }
                    number += 10;
                }
                value <<= 4;
                value  += number;
            }while (++current != end);
        }
Пример #3
0
        internal void Parse(ref long value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = 0;
                return;
            }
            current = bufferStart + indexs->StartIndex;
            end     = current + indexs->Length;
            int sign = 0;

            if (*current == '-')
            {
                if (++current == end)
                {
                    state = HeaderQueryParseState.NotNumber;
                    return;
                }
                sign = 1;
            }
            uint number = (uint)(*current - '0');

            if (number > 9)
            {
                state = HeaderQueryParseState.NotNumber;
                return;
            }
            if (++current == end)
            {
                value = sign == 0 ? (long)(int)number : -(long)(int)number;
                return;
            }
            if (number == 0)
            {
                if (*current != 'x')
                {
                    value = 0;
                    return;
                }
                if (++current == end)
                {
                    state = HeaderQueryParseState.NotNumber;
                    return;
                }
                value = (long)parseHex64();
                if (sign != 0)
                {
                    value = -value;
                }
                return;
            }
            value = (long)parseUInt64(number);
            if (sign != 0)
            {
                value = -value;
            }
        }
Пример #4
0
        /// <summary>
        /// 解析16进制数字
        /// </summary>
        /// <returns>数字</returns>
        private ulong parseHex64()
        {
            uint number = (uint)(*current - '0');

            if (number > 9)
            {
                if ((number = (number - ('A' - '0')) & 0xffdfU) > 5)
                {
                    state = HeaderQueryParseState.NotHex;
                    return(0);
                }
                number += 10;
            }
            if (++current == end)
            {
                return(number);
            }
            uint  high  = number;
            byte *end32 = current + 7;

            if (end32 > end)
            {
                end32 = end;
            }
            do
            {
                if ((number = (uint)(*current - '0')) > 9)
                {
                    if ((number = (number - ('A' - '0')) & 0xffdfU) > 5)
                    {
                        return(high);
                    }
                    number += 10;
                }
                high <<= 4;
                high  += number;
            }while (++current != end32);
            if (current == end)
            {
                return(high);
            }
            byte *start = current;
            ulong low   = number;

            do
            {
                if ((number = (uint)(*current - '0')) > 9)
                {
                    if ((number = (number - ('A' - '0')) & 0xffdfU) > 5)
                    {
                        return(low | (ulong)high << ((int)((byte *)current - (byte *)start) << 1));
                    }
                    number += 10;
                }
                low <<= 4;
                low  += number;
            }while (++current != end);
            return(low | (ulong)high << ((int)((byte *)current - (byte *)start) << 1));
        }
Пример #5
0
        internal void Parse(ref Guid value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = new Guid();
            }
            else if (end - current != 36)
            {
                state = HeaderQueryParseState.NotGuid;
            }
            else
            {
                current = bufferStart + indexs->StartIndex;
                end     = current + indexs->Length;
                GuidCreator guid = new GuidCreator();
                guid.Byte3 = (byte)parseHex2();
                guid.Byte2 = (byte)parseHex2();
                guid.Byte1 = (byte)parseHex2();
                guid.Byte0 = (byte)parseHex2();
                if (*++current != '-')
                {
                    state = HeaderQueryParseState.NotGuid;
                    return;
                }
                guid.Byte45 = (ushort)parseHex4();
                if (*++current != '-')
                {
                    state = HeaderQueryParseState.NotGuid;
                    return;
                }
                guid.Byte67 = (ushort)parseHex4();
                if (*++current != '-')
                {
                    state = HeaderQueryParseState.NotGuid;
                    return;
                }
                guid.Byte8 = (byte)parseHex2();
                guid.Byte9 = (byte)parseHex2();
                if (*++current != '-')
                {
                    state = HeaderQueryParseState.NotGuid;
                    return;
                }
                guid.Byte10 = (byte)parseHex2();
                guid.Byte11 = (byte)parseHex2();
                guid.Byte12 = (byte)parseHex2();
                guid.Byte13 = (byte)parseHex2();
                guid.Byte14 = (byte)parseHex2();
                guid.Byte15 = (byte)parseHex2();
                value       = guid.Value;
            }
        }
Пример #6
0
        internal void Parse(ref short value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = 0;
                return;
            }
            current = bufferStart + indexs->StartIndex;
            end     = current + indexs->Length;
            int sign = 0;

            if (*current == '-')
            {
                if (++current == end)
                {
                    state = HeaderQueryParseState.NotNumber;
                    return;
                }
                sign = 1;
            }
            uint number = (uint)(*current - '0');

            if (number > 9)
            {
                state = HeaderQueryParseState.NotNumber;
                return;
            }
            if (++current == end)
            {
                value = sign == 0 ? (short)(ushort)number : (short)-(int)number;
                return;
            }
            if (number == 0)
            {
                if (*current != 'x')
                {
                    value = 0;
                    return;
                }
                if (++current == end)
                {
                    state = HeaderQueryParseState.NotNumber;
                    return;
                }
                parseHex32(ref number);
                value = sign == 0 ? (short)(ushort)number : (short)-(int)number;
                return;
            }
            value = sign == 0 ? (short)(ushort)parseUInt32(number) : (short)-(int)parseUInt32(number);
        }
Пример #7
0
        private void unknown <valueType>(ref valueType value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = default(valueType);
            }
            else if (!AutoCSer.Json.Parser.ParseNotEmpty(header.UnescapeUtf8(bufferStart, indexs->StartIndex, indexs->Length), ref value))
            {
                state = HeaderQueryParseState.Unknown;
            }
        }
Пример #8
0
        /// <summary>
        /// 查询解析
        /// </summary>
        /// <typeparam name="valueType">目标类型</typeparam>
        /// <param name="header">HTTP请求头部</param>
        /// <param name="value">目标数据</param>
        /// <returns>解析状态</returns>
        private HeaderQueryParseState parse <valueType>(Header header, ref valueType value)
        {
            this.header = header;
            state       = HeaderQueryParseState.Success;
            fixed(byte *bufferFixed = header.Buffer.Buffer)
            {
                bufferStart   = bufferFixed + header.Buffer.StartIndex;
                queryIndex    = (BufferIndex *)(bufferStart + Header.QueryStartIndex);
                queryEndIndex = queryIndex + (header.QueryCount << 1);
                queryIndex   -= 2;
                HeaderQueryTypeParser <valueType> .Parse(this, ref value);
            }

            return(state);
        }
Пример #9
0
        internal void Parse(ref bool value)
        {
            BufferIndex *indexs = queryIndex + 1;

            switch (indexs->Length)
            {
            case 0:
                value = false;
                return;

            case 4:
                current = bufferStart + indexs->StartIndex;
                if (*(int *)current == ('t' + ('r' << 8) + ('u' << 16) + ('e' << 24)))
                {
                    value = true;
                }
                else
                {
                    state = HeaderQueryParseState.NotBool;
                }
                return;

            case 5:
                current = bufferStart + indexs->StartIndex;
                if ((*current | 0x20) == 'f' && *(int *)(current + 1) == ('a' + ('l' << 8) + ('s' << 16) + ('e' << 24)))
                {
                    value = false;
                }
                else
                {
                    state = HeaderQueryParseState.NotBool;
                }
                return;

            default:
                byte byteValue = (byte)(*(bufferStart + indexs->StartIndex) - '0');
                if (byteValue < 10)
                {
                    value = byteValue != 0;
                }
                else
                {
                    state = HeaderQueryParseState.NotBool;
                }
                return;
            }
        }
Пример #10
0
        internal void Parse(ref DateTime value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = DateTime.MinValue;
            }
            else
            {
                current = bufferStart + indexs->StartIndex;
                end     = current + indexs->Length;
                if (!DateTime.TryParse(unescapeAscii(), out value))
                {
                    state = HeaderQueryParseState.NotDateTime;
                }
            }
        }
Пример #11
0
        internal void Parse(ref decimal value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = 0;
            }
            else
            {
                current = bufferStart + indexs->StartIndex;
                end     = current + indexs->Length;
                if (!decimal.TryParse(unescapeAscii(), out value))
                {
                    state = HeaderQueryParseState.NotNumber;
                }
            }
        }
Пример #12
0
        internal void Parse(ref uint value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value = 0;
                return;
            }
            current = bufferStart + indexs->StartIndex;
            end     = current + indexs->Length;
            uint number = (uint)(*current - '0');

            if (number > 9)
            {
                state = HeaderQueryParseState.NotNumber;
                return;
            }
            if (++current == end)
            {
                value = number;
                return;
            }
            if (number == 0)
            {
                if (*current != 'x')
                {
                    value = 0;
                    return;
                }
                if (++current == end)
                {
                    state = HeaderQueryParseState.NotNumber;
                    return;
                }
                parseHex32(ref number);
                value = number;
                return;
            }
            value = parseUInt32(number);
        }