public void AddRegister(string name, RegisterType type, idScriptParser parser, idWindow window, idWindowVariable var) { idRegister register = FindRegister(name); if(register == null) { int regCount = idRegister.RegisterTypeCount[(int) type]; register = new idRegister(name, type, var); if(type == RegisterType.String) { idToken token; if((token = parser.ReadToken()) != null) { var.Init(idE.Language.Get(token.ToString()), window); } } else { for(int i = 0; i < regCount; i++) { register.Indexes[i] = window.ParseExpression(parser, null); if(i < (regCount - 1)) { parser.ExpectTokenString(","); } } } _registers.Add(register); _registerDict.Add(name, register); } else { int regCount = idRegister.RegisterTypeCount[(int) type]; register.Variable = var; if(type == RegisterType.String) { idToken token = parser.ReadToken(); if(token != null) { var.Init(token.ToString(), window); } } else { for(int i = 0; i < regCount; i++) { register.Indexes[i] = window.ParseExpression(parser, null); if(i < (regCount - 1)) { parser.ExpectTokenString(","); } } } } }
/// <summary> /// /// </summary> /// <param name="parser"></param> /// <param name="var"></param> /// <param name="component"></param> /// <returns>Returns a register index.</returns> private int ParseTerm(idScriptParser parser, idWindowVariable var, int component) { int a, b; object tmp; idToken token = parser.ReadToken(); string tokenValue = token.ToString().ToLower(); if(tokenValue == "(") { a = ParseExpression(parser); parser.ExpectTokenString(")"); return a; } else if(tokenValue == "time") { return (int) WindowExpressionRegister.Time; } // parse negative numbers else if(tokenValue == "-") { token = parser.ReadToken(); if((token.Type == TokenType.Number) || (token.ToString() == ".")) { return ExpressionConstant(-token.ToFloat()); } parser.Warning("Bad negative number '{0}'", token.ToString()); return 0; } if((token.Type == TokenType.Number) || (token.ToString() == ".") || (token.ToString() == "-")) { return ExpressionConstant(token.ToFloat()); } // see if it is a table name idDeclTable table = idE.DeclManager.FindType<idDeclTable>(DeclType.Table, token.ToString(), false); if(table != null) { a = table.Index; // parse a table expression parser.ExpectTokenString("["); b = ParseExpression(parser); parser.ExpectTokenString("]"); return EmitOperation(a, b, WindowExpressionOperationType.Table); } if(var == null) { var = GetVariableByName(token.ToString(), true); } if(var != null) { var.Init(tokenValue, this); tmp = var; b = component; if(var is idWinVector4) { if((token = parser.ReadToken()) != null) { if(token.ToString() == "[") { b = ParseExpression(parser); parser.ExpectTokenString("]"); } else { parser.UnreadToken(token); } } return EmitOperation(tmp, b, WindowExpressionOperationType.Var); } else if(var is idWinFloat) { return EmitOperation(tmp, b, WindowExpressionOperationType.VarF); } else if(var is idWinInteger) { return EmitOperation(tmp, b, WindowExpressionOperationType.VarI); } else if(var is idWinBool) { return EmitOperation(tmp, b, WindowExpressionOperationType.VarB); } else if(var is idWinString) { return EmitOperation(tmp, b, WindowExpressionOperationType.VarS); } else { parser.Warning("Variable expression not vec4, float or int '{0}'", token.ToString()); } return 0; } else { // ugly but used for post parsing to fixup named vars EmitOperation(token.ToString(), -2, WindowExpressionOperationType.Var); } return 0; }