Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ TryParseNumber()

static bool System.Buffers.Text.Utf8Parser.TryParseNumber ( ReadOnlySpan< byte > source,
ref Number::NumberBuffer number,
out int bytesConsumed,
ParseNumberOptions options,
out bool textUsedExponentNotation )
inlinestaticprivate

Definition at line 3394 of file Utf8Parser.cs.

3395 {
3396 textUsedExponentNotation = false;
3397 if (source.Length == 0)
3398 {
3399 bytesConsumed = 0;
3400 return false;
3401 }
3402 Span<byte> digits = number.Digits;
3403 int i = 0;
3404 int num = 0;
3405 byte b = source[i];
3406 if (b != 43)
3407 {
3408 if (b != 45)
3409 {
3410 goto IL_0055;
3411 }
3412 number.IsNegative = true;
3413 }
3414 i++;
3415 if (i == source.Length)
3416 {
3417 bytesConsumed = 0;
3418 return false;
3419 }
3420 b = source[i];
3421 goto IL_0055;
3422 IL_02a0:
3423 if ((byte)(b - 48) > 9)
3424 {
3425 bytesConsumed = 0;
3426 return false;
3427 }
3428 if (!TryParseUInt32D(source.Slice(i), out var value, out var bytesConsumed2))
3429 {
3430 value = uint.MaxValue;
3431 for (i += 10; i != source.Length; i++)
3432 {
3433 b = source[i];
3434 int num2 = (byte)(b - 48);
3435 if (num2 > 9)
3436 {
3437 break;
3438 }
3439 }
3440 }
3441 i += bytesConsumed2;
3442 bool flag;
3443 if (flag)
3444 {
3445 if (number.Scale < int.MinValue + value)
3446 {
3447 number.Scale = int.MinValue;
3448 }
3449 else
3450 {
3451 number.Scale -= (int)value;
3452 }
3453 }
3454 else if (number.Scale > 2147483647L - (long)value)
3455 {
3456 number.Scale = int.MaxValue;
3457 }
3458 else
3459 {
3460 number.Scale += (int)value;
3461 }
3462 digits[num] = 0;
3463 number.DigitsCount = num;
3464 bytesConsumed = i;
3465 return true;
3466 IL_0055:
3467 int num3 = i;
3468 int num4 = 0;
3469 int num5 = digits.Length - 1;
3470 for (; i != source.Length; i++)
3471 {
3472 b = source[i];
3473 if (b != 48)
3474 {
3475 break;
3476 }
3477 }
3478 if (i == source.Length)
3479 {
3480 bytesConsumed = i;
3481 return true;
3482 }
3483 int num6 = i;
3484 int num7 = 0;
3485 while (i != source.Length)
3486 {
3487 b = source[i];
3488 int num8 = (byte)(b - 48);
3489 if (num8 > 9)
3490 {
3491 break;
3492 }
3493 i++;
3494 num4++;
3495 if (num4 >= num5)
3496 {
3497 num7 |= num8;
3498 }
3499 }
3500 number.HasNonZeroTail = num7 != 0;
3501 int num9 = i - num3;
3502 int num10 = i - num6;
3503 int num11 = Math.Min(num10, num5);
3504 source.Slice(num6, num11).CopyTo(digits);
3505 num = num11;
3506 number.Scale = num10;
3507 if (i == source.Length)
3508 {
3509 digits[num] = 0;
3510 number.DigitsCount = num;
3511 bytesConsumed = i;
3512 return true;
3513 }
3514 int num12 = 0;
3515 if (b == 46)
3516 {
3517 i++;
3518 int num13 = i;
3519 while (i != source.Length)
3520 {
3521 b = source[i];
3522 int num14 = (byte)(b - 48);
3523 if (num14 > 9)
3524 {
3525 break;
3526 }
3527 i++;
3528 num4++;
3529 if (num4 >= num5)
3530 {
3531 num7 |= num14;
3532 }
3533 }
3534 number.HasNonZeroTail = num7 != 0;
3535 num12 = i - num13;
3536 int j = num13;
3537 if (num == 0)
3538 {
3539 for (; j < i && source[j] == 48; j++)
3540 {
3541 number.Scale--;
3542 }
3543 }
3544 int num15 = Math.Min(i - j, num5 - num);
3545 source.Slice(j, num15).CopyTo(digits.Slice(num));
3546 num += num15;
3547 if (i == source.Length)
3548 {
3549 if (num9 == 0 && num12 == 0)
3550 {
3551 bytesConsumed = 0;
3552 return false;
3553 }
3554 digits[num] = 0;
3555 number.DigitsCount = num;
3556 bytesConsumed = i;
3557 return true;
3558 }
3559 }
3560 if (num9 == 0 && num12 == 0)
3561 {
3562 bytesConsumed = 0;
3563 return false;
3564 }
3565 if ((b & -33) != 69)
3566 {
3567 digits[num] = 0;
3568 number.DigitsCount = num;
3569 bytesConsumed = i;
3570 return true;
3571 }
3572 textUsedExponentNotation = true;
3573 i++;
3574 if ((options & ParseNumberOptions.AllowExponent) == 0)
3575 {
3576 bytesConsumed = 0;
3577 return false;
3578 }
3579 if (i == source.Length)
3580 {
3581 bytesConsumed = 0;
3582 return false;
3583 }
3584 flag = false;
3585 b = source[i];
3586 if (b != 43)
3587 {
3588 if (b != 45)
3589 {
3590 goto IL_02a0;
3591 }
3592 flag = true;
3593 }
3594 i++;
3595 if (i == source.Length)
3596 {
3597 bytesConsumed = 0;
3598 return false;
3599 }
3600 b = source[i];
3601 goto IL_02a0;
3602 }
static bool TryParseUInt32D(ReadOnlySpan< byte > source, out uint value, out int bytesConsumed)

References System.L, System.Math.Min(), System.options, System.Span< T >.Slice(), System.source, System.Buffers.Text.Utf8Parser.TryParseUInt32D(), and System.value.

Referenced by System.Buffers.Text.Utf8Parser.TryParse(), and System.Buffers.Text.Utf8Parser.TryParseNormalAsFloatingPoint().