1240 {
1241 bool flag = false;
1242 bool flag2 = false;
1243 bool flag3 = false;
1244 bool flag4 = false;
1245 bool flag5 = false;
1246 int result2 = 0;
1247 int result3 = 0;
1248 int result4 = 0;
1249 int result5 = 0;
1250 int zeroes = 0;
1251 int result6 = 0;
1253 TimeSpanTokenizer tokenizer =
new TimeSpanTokenizer(
input, -1);
1254 int returnValue;
1255 for (;
i <
format.Length;
i += returnValue)
1256 {
1258 switch (c)
1259 {
1260 case 'h':
1261 returnValue = DateTimeFormat.ParseRepeatPattern(
format, i, c);
1262 if (returnValue > 2 || flag2 || !
ParseExactDigits(ref tokenizer, returnValue, out result3))
1263 {
1264 return result.SetInvalidStringFailure();
1265 }
1266 flag2 = true;
1267 break;
1268 case 'm':
1269 returnValue = DateTimeFormat.ParseRepeatPattern(
format, i, c);
1270 if (returnValue > 2 || flag3 || !
ParseExactDigits(ref tokenizer, returnValue, out result4))
1271 {
1272 return result.SetInvalidStringFailure();
1273 }
1274 flag3 = true;
1275 break;
1276 case 's':
1277 returnValue = DateTimeFormat.ParseRepeatPattern(
format, i, c);
1278 if (returnValue > 2 || flag4 || !
ParseExactDigits(ref tokenizer, returnValue, out result5))
1279 {
1280 return result.SetInvalidStringFailure();
1281 }
1282 flag4 = true;
1283 break;
1284 case 'f':
1285 returnValue = DateTimeFormat.ParseRepeatPattern(
format, i, c);
1286 if (returnValue > 7 || flag5 || !
ParseExactDigits(ref tokenizer, returnValue, returnValue, out zeroes, out result6))
1287 {
1288 return result.SetInvalidStringFailure();
1289 }
1290 flag5 = true;
1291 break;
1292 case 'F':
1293 returnValue = DateTimeFormat.ParseRepeatPattern(
format, i, c);
1294 if (returnValue > 7 || flag5)
1295 {
1296 return result.SetInvalidStringFailure();
1297 }
1298 ParseExactDigits(ref tokenizer, returnValue, returnValue, out zeroes, out result6);
1299 flag5 = true;
1300 break;
1301 case 'd':
1302 {
1303 returnValue = DateTimeFormat.ParseRepeatPattern(
format, i, c);
1304 if (returnValue > 8 || flag || !
ParseExactDigits(ref tokenizer, (returnValue < 2) ? 1 : returnValue, (returnValue < 2) ? 8 : returnValue, out var _, out result2))
1305 {
1306 return result.SetInvalidStringFailure();
1307 }
1308 flag = true;
1309 break;
1310 }
1311 case '"':
1312 case '\'':
1313 {
1315 if (!DateTimeParse.TryParseQuoteString(
format, i, stringBuilder, out returnValue))
1316 {
1318 return result.SetBadQuoteFailure(c);
1319 }
1321 {
1323 return result.SetInvalidStringFailure();
1324 }
1326 break;
1327 }
1328 case '%':
1329 {
1330 int num = DateTimeFormat.ParseNextChar(
format, i);
1331 if (num >= 0 && num != 37)
1332 {
1333 returnValue = 1;
1334 break;
1335 }
1336 return result.SetInvalidStringFailure();
1337 }
1338 case '\\':
1339 {
1340 int num = DateTimeFormat.ParseNextChar(
format, i);
1341 if (num >= 0 && tokenizer.NextChar == (ushort)num)
1342 {
1343 returnValue = 2;
1344 break;
1345 }
1346 return result.SetInvalidStringFailure();
1347 }
1348 default:
1349 return result.SetInvalidStringFailure();
1350 }
1351 }
1352 if (!tokenizer.EOL)
1353 {
1354 return result.SetBadTimeSpanFailure();
1355 }
1357 if (
TryTimeToTicks(flag6,
new TimeSpanToken(result2),
new TimeSpanToken(result3),
new TimeSpanToken(result4),
new TimeSpanToken(result5),
new TimeSpanToken(result6, zeroes), out var result7))
1358 {
1359 if (!flag6)
1360 {
1361 result7 = -result7;
1362 }
1363 result.parsedTimeSpan =
new TimeSpan(result7);
1364 return true;
1365 }
1366 return result.SetOverflowFailure();
1367 }
static bool ParseExactLiteral(ref TimeSpanTokenizer tokenizer, StringBuilder enquotedString)
static bool TryTimeToTicks(bool positive, TimeSpanToken days, TimeSpanToken hours, TimeSpanToken minutes, TimeSpanToken seconds, TimeSpanToken fraction, out long result)
static bool ParseExactDigits(ref TimeSpanTokenizer tokenizer, int minDigitLength, out int result)
static void Release(StringBuilder sb)
static StringBuilder Acquire(int capacity=16)