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

📄 oplutil.cpp

📁 在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己的开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// OPLUTIL.CPP
//
// Copyright (c) 1997-2002 Symbian Ltd. All rights reserved.

#include <bldvariant.hrh>
#if defined(__SERIES60__)
#include "aknutils.h"
#else
#include <fontids.h>
#endif

#include <fntstore.h>
#include <oplerr.h>
#include <oplstack.h>
#include <oplr.rsg>
#include "oplutil.h"
#include "program.h"
#include "oplr.h"

_LIT(KDebuggerFile,"\\System\\Libs\\Opldbg.dll");
_LIT(KOplRscFile,"\\System\\Data\\Oplr.rsc");

EXPORT_C TPtrC DebuggerDllFilename()
	{
	return KDebuggerFile();
	}

EXPORT_C TFileName RuntimeResourceFile()
	{
	return KOplRscFile();
	}

void OplUtil::PutWord(TAny* aPtr,TInt16 aWord)
	{
	TUint8* trg=(TUint8*)aPtr;
	TUint8* src=(TUint8*)&aWord;
	*trg++=*src++;
	*trg++=*src++;
	}

TInt16 OplUtil::GetWord(TAny* aPtr)
	{
	TUint8* src=(TUint8*)aPtr;
	TInt16 theWord;
	TUint8* trg=(TUint8*)&theWord;
	*trg++=*src++;
	*trg++=*src++;
	return theWord;
	}

void OplUtil::PutLong(TAny* aPtr,TInt32 aLong)
	{
	TUint8* trg=(TUint8*)aPtr;
	TUint8* src=(TUint8*)&aLong;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	}

TInt32 OplUtil::GetLong(TAny* aPtr)
	{
	TUint8* src=(TUint8*)aPtr;
	TInt32 theLong;
	TUint8* trg=(TUint8*)&theLong;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	return theLong;
	}

void OplUtil::PutFloat(TAny* aPtr,TReal64 aFloat)
	{
	TUint8* trg=(TUint8*)aPtr;
	TUint8* src=(TUint8*)&aFloat;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;

	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	}

TReal64 OplUtil::GetFloat(TAny* aPtr)
	{
	TUint8* src=(TUint8*)aPtr;
	TReal64 theFloat;
	TUint8* trg=(TUint8*)&theFloat;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;

	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	*trg++=*src++;
	return theFloat;
	}

TUint8* OplUtil::OffsetToAddrL(const RHeap& aHeap,TInt aOffset,TInt aSize)
	{
	if (aOffset<0)
		{
		if (aOffset<TInt(0xffff8000))
			User::Leave(KErrArgument);
		aOffset=(TUint16)aOffset;
		}
	if ((aOffset>=0x40&&(aOffset+aSize)<=aHeap.Size())||(aOffset>=0x28&&(aOffset+aSize)<=0x36))
		return (aHeap.Base()+aOffset);
	if (aOffset!=0)
		User::Leave(KErrArgument);
	return NULL;
	}

TUint8* OplUtil::PopOffsetAsAddrL(CStack& aStack,const RHeap& aHeap,TInt aSize)
	{
	TInt offset=aStack.PopInt32();
	return OffsetToAddrL(aHeap,offset,aSize);
	}

TInt16 OplUtil::MapError(TInt aE32Error)
	{
	if ((aE32Error&KOplErrorMask)==KOplErrorBase)
		return ((TInt16)aE32Error); // left with KOplErrXXX
	return ErrorEraToOpl1993(aE32Error);
	}

//
// OPL1993 Constants for errors
//
const TInt16 E_GEN_FAIL =-1;
const TInt16 E_GEN_ARG =-2;
const TInt16 E_GEN_OS =-3;
const TInt16 E_GEN_NSUP =-4;
const TInt16 E_GEN_UNDER =-5;
const TInt16 E_GEN_OVER =-6;
const TInt16 E_GEN_RANGE =-7;
const TInt16 E_GEN_DIVIDE =-8;
const TInt16 E_GEN_INUSE =-9;
const TInt16 E_GEN_NOMEMORY =-10;
const TInt16 E_GEN_NOSEGMENTS =-11;
const TInt16 E_GEN_NOSEM =-12;
const TInt16 E_GEN_NOPROC =-13;
const TInt16 E_GEN_OPEN =-14;
const TInt16 E_GEN_NOTOPEN =-15;
const TInt16 E_GEN_IMAGE =-16;
const TInt16 E_GEN_RECEIVER =-17;
const TInt16 E_GEN_DEVICE =-18;
const TInt16 E_GEN_FSYS =-19;
const TInt16 E_GEN_START =-20;
const TInt16 E_GEN_NOFONT =-21;
const TInt16 E_GEN_TOOWIDE =-22;
const TInt16 E_GEN_TOOMANY =-23;
const TInt16 E_FILE_EXIST =-32;
const TInt16 E_FILE_NXIST =-33;
const TInt16 E_FILE_WRITE =-34;
const TInt16 E_FILE_READ =-35;
const TInt16 E_FILE_EOF =-36;
const TInt16 E_FILE_FULL =-37;
const TInt16 E_FILE_NAME =-38;
const TInt16 E_FILE_ACCESS =-39;
const TInt16 E_FILE_LOCKED =-40;
const TInt16 E_FILE_DEVICE =-41;
const TInt16 E_FILE_DIR =-42;
const TInt16 E_FILE_RECORD =-43;
const TInt16 E_FILE_RDONLY =-44;
const TInt16 E_FILE_INV =-45;
const TInt16 E_FILE_PENDING =-46;
const TInt16 E_FILE_VOLUME =-47;
const TInt16 E_FILE_CANCEL =-48;
const TInt16 E_FILE_ALLOC =-10;
const TInt16 E_FILE_DISC =-50;
const TInt16 E_FILE_CONNECT =-51;
const TInt16 E_FILE_RETRAN =-52;
const TInt16 E_FILE_LINE =-53;
const TInt16 E_FILE_INACT =-54;
const TInt16 E_FILE_PARITY =-55;
const TInt16 E_FILE_FRAME =-56;
const TInt16 E_FILE_OVERRUN =-57;
const TInt16 E_MDM_CONFAIL =-58;
const TInt16 E_MDM_BUSY =-59;
const TInt16 E_MDM_NOANS =-60;
const TInt16 E_MDM_BLACKLIST =-61;
const TInt16 E_FILE_NOTREADY =-62;
const TInt16 E_FILE_UNKNOWN =-63;
const TInt16 E_FILE_DIRFULL =-64;
const TInt16 E_FILE_PROTECT =-65;
const TInt16 E_FILE_CORRUPT =-66;
const TInt16 E_FILE_ABORT =-67;
const TInt16 E_FILE_ERASE =-68;
const TInt16 E_FILE_INVALID =-69;

const TInt KEraToOpl1993TableSize = 45;

static const TInt16 EraToOpl1993Table[KEraToOpl1993TableSize]=
	{
	0,					// KErrNone (0)
	E_FILE_NXIST,		// KErrNotFound(-1)
	E_GEN_FAIL,			// KErrGeneral(-2)
	E_FILE_CANCEL,		// KErrCancel(-3)
	E_GEN_NOMEMORY,		// KErrNoMemory(-4)
	E_GEN_NSUP,			// KErrNotSupported(-5)
	E_GEN_ARG,   		// KErrArgument(-6)
	E_GEN_RANGE,		// KErrTotalLossOfPrecision(-7)
	E_FILE_NXIST,		// KErrBadHandle(-8)
	E_GEN_OVER,			// KErrOverflow(-9)
	E_GEN_UNDER,		// KErrUnderflow(-10)
	E_FILE_EXIST,		// KErrAlreadyExists(-11)
	E_FILE_DIR,  		// KErrPathNotFound(-12)
	E_GEN_FAIL,			// KErrDied(-13)
	E_GEN_INUSE,		// KErrInUse(-14)
	E_GEN_FAIL,			// KErrServerTerminated(-15)
	E_GEN_TOOMANY,		// KErrServerBusy(-16)
	E_GEN_FAIL,			// KErrCompletion(-17)
	E_FILE_NOTREADY,	// KErrNotReady(-18)
	E_FILE_UNKNOWN,		// KErrUnknown(-19)
	E_FILE_CORRUPT,	 	// KErrCorrupt(-20)
	E_FILE_ACCESS,		// KErrAccessDenied(-21)
	E_FILE_LOCKED,		// KErrLocked(-22)
	E_FILE_WRITE,		// KErrWrite(-23)
	E_GEN_FSYS,			// KErrDismounted(-24)
	E_FILE_EOF,			// KErrEof(-25)
	E_FILE_FULL,		// KErrDiskFull(-26)
	E_GEN_DEVICE,		// KErrBadDriver(-27)
	E_FILE_NAME,		// KErrBadName(-28)
	E_FILE_LINE,		// KErrCommsLineFail(-29)
	E_FILE_FRAME,		// KErrCommsFrame(-30)
	E_FILE_OVERRUN,		// KErrCommsOverrun(-31)
	E_FILE_PARITY,		// KErrCommsParity(-32)
	E_FILE_RETRAN,		// KErrTimeout(-33)
	E_FILE_CONNECT,		// KErrCouldNotConnect(-34)
	E_FILE_DISC,		// KErrCouldNotDisconnect(-35)
	E_FILE_DISC,		// KErrDisconnected(-36)
	E_GEN_FAIL,			// KErrBadLibraryEntryPoint(-37)
	E_GEN_FAIL,			// KErrBadDescriptor(-38)
	E_FILE_ABORT,		// KErrAbort(-39)
	E_FILE_FULL,		// KErrTooBig(-40)
	E_GEN_DIVIDE,		// KErrDivideByZero(-41)
	E_GEN_FAIL,			// KErrBadPower(-42)
	E_FILE_DIRFULL		// KErrDirFull=(-43)
	};

TInt16 OplUtil::ErrorEraToOpl1993(TInt aE32Error)
	{
	if (aE32Error>0)
		return (TInt16) aE32Error;

	aE32Error=-aE32Error;
	if (aE32Error<KEraToOpl1993TableSize)
		return EraToOpl1993Table[aE32Error];
	return E_GEN_FAIL;
	}

TInt OplUtil::GetErrResource(TInt aError)
	// Return the resource id with R_OPLR_UNKNOWN_ERROR if unknown
	{
	TInt resourceNo=R_OPLR_UNKNOWN_ERROR;
 	if (aError<0&&aError>-26)
		resourceNo=R_OPLR_UNKNOWN_ERROR-aError; // NB aError is negative here
	else if (aError<-31&&aError>=KOplMaxErr) // may be more errors added !!!!!
		resourceNo-=(aError+6); // -32 is mapped to -26 etc.
	return resourceNo;
	}

TInt16 OplUtil::MultiplyL(TInt16 aArg1,TInt16 aArg2)
	{
	TInt res=aArg1*aArg2;
	if (res>KMaxTInt16 || res<KMinTInt16)
		User::Leave(KOplErrOverflow);
	return (TInt16)res;
	}

TInt32 OplUtil::MultiplyL(TInt32 aArg1,TInt32 aArg2)
	{
	TInt64 arg164=TInt64((TInt)aArg1);
	TInt64 arg264=TInt64((TInt)aArg2);
	arg164*=arg264;
	TInt32 low=arg164.Low();
	TInt32 high=arg164.High();	
	if ((low<0 && high!=-1) || (low>=0 && high!=0))
		User::Leave(KOplErrOverflow);
	return low;
	}

#if defined(__SERIES60__)
// Some stale font ids from EON14.GDR's fontid.h
#define KScreenFontUidCourierNormal8   268436065
#define KScreenFontUidTimesNormal8     268435965
#define KScreenFontUidTimesNormal11    268435966
#define KScreenFontUidTimesNormal13    268435967
#define KScreenFontUidTimesNormal15    268435968
#define KScreenFontUidArialNormal8     268435954
#define KScreenFontUidArialNormal11    268435955
#define KScreenFontUidArialNormal13    268435956
#define KScreenFontUidArialNormal15    268435957
#define KScreenFontUidTiny4     268435504

// OS61fonts.h
const TInt KOS61BaseFontId2		= 0x63330000 ;
const TInt KOS61NormalFontId	= KOS61BaseFontId2 + 0x00 ;
const TInt KOS61TitleFontId		= KOS61BaseFontId2 + 0x01 ;
const TInt KOS61AnnotationFontId = KOS61BaseFontId2 + 0x02 ;
const TInt KOS61LegendFontId	= KOS61BaseFontId2 + 0x03 ;
const TInt KOS61SymbolFontId	= KOS61BaseFontId2 + 0x04 ;

⌨️ 快捷键说明

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