📄 calltoda_db.c
字号:
/* 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 + -