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

📄 sugarmemodb.c

📁 Palm上著名的背单词软件的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
//SugarMemo Database Module

#include <PalmOS.h>
#include "SugarMemo.h"
#include "SugarMemoRsc.h"
#include "SugarMemoDB.h"
#include "SugarMemoTools.h"

#define HeaderBufferVolumn	(UInt16)100

//*******************************************************************
//	
//	Globals
//
//*******************************************************************
DmOpenRef 	CurrentDB = NULL;
UInt16 		CurrentRecord = noRecord;

//*******************************************************************
//
//	Internal function declaration
//
//*******************************************************************

static 	UInt16	WordUnpackedSize(WordRecordType *record);
static 	void 	PackRecord(WordRecordType *record, MemPtr recordDBEntry);
static 	void 	UnpackRecord(WordPackedRecord *packed, WordRecordType *record);
static 	Int16 	WordDBComparePackedRecords(WordPackedRecord * packed1, WordPackedRecord * packed2,
	Int16 uselessinfo, SortRecordInfoPtr infoP1, SortRecordInfoPtr infoP2, MemHandle appinfoH);
static void TranslatePhonetic(char* field);

//*******************************************************************
//
//	App info manipulation. 	
//	1.Get AppInfo Pointer
//	2.Init AppInfo Pointer
//	3.GetRawWordCount(); 
//	4.SetRawWordCount();
//
//*******************************************************************

//return locked app info pointer
SugarAppInfoType*   GetAppInfoPtr(DmOpenRef dbP)
{
	UInt16     cardNo;
	LocalID    dbID;
	LocalID    appInfoID;

	if (DmOpenDatabaseInfo(dbP, &dbID, NULL, NULL, &cardNo, NULL))
		return NULL;
	if (DmDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
		return NULL;

	if (appInfoID == 0)
		return NULL;
	else
		return MemLocalIDToLockedPtr(appInfoID, cardNo);

}

Err	SugarDBAppInfoInit(DmOpenRef db){

	UInt16         		cardNo;
	LocalID        		dbID;
	LocalID        		appInfoID;
	MemHandle      		h;
	SugarAppInfoType* 	app;
	SugarAppInfoType* 	defaultP;
	UInt8          		i;
	UInt16				bits = 0;
	DateType			zeroDate;
	UInt16				version = 0;

	app = GetAppInfoPtr(db);
	if (app != NULL) {
		version = app -> version;
		MemPtrUnlock(app);
	}

	//	if version check OK, return
	if (version == CurrentVersion) return 0;

	//	clear old app info
	if (DmOpenDatabaseInfo(db, &dbID, NULL, NULL, &cardNo, NULL)) return dmErrInvalidParam;
	DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

	// Make space for new one
	h = DmNewHandle(db, sizeof(SugarAppInfoType));
	if (!h) return dmErrMemError;

	appInfoID = MemHandleToLocalID(h);
		
	if (DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
	{
		MemHandleFree(h);
		return 1;
	}

	app = MemHandleLock(h);


	// Allocate & Clear the app info
	defaultP = MemPtrNew(sizeof(SugarAppInfoType));
	if (defaultP == NULL)
	{
		ErrDisplay("Unable to init App info");
		return 1;
	}

	MemSet(defaultP, sizeof(SugarAppInfoType), 0);


/*
typedef struct {
	UInt16				renamedCategories;	// bitfield of categories with a different name
	char 				categoryLabels[dmRecNumCategories][dmCategoryLength];
	UInt8 				categoryUniqIDs[dmRecNumCategories];
	UInt8				lastUniqID;			// Uniq IDs generated by the device are between
											// 0 - 127.  Those from the PC are 128 - 255.
	UInt8				padding;			// from the compiler word aligning things
	
	DateType			lastUpdated;
	WordFieldFlags		answerPageFields;
	WordFieldFlags		questionPageFields;
	UInt16 				rawWordCount;
	
	UInt16				version;
	
	FontID				learnFieldFont[WordFieldsCount];
	FontID				learnFieldFont2[WordFieldsCount];
	
	TextAlignment		learnFieldAlignment[WordFieldsCount];	
	
	ReviewMode			reviewMode;
	UInt8				lefty;
	
}	SugarAppInfoType; */

	// Init the categories
	for (i = 0; i < dmRecNumCategories; i++)
	{
		defaultP->categoryUniqIDs[i] = i;
	}
		
	defaultP->lastUniqID = dmRecNumCategories - 1;

	//	Set lastUpdated
	DateSecondsToDate(0, &zeroDate);
	defaultP->lastUpdated = zeroDate;

	// 	Set question page field
	bits = 0;
	SetBitMacro(bits, WordFieldQuestion);
	SetBitMacro(bits, WordFieldPhonetic);
	defaultP -> questionPageFields.allBits = bits;

	// 	Set answer page field
	bits = 0;
	SetBitMacro(bits, WordFieldPhonetic);
	SetBitMacro(bits, WordFieldNote3);
	defaultP -> answerPageFields.allBits = bits;

	// 	Set raw word count to 0
	defaultP -> rawWordCount = 0;

	//	Set version
	defaultP -> version = CurrentVersion;

		
	//	Set LearnFieldFont
	defaultP -> learnFieldFont[WordFieldQuestion] = OS5_16_Font;
	defaultP -> learnFieldFont[WordFieldPhonetic] = PhoneticLargeFont;
	defaultP -> learnFieldFont[WordFieldAnswer] = OS5_16_Font;
	defaultP -> learnFieldFont[WordFieldWordNet] = stdFont;
	defaultP -> learnFieldFont[WordFieldMerriamWebster] = stdFont;
	defaultP -> learnFieldFont[WordFieldDict1] = stdFont;
	defaultP -> learnFieldFont[WordFieldDict2] = stdFont;
	defaultP -> learnFieldFont[WordFieldDict3] = stdFont;
	defaultP -> learnFieldFont[WordFieldNote1] = stdFont;
	defaultP -> learnFieldFont[WordFieldNote2] = stdFont;
	defaultP -> learnFieldFont[WordFieldNote3] = boldFont;

	//	Set LearnFieldFont2
	defaultP -> learnFieldFont2[WordFieldQuestion] = OS5_16_Font;
	defaultP -> learnFieldFont2[WordFieldPhonetic] = PhoneticLargeFont;
	defaultP -> learnFieldFont2[WordFieldAnswer] = OS5_16_Font;
	defaultP -> learnFieldFont2[WordFieldWordNet] = stdFont;
	defaultP -> learnFieldFont2[WordFieldMerriamWebster] = stdFont;
	defaultP -> learnFieldFont2[WordFieldDict1] = stdFont;
	defaultP -> learnFieldFont2[WordFieldDict2] = stdFont;
	defaultP -> learnFieldFont2[WordFieldDict3] = stdFont;
	defaultP -> learnFieldFont2[WordFieldNote1] = stdFont;
	defaultP -> learnFieldFont2[WordFieldNote2] = stdFont;
	defaultP -> learnFieldFont2[WordFieldNote3] = boldFont;

	//	Set LearnField text alignment
	defaultP -> learnFieldAlignment[WordFieldQuestion] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldPhonetic] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldAnswer] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldWordNet] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldMerriamWebster] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldDict1] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldDict2] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldDict3] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldNote1] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldNote2] = CenterAlignment;
	defaultP -> learnFieldAlignment[WordFieldNote3] = LeftAlignment;		

	//	Set review mode
	bits = 0;
	SetBitMacro(bits, TranslationRecollection);
	SetBitMacro(bits, WordRecollection);
	SetBitMacro(bits, TranslationTest);
	SetBitMacro(bits, WordTest);
	defaultP -> reviewMode.allBits = (UInt8)bits;

	//	Set lefty
	defaultP -> lefty = (UInt8)0;
	
	// copy in the defaults and free the default app info
	DmWrite(app, 0, defaultP,  sizeof(SugarAppInfoType));
	MemPtrFree(defaultP);

	CategoryInitialize((AppInfoPtr)app, CategoryNamesAppInfoStr);

	// Unlock
	MemPtrUnlock(app);

	return 0;
}

//initialize database appinfo 
/*
Err   SugarDBAppInfoInit(DmOpenRef dbP)
{	
	
	UInt16         	cardNo;
	LocalID        	dbID;
	LocalID        	appInfoID;
	MemHandle      	h;
	SugarAppInfoType* 	appInfoP;
	SugarAppInfoType* 	defaultInfoP;
	UInt8          	i, j;
	WordFieldFlags 	flag, newAnswerPageFlag;
	DateType 		today;
	
	Int16			oldVersion = -1;
	Int16			currentVersion = 2;
	
	UInt16 			bits = 0;
	
	MemorizingStatus memoStatus = {2.50, //e-factor
		40, //difficulty 
		0, //total lapse
		0, //total recall
		0, //recent lapse
		0, //recent recall
		0, //step
		0, //last test
		0, //current test
		0,	//next test
		0,	//first learn
		0}; //create

	SetBitMacro(bits, TranslationRecollection);
	SetBitMacro(bits, WordRecollection);
	SetBitMacro(bits, TranslationTest);
	SetBitMacro(bits, WordTest);
	
	newAnswerPageFlag.allBits = 0;
	SetBitMacro(newAnswerPageFlag.allBits, WordFieldPhonetic);
	SetBitMacro(newAnswerPageFlag.allBits, WordFieldNote3);


	DateDaysToDate(TimGetSeconds(), &today);
	
	appInfoP = GetAppInfoPtr(dbP);

	// If there isn't an app info make space for one
	if (appInfoP == NULL)
	{
	}
	
	else if (appInfoP -> version == currentVersion){
		MemPtrUnlock(appInfoP);
		return 0;
	}
	
	else {
		oldVersion = appInfoP -> version;
	}
	
	// Allocate & Clear the app info
	defaultInfoP = MemPtrNew(sizeof(SugarAppInfoType));
	if (defaultInfoP == NULL)
	{
		ErrDisplay("Unable to init Word DB");
		return 1;
	}
	
	// Flush memory
	MemSet(defaultInfoP, sizeof(SugarAppInfoType), 0);
	
	// Init the categories
	switch(oldVersion){
	
		case  -1:
			for (i = 0; i < dmRecNumCategories; i++)
				defaultInfoP->categoryUniqIDs[i] = i;
	
			defaultInfoP->lastUniqID = dmRecNumCategories - 1;
	
			//Set lastUpdated
			defaultInfoP -> lastUpdated = today;
	
			// Set question and answer page field
			flag.allBits = 0;
			SetBitMacro(flag.allBits, WordFieldQuestion);
			SetBitMacro(flag.allBits, WordFieldPhonetic);
			defaultInfoP -> questionPageFields.allBits = flag.allBits;
	
			//flag.allBits = 0;
			//SetBitMacro(flag.allBits, WordFieldAnswer);
			//SetBitMacro(flag.allBits, WordFieldNote3);
			defaultInfoP -> answerPageFields.allBits = newAnswerPageFlag.allBits;

			// Set raw word count to 0
			defaultInfoP -> rawWordCount = 0;
			defaultInfoP -> reviewMode.allBits = (UInt8)bits;
			break;
			
		case 0:
		case 1:
			defaultInfoP -> renamedCategories = appInfoP -> renamedCategories;	
			
			for (i = 0; i < dmRecNumCategories; i ++){
				defaultInfoP->categoryUniqIDs[i] = appInfoP -> categoryUniqIDs[i];

				for (j = 0; j < dmCategoryLength; j++){
					defaultInfoP -> categoryLabels[i][j] =	appInfoP -> categoryLabels[i][j];
				}
			}		
	
			defaultInfoP -> lastUniqID = appInfoP -> lastUniqID;
	
			//Set lastUpdated
			defaultInfoP -> lastUpdated = appInfoP -> lastUpdated;
	
			// Set question and answer page field
			defaultInfoP -> questionPageFields.allBits = 
				appInfoP -> questionPageFields.allBits;
	
			defaultInfoP -> answerPageFields.allBits = newAnswerPageFlag.allBits;

			// Set raw word count to 0
			defaultInfoP -> rawWordCount = appInfoP -> rawWordCount;
			defaultInfoP -> reviewMode.allBits = (UInt8)bits;
			break;
	}
		
	//init version
	defaultInfoP -> version = currentVersion;
		
	//init LearnFieldFont
	defaultInfoP -> learnFieldFont[WordFieldQuestion] = OS5_16_Font;
	defaultInfoP -> learnFieldFont[WordFieldPhonetic] = PhoneticLargeFont;
	defaultInfoP -> learnFieldFont[WordFieldAnswer] = OS5_16_Font;
	defaultInfoP -> learnFieldFont[WordFieldWordNet] = stdFont;
	defaultInfoP -> learnFieldFont[WordFieldMerriamWebster] = stdFont;
	defaultInfoP -> learnFieldFont[WordFieldDict1] = stdFont;
	defaultInfoP -> learnFieldFont[WordFieldDict2] = stdFont;
	defaultInfoP -> learnFieldFont[WordFieldDict3] = stdFont;
	defaultInfoP -> learnFieldFont[WordFieldNote1] = stdFont;
	defaultInfoP -> learnFieldFont[WordFieldNote2] = stdFont;
	defaultInfoP -> learnFieldFont[WordFieldNote3] = boldFont;

	//init LearnField text alignment
	defaultInfoP -> learnFieldAlignment[WordFieldQuestion] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldPhonetic] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldAnswer] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldWordNet] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldMerriamWebster] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldDict1] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldDict2] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldDict3] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldNote1] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldNote2] = CenterAlignment;
	defaultInfoP -> learnFieldAlignment[WordFieldNote3] = LeftAlignment;		

	//Init default new record
	SetBitMacro(defaultInfoP -> defaultNewWordRecord.header.allBits, RawQueue);
	
	defaultInfoP -> defaultNewWordRecord.ltStatus.learningStatus = 0;
	defaultInfoP -> defaultNewWordRecord.memoStatus = memoStatus;
	defaultInfoP -> defaultNewWordRecord.memoStatus.create = today;

	
	if (appInfoP != NULL) {
		if (DmOpenDatabaseInfo(dbP, &dbID, NULL, NULL, &cardNo, NULL))
			return dmErrInvalidParam;
		if (DmDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
			return dmErrInvalidParam;		
		
		//delete original appInfo block
		if (DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
		{
			MemPtrUnlock(appInfoP);
			return 1;
		}
		
		//	free memory	
		MemPtrFree(appInfoP);
	}
	
	if (DmOpenDatabaseInfo(dbP, &dbID, NULL, NULL, &cardNo, NULL))
		return dmErrInvalidParam;
	if (DmDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
		return dmErrInvalidParam;
	
	//allocate new space
	h = DmNewHandle(dbP, sizeof(SugarAppInfoType));
	if (!h) return dmErrMemError;

	//set new app info block
	appInfoID = MemHandleToLocalID(h);
	if (DmSetDatabaseInfo(cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appInfoID, NULL, NULL, NULL))
	{
		MemHandleFree(h);
		return 1;
	}

	appInfoP = MemHandleLock(h);

	// copy in the defaults and free the default app info
	DmWrite(appInfoP, 0, defaultInfoP,  sizeof(SugarAppInfoType));
	MemPtrFree(defaultInfoP);

	// Try to use localized app info block strings.
	if (oldVersion == -1) ;

	// Unlock
	MemPtrUnlock(appInfoP);

	return 0;
}*/

UInt16 GetRawWordCount(){
	SugarAppInfoType* app;
	UInt16 number;
	
	app = GetAppInfoPtr(CurrentDB);
	number = app -> rawWordCount;
	MemPtrUnlock(app);
	
	return number;
}

void SetRawWordCount(UInt16 newWordCount){

⌨️ 快捷键说明

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