+
+/**
+ * \brief Define a variable
+ * \param Block Current block state
+ * \param Type Type of the variable
+ * \param Name Name of the variable
+ * \return Boolean Failure
+ */
+tAST_Variable *Variable_Define(tAST_BlockState *Block, int Type, const char *Name)
+{
+ tAST_Variable *var, *prev = NULL;
+
+ for( var = Block->FirstVar; var; prev = var, var = var->Next )
+ {
+ if( strcmp(var->Name, Name) == 0 ) {
+ fprintf(stderr, "ERROR: Redefinition of variable '%s'\n", Name);
+ return ERRPTR;
+ }
+ }
+
+ var = malloc( sizeof(tAST_Variable) + strlen(Name) + 1 );
+ var->Next = NULL;
+ var->Type = Type;
+ var->Object = NULL;
+ strcpy(var->Name, Name);
+
+ if(prev) prev->Next = var;
+ else Block->FirstVar = var;
+
+ //printf("Defined variable %s (%i)\n", Name, Type);
+
+ return var;
+}
+
+/**
+ * \brief Set the value of a variable
+ */
+void Variable_SetValue(tAST_BlockState *Block, const char *Name, tSpiderObject *Value)
+{
+ tAST_Variable *var;
+ tAST_BlockState *bs;
+
+ for( bs = Block; bs; bs = bs->Parent )
+ {
+ for( var = bs->FirstVar; var; var = var->Next )
+ {
+ if( strcmp(var->Name, Name) == 0 ) {
+ if( !Block->Script->Variant->bDyamicTyped
+ && (Value && var->Type != Value->Type) ) {
+ fprintf(stderr, "ERROR: Type mismatch assigning to '%s'\n", Name);
+ return ;
+ }
+ Object_Reference(Value);
+ Object_Dereference(var->Object);
+ var->Object = Value;
+ return ;
+ }
+ }
+ }
+
+ if( Block->Script->Variant->bDyamicTyped )
+ {
+ // Define variable
+ var = Variable_Define(Block, Value->Type, Name);
+ Object_Reference(Value);
+ var->Object = Value;
+ }
+ else
+ {
+ fprintf(stderr, "ERROR: Variable '%s' set while undefined\n", Name);
+ }
+}
+
+/**
+ * \brief Get the value of a variable
+ */
+tSpiderObject *Variable_GetValue(tAST_BlockState *Block, const char *Name)
+{
+ tAST_Variable *var;
+ tAST_BlockState *bs;
+
+ for( bs = Block; bs; bs = bs->Parent )
+ {
+ for( var = bs->FirstVar; var; var = var->Next )
+ {
+ if( strcmp(var->Name, Name) == 0 ) {
+ Object_Reference(var->Object);
+ return var->Object;
+ }
+ }
+ }
+
+ fprintf(stderr, "ERROR: Variable '%s' used undefined\n", Name);
+
+ return ERRPTR;
+}
+
+/**
+ * \brief Destorys a variable
+ */
+void Variable_Destroy(tAST_Variable *Variable)
+{
+ Object_Dereference(Variable->Object);
+ free(Variable);
+}