private bool ReadNumber(idToken token)
{
token.Type = TokenType.Number;
token.SubType = 0;
token.SetInteger(0);
token.SetFloat(0);
char c = GetBufferCharacter(_scriptPosition);
char c2 = GetBufferCharacter(_scriptPosition + 1);
if((c == '0') && (c2 != '.'))
{
if((c2 == 'x') || (c2 == 'X'))
{
token.Append(GetBufferCharacter(_scriptPosition++));
token.Append(GetBufferCharacter(_scriptPosition++));
c = GetBufferCharacter(_scriptPosition);
while(((c >= 0) && (c <= '9')) || ((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F')))
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
token.SubType = TokenSubType.Hex | TokenSubType.Integer;
}
// check for a binary number
else if((c2 == 'b') || (c2 == 'B'))
{
token.Append(GetBufferCharacter(_scriptPosition++));
token.Append(GetBufferCharacter(_scriptPosition++));
c = GetBufferCharacter(_scriptPosition);
while((c == '0') || (c == '1'))
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
token.SubType = TokenSubType.Binary | TokenSubType.Integer;
}
// its an octal number
else
{
token.Append(GetBufferCharacter(_scriptPosition++));
c = GetBufferCharacter(_scriptPosition);
while((c >= '0') && (c <= '7'))
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
token.SubType = TokenSubType.Octal | TokenSubType.Integer;
}
}
else
{
// decimal integer or floating point number or ip address
int dot = 0;
while(true)
{
if((c >= '0') && (c <= '9'))
{
}
else if(c == '.')
{
dot++;
}
else
{
break;
}
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
if((c == 'e') && (dot == 0))
{
//We have scientific notation without a decimal point
dot++;
}
// if a floating point number
if(dot == 1)
{
token.SubType = TokenSubType.Decimal | TokenSubType.Float;
// check for floating point exponent
if(c == 'e')
{
//Append the e so that GetFloatValue code works
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
if((c == '-') || (c == '+'))
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
while((c >= '0') || (c <= '9'))
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
}
// check for floating point exception infinite 1.#INF or indefinite 1.#IND or NaN
else if(c == '#')
{
c2 = (char) 4;
if(CheckString("INF") == true)
{
token.SubType |= TokenSubType.Infinite;
}
else if(CheckString("IND") == true)
{
token.SubType |= TokenSubType.Indefinite;
}
else if(CheckString("NAN") == true)
{
token.SubType |= TokenSubType.NaN;
}
else if(CheckString("QNAN") == true)
{
token.SubType |= TokenSubType.NaN;
c2++;
}
for(int i = 0; i < c2; i++)
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
while((c >= '0') && (c <= '9'))
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
if((_options & LexerOptions.AllowFloatExceptions) == 0)
{
Error("parsed {0}", token);
}
}
}
else if(dot > 1)
{
if((_options & LexerOptions.AllowIPAddresses) == 0)
{
Error("more than one dot in number");
return false;
}
if(dot != 3)
{
Error("ip address should have three dots");
return false;
}
token.SubType = TokenSubType.IPAddress;
}
else
{
token.SubType = TokenSubType.Decimal | TokenSubType.Integer;
}
}
if((token.SubType & TokenSubType.Float) == TokenSubType.Float)
{
if(c > ' ')
{
// single-precision: float
if((c == 'f') || (c == 'F'))
{
token.SubType |= TokenSubType.SinglePrecision;
_scriptPosition++;
}
// extended-precision: long double
else if((c == 'l') || (c == 'L'))
{
token.SubType |= TokenSubType.ExtendedPrecision;
_scriptPosition++;
}
// default is double-precision: double
else
{
token.SubType |= TokenSubType.DoublePrecision;
}
}
else
{
token.SubType |= TokenSubType.DoublePrecision;
}
}
else if((token.SubType & TokenSubType.Integer) == TokenSubType.Integer)
{
if(c > ' ')
{
// default: signed long
for(int i = 0; i < 2; i++)
{
// long integer
if((c == 'l') || (c == 'L'))
{
token.SubType |= TokenSubType.Long;
}
// unsigned integer
else if((c == 'u') || (c == 'U'))
{
token.SubType |= TokenSubType.Unsigned;
}
else
{
break;
}
c = GetBufferCharacter(++_scriptPosition);
}
}
}
else if((token.SubType & TokenSubType.IPAddress) == TokenSubType.IPAddress)
{
if(c == ':')
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
while((c >= '0') && (c <= '9'))
{
token.Append(c);
c = GetBufferCharacter(++_scriptPosition);
}
token.SubType |= TokenSubType.IPPort;
}
}
return true;
}