in FixAntenna/NetCore/Message/Format/DoubleFormatter.cs [65:230]
public static double ParseDouble(byte[] str, int offset, int length)
{
double number;
int exponent;
bool negative;
double p10;
int n;
int numDigits;
int numDecimals;
var limit = offset + length;
//// Skip leading whitespace
//while (isspace(*p)) p++;
// Handle optional sign
negative = false;
switch (str[offset])
{
case (byte)'-':
negative = true; // Fall through to increment position
goto case (byte)'+';
case (byte)'+':
offset++;
break;
}
number = 0.0;
exponent = 0;
numDigits = 0;
numDecimals = 0;
byte ch = 0;
// Process string of digits
while (offset < limit)
{
ch = str[offset];
if (!(ch >= (byte)'0' && ch <= (byte)'9'))
{
break;
}
number = number * 10.0 + (ch - '0');
offset++;
numDigits++;
}
// Process decimal part
if (offset < limit && ch == (byte)'.')
{
offset++;
while (offset < limit)
{
ch = str[offset];
if (!(ch >= (byte)'0' && ch <= (byte)'9'))
{
break;
}
number = number * 10.0 + (ch - '0');
offset++;
numDigits++;
numDecimals++;
}
exponent -= numDecimals;
}
if (numDigits == 0)
{
throw new ArgumentException("Not a number");
}
// Correct for sign
if (negative)
{
number = -number;
}
// Process an exponent string
if (offset + 1 < limit && (ch == (byte)'e' || ch == (byte)'E'))
{
// Handle optional sign
negative = false;
ch = str[++offset];
switch (ch)
{
case (byte)'-':
negative = true; // Fall through to increment pos
goto case (byte)'+';
case (byte)'+':
offset++;
break;
}
// Process string of digits
n = 0;
while (offset < limit)
{
ch = str[offset];
if (!(ch >= (byte)'0' && ch <= (byte)'9'))
{
break;
}
n = n * 10 + (ch - '0');
offset++;
}
if (negative)
{
exponent -= n;
}
else
{
exponent += n;
}
}
if (exponent < DblMinExp || exponent > DblMaxExp)
{
throw new ArgumentException("Not a number");
}
// Scale the result
//p10 = 10.;
p10 = 1;
n = exponent;
if (n < 0)
{
n = -n;
}
while (n > 0)
{
//if ((n & 1) != 0) {
// if (exponent < 0) {
// number /= p10;
// } else {
// number *= p10;
// }
//}
//n >>= 1;
//p10 *= p10;
n--;
p10 *= 10.0;
}
if (exponent < 0)
{
number /= p10;
}
else
{
number *= p10;
}
if (number == HugeVal)
{
throw new ArgumentException("Not a number");
}
return number;
}