public void CallParse(ref long value) { Quote = (char)0; ulong value64; ParseIntState state = parseInt64(out value64); if ((state & (ParseIntState.Error | ParseIntState.Null)) == 0) { if (state == ParseIntState.None) { if ((value64 & 0x8000000000000000U) == 0) { value = (long)value64; return; } } else if (value64 <= 0x8000000000000000U) { value = (long)(0UL - value64); return; } ParseState = ParseState.OutOfRange; } else if ((state & ParseIntState.Error) == 0) { ParseState = ParseState.NotInteger; } }
public void CallParse(ref int?value) { Quote = (char)0; uint value32; ParseIntState state = parseInt32(out value32); if ((state & (ParseIntState.Error | ParseIntState.Null)) == 0) { if (state == ParseIntState.None) { if ((value32 & 0x80000000U) == 0) { value = (int)value32; return; } } else if (value32 <= 0x80000000U) { value = (int)(0U - value32); return; } ParseState = ParseState.OutOfRange; } else if ((state & ParseIntState.Error) == 0) { value = null; } }
public void CallParse(ref short value) { Quote = (char)0; uint value32; ParseIntState state = parseInt32(out value32); if ((state & (ParseIntState.Error | ParseIntState.Null)) == 0) { if (state == ParseIntState.None) { if ((value32 & 0xffff8000U) == 0) { value = (short)(ushort)value32; return; } } else if (value32 <= 0xffff8000U) { value = (short)-(int)value32; return; } ParseState = ParseState.OutOfRange; } else if ((state & ParseIntState.Error) == 0) { ParseState = ParseState.NotInteger; } }
public void CallParse(ref ushort?value) { Quote = (char)0; uint value32; ParseIntState state = parseInt32(out value32); if (state == ParseIntState.None) { if ((value32 & 0xffff0000U) == 0) { value = (ushort)value32; return; } ParseState = ParseState.OutOfRange; } else if ((state & ParseIntState.Error) == 0) { if (state == ParseIntState.Null) { value = null; } else { ParseState = ParseState.OutOfRange; } } }
public void CallParse(ref ulong value) { Quote = (char)0; ParseIntState state = parseInt64(out value); if (state != ParseIntState.None && (state & ParseIntState.Error) == 0) { ParseState = ParseState.OutOfRange; } }
/// <summary> /// 检测整数字符串结束 /// </summary> /// <param name="state"></param> /// <returns></returns> private ParseIntState checkQuote(ParseIntState state) { if ((state & ParseIntState.Error) == 0) { if ((state & ParseIntState.Null) == 0) { if (Current >= end) { ParseState = ParseState.CrashEnd; return(ParseIntState.Error); } if (*Current == Quote) { ++Current; return(state); } } ParseState = ParseState.NotInteger; } return(ParseIntState.Error); }
public void CallParse(ref ulong?value) { Quote = (char)0; ulong value64; ParseIntState state = parseInt64(out value64); if (state == ParseIntState.None) { value = value64; return; } else if ((state & ParseIntState.Error) == 0) { if (state == ParseIntState.Null) { value = null; } else { ParseState = ParseState.OutOfRange; } } }
/// <summary> /// 整数值解析 /// </summary> /// <param name="value"></param> /// <returns></returns> private ParseIntState parseInt64(out ulong value) { ParseIntState state = ParseIntState.None; START: switch (*Current & 15) { case '0' & 15: if (*Current == '0') { if (++Current == end || *Current != 'x') { value = 0; return(state); } if (++Current == end) { value = 0; ParseState = ParseState.CrashEnd; return(ParseIntState.Error); } return(state | parseHex64(out value)); } break; case '1' & 15: case '3' & 15: case '4' & 15: case '5' & 15: case '6' & 15: case '8' & 15: case '9' & 15: if ((value = (uint)(*Current - '0')) < 10) { if (++Current != end) { parseInt64Next(ref value); } return(state); } break; case '2' & 15: if (*Current == '2') { value = 2; if (++Current != end) { parseInt64Next(ref value); } return(state); } else if (*Current == '"') { Quote = '"'; if ((int)((byte *)end - (byte *)Current) >= 3 * sizeof(char)) { ++Current; return(checkQuote(state |= parseInt64(out value))); } } break; case '7' & 15: if (*Current == '7') { value = 7; if (++Current != end) { parseInt64Next(ref value); } return(state); } else if (*Current == '\'') { Quote = '\''; if ((int)((byte *)end - (byte *)Current) >= 3 * sizeof(char)) { ++Current; return(checkQuote(state |= parseInt64(out value))); } } break; case '-' & 15: if (*Current == '-') { if (++Current == end) { value = 0; ParseState = ParseState.CrashEnd; return(ParseIntState.Error); } if (state != ParseIntState.Negative) { state = ParseIntState.Negative; goto START; } Quote = (char)1; } break; //case '+' & 15: case 'n' & 15: if ((int)((byte *)end - (byte *)Current) >= 4 * sizeof(char) && *(long *)(Current) == 'n' + ('u' << 16) + ((long)'l' << 32) + ((long)'l' << 48)) { if (state != ParseIntState.Negative) { value = 0; Current += 4; return(ParseIntState.Null); } Quote = (char)1; } break; } if (Quote == 0) { char *current = Current; space(); if (current != Current) { if (ParseState != ParseState.Success) { value = 0; return(ParseIntState.Error); } if (Current == end) { value = 0; ParseState = ParseState.CrashEnd; return(ParseIntState.Error); } Quote = (char)1; goto START; } } value = 0; ParseState = ParseState.NotInteger; return(ParseIntState.Error); }