private static bool ParseByFormat(ref __DTString str, ref __DTString format, ref ParsingInfo parseInfo, DateTimeFormatInfo dtfi, ref DateTimeResult result)
{
int num = 0;
int newValue = 0;
int newValue2 = 0;
int newValue3 = 0;
int newValue4 = 0;
int newValue5 = 0;
int newValue6 = 0;
int newValue7 = 0;
double num2 = 0.0;
DateTimeParse.TM tM = DateTimeParse.TM.AM;
char @char = format.GetChar();
char c = @char;
if (c <= 'H')
{
if (c <= '\'')
{
if (c != '"')
{
switch (c)
{
case '%':
{
if (format.Index >= format.Value.Length - 1 || format.Value[format.Index + 1] == '%')
{
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
}
return true;
}
case '&':
{
goto IL_991;
}
case '\'':
{
break;
}
default:
{
goto IL_991;
}
}
}
StringBuilder stringBuilder = new StringBuilder();
if (!DateTimeParse.TryParseQuoteString(format.Value, format.Index, stringBuilder, out num))
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_BadQuote", @char);
return false;
}
format.Index += num - 1;
string text = stringBuilder.ToString();
for (int i = 0; i < text.Length; i++)
{
if (text[i] == ' ' && parseInfo.fAllowInnerWhite)
{
str.SkipWhiteSpaces();
}
else
{
if (!str.Match(text[i]))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
}
if ((result.flags & ParseFlags.CaptureOffset) == (ParseFlags)0)
{
return true;
}
if ((result.flags & ParseFlags.Rfc1123Pattern) != (ParseFlags)0 && text == "GMT")
{
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
return true;
}
if ((result.flags & ParseFlags.UtcSortPattern) != (ParseFlags)0 && text == "Z")
{
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
return true;
}
return true;
}
else
{
switch (c)
{
case '.':
{
if (str.Match(@char))
{
return true;
}
if (format.GetNext() && format.Match('F'))
{
format.GetRepeatCount();
return true;
}
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
case '/':
{
if (!str.Match(dtfi.DateSeparator))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
return true;
}
default:
{
if (c != ':')
{
switch (c)
{
case 'F':
{
break;
}
case 'G':
{
goto IL_991;
}
case 'H':
{
num = format.GetRepeatCount();
if (!DateTimeParse.ParseDigits(ref str, (num < 2) ? 1 : 2, out newValue5))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (!DateTimeParse.CheckNewValue(ref result.Hour, newValue5, @char, ref result))
{
return false;
}
return true;
}
default:
{
goto IL_991;
}
}
}
else
{
if (!str.Match(dtfi.TimeSeparator))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
return true;
}
break;
}
}
}
}
else
{
if (c <= 'h')
{
switch (c)
{
case 'K':
{
if (str.Match('Z'))
{
if ((result.flags & ParseFlags.TimeZoneUsed) != (ParseFlags)0 && result.timeZoneOffset != TimeSpan.Zero)
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_RepeatDateTimePattern", 'K');
return false;
}
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = new TimeSpan(0L);
result.flags |= ParseFlags.TimeZoneUtc;
return true;
}
else
{
if (!str.Match('+') && !str.Match('-'))
{
return true;
}
str.Index--;
TimeSpan timeSpan = new TimeSpan(0L);
if (!DateTimeParse.ParseTimeZoneOffset(ref str, 3, ref timeSpan))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if ((result.flags & ParseFlags.TimeZoneUsed) != (ParseFlags)0 && timeSpan != result.timeZoneOffset)
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_RepeatDateTimePattern", 'K');
return false;
}
result.timeZoneOffset = timeSpan;
result.flags |= ParseFlags.TimeZoneUsed;
return true;
}
break;
}
case 'L':
{
goto IL_991;
}
case 'M':
{
num = format.GetRepeatCount();
if (num <= 2)
{
if (!DateTimeParse.ParseDigits(ref str, num, out newValue2) && (!parseInfo.fCustomNumberParser || !parseInfo.parseNumberDelegate(ref str, num, out newValue2)))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
else
{
if (num == 3)
{
if (!DateTimeParse.MatchAbbreviatedMonthName(ref str, dtfi, ref newValue2))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
else
{
if (!DateTimeParse.MatchMonthName(ref str, dtfi, ref newValue2))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
result.flags |= ParseFlags.ParsedMonthName;
}
if (!DateTimeParse.CheckNewValue(ref result.Month, newValue2, @char, ref result))
{
return false;
}
return true;
}
default:
{
switch (c)
{
case 'Z':
{
if ((result.flags & ParseFlags.TimeZoneUsed) != (ParseFlags)0 && result.timeZoneOffset != TimeSpan.Zero)
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_RepeatDateTimePattern", 'Z');
return false;
}
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = new TimeSpan(0L);
result.flags |= ParseFlags.TimeZoneUtc;
str.Index++;
if (!DateTimeParse.GetTimeZoneName(ref str))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
str.Index--;
return true;
}
case '[':
{
goto IL_991;
}
case '\\':
{
if (!format.GetNext())
{
result.SetFailure(ParseFailureKind.Format, "Format_BadFormatSpecifier", null);
return false;
}
if (!str.Match(format.GetChar()))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
return true;
}
default:
{
switch (c)
{
case 'd':
{
num = format.GetRepeatCount();
if (num <= 2)
{
if (!DateTimeParse.ParseDigits(ref str, num, out newValue3) && (!parseInfo.fCustomNumberParser || !parseInfo.parseNumberDelegate(ref str, num, out newValue3)))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (!DateTimeParse.CheckNewValue(ref result.Day, newValue3, @char, ref result))
{
return false;
}
return true;
}
else
{
if (num == 3)
{
if (!DateTimeParse.MatchAbbreviatedDayName(ref str, dtfi, ref newValue4))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
else
{
if (!DateTimeParse.MatchDayName(ref str, dtfi, ref newValue4))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
if (!DateTimeParse.CheckNewValue(ref parseInfo.dayOfWeek, newValue4, @char, ref result))
{
return false;
}
return true;
}
break;
}
case 'e':
{
goto IL_991;
}
case 'f':
{
break;
}
case 'g':
{
num = format.GetRepeatCount();
if (!DateTimeParse.MatchEraName(ref str, dtfi, ref result.era))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
return true;
}
case 'h':
{
parseInfo.fUseHour12 = true;
num = format.GetRepeatCount();
if (!DateTimeParse.ParseDigits(ref str, (num < 2) ? 1 : 2, out newValue5))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (!DateTimeParse.CheckNewValue(ref result.Hour, newValue5, @char, ref result))
{
return false;
}
return true;
}
default:
{
goto IL_991;
}
}
break;
}
}
break;
}
}
}
else
{
if (c != 'm')
{
switch (c)
{
case 's':
{
num = format.GetRepeatCount();
if (!DateTimeParse.ParseDigits(ref str, (num < 2) ? 1 : 2, out newValue7))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (!DateTimeParse.CheckNewValue(ref result.Second, newValue7, @char, ref result))
{
return false;
}
return true;
}
case 't':
{
num = format.GetRepeatCount();
if (num == 1)
{
if (!DateTimeParse.MatchAbbreviatedTimeMark(ref str, dtfi, ref tM))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
else
{
if (!DateTimeParse.MatchTimeMark(ref str, dtfi, ref tM))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
if (parseInfo.timeMark == DateTimeParse.TM.NotSet)
{
parseInfo.timeMark = tM;
return true;
}
if (parseInfo.timeMark != tM)
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_RepeatDateTimePattern", @char);
return false;
}
return true;
}
default:
{
switch (c)
{
case 'y':
{
num = format.GetRepeatCount();
bool flag;
if (dtfi.HasForceTwoDigitYears)
{
flag = DateTimeParse.ParseDigits(ref str, 1, 4, out newValue);
}
else
{
if (num <= 2)
{
parseInfo.fUseTwoDigitYear = true;
}
flag = DateTimeParse.ParseDigits(ref str, num, out newValue);
}
if (!flag && parseInfo.fCustomNumberParser)
{
flag = parseInfo.parseNumberDelegate(ref str, num, out newValue);
}
if (!flag)
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (!DateTimeParse.CheckNewValue(ref result.Year, newValue, @char, ref result))
{
return false;
}
return true;
}
case 'z':
{
num = format.GetRepeatCount();
TimeSpan timeSpan2 = new TimeSpan(0L);
if (!DateTimeParse.ParseTimeZoneOffset(ref str, num, ref timeSpan2))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if ((result.flags & ParseFlags.TimeZoneUsed) != (ParseFlags)0 && timeSpan2 != result.timeZoneOffset)
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_RepeatDateTimePattern", 'z');
return false;
}
result.timeZoneOffset = timeSpan2;
result.flags |= ParseFlags.TimeZoneUsed;
return true;
}
default:
{
goto IL_991;
}
}
break;
}
}
}
else
{
num = format.GetRepeatCount();
if (!DateTimeParse.ParseDigits(ref str, (num < 2) ? 1 : 2, out newValue6))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (!DateTimeParse.CheckNewValue(ref result.Minute, newValue6, @char, ref result))
{
return false;
}
return true;
}
}
}
num = format.GetRepeatCount();
if (num > 7)
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (!DateTimeParse.ParseFractionExact(ref str, num, ref num2) && @char == 'f')
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
if (result.fraction < 0.0)
{
result.fraction = num2;
return true;
}
if (num2 != result.fraction)
{
result.SetFailure(ParseFailureKind.FormatWithParameter, "Format_RepeatDateTimePattern", @char);
return false;
}
return true;
IL_991:
if (@char == ' ')
{
if (!parseInfo.fAllowInnerWhite && !str.Match(@char))
{
if (parseInfo.fAllowTrailingWhite && format.GetNext() && DateTimeParse.ParseByFormat(ref str, ref format, ref parseInfo, dtfi, ref result))
{
return true;
}
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
else
{
if (format.MatchSpecifiedWord("GMT"))
{
format.Index += "GMT".Length - 1;
result.flags |= ParseFlags.TimeZoneUsed;
result.timeZoneOffset = TimeSpan.Zero;
if (!str.Match("GMT"))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
else
{
if (!str.Match(@char))
{
result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
return false;
}
}
}
return true;
}