2013-11-15 04:55:18 +08:00
|
|
|
#include "variable.h"
|
|
|
|
|
|
|
|
static VAR* vars;
|
|
|
|
|
|
|
|
static VAR* varfind(const char* name, VAR** link)
|
|
|
|
{
|
|
|
|
VAR* cur=vars;
|
|
|
|
if(!cur)
|
|
|
|
return 0;
|
|
|
|
VAR* prev=0;
|
|
|
|
while(cur)
|
|
|
|
{
|
|
|
|
if(arraycontains(cur->name, name))
|
|
|
|
{
|
|
|
|
if(link)
|
|
|
|
*link=prev;
|
|
|
|
return cur;
|
|
|
|
}
|
|
|
|
prev=cur;
|
|
|
|
cur=cur->next;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-03-27 05:52:41 +08:00
|
|
|
static void varsetvalue(VAR* var, VAR_VALUE* value)
|
|
|
|
{
|
|
|
|
switch(var->value.type)
|
|
|
|
{
|
|
|
|
case VAR_STRING:
|
|
|
|
delete [] var->value.u.data;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
memcpy(&var->value, value, sizeof(VAR_VALUE));
|
|
|
|
}
|
|
|
|
|
2013-11-15 04:55:18 +08:00
|
|
|
void varinit()
|
|
|
|
{
|
2013-11-17 20:10:29 +08:00
|
|
|
vars=(VAR*)emalloc(sizeof(VAR), "varinit:vars");
|
2013-11-15 04:55:18 +08:00
|
|
|
memset(vars, 0, sizeof(VAR));
|
|
|
|
//General variables
|
|
|
|
varnew("$res\1$result", 0, VAR_SYSTEM);
|
|
|
|
varnew("$res1\1$result1", 0, VAR_SYSTEM);
|
|
|
|
varnew("$res2\1$result2", 0, VAR_SYSTEM);
|
|
|
|
varnew("$res3\1$result3", 0, VAR_SYSTEM);
|
|
|
|
varnew("$res4\1$result4", 0, VAR_SYSTEM);
|
|
|
|
//InitDebug variables
|
|
|
|
varnew("$hp\1$hProcess", 0, VAR_READONLY);
|
|
|
|
varnew("$pid", 0, VAR_READONLY);
|
|
|
|
//hidden variables
|
|
|
|
varnew("$ans\1$an", 0, VAR_HIDDEN);
|
|
|
|
//read-only variables
|
|
|
|
varnew("$lastalloc", 0, VAR_READONLY);
|
2014-02-11 04:32:17 +08:00
|
|
|
varnew("$_EZ_FLAG", 0, VAR_READONLY); //equal/zero flag for internal use (1=equal, 0=unequal)
|
|
|
|
varnew("$_BS_FLAG", 0, VAR_READONLY); //bigger/smaller flag for internal use (1=bigger, 0=smaller)
|
2013-11-15 04:55:18 +08:00
|
|
|
}
|
|
|
|
|
2013-11-17 20:10:29 +08:00
|
|
|
void varfree()
|
|
|
|
{
|
|
|
|
VAR* cur=vars;
|
|
|
|
while(cur)
|
|
|
|
{
|
|
|
|
efree(cur->name, "varfree:cur->name");
|
|
|
|
VAR* next=cur->next;
|
|
|
|
efree(cur, "varfree:cur");
|
|
|
|
cur=next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-11-15 04:55:18 +08:00
|
|
|
VAR* vargetptr()
|
|
|
|
{
|
|
|
|
return vars;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool varnew(const char* name_, uint value, VAR_TYPE type)
|
|
|
|
{
|
|
|
|
if(!name_)
|
|
|
|
return false;
|
2013-11-17 20:10:29 +08:00
|
|
|
char* name=(char*)emalloc(strlen(name_)+2, "varnew:name");
|
2013-11-15 04:55:18 +08:00
|
|
|
if(*name_!='$')
|
|
|
|
{
|
|
|
|
*name='$';
|
|
|
|
strcpy(name+1, name_);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
strcpy(name, name_);
|
|
|
|
if(!name[1])
|
|
|
|
{
|
2013-11-17 20:10:29 +08:00
|
|
|
efree(name, "varnew:name");
|
2013-11-15 04:55:18 +08:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(varfind(name, 0))
|
|
|
|
{
|
2013-11-17 20:10:29 +08:00
|
|
|
efree(name, "varnew:name");
|
2013-11-15 04:55:18 +08:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
VAR* var;
|
|
|
|
bool nonext=false;
|
|
|
|
if(!vars->name)
|
|
|
|
{
|
|
|
|
nonext=true;
|
|
|
|
var=vars;
|
|
|
|
}
|
|
|
|
else
|
2013-11-17 20:10:29 +08:00
|
|
|
var=(VAR*)emalloc(sizeof(VAR), "varnew:var");
|
2013-11-15 04:55:18 +08:00
|
|
|
memset(var, 0, sizeof(VAR));
|
|
|
|
var->name=name;
|
|
|
|
var->type=type;
|
2014-03-27 05:52:41 +08:00
|
|
|
VAR_VALUE varvalue;
|
|
|
|
varvalue.size=sizeof(uint);
|
|
|
|
varvalue.type=VAR_UINT;
|
|
|
|
varvalue.u.value=value;
|
|
|
|
varsetvalue(var, &varvalue);
|
2013-11-15 04:55:18 +08:00
|
|
|
if(!nonext)
|
|
|
|
{
|
|
|
|
VAR* cur=vars;
|
|
|
|
while(cur->next)
|
|
|
|
cur=cur->next;
|
|
|
|
cur->next=var;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool varget(const char* name, uint* value, int* size, VAR_TYPE* type)
|
|
|
|
{
|
|
|
|
char newname[deflen]="$";
|
|
|
|
int add=0;
|
|
|
|
if(*name=='$')
|
|
|
|
add=1;
|
|
|
|
strcat(newname, name+add);
|
|
|
|
VAR* found=varfind(newname, 0);
|
|
|
|
if(!found)
|
|
|
|
return false;
|
|
|
|
if(!value)
|
|
|
|
return false;
|
|
|
|
if(type)
|
|
|
|
*type=found->type;
|
2014-03-27 05:52:41 +08:00
|
|
|
if(found->value.type!=VAR_UINT)
|
|
|
|
return false;
|
|
|
|
if(size)
|
|
|
|
*size=found->value.size;
|
|
|
|
*value=found->value.u.value;
|
2013-11-15 04:55:18 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-03-27 05:52:41 +08:00
|
|
|
bool varset(const char* name, VAR_VALUE* value, bool setreadonly)
|
2013-11-15 04:55:18 +08:00
|
|
|
{
|
|
|
|
char newname[deflen]="$";
|
|
|
|
int add=0;
|
|
|
|
if(*name=='$')
|
|
|
|
add=1;
|
|
|
|
strcat(newname, name+add);
|
|
|
|
VAR* found=varfind(newname, 0);
|
|
|
|
if(!found)
|
|
|
|
return false;
|
|
|
|
if(!setreadonly and (found->type==VAR_READONLY or found->type==VAR_HIDDEN))
|
|
|
|
return false;
|
2014-03-27 05:52:41 +08:00
|
|
|
varsetvalue(found, value);
|
2013-11-15 04:55:18 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-03-27 05:52:41 +08:00
|
|
|
bool varset(const char* name, uint value, bool setreadonly)
|
2013-11-15 04:55:18 +08:00
|
|
|
{
|
2014-03-27 05:52:41 +08:00
|
|
|
VAR_VALUE varvalue;
|
|
|
|
varvalue.size=sizeof(uint);
|
|
|
|
varvalue.type=VAR_UINT;
|
|
|
|
varvalue.u.value=value;
|
|
|
|
varset(name, &varvalue, setreadonly);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool varset(const char* name, char* data, bool setreadonly)
|
|
|
|
{
|
|
|
|
VAR_VALUE varvalue;
|
|
|
|
int size=strlen(data);
|
|
|
|
varvalue.size=size;
|
|
|
|
varvalue.type=VAR_STRING;
|
|
|
|
varvalue.u.data=new std::vector<unsigned char>;
|
|
|
|
varvalue.u.data->resize(size);
|
|
|
|
memcpy(&varvalue.u.data->front(), data, size);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool vardel(const char* name, bool delsystem)
|
|
|
|
{
|
|
|
|
char* name_=(char*)emalloc(strlen(name)+2, "vardel:name");
|
|
|
|
if(*name!='$')
|
2013-11-15 04:55:18 +08:00
|
|
|
{
|
2014-03-27 05:52:41 +08:00
|
|
|
*name_='$';
|
|
|
|
strcpy(name_+1, name);
|
2013-11-15 04:55:18 +08:00
|
|
|
}
|
|
|
|
else
|
2014-03-27 05:52:41 +08:00
|
|
|
strcpy(name_, name);
|
2013-11-15 04:55:18 +08:00
|
|
|
VAR* prev=0;
|
2014-03-27 05:52:41 +08:00
|
|
|
VAR* found=varfind(name_, &prev);
|
|
|
|
efree(name_, "vardel:name");
|
2013-11-15 04:55:18 +08:00
|
|
|
if(!found)
|
|
|
|
return false;
|
|
|
|
VAR_TYPE type=found->type;
|
|
|
|
if(!delsystem and type!=VAR_USER)
|
|
|
|
return false;
|
|
|
|
if(type==VAR_HIDDEN)
|
|
|
|
return false;
|
2014-03-27 05:52:41 +08:00
|
|
|
VAR_VALUE varvalue;
|
|
|
|
varvalue.size=sizeof(uint);
|
|
|
|
varvalue.type=VAR_UINT;
|
|
|
|
varvalue.u.value=0;
|
|
|
|
varsetvalue(found, &varvalue);
|
2013-11-17 20:10:29 +08:00
|
|
|
efree(found->name, "vardel:found->name");
|
2013-11-15 04:55:18 +08:00
|
|
|
if(found==vars)
|
|
|
|
{
|
|
|
|
VAR* next=vars->next;
|
|
|
|
if(next)
|
|
|
|
{
|
|
|
|
memcpy(vars, vars->next, sizeof(VAR));
|
|
|
|
vars->next=next->next;
|
2013-11-17 20:10:29 +08:00
|
|
|
efree(next, "vardel:next");
|
2013-11-15 04:55:18 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
memset(vars, 0, sizeof(VAR));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
prev->next=found->next;
|
2013-11-17 20:10:29 +08:00
|
|
|
efree(found, "vardel:found");
|
2013-11-15 04:55:18 +08:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|