internal void SetFailure(NumberSpanParse.ParseFailureKind failure, string failureMessageID, object failureMessageFormatArgument, string failureArgumentName) { _failure = failure; _failureMessageID = failureMessageID; _failureMessageFormatArgument = failureMessageFormatArgument; _failureArgumentName = failureArgumentName; if (_throwStyle != NumberSpanParse.NumberSpanThrowStyle.None) throw GetNumberSpanParseException(); }
private bool AddNum(NumberSpanParse.NumberSpanToken num, ref NumberSpanParse.NumberSpanResult result) { if (_numCount >= 5 || _tokenCount >= 11) { result.SetFailure(NumberSpanParse.ParseFailureKind.Format, "Format_BadNumberSpan", null); return false; } _numbers[_numCount++] = num; _tokenCount++; return true; }
private bool AddSep(string sep, ref NumberSpanParse.NumberSpanResult result) { if (_sepCount >= 6 || _tokenCount >= 11) { result.SetFailure(NumberSpanParse.ParseFailureKind.Format, "Format_BadNumberSpan", null); return false; } _literals[_sepCount++] = sep; _tokenCount++; return true; }
internal bool ProcessToken(ref NumberSpanParse.NumberSpanToken tok, ref NumberSpanParse.NumberSpanResult result) { if (tok._ttt == NumberSpanParse.TTT.NumOverflow) { result.SetFailure(NumberSpanParse.ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge", null); return false; } if (tok._ttt != NumberSpanParse.TTT.Sep && tok._ttt != NumberSpanParse.TTT.Num) { result.SetFailure(NumberSpanParse.ParseFailureKind.Format, "Format_BadNumberSpan", null); return false; } switch (tok._ttt) { case NumberSpanParse.TTT.Num: if (_tokenCount != 0 || AddSep(string.Empty, ref result)) { if (!AddNum(tok, ref result)) return false; break; } return false; case NumberSpanParse.TTT.Sep: if (AddSep(tok._sep, ref result)) break; return false; } _lastSeenTTT = tok._ttt; return true; }
internal bool ParseNumber(out long number, ref NumberSpanParse.NumberSpanResult result) { int num; number = 0L; if (!ParseInt(0x17, out num, ref result)) return false; number = num * 0x861c46800L; if (_ch != ':') { result.SetFailure(NumberSpanParse.ParseFailureKind.Format, "Format_BadNumberSpan"); return false; } NextChar(); if (!ParseInt(0x3b, out num, ref result)) return false; number += num * 0x23c34600L; if (_ch == ':') { NextChar(); if (_ch != '.') { if (!ParseInt(0x3b, out num, ref result)) return false; number += num * 0x989680L; } if (_ch == '.') { NextChar(); int num2 = 0x989680; while (num2 > 1 && _ch >= '0' && _ch <= '9') { num2 /= 10; number += (_ch - '0') * num2; NextChar(); } } } return true; }
internal bool ParseInt(int max, out int i, ref NumberSpanParse.NumberSpanResult result) { i = 0; var pos = _pos; while (_ch >= '0' && _ch <= '9') { if ((((long)i) & 0xf0000000L) != 0L) { result.SetFailure(NumberSpanParse.ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge"); return false; } i = ((i * 10) + _ch) - 0x30; if (i < 0) { result.SetFailure(NumberSpanParse.ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge"); return false; } NextChar(); } if (pos == _pos) { result.SetFailure(NumberSpanParse.ParseFailureKind.Format, "Format_BadNumberSpan"); return false; } if (i > max) { result.SetFailure(NumberSpanParse.ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge"); return false; } return true; }
internal void SetFailure(NumberSpanParse.ParseFailureKind failure, string failureMessageID, object failureMessageFormatArgument) { SetFailure(failure, failureMessageID, failureMessageFormatArgument, null); }
internal void SetFailure(NumberSpanParse.ParseFailureKind failure, string failureMessageID) { SetFailure(failure, failureMessageID, null, null); }
internal bool TryParse(string input, ref NumberSpanParse.NumberSpanResult result) { result._parsedNumberSpan._ticks = 0L; if (input == null) { result.SetFailure(NumberSpanParse.ParseFailureKind.ArgumentNull, "ArgumentNull_String", null, "input"); return false; } _str = input; _len = input.Length; _pos = -1; NextChar(); SkipBlanks(); var negative = false; if (_ch == '-') { negative = true; NextChar(); } long num; if (NextNonDigit() == ':') { if (!ParseNumber(out num, ref result)) return false; } else { int num2; if (!ParseInt(0xa2e3ff, out num2, ref result)) return false; num = num2 * 0xc92a69c000L; if (_ch == '.') { long num3; NextChar(); if (!ParseNumber(out num3, ref result)) return false; num += num3; } } if (negative) { num = -num; if (num > 0L) { result.SetFailure(NumberSpanParse.ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge"); return false; } } else if (num < 0L) { result.SetFailure(NumberSpanParse.ParseFailureKind.Overflow, "Overflow_NumberSpanElementTooLarge"); return false; } SkipBlanks(); if (_pos < _len) { result.SetFailure(NumberSpanParse.ParseFailureKind.Format, "Format_BadNumberSpan"); return false; } result._parsedNumberSpan._ticks = num; return true; }
internal void Init(NumberSpanParse.NumberSpanThrowStyle throwStyle) { _parsedNumberSpan = new NumberSpan(); _throwStyle = throwStyle; }