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(); } } }
/// <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); }
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> /// 解析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)); }
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; } }
/// <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; } }
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); }