📄 sexpeval.cpp
字号:
strnewcpy( SVars[i].NameSpace, NameSpace );
else
SVars[i].NameSpace = NULL;
return true;
}
bool GetSVar( in const char* Name, in UInt32 NameLen, inout SValueDef* Value, in const char* NameSpace )
{
UInt32 i;
// Look up to see if variable already exists.
if ( !LookupSVar(Name,NameLen,NameSpace,i) )
return false;
Value->IsString = SVars[i].IsString;
Value->NumValue = SVars[i].NumValue;
if ( SVars[i].IsString )
strcpy( Value->StrValue, SVars[i].StrValue );
else
Value->StrValue[0] = '\0';
return true;
}
static bool LookupSVar( in const char* Name, in UInt32 NameLen, in const char* NameSpace, out UInt32& ListIndex )
{
for ( ListIndex=0; ListIndex<NumSVars; ListIndex++ )
{
if ( strincmp(Name,SVars[ListIndex].Name,NameLen) == 0 )
{
if ( NameSpace==NULL && SVars[ListIndex].NameSpace==NULL )
break;
if ( NameSpace && SVars[ListIndex].NameSpace && stricmp(NameSpace,SVars[ListIndex].NameSpace)==0 )
break;
}
}
return (ListIndex < NumSVars);
}
bool EnuSVars( in UInt32 Index, out const char* *Name, in const char* NameSpace )
{
UInt32 NameSpaceIndex = 0;
bool NameSpaceMatched;
for ( UInt32 i=0; i<NumSVars; i++ )
{
if ( NameSpace == NULL )
NameSpaceMatched = ( SVars[i].NameSpace == NULL );
else
NameSpaceMatched = ( SVars[i].NameSpace && stricmp(NameSpace,SVars[i].NameSpace)==0 );
if ( NameSpaceMatched )
{
if ( NameSpaceIndex == Index )
{
*Name = SVars[i].Name;
return true;
}
NameSpaceIndex++;
}
}
return false;
}
void DeleteAllSVars( void )
{
for ( UInt32 i=0; i<NumSVars; i++ )
{
if ( SVars[i].Name )
delete [] SVars[i].Name;
if ( SVars[i].StrValue )
delete [] SVars[i].StrValue;
if ( SVars[i].NameSpace )
delete [] SVars[i].NameSpace;
}
NumSVars = 0;
}
void SetSExprHook( in ExternalVarFunc cbVar )
{
g_cbVar = cbVar;
}
static int EvalNumIf( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 3 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
if ( ISEXPRTRUE(0) )
{
DOEXPRESSION( 1 );
EndResult->IsString = e[1].IsString;
EndResult->NumValue = e[1].NumValue;
strcpy( EndResult->StrValue, e[1].StrValue );
}
else
{
DOEXPRESSION( 2 );
EndResult->IsString = e[2].IsString;
EndResult->NumValue = e[2].NumValue;
strcpy( EndResult->StrValue, e[2].StrValue );
}
return 0;
}
static int EvalLogAnd( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
EndResult->IsString = false;
EndResult->NumValue = 0;
DOEXPRESSION( 0 );
if ( ISEXPRTRUE(0) )
{
DOEXPRESSION( 1 );
if ( ISEXPRTRUE(1) )
EndResult->NumValue = 1;
}
return 0;
}
static int EvalLogOr( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
EndResult->IsString = false;
EndResult->NumValue = 1;
DOEXPRESSION( 0 );
if ( !ISEXPRTRUE(0) )
{
DOEXPRESSION( 1 );
if ( !ISEXPRTRUE(1) )
EndResult->NumValue = 0;
}
return 0;
}
static int EvalLogXOr( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
EndResult->IsString = false;
EndResult->NumValue = ISEXPRTRUE(0) ^ ISEXPRTRUE(1);
return 0;
}
static int EvalBitAnd( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( e[0].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 1;
}
if ( e[1].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 2;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].NumValue & e[1].NumValue;
return 0;
}
static int EvalBitOr( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( e[0].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 1;
}
if ( e[1].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 2;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].NumValue | e[1].NumValue;
return 0;
}
static int EvalBitXOr( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( e[0].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 1;
}
if ( e[1].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 2;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].NumValue ^ e[1].NumValue;
return 0;
}
static int EvalIsEqual( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( (e[0].IsString ^ e[1].IsString) == 1 )
{
if ( ErrorMsg )
*ErrorMsg = "Cannot mix numerical and string values here.";
return 3;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].IsString ? stricmp(e[0].StrValue,e[1].StrValue)==0 : e[0].NumValue==e[1].NumValue;
return 0;
}
static int EvalIsNotEqual( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( (e[0].IsString ^ e[1].IsString) == 1 )
{
if ( ErrorMsg )
*ErrorMsg = "Cannot mix numerical and string values here.";
return 3;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].IsString ? stricmp(e[0].StrValue,e[1].StrValue)!=0 : e[0].NumValue!=e[1].NumValue;
return 0;
}
static int EvalIsLT( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( e[0].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 1;
}
if ( e[1].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 2;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].NumValue < e[1].NumValue;
return 0;
}
static int EvalIsGT( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( e[0].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 1;
}
if ( e[1].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 2;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].NumValue > e[1].NumValue;
return 0;
}
static int EvalIsLTE( in const char* Expr, in UInt32* ExprStart, in UInt32* ExprEnd, in UInt32 nExprs, inout SValueDef* EndResult, in const char* NameSpace, out const char* *ErrorMsg )
{
SValueDef e[MaxExprsPerTemplate];
if ( nExprs < 2 )
{
if ( ErrorMsg )
*ErrorMsg = "Missing an expression after the operator.";
return 1;
}
DOEXPRESSION( 0 );
DOEXPRESSION( 1 );
if ( e[0].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 1;
}
if ( e[1].IsString )
{
if ( ErrorMsg )
*ErrorMsg = "Unexpected string value.";
return 2;
}
EndResult->IsString = false;
EndResult->NumValue = e[0].NumValue <= e[1].NumValue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -