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

📄 en_arith.cpp

📁 在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己的开发
💻 CPP
字号:
// EN_ARITH.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//
#include <opcodes.h>
#include "oplutil.h"

void OpCode::AddInt(CStack& aStack, COplRuntime&, CFrame*)
	{
    TInt res=aStack.PopInt16()+aStack.PopInt16();
	if (res<-32768 || res>32767)
		User::Leave(KOplErrOverflow);
	aStack.Push((TInt16)res);
	}
	
void OpCode::AddLong(CStack& aStack, COplRuntime&, CFrame*)
	{
	TInt right=aStack.PopInt32();
	TInt left=aStack.PopInt32();
	TInt res=left+right;
	if ((left^right)>=0)
		{					// args same sign
		if ((left^res)<0)
			{				// result different sign
			User::Leave(KOplErrOverflow);
			}
		}
    aStack.Push(TInt32(res));
	}
	
void OpCode::SubtractInt(CStack& aStack, COplRuntime&, CFrame*)
	{
	TInt right=aStack.PopInt16();
	TInt res=aStack.PopInt16()-right;
	if (res<-32768 || res>32767)
		User::Leave(KOplErrOverflow);
	aStack.Push(TInt16(res));
	}
	
void OpCode::SubtractLong(CStack& aStack, COplRuntime&, CFrame*)
	{
	TInt right=aStack.PopInt32();
	TInt left=aStack.PopInt32();
	TInt res=left-right;
	if ((left^right)<0)
		{					// args opposite sign
		if ((left^res)<0)
			{				// result different sign from left (includes case of 0-negmax)
			User::Leave(KOplErrOverflow);
			}
		}
    aStack.Push(TInt32(res));
	}
	
void OpCode::MultiplyInt(CStack& aStack, COplRuntime&, CFrame*)
	{
	TInt res=aStack.PopInt16()*aStack.PopInt16();
	if (res<-32768 || res>32767)
		User::Leave(KOplErrOverflow);
	aStack.Push((TInt16)res);
	}
	
void OpCode::MultiplyLong(CStack& aStack, COplRuntime&, CFrame*)
	{
	aStack.Push(OplUtil::MultiplyL(aStack.PopInt32(),aStack.PopInt32()));
	}

void OpCode::DivideInt(CStack& aStack, COplRuntime& , CFrame* )
	{
	TInt denominator = aStack.PopInt16();
	if (denominator == 0)
		User::Leave(KOplErrDivideByZero);
	aStack.Push((TInt16)(aStack.PopInt16()/(TInt16)denominator));
	}
	
void OpCode::DivideLong(CStack& aStack, COplRuntime& , CFrame* )
	{
	TInt denominator = aStack.PopInt32();
	if (denominator == 0)
		User::Leave(KOplErrDivideByZero);
	aStack.Push((TInt32)(aStack.PopInt32()/(TInt32)denominator));
	}


void FuncOpCode::Uadd(CStack& aStack, COplRuntime&, CFrame*)
	{
    aStack.Push((TInt16)(aStack.PopInt16()+aStack.PopInt16()));
    }

void FuncOpCode::Usub(CStack& aStack, COplRuntime&, CFrame*)
	{
	TInt right=aStack.PopInt16();
	TInt left=aStack.PopInt16();
	aStack.Push(TInt16(left-right));
    }

void OpCode::AndInt(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push((TInt16)(aStack.PopInt16() & aStack.PopInt16()));
	}
	
void OpCode::AndLong(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push((TInt32)(aStack.PopInt32() & aStack.PopInt32()));
	}
	
void OpCode::AndFloat(CStack& aStack, COplRuntime& , CFrame* )
	{
	TInt16 res=KOplFalse;
	TReal64 right=aStack.PopReal64();
    TReal64 left=aStack.PopReal64();
    if (left!=0.0 && right!=0.0)
		res=KOplTrue;
	aStack.Push(res);
	}
	
void OpCode::OrInt(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push((TInt16)(aStack.PopInt16() | aStack.PopInt16()));
	}
	
void OpCode::OrLong(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push((TInt32)(aStack.PopInt32() | aStack.PopInt32()));
	}
	
void OpCode::OrFloat(CStack& aStack, COplRuntime& , CFrame* )
	{
	TInt16 res=KOplFalse;
    TReal right=aStack.PopReal64();
    TReal left=aStack.PopReal64();
	if (left!=0.0 || right!=0.0)
		res=KOplTrue;
	aStack.Push(res);
	}
	
void OpCode::NotInt(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push((TInt16)(~aStack.PopInt16()));
	}
	
void OpCode::NotLong(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push((TInt32)(~aStack.PopInt32()));
	}
	
void OpCode::NotFloat(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push(TInt16(aStack.PopReal64()==0.0 ? KOplTrue : KOplFalse));
	}
	
void OpCode::UnaryMinusInt(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push((TInt16)-aStack.PopInt16());
	}
	
void OpCode::UnaryMinusLong(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push(-aStack.PopInt32());
	}
	
void OpCode::UnaryMinusFloat(CStack& aStack, COplRuntime& , CFrame* )
	{
	aStack.Push(-aStack.PopReal64());
	}
	
void OpCode::AddString(CStack& aStack, COplRuntime&, CFrame*)
	{
    TPtrC right = aStack.PopString();
	TBuf<256> result = aStack.PopString();
	if (result.Length()+right.Length() > 255)
		User::Leave(KOplErrStrTooLong);
	result.Append(right);
	aStack.Push(result);
	}

/* End of $Workfile:   EN_ARITH.CPP  $ */
  
  

⌨️ 快捷键说明

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