📄 calltoda_txt.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 + -