idTech4.Text.idLexer.ReadNumber C# (CSharp) Method

ReadNumber() private method

private ReadNumber ( idToken token ) : bool
token idToken
return bool
		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;
		}