windows-nt/Source/XPSP1/NT/windows/feime/chs/ntabc/winabc/abcsda.c
2020-09-26 16:20:57 +08:00

562 lines
15 KiB
C

/*************************************************
* 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;
}