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

📄 calltoda_db.c

📁 palm os上的DA编程
💻 C
📖 第 1 页 / 共 2 页
字号:
/* CallToDA * Find phone# info from Address database (Desk Accessory) * * by TERADA, Koichi * email: kterada@iname.com * web:   http://www04.u-page.so-net.ne.jp/zd5/kterada/ * Jan. 2000 */#include <Pilot.h>#include <Common.h>#include <System/SysAll.h>#include <UI/UIAll.h>#include "CallToDA.h"#include "CallToDA_res.h"/* Internal Functions prototyping *///static Boolean isAvailPhone( unsigned, AddrDBRecordType * );//static Boolean checkFlag( unsigned, CharPtr, Param * );static CharPtr StrNToLower( CharPtr, CharPtr, Word );static int RemoveCtrlChrs( CharPtr );static CharPtr StrNCopy_WPJ( CharPtr, CharPtr, Word );static CharPtr StrNCat_WPJ( CharPtr, CharPtr, Word );static void make_table_StrStrI_bm( Word *table, char *token );static void AddrUnpack(AddrPackedDBRecord *, AddrDBRecordPtr);static Err AddrGetPackedRecord(DmOpenRef, UInt, AddrPackedDBRecord **, Handle *);static Boolean StrStrI_bm_new01( char *, char *, Word *, Word , Word );static Boolean StrStrI_bm_new2( char *, char *, Word *, Word , Word );static Boolean StrStr_bm_new01( char *, char *, Word *, Word , Word );static Boolean StrStr_bm_new2( char *, char *, Word *, Word , Word );static Boolean isPrivateRecord( Param *param, UInt rec );static Boolean copyPhoneText( AddrDBRecordType *rec, Param *param );static int numOfMatchedPhone( unsigned data, AddrDBRecordType *recP );static Boolean StrStrI_intl( char *str, char *token, Word *table, Word len_str, Word len_token );/* End of Header */Word FindAddrDB( Param *param ){	UInt recordNum, rec;	VoidHand recordH;	AddrDBRecordType record;	Boolean match;	Err recError;	Word i, num;	Char src_lower[MAX_TEXT];//	Boolean (*func)(CharPtr, CharPtr, Word *, Word);	Boolean (*funcNew)(CharPtr, CharPtr, Word *, Word, Word);	Boolean enable[addrNumFields];	Boolean enableAll;	Word bm_table[256];//	Word len_token;	AddrPackedDBRecord *packedP;	Boolean privateFlag;	Char *str;	Word len_str;	UInt indicateRange[5];	UInt indicateNext, indicatePos;		privateFlag = PrefGetPreference(prefHidePrivateRecords);	if( param->p.language == LANG_EU ) {		StrNCopy( src_lower, param->src, MAX_TEXT );//		make_table_StrStrI_bm( bm_table, src_lower );		funcNew = (Boolean (*)(CharPtr, CharPtr, Word *, Word, Word)) StrStrI_intl;	} else {		if( param->p.ignoreCase ) {			StrNToLower( src_lower, param->src, MAX_TEXT );			make_table_StrStrI_bm( bm_table, src_lower );			if( StrLen( src_lower ) < 2 ) {				funcNew = (Boolean (*)(CharPtr, CharPtr, Word *, Word, Word)) StrStrI_bm_new01;			} else {				funcNew = (Boolean (*)(CharPtr, CharPtr, Word *, Word, Word)) StrStrI_bm_new2;			}		} else {			StrNCopy( src_lower, param->src, MAX_TEXT );			make_table_StrStrI_bm( bm_table, src_lower );			if( StrLen( src_lower ) < 2 ) {				funcNew = (Boolean (*)(CharPtr, CharPtr, Word *, Word, Word)) StrStr_bm_new01;			} else {				funcNew = (Boolean (*)(CharPtr, CharPtr, Word *, Word, Word)) StrStr_bm_new2;			}		}	}	for (i = 0; i < addrNumFields; i++) {		enable[i] = false;	}	if( param->p.findNameCompany )		enable[name] = enable[firstName] = enable[company] = enable[title] = true;	if( param->p.findPhones )		enable[phone1] = enable[phone2] = enable[phone3] = 						enable[phone4] = enable[phone5] = true;	if( param->p.findAddress )		enable[address] = enable[city] = enable[state] = 						enable[zipCode] = enable[country] = true;	if( param->p.findCustoms )		enable[custom1] = enable[custom2] = enable[custom3] = enable[custom4] = true;	if( param->p.findNote )		enable[note] = true;	// evenif all switches are off:	if( !param->p.findNameCompany && !param->p.findPhones && !param->p.findAddress && 		!param->p.findCustoms && !param->p.findNote )		enable[name] = true;	// Is all switches enabled?	if( param->p.findNameCompany && param->p.findPhones && param->p.findAddress &&		param->p.findCustoms && param->p.findNote )			enableAll = true;	else 			enableAll = false;		num = 0;	recordNum = DmNumRecords( param->dbP );	//{	char buf[30];	//	StrIToA( buf, recordNum );	//	FrmCustomAlert( MsgAlert, "recordNum",buf," " );	}	indicateRange[0] = recordNum / 5 * 1;	indicateRange[1] = recordNum / 5 * 2;	indicateRange[2] = recordNum / 5 * 3;	indicateRange[3] = recordNum / 5 * 4;	indicatePos = 0;	indicateNext = indicateRange[indicatePos ++];	initIndicate();	for( rec = 0 ; rec < recordNum ; rec ++ ) {		if( rec == indicateNext ) {			displayNextIndicate( indicatePos );			indicateNext = indicateRange[indicatePos ++];		}		/*{	char buf[30];			StrIToA( buf, rec );			FrmCustomAlert( MsgAlert, "rec #", buf," " );	}	*/		recError = AddrGetPackedRecord(param->dbP, rec, &packedP, &recordH);		if( recError == 0 ) {			str = &(packedP->firstField);			len_str = MemHandleSize( recordH ) - sizeof(AddrPackedDBRecordHeading);			match = (*funcNew)( str, src_lower, bm_table, len_str, StrLen(src_lower) );			//FrmCustomAlert( MsgAlert, "match", &(packedP->firstField), match ? "T" : "F" );			MemHandleUnlock(recordH);	//		if( match || *(param->src) == '\0' ) {			if( match ) {				if( !(privateFlag && isPrivateRecord( param, rec )) ) {					if( !enableAll ) {						AddrUnpack( packedP, &record );						match = false;						for (i = 0; i < addrNumFields; i++) {							if (record.fields[i] != NULL && enable[i]) {								match |= (*funcNew)( record.fields[i], src_lower, bm_table, StrLen(record.fields[i]), StrLen(src_lower) );							}						}					}					if( match ) {						if( num < MAX_ADDR_LIST ) {							param->indexList[num ++] = rec;						} else {							break;						}					}				}			}		}	}	//{	char buf[30];	//	StrIToA( buf, num );	//	FrmCustomAlert( MsgAlert, "index num",buf," " );	}		return num;}Boolean FindAddrList( Param *param ){	VoidHand recordH;	AddrDBRecordType record;	Word i;	Char *nameP, *firstNameP, *companyP, *titleP;	Word max_char;	UInt rec;//	char buf[20];	AddrPackedDBRecord *packedP;		rec = param->indexList[ param->index ];	//StrIToA( buf, rec );	//FrmCustomAlert( MsgAlert, "rec",buf," " );	AddrGetPackedRecord(param->dbP, rec, &packedP, &recordH);	AddrUnpack( packedP, &record );	//FrmCustomAlert( MsgAlert, "match",match ? "T" : "F"," " );	nameP = record.fields[name];	firstNameP = record.fields[firstName];	companyP = record.fields[company];	titleP = record.fields[title];	if( firstNameP == NULL && nameP == NULL ) {		if( companyP == NULL ) {//			StrNCopy( param->buf1, "--- unnamed ---", MAX_TEXT );			StrNCopy_fromRsrc( param->buf1, MAX_TEXT, strRsc, unnamedString );		} else {			StrNCopy_WPJ( param->buf1, companyP, MAX_TEXT );		}	} else if( firstNameP != NULL && nameP != NULL ) {		if( StrLen(firstNameP) + StrLen(nameP) + 1 <= MAX_TEXT ) {			max_char = MAX_TEXT;		} else {			max_char = MAX_TEXT / 2 - 1;		}		if( param->p.swapFirstLast && param->p.includeLastname ) {			StrNCopy_WPJ( param->buf1, nameP, max_char );			if( !param->p.omitComma ) {				StrNCat( param->buf1, ",", max_char );			}			StrNCat( param->buf1, " ", max_char );			StrNCat_WPJ( param->buf1, firstNameP, max_char );		} else if( !param->p.swapFirstLast && param->p.includeLastname ) {			StrNCopy_WPJ( param->buf1, firstNameP, max_char );			StrNCat( param->buf1, " ", max_char );			StrNCat_WPJ( param->buf1, nameP, max_char );		} else {			StrNCopy_WPJ( param->buf1, firstNameP, max_char );		}	} else if( firstNameP != NULL ) {			StrNCopy_WPJ( param->buf1, firstNameP, MAX_TEXT );	} else if( nameP != NULL ) {			// Evenif the includeLastname is unchecked, the record has only 			// the last name field, the last name will be appeared.			StrNCopy_WPJ( param->buf1, nameP, MAX_TEXT );	}	param->ptrCompanyTitle = param->buf1 + StrLen( param->buf1 );	if( param->pasteCompany && companyP != NULL && 				!(firstNameP == NULL && nameP == NULL) ) {		StrNCat( param->buf1, " - ", MAX_TEXT );		StrNCat_WPJ( param->buf1, companyP, MAX_TEXT );//		FrmCustomAlert( MsgAlert, "companyP",companyP," " );//		FrmCustomAlert( MsgAlert, "param->buf1",param->buf1," " );	}	if( param->pasteTitle && titleP != NULL ) {		StrNCat( param->buf1, " - ", MAX_TEXT );		StrNCat( param->buf1, titleP, MAX_TEXT );	}	RemoveCtrlChrs( param->buf1 );	//	StrIToA( buf, record.options.phones.displayPhoneForList );//	FrmCustomAlert( MsgAlert, "displayPhoneForList",buf," " );	if( param->mode == -1 ) {		param->mode = (record.options.phoneBits >> 				(record.options.phones.displayPhoneForList * 4)) & 0x0f;	}	if( param->modeNum == -1 ) {		param->modeNum = 0;		for( i = 0 ; i < record.options.phones.displayPhoneForList ; i ++ ) {			if( ((record.options.phoneBits >> (i * 4)) & 0x0f) == param->mode ) {					param->modeNum ++;			}		}	}//	StrNCopy( param->buf2, "--- no phones ---", MAX_TEXT );	StrNCopy_fromRsrc( param->buf2, MAX_TEXT, strRsc, nophonesString );/*	checkFlag( record.options.phones.phone1, record.fields[phone1], param ) ? 0 :	checkFlag( record.options.phones.phone2, record.fields[phone2], param ) ? 0 :	checkFlag( record.options.phones.phone3, record.fields[phone3], param ) ? 0 :	checkFlag( record.options.phones.phone4, record.fields[phone4], param ) ? 0 :	checkFlag( record.options.phones.phone5, record.fields[phone5], param ) ;	*/	param->availPhoneText = copyPhoneText( &record, param );		for( i = 0 ; i < numPhoneLabels ; i ++ ) {		param->availPhone[i] = (numOfMatchedPhone( i, &record ) > 0);	}	MemHandleUnlock(recordH);	return true;}/*static Boolean checkFlag( unsigned data, CharPtr src, Param *param ){	if( (data == param->mode) && (data < numPhoneLabels) ) {		if( src != NULL )			StrNCopy_WPJ( param->buf2, src, MAX_TEXT - 1 );		return true;	} else {		return false;	}}*/static Boolean copyPhoneText( AddrDBRecordType *rec, Param *param ){	int index, num;	Char *src;	num =  numOfMatchedPhone( param->mode, rec );//	{ char buf[40];//	StrIToA( buf, num );//	FrmCustomAlert( MsgAlert, "numOfMatchedPhone" ,buf," " ); }	if( num > 0 ) {		index = param->modeNum % num;	} else {		index = 0;	}	if( rec->options.phones.phone1 == param->mode ) {		if( index == 0 ) {			src = rec->fields[phone1];			if( src != NULL ) {				StrNCopy_WPJ( param->buf2, src, MAX_TEXT - 1 );				return true;			}			return false;		} else {			index --;		}				}	if( rec->options.phones.phone2 == param->mode ) {		if( index == 0 ) {			src = rec->fields[phone2];			if( src != NULL ) {				StrNCopy_WPJ( param->buf2, src, MAX_TEXT - 1 );				return true;			}			return false;

⌨️ 快捷键说明

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