562 lines
15 KiB
C
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;
|
|
}
|
|
|
|
|