private bool DollarDirective_EvalInt() { long value; double tmp; if (DollarEvaluate(out value, out tmp, true) == false) { return(false); } idToken token = new idToken(); token.Line = _scriptStack.Peek().LineNumber; token.Set(value.ToString()); token.Type = TokenType.Number; token.SubType = TokenSubType.Integer | TokenSubType.Long | TokenSubType.Decimal | TokenSubType.ValuesValid; token.SetInteger((ulong)idMath.Abs(value)); token.SetFloat((ulong)idMath.Abs(value)); UnreadSourceToken(token); if (value < 0) { UnreadSignToken(); } return(true); }
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; }
private bool DollarDirective_EvalInt() { long value; double tmp; if(DollarEvaluate(out value, out tmp, true) == false) { return false; } idToken token = new idToken(); token.Line = _scriptStack.Peek().LineNumber; token.Set(value.ToString()); token.Type = TokenType.Number; token.SubType = TokenSubType.Integer | TokenSubType.Long | TokenSubType.Decimal | TokenSubType.ValuesValid; token.SetInteger((ulong) idMath.Abs(value)); token.SetFloat((ulong) idMath.Abs(value)); UnreadSourceToken(token); if(value < 0) { UnreadSignToken(); } return true; }