public static TimeSpan ParseUtcOffset(string s, ComplianceTracker tracker) { int num = 0; int num2 = 0; int num3 = 0; int length = s.Length; if (length != 5 && length != 7) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidUtcOffsetLength); return(TimeSpan.Zero); } char c = s[0]; bool flag; if (c == '+') { flag = false; } else { if (c != '-') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedPlusMinus); return(TimeSpan.Zero); } flag = true; } for (int i = 1; i < length; i++) { c = s[i]; if ((int)c >= ContentLineParser.Dictionary.Length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidToken); return(TimeSpan.Zero); } } if (!int.TryParse(s.Substring(1, 2), out num) || num < 0 || num > 23) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } if (!int.TryParse(s.Substring(3, 2), out num2) || num2 < 0 || num2 > 59) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } if (length == 7 && (!int.TryParse(s.Substring(5, 2), out num3) || num3 < 0 || num3 > 59)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } if (num == 0 && num2 == 0 && num3 == 0 && flag) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } return(CalendarCommon.CreateTimeSpan(tracker, 0, num, num2, num3, flag)); }
public static TimeSpan ParseDuration(string s, ComplianceTracker tracker) { int num = 0; int length = s.Length; CalendarCommon.DurationParseStates durationParseStates = CalendarCommon.DurationParseStates.Start; StringBuilder stringBuilder = null; int num2 = 0; int num3 = 0; int hours = 0; int minutes = 0; int seconds = 0; bool negative = false; while (num < length && durationParseStates != CalendarCommon.DurationParseStates.End) { char c = s[num]; if ((int)c >= ContentLineParser.Dictionary.Length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } switch (durationParseStates) { case CalendarCommon.DurationParseStates.Start: if (c == 'P') { durationParseStates = CalendarCommon.DurationParseStates.S1; } else if (c == '+') { durationParseStates = CalendarCommon.DurationParseStates.Sign; } else { if (c != '-') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } negative = true; durationParseStates = CalendarCommon.DurationParseStates.Sign; } break; case CalendarCommon.DurationParseStates.Sign: if (c != 'P') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedP); return(TimeSpan.Zero); } durationParseStates = CalendarCommon.DurationParseStates.S1; break; case CalendarCommon.DurationParseStates.S1: if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0) { stringBuilder = new StringBuilder(); stringBuilder.Append(c); durationParseStates = CalendarCommon.DurationParseStates.S2; } else { if (c != 'T') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } durationParseStates = CalendarCommon.DurationParseStates.T1; } break; case CalendarCommon.DurationParseStates.S2: while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0) { stringBuilder.Append(c); if (++num == length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedWOrD); return(TimeSpan.Zero); } c = s[num]; if ((int)c >= ContentLineParser.Dictionary.Length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } } if (c == 'W') { if (!int.TryParse(stringBuilder.ToString(), out num3)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } durationParseStates = CalendarCommon.DurationParseStates.End; } else { if (c != 'D') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } if (!int.TryParse(stringBuilder.ToString(), out num2)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } durationParseStates = CalendarCommon.DurationParseStates.D1; } break; case CalendarCommon.DurationParseStates.D1: if (c != 'T') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedT); return(TimeSpan.Zero); } durationParseStates = CalendarCommon.DurationParseStates.T1; break; case CalendarCommon.DurationParseStates.T1: if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } stringBuilder = new StringBuilder(); stringBuilder.Append(c); durationParseStates = CalendarCommon.DurationParseStates.T2; break; case CalendarCommon.DurationParseStates.T2: while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0) { stringBuilder.Append(c); if (++num == length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedHMS); return(TimeSpan.Zero); } c = s[num]; if ((int)c >= ContentLineParser.Dictionary.Length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } } if (c == 'H') { if (!int.TryParse(stringBuilder.ToString(), out hours)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } durationParseStates = CalendarCommon.DurationParseStates.H1; } else if (c == 'M') { if (!int.TryParse(stringBuilder.ToString(), out minutes)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } durationParseStates = CalendarCommon.DurationParseStates.M1; } else { if (c != 'S') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } if (!int.TryParse(stringBuilder.ToString(), out seconds)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } durationParseStates = CalendarCommon.DurationParseStates.End; } break; case CalendarCommon.DurationParseStates.H1: if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } stringBuilder = new StringBuilder(); stringBuilder.Append(c); durationParseStates = CalendarCommon.DurationParseStates.H2; break; case CalendarCommon.DurationParseStates.H2: while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0) { stringBuilder.Append(c); if (++num == length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedM); return(TimeSpan.Zero); } c = s[num]; if ((int)c >= ContentLineParser.Dictionary.Length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } } if (c != 'M') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } if (!int.TryParse(stringBuilder.ToString(), out minutes)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } durationParseStates = CalendarCommon.DurationParseStates.M1; break; case CalendarCommon.DurationParseStates.M1: if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } stringBuilder = new StringBuilder(); stringBuilder.Append(c); durationParseStates = CalendarCommon.DurationParseStates.M2; break; case CalendarCommon.DurationParseStates.M2: while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0) { stringBuilder.Append(c); if (++num == length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedS); return(TimeSpan.Zero); } c = s[num]; if ((int)c >= ContentLineParser.Dictionary.Length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } } if (c != 'S') { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter); return(TimeSpan.Zero); } if (!int.TryParse(stringBuilder.ToString(), out seconds)) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); } durationParseStates = CalendarCommon.DurationParseStates.End; break; default: tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat); return(TimeSpan.Zero); } num++; } if (num != length) { tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.DurationDataNotEndedProperly); return(TimeSpan.Zero); } if (num3 != 0) { num2 += num3 * 7; } return(CalendarCommon.CreateTimeSpan(tracker, num2, hours, minutes, seconds, negative)); }