Ejemplo n.º 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();
                }
            }
        }
Ejemplo n.º 2
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;
            }
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 是否存在未结束的查询
 /// </summary>
 /// <returns>是否存在未结束的查询</returns>
 internal bool IsQuery()
 {
     if ((queryIndex += 2) == queryEndIndex)
     {
         return(false);
     }
     current = bufferStart + queryIndex->StartIndex;
     end     = current + queryIndex->Length;
     return(true);
 }
Ejemplo n.º 4
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;
            }
        }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
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;
            }
        }
Ejemplo n.º 7
0
        internal void Parse(ref SubString value)
        {
            BufferIndex *indexs = queryIndex + 1;

            if (indexs->Length == 0)
            {
                value.Set(string.Empty, 0, 0);
            }
            else
            {
                value = header.UnescapeUtf8(bufferStart, indexs->StartIndex, indexs->Length);
            }
        }
Ejemplo n.º 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);
        }
Ejemplo n.º 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;
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 是否匹配默认顺序名称
        /// </summary>
        /// <param name="names"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        internal byte *IsName(byte *names, ref int index)
        {
            if ((queryIndex += 2) == queryEndIndex)
            {
                index = -1;
                return(names);
            }
            int length = *(short *)names;

            if (queryIndex->Length == (short)length && Memory.SimpleEqualNotNull(bufferStart + queryIndex->StartIndex, names += sizeof(short), length))
            {
                return(names + length);
            }
            current = bufferStart + queryIndex->StartIndex;
            end     = current + queryIndex->Length;
            return(null);
        }
Ejemplo n.º 11
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;
                }
            }
        }
Ejemplo n.º 12
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;
                }
            }
        }
Ejemplo n.º 13
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);
        }