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

📄 calltoda_txt.c

📁 palm os上的DA编程
💻 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>//#define DEBUG 1#include "CallToDA.h"#include "CallToDA_res.h"/* Internal Functions prototyping */void putSelectedText(CharPtr, Param *);Word getSelectedText(char *, Param *);void reformatPastableText( CharPtr p, CharPtr buttonLabel, Param *param );Char *StrNCopy_fromRsrc( Char *dest, Word num, ULong type, Int id );static Boolean isalpha( Char c );static Boolean isKanji( unsigned char ch, unsigned char cl );static Boolean isKanjiDelimiter( unsigned char ch, unsigned char cl );static Char *backtrackToLinefeed( Char *textStartP, Char *targetP );static Boolean isLastKanjiBeforePtr( Char *lineStartP, Char *targetP );static Char *getLastKanjiWordBeforePtr( Char *lineStartP, Char *targetP );static FieldPtr GetFocusFieldPtr( void );/* End of Header */Char *StrNCopy_fromRsrc( Char *dest, Word num, ULong type, Int id ){	VoidHand handle;	Char *p;		handle = DmGet1Resource( type, id );	p = MemHandleLock( handle );	StrNCopy( dest, p, num );	MemHandleUnlock( handle );	DmReleaseResource( handle );	return dest;}static Boolean isalpha( Char c ){	return	(c >= 'A' && c <= 'Z') ||			(c >= 'a' && c <= 'z') ;}static Boolean isKanji( unsigned char ch, unsigned char cl ){	return	((0x81 <= ch && ch <= 0x9f) || (0xe0 <= ch && ch <= 0xec)) &&			((0x40 <= cl && cl <= 0x7e) || (0x80 <= cl && cl <= 0xfc)) ;}static Boolean isKanjiDelimiter( unsigned char ch, unsigned char cl ){	unsigned short s;		s = (unsigned short)ch * 0x100 + (unsigned short)cl;	return !( (s >= 0x889f) || (0x824f <= s && s <= 0x8396) 				|| (s == 0x815b) || (s == 0x8158) ) ;}static Char *backtrackToLinefeed( Char *textStartP, Char *targetP ){	unsigned char *p;		p = (unsigned char *)targetP - 1;	while( p >= (unsigned char *)textStartP ) {		if( *p == '\n' )			return (Char *)p + 1;		-- p;	}	return textStartP;}static Boolean isLastKanjiBeforePtr( Char *lineStartP, Char *targetP ){	unsigned char *p;	Boolean kanji = false;		p = (unsigned char *)lineStartP;	while( p < (unsigned char *)targetP ) {		if( isKanji( *p, *(p+1) ) ) {			#ifdef DEBUG			FrmCustomAlert( MsgAlert, "kanji", "T", (Char *)p );			#endif			kanji = true;			p += 2;		} else {			#ifdef DEBUG			FrmCustomAlert( MsgAlert, "kanji", "F", (Char *)p );			#endif			kanji = false;			p ++;		}	}	#ifdef DEBUG	FrmCustomAlert( MsgAlert, "return", "p", (Char *)p );	FrmCustomAlert( MsgAlert, "return", "targetP", (Char *)targetP );	#endif	if( p == (unsigned char *)targetP ) {		return kanji;	} else {		return false;	}}static Char *getLastKanjiWordBeforePtr( Char *lineStartP, Char *targetP ){	unsigned char *p;	unsigned char *wordP;		#ifdef DEBUG	FrmCustomAlert( MsgAlert, "targetP", (Char *)targetP, " " );	#endif	p = wordP = (unsigned char *)lineStartP;	while( p < (unsigned char *)targetP ) {		//FrmCustomAlert( MsgAlert, "p", (Char *)p, " " );		if( isKanji( *p, *(p+1) ) ) {			if( isKanjiDelimiter( *p, *(p+1) ) ) {				wordP = p + 2;				#ifdef DEBUG				FrmCustomAlert( MsgAlert, "wordP", "updated knj", (Char *)wordP );				#endif			}			p += 2;		} else {			wordP = (++ p);			#ifdef DEBUG			FrmCustomAlert( MsgAlert, "wordP", "updated asc", (Char *)wordP );			#endif		}	}	#ifdef DEBUG	FrmCustomAlert( MsgAlert, "wordP", (Char *)wordP, " " );	#endif	if( p == (unsigned char *)targetP ) {		if( wordP == (unsigned char *)targetP ) {			return NULL;		} else {			return (Char *)wordP;		}	} else {		return NULL;	}}static FieldPtr GetFocusFieldPtr( void ){	FormPtr form;	Word focus;		if (FrmGetActiveFormID() == 0		|| (form = FrmGetActiveForm()) == NULL		|| (focus = FrmGetFocus(form)) == noFocus) {	return NULL;	}	switch (FrmGetObjectType(form, focus)) {	case frmFieldObj:		return FrmGetObjectPtr(form, focus);	case frmTableObj:		return TblGetCurrentField(FrmGetObjectPtr(form, focus));	default:		return NULL;	}}Word getSelectedText(char *buf, Param *param){	FieldPtr field;	CharPtr ptr, p1, p2;	Word start, end;	Word len;	Char *lineStartP;		field = GetFocusFieldPtr();		if (field != NULL				&& (ptr = FldGetTextPtr(field)) != NULL && *ptr != '\0') {		FldGetSelection(field, &start, &end);/*		{			char s1[10],s2[10];			StrIToA( s1, start );			StrIToA( s2, end );			FrmCustomAlert( MsgAlert, "start/end", s1, s2 );		}*/		param->fieldptr = field;		param->end = end;		len = end - start;		if( len <= 0 ) {			start = end = FldGetInsPtPosition( field );			#ifdef DEBUG			FrmCustomAlert( MsgAlert, "ptr", ptr, " " );			FrmCustomAlert( MsgAlert, "ptr+start", ptr+start, " " );			#endif						lineStartP = backtrackToLinefeed( ptr, ptr + start );			#ifdef DEBUG			FrmCustomAlert( MsgAlert, "lineStartP", lineStartP, " " );			#endif			if( isLastKanjiBeforePtr( lineStartP, ptr + start ) ) {				if( (p1 = getLastKanjiWordBeforePtr( lineStartP, ptr + start )) == NULL )					p1 = ptr + start;				#ifdef DEBUG				FrmCustomAlert( MsgAlert, "kanji p1", p1, " " );				#endif				p2 = ptr + start;				while( isKanji( *p2, *(p2+1) ) && !isKanjiDelimiter( *p2, *(p2+1) ) ) {					p2 += 2;				}			} else {				p1 = ptr + start - 1;				#ifdef DEBUG				FrmCustomAlert( MsgAlert, "ascii p1", p1, " " );				#endif				while( p1 >= ptr ) {					if( isalpha(*p1) ) {						p1 --;					} else {						break;					}				}				p1 ++;				p2 = ptr + start;				while( *p2 != '\0' ) {					if( isalpha(*p2) ) {						p2 ++;					} else {						break;					}				}			}			len = p2 - p1;			if( len < MAX_TEXT ) {				StrNCopy( buf, p1, len );				*(buf + len) = '\0';				param->start = p1 - ptr;				param->end = p2 - ptr;				//FrmCustomAlert( MsgAlert, "search txt", buf, " " );			/*	if( *buf == '\0' ) {					FrmAlert( NoselectionAlert );				}	*/			} else {				len = 0;				FrmAlert( ToolongstrAlert );				param->start = start;			}		}		else if( len < MAX_TEXT) {			StrNCopy( buf, ptr + start, len );			*(buf + len) = '\0';			param->start = start;		} else {			len = 0;			FrmAlert( ToolongstrAlert );			param->start = start;		}	} else if (field != NULL				&& ptr != NULL && *ptr == '\0') {	//	FrmAlert( NoselectionAlert );		*buf = '\0';		len = 0;		param->fieldptr = field;		param->start = param->end = 0;    } else {	//	FrmAlert( NoselectionAlert );		*buf = '\0';		len = 0;		param->fieldptr = NULL;		param->start = param->end = 0;	}	return len;}void putSelectedText(CharPtr buf, Param *param){	FieldAttrType attr;		FldGetAttributes( param->fieldptr, &attr );	if( param->fieldptr != NULL && attr.editable ) {		FldSetSelection( param->fieldptr, 0, 0 );		FldDelete( param->fieldptr, param->start, param->end );		FldInsert( param->fieldptr, buf, StrLen( buf ) );	}	return;}void reformatPastableText( CharPtr p, CharPtr buttonLabel, Param *param ){	Char *src;	if( param->pasteName ) {		src = param->buf1;	} else {		src = param->ptrCompanyTitle;	}	StrNCopy( p, src, MAX_TEXT * 2 );	if( StrLen( src ) == MAX_TEXT - 1 ) {		if( param->p.language == LANG_JP && isKanji( *(p + StrLen(p) - 1), '@') ) {	//	if( isKanji( *(p + StrLen(p) - 1), '@') ) {			*(p + StrLen(p) - 1) = '\0';		}		StrNCat( p, "...", MAX_TEXT * 2 );	}	if( param->pasteNumber ) {		StrNCat( p, " ", MAX_TEXT * 2 );		StrNCat( p, param->buf2, MAX_TEXT * 2 );		if( StrLen( param->buf2 ) == MAX_TEXT - 1 ) {			if( param->p.language == LANG_JP && isKanji( *(p + StrLen(p) - 1), '@') ) {	//		if( isKanji( *(p + StrLen(p) - 1), '@') ) {				*(p + StrLen(p) - 1) = '\0';			}			StrNCat( p, "...", MAX_TEXT * 2 );		}		if( param->p.pasteType && param->availPhoneText ) {			StrNCat( p, " ", MAX_TEXT * 2 );			StrNCat( p, buttonLabel, MAX_TEXT * 2 );		}	}	return;}/* $Revision: 1.2 $ * * $Log: CallToDA_txt.c,v $ * Revision 1.2  2001/04/28 16:53:53  kterada * add new option * * Revision 1.1  2001/01/19 16:12:07  kterada * add all items to repository * * Revision 1.4  2000/12/20 16:51:28  kterada * Add intl. comparation * * Revision 1.3  2000/08/22 15:57:18  kterada * Handle kanji 1st-byte * * Revision 1.2  2000/07/04 16:38:25  kterada * *** empty log message *** * */

⌨️ 快捷键说明

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