⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sexpeval.cpp

📁 用C语言设计的EPSON LCD控制器S1D13700驱动。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -