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(); } } }
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; } }
/// <summary> /// 是否存在未结束的查询 /// </summary> /// <returns>是否存在未结束的查询</returns> internal bool IsQuery() { if ((queryIndex += 2) == queryEndIndex) { return(false); } current = bufferStart + queryIndex->StartIndex; end = current + queryIndex->Length; return(true); }
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; } }
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); }
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; } }
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); } }
/// <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); }
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; } }
/// <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); }
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; } } }
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; } } }
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); }