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

📄 pocketclib.cpp

📁 palm的pocketc
💻 CPP
字号:
#include "PocketCLib.h"

/********************************************************************
 * Internally used routines
 ********************************************************************/
static PocketCLibGlobalsPtr PrvMakeGlobals(UInt16 refNum);
static PocketCLibGlobalsPtr PrvLockGlobals(UInt16 refNum);

/********************************************************************
 * Internally used macros
 ********************************************************************/

// Unlock globals
#define PrvUnlockGlobals(gP)	MemPtrUnlock(gP)

/********************************************************************
 * Open routine - add global initialization code
 ********************************************************************/

PocketCLibGlobalsPtr PocketCLibOpen(UInt16 refNum, UInt32*) {
	PocketCLibGlobalsPtr gP;
	Err err = 0;

	gP = PrvMakeGlobals(refNum);
	
	// NOTE: You CANNOT call the global routines (e.g. pop() ) at this point!
	//
	// TODO: Initialize globals
	//
	
	// NOTE: PocketC will fill the structure and then _unlock_ it
	return gP;
}

/********************************************************************
 * Close routine - add global cleanup code 
 ********************************************************************/

Err PocketCLibClose(UInt16 refNum, UInt32) {
	MemHandle gH;
	SysLibTblEntryPtr libEntryP;

	libEntryP = SysLibTblEntry(refNum);
	ErrFatalDisplayIf(libEntryP == NULL, "invalid PocketC lib refNum");

	gH = (MemHandle)(libEntryP->globalsP);
	if (gH) {
		
		//
		// TODO: Insert cleanup routines here (if necessary)
		//
		
		libEntryP->globalsP = NULL;
		MemHandleFree(gH);
	}
	
	return 0;
}

/********************************************************************
 * AddFunctions routine - add your libraries custom functions here
 ********************************************************************/

Err PocketCLibAddFunctions(UInt16 refNum) {
	PocketCLibGlobalsPtr gP;
	
	gP = PrvLockGlobals(refNum);
	
	//
	// TODO: Add library functions here
	//
	gP->addLibFunc("times5", 1, vtInt);
	gP->addLibFunc("reverse", 1, vtString);
	gP->addLibFunc("volume", 3, vtFloat, vtFloat, vtFloat);
	gP->addLibFunc("makeStr", 0);

	PrvUnlockGlobals(gP);
	return 0;
}

/********************************************************************
 * Functions exposed to PocketC applets
 ********************************************************************/

void times5(PocketCLibGlobalsPtr gP) {
	Value x;
	
	gP->pop(x);
	gP->retVal->iVal = x.iVal * 5;
}

void reverse(PocketCLibGlobalsPtr gP) {
	Value str;
	
	gP->pop(str);
	
	char* b = (char*)MemHandleLock(str.sVal);
	char* e = b + StrLen(b) - 1;
	while (b < e) {
		char t = *b;
		*b = *e;
		*e = t;
		b++; e--;
	}
	
	MemHandleUnlock(str.sVal);
	
	gP->retVal->type = vtString;
	gP->retVal->sVal = str.sVal;
	// we don't need to call cleanup on str since the string MemHandle
	// is still in use
}

void volume(PocketCLibGlobalsPtr gP) {
	Value x, y, z;
	
	gP->pop(z); // pop them off in reverse order
	gP->pop(y);
	gP->pop(x);
	
	gP->retVal->type = vtFloat;
	gP->retVal->fVal = x.fVal * y.fVal * z.fVal;
}

/********************************************************************
 * ExecuteFunction routine - call your library functions from here
 ********************************************************************/
Err PocketCLibExecuteFunction(UInt16 refNum, int funcNum) {
	PocketCLibGlobalsPtr gP;
	
	gP = PrvLockGlobals(refNum);
	
	switch (funcNum) {
		case 0: times5(gP); break;
		case 1: reverse(gP); break;
		case 2: volume(gP); break;
	};
	
	PrvUnlockGlobals(gP);
	return 0;
}

/********************************************************************
 * Sleep/Wake routines - don't modify these
 ********************************************************************/

Err PocketCLibSleep(UInt16 refNum) {
	return 0;
}

Err PocketCLibWake(UInt16 refNum) {
	return 0;
}

/********************************************************************
 * MakeGlobals - no modificcations needed
 ********************************************************************/

static PocketCLibGlobalsPtr PrvMakeGlobals(UInt16 refNum)
{
	PocketCLibGlobalsPtr gP = NULL;
	MemHandle	 gH;
	SysLibTblEntryPtr libEntryP;

	// Get library globals
	libEntryP = SysLibTblEntry(refNum);
	ErrFatalDisplayIf(libEntryP == NULL, "invalid PocketC lib refNum");

	// Allocate and initialize our library globals.
	gH = MemHandleNew(sizeof(PocketCLibGlobalsType));
	if (!gH) return NULL;

	libEntryP->globalsP = (void*)gH;
	gP = PrvLockGlobals(refNum);
	
	// Initialize our library globals
	MemSet(gP, sizeof(PocketCLibGlobalsType), 0);

	return gP;
}

/********************************************************************
 * LockGlobals - no modificcations needed
 ********************************************************************/

static PocketCLibGlobalsPtr PrvLockGlobals(UInt16 refNum) {
	PocketCLibGlobalsPtr gP = NULL;
	MemHandle gH;
	SysLibTblEntryPtr libEntryP;

	libEntryP = SysLibTblEntry(refNum);
	if (libEntryP) gH = (MemHandle)(libEntryP->globalsP);
	if (gH) gP = (PocketCLibGlobalsPtr)MemHandleLock(gH);

	return gP;
}

⌨️ 快捷键说明

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