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

📄 si_instr.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		return ERR_WAE_WMLS_VERIFICATION;
	}
	if ( ! RE_Read16bOperand( si->RE, &cindexFUNC )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}
	if ( ! RE_Read8bOperand( si->RE, &nbrOfArgs )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}

	if (BPI_GetConstantType( si->RE->BPI, cindexURL, &constType ))
	{
		utf8_funcName = BPI_GetRawUTF8Constant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindexFUNC );
		if ((constType >= CONST_TYPE_UTF8) && (constType <= CONST_TYPE_EXT_CHARSET) && (utf8_funcName != NULL) )
		{
			url = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindexURL );
			if (url != NULL)
			{
				if (w_Resolve (si->baseURL, url->val.theString, &resolvedUrl))
				{
					si->returnInfo = SI_RETURN_EXTERNAL;

					if ( SI_NewReturnParams( si ) )
					{
						/* the SIs returnparams struct is to be filled in */
						si->returnParams->islibCall = FALSE;

						si->returnParams->bpUrl = resolvedUrl;
						resolvedUrl = NULL;

						si->returnParams->funcName = utf8_funcName;
						utf8_funcName = NULL;

           	si->returnParams->argOpS = OpS_NewFromOpS( si->RE->OpS, nbrOfArgs );
						if (si->returnParams->argOpS != NULL)
						{
							error = ERR_WAE_WMLS_NONE;
						}
						else
						{
							error = ERR_WAE_WMLS_STACK_UNDERFLOW;
						}
					}
				}
				/* else ERR_WAE_WMLS_VERIFICATION (the init value of error) */
			}
		}
	}

	DEALLOC( &resolvedUrl );
	Var_Delete( &url );
	DEALLOC( &utf8_funcName );

	return error;
}



/* Variable access and manipulation *****************************************************/
enumErrorCode Exec_LOAD_VAR_S( BYTE instr, pstructSI si ) 
{
	UINT8				vindex = 0;
	pstructVar	var;

	vindex = Read5bFrom8b( instr );

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		var = Var_New();
		if (var == NULL) 
			return ERR_WAE_OUT_OF_MEMORY;

		Var_AssignVar( var, si->RE->currF->variables[ vindex ] );
			/* copies the vindex value to var */
		OpS_Push( si->RE->OpS, &var );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_LOAD_VAR( pstructSI si ) 
{
	UINT8				vindex = 0;
	pstructVar	var;

	if ( ! RE_Read8bOperand( si->RE, &vindex )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		var = Var_New();
		if (var == NULL) 
			return ERR_WAE_OUT_OF_MEMORY;

		Var_AssignVar( var, si->RE->currF->variables[ vindex ] );
			/* copies the vindex value to var */
		OpS_Push( si->RE->OpS, &var );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_STORE_VAR_S( BYTE instr, pstructSI si ) 
{
	UINT8				vindex = 0;
	pstructVar	var;

	vindex = Read4bFrom8b( instr );

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		var = RE_Pop( si->RE );
		if (var == NULL) 
			return ERR_WAE_WMLS_STACK_UNDERFLOW;

		Var_AssignVar( si->RE->currF->variables[ vindex ], var );
			/* stores the var value in the correct variable specified by vindex */
		Var_Delete( &var );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_STORE_VAR( pstructSI si ) 
{
	UINT8				vindex = 0;
	pstructVar	var;

	if ( ! RE_Read8bOperand( si->RE, &vindex )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		var = RE_Pop( si->RE );
		if (var == NULL) 
			return ERR_WAE_WMLS_STACK_UNDERFLOW;

		Var_AssignVar( si->RE->currF->variables[ vindex ], var );
			/* stores the var value in the correct variable specified by vindex */
		Var_Delete( &var );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_INCR_VAR_S( BYTE instr, pstructSI si ) 
{
	UINT8				vindex = 0;

	vindex = Read3bFrom8b( instr );

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		if ( Var_ConvertMethod(CONVERT_INT_FLOAT, si->RE->currF->variables[ vindex ], NULL) )
    {
			Var_INCR( si->RE->currF->variables[ vindex ] );
    }
    else
    {
			Var_AssignInvalid( si->RE->currF->variables[ vindex ] );
    }

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_INCR_VAR( pstructSI si ) 
{
	UINT8				vindex = 0;

	if ( ! RE_Read8bOperand( si->RE, &vindex )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		if ( Var_ConvertMethod(CONVERT_INT_FLOAT, si->RE->currF->variables[ vindex ], NULL) )
    {
			Var_INCR( si->RE->currF->variables[ vindex ] );
    }
    else
    {
			Var_AssignInvalid( si->RE->currF->variables[ vindex ] );
    }

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_DECR_VAR( pstructSI si )
{
	UINT8				vindex = 0;

	if ( ! RE_Read8bOperand( si->RE, &vindex )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		if ( Var_ConvertMethod(CONVERT_INT_FLOAT, si->RE->currF->variables[ vindex ], NULL) )
    {
			Var_DECR( si->RE->currF->variables[ vindex ] );
    }
    else
    {
			Var_AssignInvalid( si->RE->currF->variables[ vindex ] );
    }

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}



/* Access to constants *****************************************************************/
enumErrorCode Exec_LOAD_CONST_S( BYTE instr, pstructSI si )
{
	UINT8				cindex = 0;
	pstructVar	var;

	cindex = Read4bFrom8b( instr );

	if (cindex < si->RE->BPI->nbrOfConstants ) {
		/* valid constant index */

		var = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindex );
		if (var == NULL)
			return ERR_WAE_OUT_OF_MEMORY;

		OpS_Push( si->RE->OpS, &var );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_LOAD_CONST( pstructSI si ) 
{
	UINT8				cindex = 0;
	pstructVar	var;

	if ( ! RE_Read8bOperand( si->RE, &cindex )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}

	if (cindex < si->RE->BPI->nbrOfConstants ) {
		/* valid constant index */

		var = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindex );
		if (var == NULL) 
			return ERR_WAE_OUT_OF_MEMORY;

		OpS_Push( si->RE->OpS, &var );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_LOAD_CONST_W( pstructSI si ) 
{
	UINT16			cindex = 0;
	pstructVar	var;

	if ( ! RE_Read16bOperand( si->RE, &cindex )) {
		return ERR_WAE_WMLS_VERIFICATION;
	}

	if (cindex < si->RE->BPI->nbrOfConstants ) {
		/* valid constant index */

		var = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindex );
		if (var == NULL)
			return ERR_WAE_OUT_OF_MEMORY;

		OpS_Push( si->RE->OpS, &var );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_CONST_0( pstructSI si ) 
{
	pstructVar			var = Var_New();

	Var_AssignInt( var, 0 );
	OpS_Push( si->RE->OpS, &var );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_CONST_1( pstructSI si ) 
{
	pstructVar			var = Var_New();

	Var_AssignInt( var, 1 );
	OpS_Push( si->RE->OpS, &var );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_CONST_M1( pstructSI si ) 
{
	pstructVar			var = Var_New();

	Var_AssignInt( var, -1 );
	OpS_Push( si->RE->OpS, &var );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_CONST_ES( pstructSI si ) 
{
	pstructVar			var = Var_New();
									/* A new var is by default an empty string (ES) */

	OpS_Push( si->RE->OpS, &var );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_CONST_INVALID( pstructSI si ) 
{
	pstructVar			var = Var_New();

	Var_AssignInvalid( var );
	OpS_Push( si->RE->OpS, &var );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_CONST_TRUE( pstructSI si )
{
	pstructVar			var = Var_New();

	Var_AssignBool( var, TRUE );
	OpS_Push( si->RE->OpS, &var );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_CONST_FALSE( pstructSI si ) 
{
	pstructVar			var = Var_New();

	Var_AssignBool( var, FALSE );
	OpS_Push( si->RE->OpS, &var );

	return ERR_WAE_WMLS_NONE;
}


/* Arithmetic instructions **************************************************************/
enumErrorCode Exec_INCR( pstructSI si )
{
	pstructVar		op1 =	RE_Pop( si->RE );

	if (op1 == NULL)
		return ERR_WAE_WMLS_STACK_UNDERFLOW;

	if (Var_ConvertMethod( CONVERT_INT_FLOAT, op1, NULL )) {
		Var_INCR( op1 );
	}
	else {
		Var_AssignInvalid( op1 );
	}
	OpS_Push( si->RE->OpS, &op1 );
	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_DECR( pstructSI si )
{
	pstructVar		op1 =	RE_Pop( si->RE );

	if (op1 == NULL)
		return ERR_WAE_WMLS_STACK_UNDERFLOW;

	if (Var_ConvertMethod( CONVERT_INT_FLOAT, op1, NULL )) {
		Var_DECR( op1 );
	}
	else {
		Var_AssignInvalid( op1 );
	}
	OpS_Push( si->RE->OpS, &op1 );
	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_ADD_ASG( pstructSI si )
{
	UINT8				vindex;
	pstructVar	op1 = NULL;
	pstructVar	op2 = NULL; 
	pstructVar	result = NULL;

	if ( ! RE_Read8bOperand( si->RE, &vindex ))
		return ERR_WAE_WMLS_VERIFICATION;

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		op1 = si->RE->currF->variables[ vindex ];
		op2 = RE_Pop( si->RE );

		if (op2 == NULL)
				return ERR_WAE_WMLS_STACK_UNDERFLOW;

		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
			result = Var_ADD( op1, op2 );
			Var_AssignVar( op1, result );
		}
		else {
			Var_AssignInvalid( op1 );
		}

		Var_Delete( &op2 );
		Var_Delete( &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_SUB_ASG( pstructSI si )
{
	UINT8				vindex;
	pstructVar	op1 = NULL;
	pstructVar	op2 = NULL;
	pstructVar	result = NULL;

	if ( ! RE_Read8bOperand( si->RE, &vindex ))
		return ERR_WAE_WMLS_VERIFICATION;

	if (vindex <	(si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
								si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
		/* valid variable index */

		op1 = si->RE->currF->variables[ vindex ];
		op2 = RE_Pop( si->RE );

		if (op2 == NULL)
				return ERR_WAE_WMLS_STACK_UNDERFLOW;

		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS, op1, op2) ) {
			result = Var_SUB( op1, op2 );
			Var_AssignVar( op1, result );
		}
		else {
			Var_AssignInvalid( op1 );
		}

		Var_Delete( &op2 );
		Var_Delete( &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_VERIFICATION;
	}
}


enumErrorCode Exec_UMINUS( pstructSI si )
{
	pstructVar		op1 =	RE_Pop( si->RE );
	pstructVar		result = NULL;

	if (op1 == NULL)
		return ERR_WAE_WMLS_STACK_UNDERFLOW;

	if (Var_ConvertMethod( CONVERT_INT_FLOAT, op1, NULL )) {
		result = Var_UMINUS( op1 );
		Var_AssignVar( op1, result );
		Var_Delete( &result );
	}
	else {
		Var_AssignInvalid( op1 );
	}
	OpS_Push( si->RE->OpS, &op1 );
	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_ADD( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
			result = Var_ADD( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_SUB( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS, op1, op2) ) {
			result = Var_SUB( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_MUL( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS, op1, op2) ) {
			result = Var_MUL( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_DIV( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS, op1, op2) ) {
			result = Var_DIV( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -