/************************************************* * abcsda.c * * * * Copyright (C) 1995-1999 Microsoft Inc. * * * *************************************************/ #include #include #include #include #include #include #include "abc95def.h" #include "resource.h" #include "resrc1.h" //#include "data.H" #include "abcsda.h" /***************************************************** FUCTION: find if the input char is yuanyin or fuyin ENTRY: input char RESULT: STC----fuyin CLC----yuanyin ******************************************************/ BOOL WINAPI yuan_or_fu(input_char) WORD input_char; { switch (input_char&0xdf){ //change the xiaoxie to Cap, cock case 'A': case 'E': case 'I': case 'O': case 'U': return(CLC); default: return(STC); } } /********************************************************** FUCTION: match the fuyin or fuher fuyin ENTRY: input char RESULT: fill the correct spelling in the communicated buffer currect_number STC----not match CLC----match ************************************************************/ BOOL WINAPI match_and_find_0(input_char) WORD input_char; { WORD tmp_chr; int i,cnt,begin_pos; //if (input_char == 'u') // DebugShow ("match and find 0",0); tmp_chr=input_char&0xdf; //change it to CAP for (i=0; i=0x41){ sda_out[0]=tmp_chr|0x20; current_number=1; } else{ begin_pos=(tmp_chr-1)*5; i=0; while (slbl_tab[begin_pos]>0x30) sda_out[i++]=(WORD)(slbl_tab[begin_pos++]|0x20); //change to small letter current_number=(BYTE)i; } return 0; } /**************************************************** FUCTION: change the input char to correct spelling. ENTRY: STC-----not match CLC-----match *****************************************************/ BOOL WINAPI match_and_find(input_char) WORD input_char; { if (current_flag&0x10) { if (match_and_find_1(input_char)) return(1); //display shengmu tishi else return(-1); }//if else { if (!(match_and_find_0(input_char))) //find yumu return(-1); else { find_tishi_pp(input_char); return(0); } }//else } /******************************************************* find_tish_pp(): find the yumu which can match with the shengmu. ENTRY: input char RESULT: yumu in the yu_tishi[] buffer. *********************************************************/ BOOL WINAPI find_tishi_pp(input_char) WORD input_char; { int n,i,cnt,tmp_num; int begin_pos,match_flag; BYTE key_match; for (i=0; i<34*4; i++){ Key_Exc_Value[i]=0x20; } key_match='a'; begin_pos=(input_char-0x61)*26; for (i=begin_pos; i=0x30){ Key_Exc_Value[cnt]=(BYTE)tmp_num; }//if(tmp_num) else{ n=(tmp_num-1)*5; while (slbl_tab[n]>0x30) Key_Exc_Value[cnt++]=slbl_tab[n++]; }//else }//if(match_flag) key_match++; }//for return 0; //##!! } /******************************************************* FUCTION: fill the ruler buffer. ********************************************************/ BOOL WINAPI fill_rule(input_char) WORD input_char; { input_sum+=current_number; if (input_sum>40){ //94/4/21 >=40 sda_out[0]=0xff; //if input are more than 40 chars, input_sum -= current_number; MessageBeep(0); return(STC);} //don't input anymore else{ rule_buf[rule_pointer].length=current_number; rule_buf[rule_pointer].type=current_flag; rule_buf[rule_pointer].chr=input_char; rule_pointer++; return(CLC); } } /******************************************************** FUNCTION: find out the input char's character ENTRY: input_char RESULT: current_flag & char identification current_flag definication: 7 6 5 4 3 2 1 0 | | | | | | | |________1=fuyin | | | | | | |______________0 | | | | | |____________________0 | | | | |__________________________0 | | | |___________________0=this key is fuyin | | | 1=this key is yunmu | | |_________________________1=number | |_______________________________0 |_____________________________________1=zimu ********************************************************/ int WINAPI chr_type(input_char) WORD input_char; { if (!rule_pointer) current_flag=0; else current_flag=rule_buf[rule_pointer-1].type&0x10; if (input_char==VK_BACK) return(SDA_DELETE); switch (input_char) { //1993.4.20 omit the arrow key case VK_SPACE: //can't edit in SDA method return(SPACE); case VK_LEFT+0x100: //in C_input, VK_LEFT etc plus 0x100 case VK_UP+0x100: case VK_RIGHT+0x100: case VK_DOWN+0x100: return(CURSOR); } if (input_char==VK_ESCAPE) return(ESCAPE); if (input_char<0x20) return(FUC_CHR); //function key, just return key value if ((input_char>=0x30) && (input_char<0x3a)){ current_flag|=0x30; //00110000b mark number and set this key //94 4,8 current_flag = 0x20; return(SDA_NUMBER);} //is yumu if ((input_char>=0x61) && (input_char<=0x7a)){ if (rule_pointer){ if (current_flag) //if last current_flag need fuyn current_flag=0; //current_flag need yuanyin. else //vice versa current_flag=0x10; } if (yuan_or_fu(input_char)) //yuan=CLC current_flag|=0x88; //10001000b yuan else current_flag|=0x81; //10000001b fu return(CHR);} if ((input_char>=0x41) && (input_char<=0x5a)){ current_flag=0x90; //10010000b; CAP=yunmu return(CAP_CHR);} if ((input_char==DK_SUB)||(input_char==DK_ZHENGX)||(input_char==DK_FANX)) { current_flag=0x30; //produce like number //94 4,8 current_flag = 0x20; return(SDA_NUMBER); } if ((input_char==DK_LP)||(input_char==DK_RP)){ current_flag=0x88; //input is yuanyin 'o', return(CHR); //and we need yumu at this time } return(FUC_CHR); //rest key return } /****************************************************** disp_tishi(): send WM_PAINT message to the dialog in order to display the help *******************************************************/ void WINAPI disp_tishi(hIMC, mark) HIMC hIMC; int mark; { int i, j /*cnt*/,k; //DebugShow("mark",mark); if (mark == 9) {mark = disp_mark;} disp_mark = mark; j=0; if (mark){ //Shengmu tishi for (i=0; i<34; i++) for (k=0; k<4; k++) Key_Exc_Value[j++]=Sheng_Tishi[i][k]; /*for (i=0; i<4; i++){ cnt=Key_Pos_Array[Sheng_Mu[i]-'A']*4; Key_Exc_Value[cnt++]=Sheng_Tishi[j++]; //get fuhe shengmu Key_Exc_Value[cnt++]=Sheng_Tishi[j++]; cnt+=2; //4 units for one sheng mu }//for*/ }//if //SendMessage(hSdaKeyBWnd,MD_PAINT, 0x80, 0l); return ; } FAR PASCAL tran_data(hdSdaFlag, hIMC, Sd_Open_flag) int hdSdaFlag; //HWND Return; HIMC hIMC; BYTE Sd_Open_flag; { Sd_Open=Sd_Open_flag; if (hdSdaFlag==0) { // ShowWindow(hSdaKeyBWnd, SW_SHOWNOACTIVATE); // UpdateWindow(hSdaKeyBWnd); return TRUE; } if (hdSdaFlag==1) { // DestroyWindow(hSdaKeyBWnd); return TRUE; } if (hdSdaFlag==2) { // ShowWindow(hSdaKeyBWnd, SW_HIDE); // UpdateWindow(hSdaKeyBWnd); return TRUE; } disp_tishi(hIMC,9); // sda_ts(hIMC,WM_PAINT, 0, 0l); return TRUE; //InitKeyWindow(hdSdaProc, hIMC, hCursor); } int FAR PASCAL sda_proc(input_char,sda_trans,step_mode,hIMC) WORD input_char; LPWORD sda_trans; //sda_out is WORD BYTE step_mode; HIMC hIMC; { int i; int disp_flag; sda_out=sda_trans; if (step_mode==SELECT){ if ((input_char>=0x61) && (input_char<=0x7a)){ input_sum=0; rule_pointer=0; //if on SELECT step, and input ascii current_number=0;} //reset the pointer } if ((step_mode==START)||(step_mode==RESELECT)){ input_sum=0; rule_pointer=0; current_number=0; } switch(chr_type(input_char)){ case FUC_CHR: sda_out[0]=input_char; if (step_mode==ONINPUT){ if (!Sd_Open){ //for display keyboard sda_out[0]=0xf0; //sign for main progress destroy the dialog sda_out[1]=input_char; // DestroyWindow(hSdaKeyBWnd); }//if (Sd_Open) } return(CLC); case SDA_NUMBER: case CAP_CHR: if ( input_sum >= 40 ) { sda_out[0] = input_char; return(STC); } current_number=1; if (fill_rule(input_char)){ sda_out[0]=input_char; disp_tishi(hIMC, 1); return(CLC);} else return(STC); case SDA_DELETE: if ((!rule_pointer) || (step_mode!=ONINPUT)){ sda_out[0]=VK_BACK; return(CLC); } rule_pointer--; //rule_pointer go back one key for (i=0; i= 40 ) { sda_out[0] = input_char; return(STC); } if ((input_char==DK_LP)||(input_char==DK_RP)){ if(rule_buf[rule_pointer-1].chr!='o') input_char='o'; //1993.2 if left and right pie else { MessageBeep(0); return(STC); } } //produce like shengmu "o" disp_flag = match_and_find(input_char); if (disp_flag == -1 ) return(STC); else { if (fill_rule(input_char)) { disp_tishi(hIMC, disp_flag); return(CLC); } else return(STC); } } return STC; }