|
|
/*************************************************
* abcsda.c * * * * Copyright (C) 1995-1999 Microsoft Inc. * * * *************************************************/
#include <windows.h>
#include <winerror.h>
#include <winuser.h>
#include <windowsx.h>
#include <immdev.h>
#include <stdio.h>
#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<sizeof sound_cvt_table_index; i++){ if (tmp_chr==sound_cvt_table_index[i]){ tmp_chr=0xff; break;}//if
}//for
if (tmp_chr!=0xff){ //not fuher shengmu
// if (tmp_chr == 'U' )
/* Because 'I' also dont stand for any ShengMu, so when you type in a ShengMu,
'I' should also be ignored. , Fix Bug 27914 Weibing Zhan, 3-15-1996 */ if (tmp_chr == 'U' || tmp_chr == 'I') {current_number=0; MessageBeep(0); return(STC);} current_number=1; sda_out[0]=input_char; return(CLC); }
tmp_chr=sound_cvt_table_value[i]; if (tmp_chr==DK_RP){ current_number=1; sda_out[0]=DK_RP; return(CLC); }
begin_pos=(tmp_chr-1)*5; cnt=0; while (slbl_tab[begin_pos]!=0x30){ sda_out[cnt++]=(WORD)(slbl_tab[begin_pos++]|0x20); //change to small letter
} //get the fuher shengmu
current_number=(BYTE)cnt; return(CLC);
}
/**********************************************************
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_1(input_char) WORD input_char; { WORD tmp_chr,sy_pos;
tmp_chr=input_char; tmp_chr=(tmp_chr&0xdf)-0x41; //sub "a"
tmp_chr&=0xff;
sy_pos=rule_buf[rule_pointer-1].chr; sy_pos-=0x61; //sub "a"
sy_pos=sy_tab_base[sy_pos*26+tmp_chr]; if (!sy_pos){ MessageBeep(0); sda_out[0]=0xff; return(STC); }
tmp_chr=input_char&0xdf; tmp_chr-=0x41; //sub "A"
tmp_chr=sy_tab1[tmp_chr*2+sy_pos-1]; got_py(tmp_chr); return(CLC);
}
BOOL WINAPI got_py(tmp_chr) WORD tmp_chr; { int begin_pos,i;
if (tmp_chr>=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<begin_pos+26; i++){ match_flag=sy_tab_base[i]; if (match_flag){ tmp_num=sy_tab1[(key_match-0x61)*2+match_flag-1];
cnt=Key_Pos_Array[key_match-'a']*4; //one key has 4 units
if (tmp_num>=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<rule_buf[rule_pointer].length; i++) sda_out[i]=VK_BACK;
input_sum -= (BYTE)i; /* 94/4/21 input sum should sub when del */
if(!rule_pointer) { if (!Sd_Open) { sda_out[0]=0xf0; sda_out[1]=VK_ESCAPE; // DestroyWindow(hSdaKeyBWnd);
return (CLC); } else { sda_out[0] = VK_BACK; disp_tishi(hIMC, 1); return (CLC); } } if ( rule_buf[rule_pointer-1].type&0x30 ) disp_tishi(hIMC, 1); else { find_tishi_pp(rule_buf[rule_pointer-1].chr); disp_tishi(hIMC, 0);
}
return(CLC);
case ESCAPE: sda_out[0]=VK_ESCAPE; if (!Sd_Open){ sda_out[0]=0xf0; sda_out[1]=VK_ESCAPE; // DestroyWindow(hSdaKeyBWnd);
} else disp_tishi(hIMC, 1); //1993.4
return(CLC);
case SPACE: sda_out[0]=VK_SPACE; if (step_mode==ONINPUT){ if (!Sd_Open){ sda_out[0]=0xf0; //sign for main progress destroy the dialog
sda_out[1]=VK_SPACE; // DestroyWindow(hSdaKeyBWnd);
} else disp_tishi(hIMC, 1); //1993,4
} return(CLC); case CURSOR: sda_out[0]=0; MessageBeep((UINT)-1); return(STC); case CHR: if ( input_sum >= 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; }
|