internal virtual void AddNumber(double n)
{
AddToken(Token.NUMBER);
long lbits = (long)n;
if (lbits != n)
{
// if it's floating point, save as a Double bit pattern.
// (12/15/97 our scanner only returns Double for f.p.)
lbits = System.BitConverter.DoubleToInt64Bits(n);
Append('D');
Append((char)(lbits >> 48));
Append((char)(lbits >> 32));
Append((char)(lbits >> 16));
Append((char)lbits);
}
else
{
// we can ignore negative values, bc they're already prefixed
// by NEG
if (lbits < 0)
{
Kit.CodeBug();
}
// will it fit in a char?
// this gives a short encoding for integer values up to 2^16.
if (lbits <= char.MaxValue)
{
Append('S');
Append((char)lbits);
}
else
{
// Integral, but won't fit in a char. Store as a long.
Append('J');
Append((char)(lbits >> 48));
Append((char)(lbits >> 32));
Append((char)(lbits >> 16));
Append((char)lbits);
}
}
}