5762 lines
146 KiB
C
5762 lines
146 KiB
C
|
||
/*************************************************
|
||
* abc95wp.c *
|
||
* *
|
||
* Copyright (C) 1995-1999 Microsoft Inc. *
|
||
* *
|
||
*************************************************/
|
||
|
||
#include "windows.h"
|
||
#include "winuser.h"
|
||
#include "immdev.h"
|
||
#include "abc95def.h"
|
||
#include "abcbx.h"
|
||
struct INPT_BF kbf={40,0,{0}};
|
||
INT_PTR WINAPI OpenDlg(HWND,UINT,WPARAM,LPARAM);
|
||
int word_select_bx(int input_char);
|
||
|
||
int word_long;
|
||
int unit_length=2; /* single word */
|
||
int disp_tail=0;
|
||
int disp_head=0;
|
||
int group_no=24;
|
||
int current_no;
|
||
|
||
/******************************************************************
|
||
/* CharProc(ImeChar,wParam,lParam,hIMC,lpIMC,lpImcP) *
|
||
/*****************************************************************/
|
||
extern HWND hCrtDlg;
|
||
int WINAPI CharProc(ImeChar,wParam,lParam,hIMC,lpIMC,lpImcP)
|
||
WORD ImeChar;
|
||
WPARAM wParam;
|
||
LPARAM lParam;
|
||
HIMC hIMC;
|
||
LPINPUTCONTEXT lpIMC;
|
||
LPPRIVCONTEXT lpImcP;
|
||
{
|
||
int x;
|
||
|
||
ghIMC=hIMC;
|
||
glpIMCP=lpImcP;
|
||
glpIMC=lpIMC;
|
||
TypeOfOutMsg = 0;
|
||
waitzl_flag = 0; //waitzl 3
|
||
|
||
if (cap_mode){
|
||
if(ImeChar<0x8000){ //for mouse message pass
|
||
send_one_char(ImeChar/*wParam*/); // changed 94/8/6
|
||
return(0);
|
||
}
|
||
}
|
||
|
||
if(lpIMC->fdwConversion&IME_CMODE_NATIVE){
|
||
switch(kb_mode){
|
||
case CIN_STD: //stand change
|
||
if (V_Flag)
|
||
v_proc(ImeChar); // V fuction
|
||
else {
|
||
if (sImeG.cbx_flag==1) {
|
||
if (bx_allow) {
|
||
if (BX_MODE(ImeChar,wParam))
|
||
return(0);
|
||
}
|
||
} //if (sImeG.cbx_flag)
|
||
|
||
STD_MODE(ImeChar);
|
||
}
|
||
break;
|
||
|
||
case CIN_SDA: //double hit inputing
|
||
for (x=0; x<(sizeof sda_trans)/2; x++) //Note sizeof!! 1992 2
|
||
sda_trans[x]=0; //clear the transport buffer
|
||
|
||
if(((!step_mode)||(step_mode==RESELECT))&&((ImeChar == 0x60)||(ImeChar == 0x27)))
|
||
return (STD_MODE(ImeChar));
|
||
|
||
if (sImeG.cbx_flag==1) {
|
||
if (bx_allow){
|
||
if (BX_MODE(ImeChar,wParam))
|
||
return(0);
|
||
} //if (bx_allow)
|
||
} //if (sImeG.cbx_flag)
|
||
|
||
if ((step_mode==ONINPUT)&&(I_U_Flag==1)){
|
||
STD_MODE(ImeChar);
|
||
return(0);
|
||
}
|
||
|
||
if ( if_zimu_or_not((BYTE)ImeChar)/*||(wParam == 0x60)*/||(wParam == 0x27) )
|
||
{
|
||
if ((step_mode==START)||/*(Return==NULL)||*/(step_mode==RESELECT))
|
||
{
|
||
if (((wParam&0xdf)=='U')||((wParam&0xdf)=='I'))
|
||
{
|
||
I_U_Flag=1;
|
||
STD_MODE(ImeChar);
|
||
return(0);
|
||
} else {
|
||
I_U_Flag=0;
|
||
}//else...
|
||
}//if (step_mode....
|
||
|
||
if (!Sd_Open_flag){
|
||
if(KeyBoardState){
|
||
SdaPromptOpen=1;
|
||
tran_data(
|
||
0,
|
||
ghIMC,
|
||
Sd_Open_flag);
|
||
}//if Key
|
||
}//if (Sd_Open_flag)
|
||
}//if (if_zimu_...
|
||
|
||
if ((wParam==VK_BACK)&&(step_mode==ONINPUT)
|
||
&&(Return==NULL)&&(!Sd_Open_flag)){
|
||
if(KeyBoardState){
|
||
SdaPromptOpen=1;
|
||
tran_data(
|
||
0,
|
||
ghIMC,
|
||
Sd_Open_flag);
|
||
}
|
||
}//if (wParam)
|
||
|
||
|
||
sda_proc(ImeChar, (LPWORD)sda_trans, step_mode, ghIMC); //change the key into standed
|
||
|
||
if (sda_trans[0]==0xff) //change error or input more than 40 chars
|
||
break;
|
||
|
||
if (sda_trans[0]==0xf0){ //if free the dialog?
|
||
|
||
if(KeyBoardState){
|
||
tran_data(
|
||
2,
|
||
ghIMC,
|
||
Sd_Open_flag);
|
||
}//if key
|
||
|
||
SdaPromptOpen=0;
|
||
sda_trans[0]=sda_trans[1];
|
||
sda_trans[1]=0;
|
||
}
|
||
|
||
x=0; //chinese spelling
|
||
while (sda_trans[x]){
|
||
if (wait_flag && (sda_trans[x]=='h')) //waitzl 4
|
||
waitzl_flag = 1;
|
||
STD_MODE(sda_trans[x++]);
|
||
}
|
||
break;
|
||
}
|
||
}else
|
||
send_one_char(ImeChar/*wParam*/);
|
||
|
||
return (0);
|
||
|
||
}
|
||
|
||
|
||
/****************************************************************
|
||
v_proc(): produce the V fuction
|
||
*****************************************************************/
|
||
int WINAPI v_proc(input_char)
|
||
WORD input_char;
|
||
{
|
||
int i, n;
|
||
|
||
n=0;
|
||
|
||
if (V_Flag==1) {
|
||
switch (input_char) {
|
||
case '0':
|
||
case VK_BACK:
|
||
cls_inpt_bf(0);
|
||
step_mode = START;
|
||
V_Flag = 0;
|
||
return(1);
|
||
}
|
||
}
|
||
|
||
if ((if_number_or_not((BYTE)input_char)) && (V_Flag!=2)){
|
||
input_char &= 0x000f; //get the QUMA
|
||
for (i=1; i<=94; i++){ //get WEIMA
|
||
if (input_char==2){
|
||
if (i==1) i=17;
|
||
if (i==67) i=69;
|
||
if (i==79) i=81;
|
||
}
|
||
out_svw[n++]=input_char+0xa0;
|
||
out_svw[n++]=i+0xa0;
|
||
}
|
||
|
||
group_no=94;
|
||
if (input_char==2) group_no=72;
|
||
unit_length=2;
|
||
current_no=0;
|
||
disp_tail=0;
|
||
V_Flag=0;
|
||
msg_type=2; //94/8/22
|
||
fmt_transfer();
|
||
SetToIMC(ghIMC,(LPSTR)&out_svw,(WORD)group_no,(WORD)(unit_length+0x1000));
|
||
move_result();
|
||
prompt_disp();
|
||
word_back_flag=0x55; //93,9,4
|
||
step_mode=SELECT;
|
||
} //if (if_number_or_not)
|
||
else {
|
||
V_Flag=2;
|
||
step_mode=ONINPUT;
|
||
STD_MODE(input_char);
|
||
}
|
||
|
||
return (1);
|
||
|
||
}
|
||
|
||
int ReDrawSdaKB(hIMC, KbIndex, ShowOp)
|
||
HIMC hIMC;
|
||
DWORD KbIndex;
|
||
DWORD ShowOp;
|
||
{
|
||
//return 0;
|
||
if (KbIndex) // if not PC KB
|
||
return 0;
|
||
if (kb_mode != CIN_SDA)
|
||
return 0; // if not SDA mode
|
||
if (ShowOp==SW_HIDE)
|
||
return 0; // if SW_SHOW....
|
||
|
||
if (SdaInst){
|
||
tran_data(
|
||
0x5678, //Return,
|
||
ghIMC,//hWnd,
|
||
Sd_Open_flag);
|
||
return 1;}
|
||
return 0;
|
||
}
|
||
|
||
void WINAPI DispModeEx()
|
||
{
|
||
cls_inpt_bf(0);
|
||
step_mode=START;
|
||
}
|
||
|
||
/****************************************************************
|
||
FUNCTION: disp_mode(hW)
|
||
PORPUSE: display the mode item at the input window.
|
||
*****************************************************************/
|
||
void WINAPI DispMode(HIMC hIMC)
|
||
{
|
||
LPINPUTCONTEXT lpIMC;
|
||
LPPRIVCONTEXT lpImcP;
|
||
UINT fdwConversion;
|
||
|
||
if (!hIMC)
|
||
return;
|
||
lpIMC =(LPINPUTCONTEXT)ImmLockIMC(hIMC);
|
||
if (!lpIMC)
|
||
return;
|
||
lpImcP =(LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
|
||
if (!lpImcP)
|
||
return;
|
||
|
||
DispModeEx(); //zl#3(hW);
|
||
|
||
if (SdaInst&&(kb_mode!=CIN_SDA)){
|
||
|
||
Sd_Open_flag=0;
|
||
SdaPromptOpen=0;
|
||
SdaInst=0;
|
||
|
||
}
|
||
if ((kb_mode==CIN_SDA)&&(!SdaInst)) {
|
||
|
||
SdaInst = 1; // The ABCSDA.DLL is Load In.
|
||
|
||
}
|
||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||
ImmUnlockIMC(hIMC);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
void WINAPI DispSpecChar(c,n)
|
||
int c,n;
|
||
{
|
||
int i;
|
||
for (i=now_cs;i<n+now_cs;i++)
|
||
InputBuffer[i]=(BYTE)c;
|
||
ImeSetCompositionString(ghIMC,SCS_SETSTR,NULL,0,
|
||
&InputBuffer,now_cs+i);
|
||
|
||
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
|
||
void WINAPI show_char(string,count)
|
||
unsigned char *string;
|
||
int count;
|
||
{
|
||
|
||
int i;
|
||
BOOL fdwImeMsgKeep;
|
||
|
||
if(count==0) {
|
||
ImeSetCompositionString(ghIMC,SCS_SETSTR,NULL,0,
|
||
&InputBuffer,now_cs);
|
||
return ; }
|
||
|
||
|
||
for(i=0; i<count; i++)
|
||
InputBuffer[now_cs+i]=string[i];
|
||
now_cs+=count;
|
||
if (!(wait_flag | waitzl_flag )){ //waitzl 5
|
||
|
||
ImeSetCompositionString(ghIMC,SCS_SETSTR,NULL,0,
|
||
&InputBuffer,now_cs);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/******************************************************
|
||
disp_jiyi(): display the word "jiyi" in the windows
|
||
*******************************************************/
|
||
void WINAPI disp_jiyi(xxx)
|
||
HANDLE xxx;
|
||
{
|
||
}
|
||
|
||
|
||
/*********************************************************************
|
||
PROMPT_DISP(): display the result of changing.
|
||
**********************************************************************/
|
||
void WINAPI prompt_disp()
|
||
{
|
||
|
||
int i;
|
||
|
||
pass_word=0;
|
||
|
||
disp_head=disp_tail;
|
||
|
||
|
||
n=0;
|
||
for(i=0; i<now.fmt_group; i++){
|
||
|
||
disp_tail++;
|
||
|
||
if (disp_tail>=group_no){
|
||
pass_word=1;
|
||
if (disp_head==0)
|
||
pass_word=2;
|
||
break;}
|
||
}//for (i=...
|
||
|
||
if (pass_word<1){
|
||
pass_word=3;
|
||
if (disp_head==0)
|
||
pass_word=4;
|
||
}
|
||
|
||
|
||
SetToIMC(ghIMC,NULL,(WORD)pass_word,(WORD)disp_head);
|
||
|
||
}
|
||
|
||
|
||
/****************************************************
|
||
cls_prompt
|
||
*****************************************************/
|
||
int WINAPI cls_prompt()
|
||
{
|
||
int i;
|
||
|
||
|
||
for (i=0;i<sizeof InputBuffer;i++) InputBuffer[i]=0x20; //Clear the display buffer.
|
||
|
||
|
||
|
||
now_cs = 0;
|
||
//DispSpecChar((BYTE)0x20,sizeof InputBuffer);
|
||
|
||
cs_p(0);
|
||
|
||
SetCloseCompWinMsg(0);
|
||
cls_prompt_only();
|
||
|
||
return 0;
|
||
|
||
}
|
||
|
||
int WINAPI cls_prompt_only(){
|
||
int i;
|
||
LPINPUTCONTEXT lpIMC;
|
||
LPPRIVCONTEXT lpImcP;
|
||
|
||
|
||
if (!ghIMC) return (0); // The IMC must be a valid one.
|
||
|
||
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(ghIMC);
|
||
if(!lpIMC) return 0;
|
||
|
||
|
||
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
|
||
|
||
if ( lpImcP != NULL )
|
||
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
||
~(MSG_OPEN_CANDIDATE);
|
||
|
||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||
ImmUnlockIMC(ghIMC);
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
int WINAPI SetCloseCompWinMsg(int ClsFlag)
|
||
{
|
||
LPINPUTCONTEXT lpIMC;
|
||
LPPRIVCONTEXT lpImcP;
|
||
|
||
|
||
if (!ghIMC) return (0); // The IMC must be a valid one.
|
||
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(ghIMC);
|
||
if(!lpIMC) return 0;
|
||
|
||
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
|
||
if (!ClsFlag )
|
||
{
|
||
if ( lpImcP != NULL )
|
||
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_END_COMPOSITION ) &
|
||
~(MSG_COMPOSITION) ;
|
||
}
|
||
|
||
|
||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||
ImmUnlockIMC(ghIMC);
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
|
||
void WINAPI ABCstrnset(bufferd,value,n)
|
||
LPSTR bufferd;
|
||
BYTE value;
|
||
{
|
||
int i;
|
||
for (i=0; i<n; i++) bufferd[i]=value;
|
||
return;
|
||
}
|
||
|
||
LPSTR WINAPI ABCstrstr(str1,str2)
|
||
LPSTR str1,str2;
|
||
{
|
||
int i,m,n,j,pos;
|
||
m=lstrlen(str1);
|
||
n=lstrlen(str2);
|
||
if(!n) return str1;
|
||
|
||
pos=0xffff0;
|
||
for(i=0;i<m-n; i++){
|
||
pos=i;
|
||
for(j=0;j<n;j++) {
|
||
if (str1[i+j]!=str2[j])
|
||
{ pos=0xffff0;break;}}
|
||
if (pos!=0xffff0) break;
|
||
}
|
||
if (pos==0xffff0) return NULL;
|
||
return str1+pos;
|
||
}
|
||
|
||
|
||
/*****************************************************
|
||
back_a_space(x): do a BACKSPACE command
|
||
******************************************************/
|
||
int WINAPI back_a_space(x)
|
||
int x;
|
||
{
|
||
|
||
if (x<=0){
|
||
x=0;
|
||
MessageBeep(0);}
|
||
else{
|
||
x--;
|
||
InputBuffer[x]=' ';
|
||
cs_p(x);
|
||
}
|
||
return(x);
|
||
}
|
||
|
||
|
||
/******************************************************
|
||
cs_p
|
||
*******************************************************/
|
||
int WINAPI cs_p(x)
|
||
int x;
|
||
{
|
||
int xx,yy,zz,kk,i;
|
||
now_cs=x;
|
||
|
||
cur_hibit=1;
|
||
hDC=GetDC(hInputWnd);
|
||
kk=(WORD)(GetText32(hDC, InputBuffer, x))
|
||
+CUR_START_X;
|
||
cur_start_ps=(WORD)(GetText32(hDC, InputBuffer,cur_start_count ))
|
||
+CUR_START_X;
|
||
zz=kk-cur_start_ps;
|
||
|
||
if (x<cur_start_count){
|
||
cur_start_count=(WORD)x;
|
||
now_cs_dot=CUR_START_X;
|
||
ReleaseDC(hInputWnd,hDC);
|
||
UpdateCompCur(hInputWnd);
|
||
cur_hibit=0;
|
||
return 0;}
|
||
|
||
if (zz>=(CUR_START_X+(lpImeL->rcCompText.right-4))){
|
||
xx=CUR_START_X;
|
||
for (i =now_cs; i>0; i--)
|
||
{ yy=GetText32(hDC, &InputBuffer[i-1], 1);
|
||
if ( (xx+yy) >= (CUR_START_X+(lpImeL->rcCompText.right-4)))
|
||
break;
|
||
else xx+=yy;
|
||
}
|
||
cur_start_count=(WORD)i;
|
||
|
||
// Adgust for Chines Word Display
|
||
|
||
kk=0;
|
||
for (i=0; i<cur_start_count; i++){
|
||
if (InputBuffer[i]>0xa0){
|
||
kk++;
|
||
kk&=1;
|
||
} else
|
||
kk=0;}
|
||
if (kk){
|
||
xx=xx- GetText32(hDC, &InputBuffer[cur_start_count], 1);
|
||
cur_start_count++;
|
||
}
|
||
|
||
cur_start_ps=(WORD)GetText32(hDC, &InputBuffer[0], i);
|
||
now_cs_dot=xx;
|
||
ReleaseDC(hInputWnd,hDC);
|
||
UpdateCompCur(hInputWnd);
|
||
cur_hibit=0;
|
||
return 0;
|
||
}
|
||
|
||
cur_hibit=0;
|
||
ReleaseDC(hInputWnd,hDC);
|
||
|
||
if (zz<(CUR_START_X+(lpImeL->rcCompText.right-4))){
|
||
now_cs_dot=kk-cur_start_ps;
|
||
DrawInputCur();
|
||
}
|
||
return 0;
|
||
|
||
}
|
||
/********************************************************************
|
||
Function:DrawInputCur
|
||
********************************************************************/
|
||
void WINAPI DrawInputCur()
|
||
{
|
||
|
||
|
||
HDC OldDC;
|
||
if (!hInputWnd) return;
|
||
|
||
if ((WORD)now_cs_dot!=old_curx)
|
||
{
|
||
if (cur_flag)
|
||
{
|
||
hDC=GetDC(hInputWnd);
|
||
OldDC=SelectObject(hMemoryDC,cur_h);
|
||
BitBlt(hDC,old_curx+lpImeL->rcCompText.left,
|
||
lpImeL->rcCompText.top+3,
|
||
CUR_W,CUR_H,hMemoryDC,0,0,SRCINVERT);
|
||
SelectObject(hMemoryDC,OldDC);
|
||
ReleaseDC(hInputWnd,hDC);
|
||
cur_flag=!cur_flag;
|
||
}
|
||
old_curx=(WORD)now_cs_dot;
|
||
}
|
||
hDC=GetDC(hInputWnd);
|
||
OldDC=SelectObject(hMemoryDC,cur_h);
|
||
BitBlt(hDC,now_cs_dot+lpImeL->rcCompText.left,
|
||
lpImeL->rcCompText.top+3,
|
||
CUR_W,CUR_H,hMemoryDC,0,0,SRCINVERT);
|
||
SelectObject(hMemoryDC,OldDC);
|
||
ReleaseDC(hInputWnd,hDC);
|
||
cur_flag=!cur_flag;
|
||
|
||
return;
|
||
}//#0
|
||
|
||
/************************************************************
|
||
UpdateUser(): if the user.rem has changed, clear the tmmr.rem_area
|
||
and read the user.rem's index once again.
|
||
*************************************************************/
|
||
void WINAPI UpdateUser()
|
||
{
|
||
// 94/4/16 HANDLE hd;
|
||
int hd;
|
||
int i;
|
||
WORD op_count;
|
||
OFSTRUCT ofs;
|
||
|
||
|
||
if (UpdateFlag) { //increase the user.rem
|
||
for (i=0; i<0x200; i++) //1993.3
|
||
tmmr.rem_area[i] = 0;
|
||
last_item_name=0; //clear the date in memory flag
|
||
UpdateFlag = 0;
|
||
|
||
hd = OpenFile (user_lib, &ofs, OF_READ); //1993.4.15
|
||
if (hd==-1)
|
||
err_exit_proc(jiyi_wenjian_cuo);
|
||
_llseek(hd,0xa000l,0);
|
||
op_count=(WORD)_lread(hd,&kzk_ndx,NDX_REAL_LENGTH);
|
||
if (op_count!=NDX_REAL_LENGTH)
|
||
err_exit_proc(jiyi_wenjian_cuo);
|
||
_lclose(hd);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
//##!!extern void AddExtLib();
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////
|
||
// STD_MODE
|
||
// Deels with stdandard Chinese Pinyin input with some written_stroke
|
||
// attributes when neccerry.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
int WINAPI STD_MODE(input_char)
|
||
WORD input_char;
|
||
{
|
||
int leibie,input_char_type,i;
|
||
sImeG.InbxProc = 0;
|
||
wait_flag=0;
|
||
if (input_char==BACKWORD_KEY)
|
||
return(backword_proc());
|
||
if (input_char==FORWORD_KEY){
|
||
if ((step_mode!=ONINPUT)&&(group_no>1))
|
||
step_mode=SELECT;
|
||
return(0);}
|
||
|
||
switch(step_mode){ //step_mode indicate the input step
|
||
// step_mode take this value:
|
||
// START=0 first input pinyin
|
||
// SELECT=1 can select/cansel the result
|
||
// RESELECT=2 use FORCE SELECT KEY
|
||
// ONINPUT=3 just in inputing step
|
||
case SELECT:
|
||
if ((input_char==VK_HOME*0x100)||
|
||
(input_char==VK_END*0x100)||
|
||
(input_char==VK_PRIOR*0x100)||
|
||
(input_char==VK_NEXT*0x100)){
|
||
word_select(input_char);
|
||
break;}
|
||
|
||
if (input_char>=0x8000)
|
||
input_char-=0x8000;
|
||
|
||
if ((input_char==VK_SPACE)||(input_char==VK_RETURN)){
|
||
if(!out_result(0))
|
||
step_mode=RESELECT; //92/12/14 SZ
|
||
break;
|
||
}
|
||
|
||
if (input_char==VK_ESCAPE){
|
||
cls_inpt_bf(0);
|
||
step_mode=START;
|
||
break;
|
||
}
|
||
|
||
if (input_char==VK_BACK){
|
||
if (word_back_flag!=0x55)
|
||
del_and_reconvert();
|
||
break;
|
||
}
|
||
|
||
if (if_zimu_or_not((BYTE)input_char)){
|
||
wait_flag=1;
|
||
while(out_result(0));
|
||
step_mode=START;
|
||
}
|
||
else{
|
||
word_select(input_char);
|
||
break;
|
||
}
|
||
|
||
case RESELECT:
|
||
case START:
|
||
|
||
if (input_char >= 0x8000){
|
||
input_char -= 0x8000;
|
||
if ( word_select(input_char) == 1 )
|
||
return(0);
|
||
else
|
||
return(send_one_char(input_char));
|
||
}//if (input_char)
|
||
|
||
else{
|
||
if (if_first_key(input_char)){
|
||
if (input_char=='v')
|
||
V_Flag = 1;
|
||
else {
|
||
V_Flag = 0; } //93,9,3
|
||
step_mode=ONINPUT;
|
||
sent_back_msg();
|
||
if (wait_flag) cls_inpt_bf(1);
|
||
else cls_inpt_bf(1); //1993. cock
|
||
}
|
||
|
||
else{
|
||
if ((kb_mode==CIN_SDA)&&(input_char==0x27)){ //1993. cock
|
||
step_mode=ONINPUT; //1993. cock
|
||
sent_back_msg(); //1993. cock
|
||
if (wait_flag) cls_inpt_bf(1);
|
||
else cls_inpt_bf(1); //1993. cock
|
||
}//if(kb_mode) //1993. cock
|
||
else
|
||
return(send_one_char(input_char));
|
||
}
|
||
}
|
||
|
||
case ONINPUT:
|
||
input_char_type=sent_chr1(input_char);
|
||
|
||
switch(input_char_type){
|
||
case REINPUT:
|
||
ImeSetCompositionString(ghIMC,SCS_SETSTR,NULL,0,&InputBuffer,now_cs);//#52224
|
||
|
||
step_mode=START;
|
||
return(0);
|
||
break;
|
||
|
||
case CLC:
|
||
return(0); // Continue input.
|
||
|
||
case STC: // input finished
|
||
if (V_Flag){
|
||
msg_type=2; //94/8/22
|
||
send_msg(&in.buffer[1], in.true_length-1); //1993.3 skip the 'v'
|
||
V_Flag = 0;
|
||
step_mode = 0;
|
||
return(0);}
|
||
|
||
step_mode=4 ; // enter proccessing step
|
||
leibie=analize();
|
||
if (leibie==BIAODIAN_ONLY){
|
||
out_result_area[0]=(BYTE)biaodian_value;
|
||
out_pointer=2; // may not used
|
||
msg_type=0;
|
||
out_result(0);
|
||
step_mode=0;
|
||
return(0);
|
||
} //only bioadian case
|
||
|
||
return(call_czh(leibie));
|
||
}// switch (sent_chr1)
|
||
|
||
} //switch step_mode
|
||
|
||
return 0;
|
||
}
|
||
/*******************************************************************
|
||
&2:
|
||
DealWithSH():
|
||
********************************************************************/
|
||
void WINAPI DealWithSH()
|
||
{
|
||
int len,p;
|
||
|
||
if (group_no <= 1)
|
||
return;
|
||
if (unit_length > 2)
|
||
return;
|
||
if (in.true_length != 2) return;
|
||
|
||
if (in.buffer[0] != 's') return;
|
||
if (in.buffer[1] != 'h') return ;
|
||
|
||
current_no = 1;
|
||
}
|
||
|
||
/*******************************************************************
|
||
&2:
|
||
call_czh():
|
||
********************************************************************/
|
||
int WINAPI call_czh(mtype)
|
||
int mtype;
|
||
{
|
||
int x;
|
||
unsigned char prompt_flag_wu[]="<EFBFBD>ޣ<EFBFBD>";
|
||
|
||
|
||
jiyi_mode=0;
|
||
in.buffer[in.true_length]=0;
|
||
sImeG.cp_ajust_flag = 0;
|
||
group_no=0;
|
||
unit_length=0;
|
||
|
||
if (cwp_proc(mtype)!=1){
|
||
MessageBeep((UINT)-1);
|
||
MessageBeep(0); //word exchange is wrong
|
||
MessageBeep(0);
|
||
MessageBeep(0); //word exchange is wrong
|
||
|
||
if (result_area_pointer>=0){
|
||
// jiyi_mode=0;
|
||
// group_no =0;
|
||
// cls_prompt_only();
|
||
// unit_length=result_area_pointer;
|
||
// out_result(1);
|
||
// step_mode=0;
|
||
// return(9);
|
||
// }//result_area
|
||
//else{
|
||
// show_char(prompt_flag_wu,4);
|
||
|
||
step_mode=ONINPUT;
|
||
return(0);
|
||
}
|
||
} //cwp_proc=-1
|
||
|
||
|
||
disp_jiyi(0);
|
||
if (msg_type==2){
|
||
current_no=0;
|
||
move_result();
|
||
out_result(1); /* special change*/
|
||
return(0);
|
||
}
|
||
if_jlxw_mode();
|
||
fmt_transfer();
|
||
current_no=0;
|
||
DealWithSH();
|
||
if (group_no==1){
|
||
if (sImeG.cp_ajust_flag!=0)
|
||
result_area_pointer-=unit_length;
|
||
move_result();
|
||
step_mode=1;
|
||
return(0);
|
||
}//if (group_no=1)
|
||
else{
|
||
|
||
disp_tail=0;
|
||
if (sImeG.cp_ajust_flag==1)
|
||
AutoMoveResult();
|
||
else
|
||
move_result();
|
||
|
||
SetToIMC(ghIMC,(BYTE *)&out_svw,(WORD)group_no,(WORD)unit_length);
|
||
prompt_disp();
|
||
step_mode=1;
|
||
return(0);
|
||
}//else
|
||
}
|
||
|
||
/**********************************************************************/
|
||
/* MoveWordIntoCand() */
|
||
/**********************************************************************/
|
||
void WINAPI MoveWordIntoCand(
|
||
LPCANDIDATELIST lpCandList,
|
||
LPBYTE srcBuffer,
|
||
BYTE srcAttr,
|
||
WORD perLength )
|
||
{
|
||
|
||
int i;
|
||
|
||
if (lpCandList->dwCount >= MAXCAND) {
|
||
return;
|
||
}
|
||
|
||
|
||
// add this string into candidate list
|
||
for (i=0; i<perLength; i++)
|
||
*(LPBYTE)((LPBYTE)lpCandList + lpCandList->dwOffset[
|
||
lpCandList->dwCount]+i) =srcBuffer[i] ;
|
||
|
||
// null terminator
|
||
|
||
*(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[
|
||
lpCandList->dwCount] + i ) = '\0';
|
||
|
||
*(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[
|
||
lpCandList->dwCount] + i+1 ) = srcAttr;
|
||
|
||
|
||
|
||
lpCandList->dwOffset[lpCandList->dwCount + 1] =
|
||
lpCandList->dwOffset[lpCandList->dwCount] +
|
||
i + sizeof(TCHAR)+1;
|
||
lpCandList->dwCount++;
|
||
|
||
return;
|
||
}
|
||
|
||
/**********************************************************************/
|
||
/* SetToIMC() */
|
||
/* Return vlaue */
|
||
/* the number of candidates in the candidate list */
|
||
/**********************************************************************/
|
||
UINT WINAPI SetToIMC(ghIMC,srcBuffer,srcCount,perLength)
|
||
HIMC ghIMC;
|
||
BYTE *srcBuffer; //soarce buffer (normal for out_svw)
|
||
WORD srcCount; //How many candidates are.
|
||
WORD perLength; //How long of each of that?
|
||
{
|
||
LPINPUTCONTEXT lpIMC;
|
||
LPCANDIDATEINFO lpCandInfo;
|
||
LPCANDIDATELIST lpCandList;
|
||
LPPRIVCONTEXT lpImcP;
|
||
INT i,j,nRecord,where;
|
||
WORD temp[20],xx,yy;
|
||
LPSTR ppt;
|
||
static int CandiCount;
|
||
|
||
where = 0 ;
|
||
if (perLength>0x1000){
|
||
perLength -=0x1000; // if where = 1, msg_type = 2
|
||
where = 1;}
|
||
|
||
|
||
if (!ghIMC) return (0); // The IMC must be a valid one.
|
||
|
||
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(ghIMC);
|
||
if(!lpIMC) return 0;
|
||
|
||
if (srcBuffer) ClearCand(lpIMC);
|
||
|
||
if (!lpIMC->hCandInfo){
|
||
ImmUnlockIMC(ghIMC);
|
||
return (0); }
|
||
// The CandInfo must...
|
||
|
||
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
|
||
if (!lpCandInfo) {
|
||
ImmUnlockIMC(ghIMC);
|
||
return (0);}
|
||
|
||
|
||
lpCandList = (LPCANDIDATELIST)
|
||
((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
|
||
if(srcBuffer){
|
||
CandiCount = srcCount;
|
||
lpCandList->dwCount = 0;
|
||
for (i=0; i<(int)srcCount; i++){
|
||
if ( where ) {
|
||
ppt = (LPSTR)temp;
|
||
for (j=0; j<perLength; j++)
|
||
ppt[j] = srcBuffer[i*perLength+j];
|
||
}
|
||
else {
|
||
for(j=0; j<perLength; j=j+2){
|
||
xx = srcBuffer[i*perLength+j];
|
||
yy = srcBuffer[i*perLength+j+1]*0x100;
|
||
yy = yy + xx;
|
||
temp[j/2]=(WORD)find_hz(yy);
|
||
} // for j loop
|
||
} // else loop
|
||
|
||
MoveWordIntoCand(lpCandList,
|
||
(LPSTR)temp,
|
||
0,//NULL,
|
||
perLength);
|
||
} //for i loop
|
||
// default start from 0
|
||
lpCandList->dwSelection = 0;
|
||
// for showing phrase prediction string(s)
|
||
nRecord = lpCandInfo->dwCount;
|
||
|
||
} else {
|
||
|
||
lpCandList->dwSelection = perLength;
|
||
//Hack for IME aware application 9/13/96
|
||
lpCandInfo->dwCount = CandiCount;
|
||
// for showing phrase prediction string(s)
|
||
nRecord = lpCandInfo->dwCount;
|
||
}
|
||
|
||
|
||
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
|
||
|
||
if ( lpImcP != NULL )
|
||
{
|
||
if ((lpImcP->fdwImeMsg & (MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) ==
|
||
(MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) {
|
||
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CHANGE_CANDIDATE) &
|
||
~(MSG_CLOSE_CANDIDATE);
|
||
} else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
||
lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE;
|
||
} else {
|
||
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE) &
|
||
~(MSG_CLOSE_CANDIDATE);
|
||
}
|
||
}
|
||
|
||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||
ImmUnlockIMCC(lpIMC->hCandInfo);
|
||
ImmUnlockIMC(ghIMC);
|
||
return (nRecord); /* The real number of being moved */
|
||
}
|
||
|
||
|
||
|
||
|
||
/********************************************************************
|
||
word_select(wParam): select the word or turn to the next or up page
|
||
*********************************************************************/
|
||
int WINAPI word_select(input_char)
|
||
int input_char;
|
||
{
|
||
int x;
|
||
|
||
switch (input_char){
|
||
|
||
case VK_END*0x100:
|
||
case VK_NEXT*0x100:
|
||
case '=': //94/8/22
|
||
case ']':
|
||
if (disp_tail>=group_no)
|
||
MessageBeep(0);
|
||
else{
|
||
|
||
if(input_char == VK_END*0x100 ){
|
||
disp_head = (group_no - 1)/now.fmt_group*now.fmt_group;
|
||
disp_tail = disp_head;}
|
||
|
||
fmt_transfer();
|
||
current_no=disp_tail;
|
||
result_area_pointer-=unit_length; //if recall, unit_length=8
|
||
if (in.info_flag==1) //result_area_pointer maybe small
|
||
result_area_pointer=0; //than zero, so reset it =0
|
||
|
||
move_result();
|
||
prompt_disp();}
|
||
return(1); //means break the STD MODE
|
||
|
||
case VK_HOME*0x100:
|
||
case '-': //94/8/22
|
||
case '[':
|
||
case VK_PRIOR*0x100:
|
||
if (disp_head==0)
|
||
|
||
MessageBeep(0);
|
||
else{
|
||
|
||
if(input_char == VK_HOME*0x100 )
|
||
disp_head = 0;
|
||
else
|
||
disp_head=disp_head-now.fmt_group;
|
||
|
||
disp_tail=disp_head;
|
||
fmt_transfer();
|
||
current_no=disp_tail;
|
||
result_area_pointer-=unit_length; //if recall, unit_length=8
|
||
if (in.info_flag==1) //result_area_pointer maybe small
|
||
result_area_pointer=0; //than zero, so reset it =0
|
||
move_result();
|
||
prompt_disp();
|
||
}
|
||
return(1);
|
||
|
||
default:
|
||
if (if_biaodian((BYTE)input_char)){ //1993.1.15 cock
|
||
if (!biaodian_value){
|
||
sent_chr1(input_char); //this produce the situation
|
||
bd_proc(); //when the result had display
|
||
while(out_result(0)); //94-4-22
|
||
step_mode=START;
|
||
return(1); //1993.1.15 cock
|
||
}
|
||
}
|
||
|
||
if ( !if_number_or_not((BYTE)input_char)) { //1993.4.22
|
||
while(out_result(0)); //94-4-22 //if input is not number
|
||
step_mode = START; //send the result and set start step
|
||
return(1);
|
||
} //1993.4.22
|
||
|
||
if(input_char=='0') x=disp_head+9; //92/12/21 SZ
|
||
else
|
||
x=(input_char-0x30-1)+disp_head;
|
||
|
||
if (x>=group_no) //1994.4
|
||
current_no=group_no-1;
|
||
else
|
||
current_no=x;
|
||
result_area_pointer-=unit_length; //if recall, unit_length=8
|
||
if (in.info_flag==1) //result_area_pointer maybe small
|
||
result_area_pointer=0; //than zero, so reset it =0
|
||
else{
|
||
if((step_mode==RESELECT)
|
||
&&biaodian_value
|
||
&&(result_area_pointer>=biaodian_len))
|
||
result_area_pointer-=biaodian_len;
|
||
}
|
||
|
||
move_result();
|
||
pindu_ajust();
|
||
step_mode=RESELECT; //Note: pindu_ajust
|
||
out_result(0); // must above out_result
|
||
return(1); // step_mode must be set to 2(Re..)
|
||
}
|
||
}
|
||
|
||
/*********************************************
|
||
del_and_reconvert()
|
||
**********************************************/
|
||
int WINAPI del_and_reconvert()
|
||
{
|
||
int x;
|
||
|
||
if (word_back_flag==0xaa)
|
||
return(same_as_backwords());
|
||
|
||
wp.dw_count--;
|
||
x=wp.dw_stack[wp.dw_count+1]-wp.dw_stack[wp.dw_count];
|
||
if (x==1){ //if the single word exchange
|
||
if (!wp.dw_count)
|
||
return(same_as_backwords());
|
||
else{
|
||
wp.dw_count--;
|
||
x=wp.dw_stack[wp.dw_count+1]-wp.dw_stack[wp.dw_count]+1;
|
||
}
|
||
}
|
||
result_area_pointer-=x*2;
|
||
word_back_flag=x-1;
|
||
wp.xsyjw=wp.dw_stack[wp.dw_count];
|
||
return(call_czh(13));
|
||
|
||
}
|
||
|
||
/***********************************************
|
||
backword_proc()
|
||
************************************************/
|
||
int WINAPI backword_proc()
|
||
{
|
||
switch(step_mode){
|
||
case SELECT:
|
||
return(same_as_backwords());
|
||
break;
|
||
|
||
case RESELECT:
|
||
case START:
|
||
if ((!msg_type)&&((kb_mode==CIN_STD)||(kb_mode==CIN_SDA)))
|
||
return(same_as_backwords());
|
||
else
|
||
send_msg(msg_bf,msg_count);
|
||
break;
|
||
case ONINPUT:
|
||
return(call_czh(14));
|
||
break;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
/***********************************************
|
||
same_as_backwords()
|
||
************************************************/
|
||
int WINAPI same_as_backwords()
|
||
{
|
||
int i;
|
||
|
||
if (in.buffer[0]!='v'){
|
||
cls_prompt_only();
|
||
if (in.true_length>=1)
|
||
if (in.buffer[0]!='U')
|
||
if (!cap_mode){
|
||
cs_p(input_msg_disp);
|
||
show_char(in.buffer,in.true_length);
|
||
cs_p(input_msg_disp+in.true_length);
|
||
half_init();
|
||
if (kb_mode==CIN_STD||kb_mode==CIN_SDA){ //STD_MODE
|
||
step_mode=ONINPUT;
|
||
return(0);
|
||
}//if (kb_mode)
|
||
return(read_kb()); //double hit input_mode
|
||
}//if (cap_mode)
|
||
|
||
}//if (in.buffer[0])
|
||
out_length=last_out_length;
|
||
return(REINPUT);
|
||
|
||
}
|
||
/*******************************************
|
||
AutoMoveResult()
|
||
********************************************/
|
||
void WINAPI AutoMoveResult()
|
||
{
|
||
int i,j,ct;
|
||
WORD x;
|
||
BYTE *ps,*pd;
|
||
|
||
x=(WORD)unit_length;
|
||
j=unit_length*current_no;
|
||
|
||
for (i=0;i<group_no;i++){
|
||
ct=0;
|
||
for (j=0; j<x; j++)
|
||
if (result_area[result_area_pointer+i]==out_svw[j*unit_length+i])
|
||
ct++;
|
||
if (ct == x){
|
||
current_no=i;
|
||
break;}
|
||
}
|
||
|
||
disp_auto_select();
|
||
|
||
}
|
||
|
||
|
||
/*******************************************
|
||
move_result()
|
||
********************************************/
|
||
void WINAPI move_result()
|
||
{
|
||
int i,j;
|
||
WORD x;
|
||
BYTE *p;
|
||
|
||
p=(BYTE *)msx_area;
|
||
if (in.info_flag==1){ // recall statue
|
||
x=*(p+current_no*22);
|
||
j=current_no*22+1;
|
||
for (i=0; i<x; i++)
|
||
result_area[result_area_pointer++]=*(p+j+i);
|
||
}
|
||
else{
|
||
x=(WORD)unit_length;
|
||
j=unit_length*current_no;
|
||
for (i=0; i<x; i++)
|
||
result_area[result_area_pointer++]=out_svw[j+i];
|
||
}
|
||
|
||
if (now.fmt_start!=12)
|
||
disp_auto_select();
|
||
|
||
}
|
||
|
||
/********************************************
|
||
pindu_ajust()
|
||
********************************************/
|
||
int WINAPI pindu_ajust()
|
||
{
|
||
if (sImeG.auto_mode!=1)
|
||
return(0); //if the pindu_ajust mode is set
|
||
if (group_no<=1)
|
||
return(0);
|
||
if (unit_length>6)
|
||
return(0);
|
||
if (msg_type&2)
|
||
return(0);
|
||
|
||
switch (unit_length){
|
||
case 2:
|
||
rem_pd1((WORD *)&out_svw[current_no*unit_length]);
|
||
break;
|
||
case 4:
|
||
rem_pd2((WORD *)&out_svw[current_no*unit_length]);
|
||
break;
|
||
default:
|
||
rem_pd3((WORD *)&out_svw[current_no*unit_length]);
|
||
break;
|
||
}
|
||
return (0);
|
||
}
|
||
|
||
|
||
|
||
|
||
/***********************************************************
|
||
cls_inpt_bf(): inputing information init. clear the display
|
||
area, and give the init_value to processing
|
||
paraments.
|
||
************************************************************/
|
||
void WINAPI cls_inpt_bf(int hFunc)
|
||
{
|
||
int i;
|
||
cls_prompt_only();
|
||
input_cur=0;//input_msg_disp;
|
||
|
||
for (i=0;i<in.max_length;i++)
|
||
in.buffer[i]=0;
|
||
|
||
for (i=0;i<sizeof InputBuffer; i++) InputBuffer[i]=' ';
|
||
SetCloseCompWinMsg(hFunc);
|
||
cs_p(0/*input_msg_disp*/);
|
||
|
||
|
||
pass_word=0;
|
||
group_no=0;
|
||
now.fmt_group=0;
|
||
disp_head=0;
|
||
disp_tail=0;
|
||
|
||
in.true_length=0;
|
||
in.info_flag=0;
|
||
|
||
result_area_pointer=0;
|
||
|
||
word_back_flag=0;
|
||
|
||
biaodian_value=0;
|
||
|
||
msg_type=0;
|
||
jiyi_mode=0;
|
||
new_no=0;
|
||
end_flg=0;
|
||
|
||
}
|
||
|
||
|
||
void InitCvtPara(void){
|
||
int i;
|
||
|
||
input_cur=0;//input_msg_disp;
|
||
|
||
for (i=0;i<in.max_length;i++)
|
||
in.buffer[i]=0;
|
||
|
||
for (i=0;i<sizeof InputBuffer; i++) InputBuffer[i]=' ';
|
||
now_cs = 0;
|
||
cs_p(now_cs);
|
||
|
||
step_mode = 0;
|
||
pass_word=0;
|
||
|
||
in.true_length=0;
|
||
in.info_flag=0;
|
||
|
||
result_area_pointer=0;
|
||
|
||
word_back_flag=0;
|
||
|
||
biaodian_value=0;
|
||
|
||
msg_type=0;
|
||
jiyi_mode=0;
|
||
new_no=0;
|
||
end_flg=0;
|
||
|
||
V_Flag = 0;
|
||
bx_inpt_on = 0;
|
||
}
|
||
|
||
|
||
/*****************************************
|
||
half_init()
|
||
******************************************/
|
||
void WINAPI half_init()
|
||
{
|
||
step_mode=ONINPUT;
|
||
result_area_pointer=0;
|
||
biaodian_value=0;
|
||
new_no=0;
|
||
msg_type=0;
|
||
word_back_flag=0;
|
||
jiyi_mode=0;
|
||
input_cur=now_cs;
|
||
}
|
||
|
||
/*******************************************************
|
||
sent_chr1(): send the string received from the keyboard
|
||
to the received buffer.
|
||
"JMP K1": return(REINPUT)
|
||
"JMP RECALL": return(RECALL)
|
||
"STC": return(STC)
|
||
"CLC": return(CLC)
|
||
********************************************************/
|
||
int WINAPI sent_chr1(input_char)
|
||
int input_char;
|
||
{
|
||
int bd_find=0,i;
|
||
|
||
if ((input_char < 0x21)||(input_char == 0x12e)){
|
||
switch(input_char){
|
||
|
||
case VK_ESCAPE: //VK_ESCAPE=0x1b:
|
||
cls_inpt_bf(0);
|
||
return(REINPUT); /* JMP K1 */
|
||
|
||
case VK_SPACE: //CK_SPACE=0x20
|
||
in.info_flag=BY_WORD;
|
||
return(STC); /* STC */
|
||
|
||
case VK_DELETE+0X100:
|
||
if (in.true_length>input_cur){
|
||
for (i=0;i<in.true_length-input_cur-1;i++)
|
||
in.buffer[input_cur+i]
|
||
=in.buffer[input_cur+i+1];
|
||
in.true_length--;
|
||
|
||
in.buffer[in.true_length]=0x20;
|
||
cs_p(0);
|
||
show_char(in.buffer,in.true_length+1);
|
||
cs_p(input_cur);
|
||
return(CLC);} /* CLC */
|
||
else{
|
||
MessageBeep(0);
|
||
return(CLC);}
|
||
|
||
|
||
case VK_BACK: //VK_BACK=0x08
|
||
if (!input_cur){
|
||
if (in.true_length){
|
||
MessageBeep(0);
|
||
return(CLC); } //1993.4 oringal return(CLC)
|
||
else {
|
||
MessageBeep(0);
|
||
return(REINPUT); } //1993.4 oringal return(CLC)
|
||
}
|
||
|
||
in.true_length--; //1993.4.16
|
||
if ( !in.true_length ) { //1993.4.16
|
||
end_flg=0; //????
|
||
input_cur=0;
|
||
cls_inpt_bf(0);
|
||
V_Flag=0; //93.9.4
|
||
return(REINPUT);} /* JMP K1 */
|
||
else{
|
||
input_cur--;
|
||
for (i=0;i<in.true_length-input_cur;i++)
|
||
in.buffer[input_cur+i]
|
||
=in.buffer[input_cur+i+1];
|
||
in.buffer[in.true_length]= 0; //0x20; //95/8/22 zst
|
||
cs_p(0);
|
||
show_char(in.buffer,in.true_length/*+1*/); //95/8/22 zst
|
||
cs_p(input_cur);
|
||
return(CLC);} /* CLC */
|
||
|
||
case VK_RETURN: //VK_RETURN=0x0d:
|
||
in.info_flag=BY_CHAR;
|
||
new_no=0;
|
||
return(STC); /* STC */
|
||
default:
|
||
MessageBeep(0);
|
||
return(CLC); /* CLC */
|
||
}
|
||
}
|
||
|
||
else{
|
||
switch(input_char){
|
||
case VK_LEFT+0x100:
|
||
if (input_cur>0) input_cur--;
|
||
cs_p(input_cur);
|
||
return (CLC);
|
||
case VK_RIGHT+0x100:
|
||
if (input_cur<in.true_length) input_cur++;
|
||
cs_p(input_cur);
|
||
return (CLC);
|
||
case VK_UP+0x100:
|
||
input_cur=0;
|
||
cs_p(input_cur);
|
||
return(CLC);
|
||
case VK_DOWN+0x100:
|
||
input_cur=in.true_length;
|
||
cs_p(input_cur);
|
||
return (CLC);
|
||
|
||
case ']':
|
||
case '[':
|
||
if (!V_Flag)
|
||
{
|
||
if (input_char==']')
|
||
jlxw_mode=1;
|
||
else
|
||
jlxw_mode=-1;
|
||
in.info_flag=BY_WORD;
|
||
return(STC); /* STC */
|
||
}
|
||
|
||
default:
|
||
if (if_biaodian((BYTE)input_char) && (!V_Flag)) //1993,3
|
||
bd_find=1;
|
||
|
||
if (in.max_length<=in.true_length){
|
||
// in.true_length=in.max_length;
|
||
MessageBeep(0);
|
||
return(CLC); //1994.4 old =STC // changed 12-12 SZ
|
||
}
|
||
|
||
else{
|
||
if(input_cur>=in.true_length){
|
||
in.buffer[in.true_length++]=(BYTE)input_char;
|
||
show_char(&in.buffer[input_cur],1); //1994.4.5
|
||
input_cur++;
|
||
cs_p(input_cur); // zst 95.54
|
||
|
||
if (bd_find==1)
|
||
return(STC); /* STC */
|
||
else
|
||
return(CLC);}
|
||
else{
|
||
|
||
if((!input_cur)&&((input_char&0xdf)=='V'))
|
||
return(CLC); //1994.7.24
|
||
|
||
for (i=0; i<in.true_length-input_cur;i++)
|
||
in.buffer[in.true_length-i]
|
||
=in.buffer[in.true_length-i-1]; /* CLC */
|
||
in.buffer[input_cur++]=(BYTE)input_char;
|
||
if (!bd_find){
|
||
in.true_length++;
|
||
cs_p(0);
|
||
show_char(in.buffer,in.true_length);
|
||
cs_p(input_cur);
|
||
return(CLC);
|
||
}
|
||
else{
|
||
for(i=input_cur;i<in.true_length;i++)
|
||
in.buffer[i]=0x20; //1993.4.20
|
||
cs_p(0);
|
||
show_char(in.buffer,in.true_length);
|
||
cs_p(input_cur);
|
||
in.true_length=(WORD)input_cur; //1993.4.20
|
||
return(STC);
|
||
}
|
||
|
||
}//#4 if now_cs...else
|
||
}//#3 if max...else
|
||
}//#2 case
|
||
}//#1 if..else
|
||
}//#0
|
||
|
||
|
||
/*******************************************************
|
||
&4:
|
||
if_biaodian(x): judge if the input is "biaodian"
|
||
return(FALSE): NO
|
||
return(TRUE): YES
|
||
********************************************************/
|
||
BOOL if_biaodian(x)
|
||
BYTE x;
|
||
{
|
||
int i;
|
||
if ((step_mode==ONINPUT)&&(x==0x27)) return(FALSE); //94/8/22
|
||
|
||
if (x=='$') {
|
||
if((in.buffer[0]&0xdf)=='I')
|
||
if((step_mode!=START)&&(step_mode!=RESELECT))
|
||
return (FALSE);}
|
||
|
||
for (i=0; i<lstrlen(biaodian_table); i++){
|
||
if (x==biaodian_table[i]){
|
||
biaodian_pos=i; /* record the porsition in biaodian_table */
|
||
return(TRUE);
|
||
}
|
||
}
|
||
return(FALSE);
|
||
}
|
||
|
||
/******************************************************
|
||
&3:
|
||
analize(): analize the input information
|
||
process the biaodian , and analize the
|
||
first byte of the input information.
|
||
return(BIAODIAN_ONLY): chinese biaodian
|
||
return(0): standard change
|
||
return(1): ABBR
|
||
return(2): "I" change
|
||
return(3): "i" change
|
||
return(4): "u" change
|
||
return(0xff): trun to "remember forced"
|
||
*******************************************************/
|
||
int WINAPI analize()
|
||
{
|
||
if (bd_proc())
|
||
return(BIAODIAN_ONLY); /* only have the chinese biaodian */
|
||
|
||
|
||
switch (in.buffer[0]){
|
||
case 'I':
|
||
return(2); /* special change: "l" change */
|
||
|
||
case 'i':
|
||
|
||
return(3); /* special change: "i" change */
|
||
case 'u':
|
||
case 'U': //in.buffer[0]='U';
|
||
if (in.true_length==1)
|
||
return(0xff); /* CTRL_F4_ENTRY: trun to the "remember forced" */
|
||
else
|
||
return(4); /* special change: "u" change */
|
||
}
|
||
if ((in.buffer[0]&0x20)==0) /*1992 9 5 &&->& */
|
||
return(1); /* ABBR */
|
||
else
|
||
return(0); /* mark of the standard change */
|
||
|
||
|
||
}
|
||
|
||
/***************************************************
|
||
&4:
|
||
bd_proc(): process the chinese biaodian
|
||
return(FALES): have chinese biaodian and another char
|
||
return(TRUE): only have the chinese biaodian
|
||
****************************************************/
|
||
BOOL bd_proc()
|
||
{
|
||
BYTE x;
|
||
|
||
x=in.buffer[in.true_length-1];
|
||
|
||
if(!GetBDValue(x)) return(FALSE);
|
||
|
||
in.true_length--;
|
||
if (in.true_length==0)
|
||
return(TRUE);
|
||
else
|
||
return(FALSE);
|
||
}
|
||
|
||
int WINAPI GetBDValue(bd_char)
|
||
int bd_char;
|
||
{
|
||
if (!if_biaodian((BYTE)bd_char))
|
||
return(FALSE);
|
||
|
||
biaodian_len =2;
|
||
if ((bd_char=='^')||(bd_char=='^'))
|
||
biaodian_len =4;
|
||
|
||
biaodian_value=cc_biaodian[biaodian_pos*2]+
|
||
cc_biaodian[biaodian_pos*2+1]*0x100;
|
||
if (bd_char==0x22){
|
||
if (yinhao_flag==1)
|
||
biaodian_value=cc_biaodian[(biaodian_pos+2)*2]
|
||
+cc_biaodian[(biaodian_pos+2)*2+1]*0x100;
|
||
yinhao_flag=!yinhao_flag; //92-12-21 SZ
|
||
}
|
||
if (bd_char==0x27){
|
||
if (d_yinhao_flag==1)
|
||
biaodian_value=cc_biaodian[(biaodian_pos+2)*2]
|
||
+cc_biaodian[(biaodian_pos+2)*2+1]*0x100;
|
||
d_yinhao_flag=!d_yinhao_flag; //92-12-21 SZ
|
||
}
|
||
|
||
if(bd_char=='<'){
|
||
if(book_name==1){
|
||
biaodian_value=cc_biaodian[(biaodian_pos+10)*2]
|
||
+cc_biaodian[(biaodian_pos+10)*2+1]*0x100;
|
||
book_name_sub++;
|
||
}
|
||
else{
|
||
book_name=1;
|
||
book_name_sub=0;
|
||
}
|
||
}
|
||
|
||
if(bd_char=='>'){
|
||
if(book_name_sub){
|
||
biaodian_value=cc_biaodian[(biaodian_pos+10)*2]
|
||
+cc_biaodian[(biaodian_pos+10)*2+1]*0x100;
|
||
book_name_sub--;
|
||
}
|
||
else
|
||
book_name=0;
|
||
}
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
/*******************************************************
|
||
&4:
|
||
if_zimu_or_not(): judge if the input is char or number
|
||
return(TRUE): is char
|
||
return(FALSE): is number
|
||
********************************************************/
|
||
BOOL if_zimu_or_not(x)
|
||
BYTE x;
|
||
{
|
||
if (('A'<=x) && (x<='Z'))
|
||
return(TRUE);
|
||
if (('a'<=x) && (x<='z'))
|
||
return(TRUE);
|
||
|
||
return(FALSE);
|
||
}
|
||
|
||
|
||
/***************************************************
|
||
if_number_or_not(c)
|
||
****************************************************/
|
||
int WINAPI if_number_or_not(c)
|
||
BYTE c;
|
||
{
|
||
if ((c<'0')||(c>'9'))
|
||
return(STC);
|
||
else
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
/***************************************************
|
||
if_bx_number(c)
|
||
****************************************************/
|
||
int WINAPI if_bx_number(c)
|
||
BYTE c;
|
||
{
|
||
if ((c<'1')||(c>'8'))
|
||
return(STC);
|
||
else
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
|
||
/*********************************************************
|
||
&3:
|
||
out_result(result_type): output the change result.
|
||
**********************************************************/
|
||
|
||
int WINAPI out_result(result_type)
|
||
int result_type;
|
||
{
|
||
int i;
|
||
|
||
if ((jiyi_mode==1)){
|
||
if (word_back_flag==0x99){
|
||
word_back_flag=2;
|
||
return(call_czh(13));}
|
||
else{
|
||
|
||
if (call_czh(12)==9){
|
||
step_mode=START;
|
||
}
|
||
else
|
||
step_mode=SELECT;
|
||
return(1);
|
||
}
|
||
} // if (jiyi)
|
||
|
||
else{
|
||
if (result_area_pointer!=unit_length)
|
||
if (msg_type!=2)
|
||
if (in.info_flag!=1)
|
||
new_no=result_area_pointer;
|
||
|
||
if (biaodian_value!=0){
|
||
result_area[result_area_pointer++]=LOBYTE(biaodian_value);
|
||
result_area[result_area_pointer++]=HIBYTE(biaodian_value);
|
||
|
||
if (biaodian_len==4)
|
||
{
|
||
result_area[result_area_pointer++]=LOBYTE(biaodian_value);
|
||
result_area[result_area_pointer++]=HIBYTE(biaodian_value);
|
||
}
|
||
|
||
}
|
||
|
||
if (!(msg_type&2)){
|
||
if (result_area_pointer>0){
|
||
temp_rem_proc();
|
||
for (i=0; i<result_area_pointer; i=i+2)
|
||
out_bfb[i/2]=(WORD)find_hz((WORD)(result_area[i]+result_area[i+1]*0x100));
|
||
} // if (result_area_pointer)
|
||
last_out_length=out_length;
|
||
out_length=result_area_pointer/2;
|
||
AddExtLib();
|
||
send_msg((BYTE *)out_bfb,result_area_pointer);
|
||
} // if (msg_type)
|
||
else{
|
||
last_out_length=out_length;
|
||
out_length=result_area_pointer/2;
|
||
send_msg(result_area,result_area_pointer);
|
||
if (in.buffer[0]!='v'){
|
||
step_mode=0;
|
||
return(0);}
|
||
}
|
||
|
||
return(0);
|
||
|
||
}
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
void WINAPI fmt_transfer()
|
||
{
|
||
|
||
if (lpImeL->wImeStyle == IME_APRS_FIX){
|
||
if (in.info_flag==BY_RECALL)
|
||
{ now.fmt_group=3; //5;
|
||
now.fmt_start=26;
|
||
now.fmt_ttl_len=54;
|
||
word_back_flag=0x55; //back convert is not allowed.
|
||
}
|
||
else
|
||
{ now.fmt_group=(WORD)form[unit_length/2];
|
||
now.fmt_start=27;
|
||
now.fmt_ttl_len=53;
|
||
}
|
||
|
||
} else {
|
||
|
||
now.fmt_group = CANDPERPAGE ;
|
||
if (in.info_flag==BY_RECALL)
|
||
word_back_flag=0x55;
|
||
}
|
||
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
int WINAPI sent_back_msg()
|
||
{
|
||
if (new_no<=2)
|
||
return(0);
|
||
if (new_no>18)
|
||
return(0);
|
||
new_word();
|
||
return(0);
|
||
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
int WINAPI if_jlxw_mode()
|
||
{
|
||
int x,i,j;
|
||
WORD *out_svw_p;
|
||
|
||
out_svw_p=(WORD *)out_svw;
|
||
|
||
if (jlxw_mode==0)
|
||
return(0);
|
||
if (jlxw_mode<0){
|
||
if (sImeG.cp_ajust_flag==1)
|
||
result_area_pointer=result_area_pointer-unit_length+2;
|
||
x=0;
|
||
} // if (jlxw)
|
||
else{
|
||
if (sImeG.cp_ajust_flag==1){
|
||
x=result_area_pointer-unit_length;
|
||
result_area[x++]=result_area[result_area_pointer-2];
|
||
result_area[x++]=result_area[result_area_pointer-1];
|
||
result_area_pointer=x;
|
||
}// if (cp_ajust)
|
||
x=unit_length-2;
|
||
}// else
|
||
|
||
jlxw_mode=0;
|
||
word_back_flag=0xaa;
|
||
if (unit_length<=2)
|
||
return(0);
|
||
|
||
j=0;
|
||
x=x/2; //out_svw_p transmit by word;
|
||
for (i=0; i<group_no; i++){
|
||
out_svw_p[j++]=out_svw_p[x];
|
||
x+=unit_length/2;
|
||
}// for
|
||
unit_length=2;
|
||
|
||
for (i=0; i<group_no; i++)
|
||
out_svw_p[i+100]=out_svw_p[i];
|
||
|
||
x=0;
|
||
for (i=0; i<group_no; i++){
|
||
if (out_svw_p[i+100]){
|
||
out_svw_p[x]=out_svw_p[i+100];
|
||
for (j=i+1; j<group_no; j++){
|
||
if (out_svw_p[j+100]==out_svw_p[x])
|
||
out_svw_p[j+100]=0;
|
||
}//for(j)
|
||
x++;
|
||
}//if(out_svw_p)
|
||
}//for(i)
|
||
|
||
group_no=x;
|
||
return(0);
|
||
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
int WINAPI disp_auto_select()
|
||
|
||
{
|
||
WORD x,y,lng;
|
||
int i,j;
|
||
BYTE disp_bf[80];
|
||
|
||
if (result_area_pointer==0)
|
||
return(0);
|
||
cs_p(input_msg_disp);
|
||
if (msg_type==2){
|
||
show_char(result_area, result_area_pointer);
|
||
cs_p(input_msg_disp+result_area_pointer);
|
||
}
|
||
else{
|
||
for (i=0; i<result_area_pointer; i=i+2){
|
||
x=result_area[i]+result_area[i+1]*0x100;
|
||
y=(WORD)find_hz(x);
|
||
disp_bf[i]=LOBYTE(y);
|
||
disp_bf[i+1]=HIBYTE(y);
|
||
}// for
|
||
lng=in.true_length;
|
||
if (jiyi_mode!=0){
|
||
if (wp.xsyjw!=0){
|
||
if (wp.yj_ps[wp.xsyjw-1]<in.true_length){
|
||
j=wp.yj_ps[wp.xsyjw-1];
|
||
x=in.true_length-wp.yj_ps[wp.xsyjw-1];
|
||
for (n=0; n<x; n++){
|
||
disp_bf[i++]=in.buffer[j++];
|
||
}//for
|
||
}// if (yj_ps)
|
||
}//if(wp.xsyjw)
|
||
}// if (jiyi)
|
||
|
||
show_char(disp_bf, i);
|
||
|
||
cs_p(input_msg_disp+result_area_pointer);
|
||
}// else
|
||
|
||
|
||
return (0);
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
int WINAPI if_first_key(input_char)
|
||
WORD input_char;
|
||
{
|
||
|
||
if (input_char=='U') return(STC);
|
||
|
||
if(if_number_or_not((BYTE)input_char))
|
||
return(STC); //the first key is number,it's not allowed
|
||
|
||
if(if_zimu_or_not((BYTE)input_char))
|
||
return(CLC); //the first key is zimu
|
||
|
||
|
||
return(STC);
|
||
}
|
||
|
||
|
||
/*****************************************************************
|
||
temp_rem_proc(): save the output in logging_stack for recall process
|
||
********************************************************************/
|
||
int WINAPI temp_rem_proc()
|
||
{
|
||
int c,i;
|
||
|
||
if (in.true_length<2)
|
||
if (in.info_flag!=1)
|
||
return(0);
|
||
|
||
if (biaodian_value){
|
||
c=result_area_pointer-2+1; //-2 biaodian isn't consider
|
||
if ((c>=2)&&(biaodian_len==4))
|
||
c = c-2;
|
||
}
|
||
else //+1 logging_stack struck is
|
||
c=result_area_pointer+1; // result_area_pointer plus
|
||
// one byte counter
|
||
|
||
CopyMemory/*memmove*/(&logging_stack[c],&logging_stack[0],(logging_stack_size-c));
|
||
|
||
logging_stack[0]=c-1; //length of storing string
|
||
for (i=0; i<logging_stack[0]; i++)
|
||
logging_stack[i+1]=result_area[i];
|
||
|
||
if_multi_rem(c);
|
||
return(0);
|
||
|
||
}
|
||
|
||
/*******************************************
|
||
if_multi_rem()
|
||
********************************************/
|
||
int WINAPI if_multi_rem(c)
|
||
int c;
|
||
{
|
||
BYTE cmp_buffer[25]={0}; //max input is 10 chinese words
|
||
int i,cn;
|
||
char *p;
|
||
|
||
for (i=0; i<c; i++)
|
||
cmp_buffer[i]=logging_stack[i];
|
||
cmp_buffer[i]=0;
|
||
|
||
p=(LPSTR)ABCstrstr(&logging_stack[c],cmp_buffer);
|
||
if (p!=NULL){
|
||
c=(INT)(p-logging_stack);
|
||
cn=logging_stack[c]+1; //cn is the length a group in logging_stack
|
||
CopyMemory/*memmove*/(&logging_stack[c],&logging_stack[c+cn],logging_stack_size-c-cn);
|
||
}
|
||
return(0);
|
||
|
||
}
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////
|
||
void WINAPI send_msg(bf,count)
|
||
BYTE *bf;
|
||
int count;
|
||
{
|
||
int i,j;
|
||
unsigned int focus,xx;
|
||
|
||
TypeOfOutMsg = ABC_OUT_MULTY ;
|
||
msg_count=count; //Keep msg for repeat.
|
||
for (i=0;i<count;i++){
|
||
msg_bf[i]=bf[i]; //send msg for Edit class W.
|
||
if (bf[i]<0x80) TypeOfOutMsg = ABC_OUT_ASCII;
|
||
}
|
||
SetResultToIMC(ghIMC,msg_bf,(WORD)count);
|
||
|
||
|
||
}
|
||
|
||
/*******************************************
|
||
Popurse: To send a single char as message .
|
||
*******************************************/
|
||
int WINAPI send_one_char(chr)
|
||
int chr;
|
||
{
|
||
int scn;
|
||
if(glpIMC->fdwConversion&IME_CMODE_SYMBOL)
|
||
if(GetBDValue(chr)){
|
||
unsigned char buffer[4];
|
||
int num = 2;
|
||
|
||
buffer[0]=LOBYTE(biaodian_value);
|
||
buffer[1]=HIBYTE(biaodian_value);
|
||
|
||
if ((chr == '_')|| (chr == '^'))
|
||
{
|
||
buffer[2]=LOBYTE(biaodian_value);
|
||
buffer[3]=HIBYTE(biaodian_value);
|
||
num = 4 ;
|
||
}
|
||
send_msg(buffer,num);
|
||
return(0);
|
||
}
|
||
|
||
if(glpIMC->fdwConversion&IME_CMODE_FULLSHAPE)
|
||
cap_full((WORD)chr);
|
||
else
|
||
TypeOfOutMsg = ABC_OUT_ONE ;
|
||
return(0);
|
||
|
||
}
|
||
|
||
int WINAPI send_one_char0(chr)
|
||
int chr;
|
||
{
|
||
TypeOfOutMsg = ABC_OUT_ONE ;
|
||
return (0);
|
||
}
|
||
|
||
|
||
|
||
/**********************************************************************/
|
||
/* SetResultToIMC() */
|
||
/* Return vlaue */
|
||
/* the number of candidates in the candidate list */
|
||
/**********************************************************************/
|
||
UINT WINAPI SetResultToIMC(
|
||
HIMC ghIMC,
|
||
LPSTR outBuffer, //soarce buffer (normal for out_svw)
|
||
WORD outCount) //How many candidates are.
|
||
{
|
||
LPINPUTCONTEXT lpIMC;
|
||
LPCANDIDATEINFO lpCandInfo;
|
||
LPCANDIDATELIST lpCandList;
|
||
LPPRIVCONTEXT lpImcP;
|
||
LPCOMPOSITIONSTRING lpCompStr;
|
||
WORD dwCompStrLen;
|
||
WORD dwReadClauseLen;
|
||
WORD dwReadStrLen;
|
||
|
||
if (!ghIMC) return (0); // The IMC must be a valid one.
|
||
|
||
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(ghIMC);
|
||
if(!lpIMC) return 0;
|
||
|
||
if (!lpIMC->hCandInfo){
|
||
ImmUnlockIMC(ghIMC);
|
||
return (0); }
|
||
// The CandInfo must...
|
||
|
||
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
|
||
if (!lpCandInfo) {
|
||
ImmUnlockIMC(ghIMC);
|
||
return (0);}
|
||
|
||
|
||
lpCandList = (LPCANDIDATELIST)
|
||
((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
|
||
|
||
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
|
||
|
||
|
||
if (!lpCompStr) {
|
||
MessageBeep((UINT)-1);
|
||
ImmUnlockIMCC(lpIMC->hCandInfo);
|
||
ImmUnlockIMC(ghIMC);
|
||
return (0);
|
||
}
|
||
|
||
|
||
dwCompStrLen = 0;
|
||
dwReadClauseLen = 0;
|
||
dwReadStrLen = 0;
|
||
|
||
InitCompStr(lpCompStr);
|
||
|
||
// the result reading clause = compsotion reading clause
|
||
CopyMemory((LPSTR)lpCompStr + lpCompStr->dwResultReadClauseOffset,
|
||
(LPSTR)lpCompStr + lpCompStr->dwCompReadClauseOffset,
|
||
dwReadClauseLen);
|
||
lpCompStr->dwResultReadClauseLen = dwReadClauseLen;
|
||
*(LPSTR)((LPSTR)lpCompStr+lpCompStr->dwResultReadClauseOffset+dwReadClauseLen) = '\0';
|
||
|
||
// the result reading string = compsotion reading string
|
||
CopyMemory((LPSTR)lpCompStr + lpCompStr->dwResultReadStrOffset,
|
||
(LPSTR)lpCompStr + lpCompStr->dwCompReadStrOffset,
|
||
dwReadStrLen);
|
||
lpCompStr->dwResultReadStrLen = dwReadStrLen;
|
||
*(LPSTR)((LPSTR)lpCompStr+lpCompStr->dwResultReadStrOffset+dwReadStrLen) = '\0';
|
||
|
||
// calculate result string length
|
||
lpCompStr->dwResultStrLen = outCount;
|
||
|
||
// the result string = outBuffer;
|
||
CopyMemory((LPSTR)lpCompStr + lpCompStr->dwResultStrOffset,
|
||
(LPSTR)outBuffer,outCount);
|
||
*(LPSTR)((LPSTR)lpCompStr+lpCompStr->dwResultStrOffset+outCount) = '\0';
|
||
|
||
lpCompStr->dwResultClauseLen = 0;
|
||
*(LPUNADWORD)((LPBYTE)lpCompStr + lpCompStr->dwResultClauseOffset +
|
||
sizeof(DWORD)) = 0;
|
||
|
||
|
||
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
|
||
|
||
// tell application, there is a reslut string
|
||
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
|
||
lpImcP->dwCompChar = (DWORD)0;
|
||
lpImcP->fdwGcsFlag |= GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS|
|
||
GCS_DELTASTART|GCS_RESULTREAD|GCS_RESULT;
|
||
|
||
if(TypeOfOutMsg == ABC_OUT_ASCII)
|
||
lpImcP->fdwGcsFlag &=(~GCS_RESULT);
|
||
|
||
|
||
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
||
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
||
~(MSG_OPEN_CANDIDATE);
|
||
}
|
||
|
||
// no candidate now, the right candidate string already be finalized
|
||
lpCandList->dwCount = 0;
|
||
|
||
lpImcP->iImeState = CST_INIT;
|
||
|
||
|
||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||
ImmUnlockIMCC(lpIMC->hCandInfo);
|
||
ImmUnlockIMC(ghIMC);
|
||
return (0) ; /* The real number of being moved */
|
||
}
|
||
|
||
|
||
|
||
/**********************************************************
|
||
FUNCTION: cap_full()
|
||
PURPOES: if the full_switch on, and in the Caps status,
|
||
change the English into Chinese mode
|
||
************************************************************/
|
||
void WINAPI cap_full(wParam)
|
||
WORD wParam;
|
||
{
|
||
|
||
if (wParam==VK_BACK){
|
||
// send_one_char(VK_BACK);
|
||
send_one_char0(VK_BACK);
|
||
return;
|
||
}
|
||
|
||
if (wParam==VK_SPACE){
|
||
result_area[0]=0xa1; //94-8-6!
|
||
result_area[1]=0xa1; //04-8-6!
|
||
send_msg(result_area,2);
|
||
return;
|
||
}
|
||
|
||
if (wParam== '~'){
|
||
result_area[0]=0xa1; //94-8-6!
|
||
result_area[1]=0xab; //04-8-6!
|
||
send_msg(result_area,2);
|
||
return;
|
||
}
|
||
|
||
|
||
if (wParam=='$'){
|
||
result_area[0]=0xa1; //94-8-6!
|
||
result_area[1]=0xe7; //04-8-6!
|
||
send_msg(result_area,2);
|
||
return;
|
||
}
|
||
|
||
|
||
if ((wParam>0x20) && (wParam<=0x7e)){
|
||
result_area[0]=0xa3;
|
||
result_area[1]=((wParam-0x20)*0x100+0xa0a3)/0x100;
|
||
|
||
send_msg(result_area,2);
|
||
return;
|
||
}
|
||
|
||
send_one_char0(wParam);
|
||
}
|
||
|
||
/*********************************************
|
||
read_kb()
|
||
**********************************************/
|
||
int WINAPI read_kb()
|
||
{
|
||
return(0);
|
||
}
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////////
|
||
// BX_MODE //
|
||
// Deel with pure bx input //
|
||
/////////////////////////////////////////////////////////////////////////
|
||
|
||
extern WORD last_size;
|
||
|
||
BX_MODE(input_char,wParam)
|
||
WORD input_char;
|
||
WPARAM wParam;
|
||
{
|
||
|
||
if (if_number_or_not((BYTE)input_char)
|
||
&&(input_char!='9')
|
||
&&(input_char!='0')){
|
||
if (step_mode==START||step_mode==RESELECT){
|
||
if (input_char >= 0x8000) //1993.4.19
|
||
return(STC); //when RESELECT use the mouse reselect result
|
||
else {
|
||
if (!bx_inpt_on)
|
||
{ cls_bx_disp(1);
|
||
sent_back_msg();
|
||
}
|
||
step_mode=ONINPUT;
|
||
bx_inpt_on=1; }//else
|
||
} //if (step_mode)
|
||
}//if (if_number...)
|
||
|
||
if (bx_inpt_on){
|
||
bx_proc(input_char,wParam);
|
||
return(CLC);
|
||
}
|
||
|
||
return(STC);
|
||
|
||
}
|
||
|
||
/**********************************************************************
|
||
FUNTION: bx_proc(WORD)
|
||
PURPOSE: when the pure bx were inputed, find one chinese word
|
||
corespond with it and eight related words with it.
|
||
***********************************************************************/
|
||
void WINAPI bx_proc(input_char,wParam)
|
||
WORD input_char;
|
||
WPARAM wParam;
|
||
{
|
||
int i;
|
||
|
||
lib_p=(BYTE *)lib_w; //lib_p point to the lib_buffer
|
||
|
||
switch (bx_analize(input_char,wParam))
|
||
{
|
||
|
||
case BX_CHOICE:
|
||
if (input_char>=0x8000){
|
||
current_no=(input_char - 0x8000-0x31)+disp_head;
|
||
sImeG.InbxProc = 0;
|
||
}else
|
||
current_no=((INT)wParam - 0x31)+disp_head;
|
||
if(current_no>=group_no){
|
||
MessageBeep(0);
|
||
disp_help_and_result();
|
||
}else
|
||
send_bx_result();
|
||
break;
|
||
|
||
case BX_SELECT:
|
||
word_select_bx(input_char);
|
||
break;
|
||
|
||
case ESC:
|
||
cls_bx_disp(0);
|
||
break;
|
||
|
||
case OTHER:
|
||
MessageBeep(0);
|
||
disp_help_and_result();
|
||
break;
|
||
|
||
|
||
case SPACE:
|
||
send_bx_result();
|
||
break;
|
||
|
||
case BXMA:
|
||
if(!disp_help_and_result()){
|
||
if(in.true_length>1){
|
||
in.true_length--;
|
||
MessageBeep(0);
|
||
disp_help_and_result();
|
||
}
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}//swith
|
||
}
|
||
|
||
|
||
|
||
|
||
/********************************************************************
|
||
word_select(wParam): select the word or turn to the next or up page
|
||
*********************************************************************/
|
||
word_select_bx(input_char)
|
||
int input_char;
|
||
{
|
||
int x;
|
||
|
||
|
||
switch (input_char){
|
||
|
||
case VK_END*0x100:
|
||
case VK_DOWN*0x100:
|
||
case '=': //94/8/22
|
||
case ']':
|
||
if (disp_tail>=group_no)
|
||
MessageBeep(0);
|
||
else{
|
||
|
||
if(input_char == VK_END*0x100 ){
|
||
disp_head = (group_no - 1)/now.fmt_group*now.fmt_group;
|
||
disp_tail = disp_head;}
|
||
|
||
fmt_transfer();
|
||
current_no=disp_tail;
|
||
prompt_disp();}
|
||
return(1); //means break the STD MODE
|
||
|
||
case VK_HOME*0x100:
|
||
case '-': //94/8/22
|
||
case '[':
|
||
case VK_UP*0x100:
|
||
if (disp_head==0)
|
||
|
||
MessageBeep(0);
|
||
else{
|
||
|
||
if(input_char == VK_HOME*0x100 )
|
||
disp_head = 0;
|
||
else
|
||
disp_head=disp_head-now.fmt_group;
|
||
|
||
disp_tail=disp_head;
|
||
fmt_transfer();
|
||
current_no=disp_tail;
|
||
prompt_disp();
|
||
}
|
||
return(1);
|
||
|
||
default:
|
||
return(1); //1993.1.15 cock
|
||
}
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
FUNTION: bx_analize(WORD)
|
||
PURPOSE: analize the input char. find out if it is pure bx
|
||
*************************************************************************/
|
||
int WINAPI bx_analize(input_char,wParam)
|
||
WORD input_char;
|
||
WPARAM wParam;
|
||
{
|
||
if(input_char>=0x8000) return(BX_CHOICE);
|
||
|
||
if (input_char == VK_UP*0x100)
|
||
return(BX_SELECT);
|
||
|
||
if (input_char == VK_DOWN*0x100)
|
||
return(BX_SELECT);
|
||
|
||
if (input_char == VK_HOME*0x100)
|
||
return(BX_SELECT);
|
||
|
||
if (input_char == VK_END*0x100)
|
||
return(BX_SELECT);
|
||
|
||
if (input_char == ']')
|
||
return(BX_SELECT);
|
||
|
||
if (input_char == '[')
|
||
return(BX_SELECT);
|
||
|
||
if (input_char == '-')
|
||
return(SELECT);
|
||
|
||
if (input_char == '=')
|
||
return(SELECT);
|
||
|
||
|
||
if (input_char==VK_ESCAPE)
|
||
return(ESC);
|
||
|
||
if (input_char==VK_SPACE)
|
||
{
|
||
in.info_flag=0x80; //standard end flag
|
||
return(SPACE);
|
||
}
|
||
|
||
if (input_char==VK_RETURN)
|
||
{
|
||
in.info_flag=0x80; //standard end flag
|
||
return(SPACE);
|
||
}
|
||
|
||
if (input_char==VK_BACK)
|
||
{
|
||
if (in.true_length==1)
|
||
{
|
||
input_char=VK_ESCAPE; //if it has inputed only one word
|
||
return(ESC);
|
||
} //cls the display
|
||
in.true_length--;
|
||
key_bx_code_long=in.true_length;
|
||
return(BXMA);
|
||
}
|
||
|
||
if (!if_bx_number((BYTE)input_char))
|
||
{
|
||
if( ((BYTE)wParam>'0') && ((BYTE)wParam <= CANDPERPAGE+0x30))
|
||
return (BX_CHOICE);
|
||
|
||
in.info_flag=(BYTE)input_char; //rest key is put into the end_flag position
|
||
return(OTHER);
|
||
}
|
||
|
||
if ((input_char>0x30)||(input_char<0x39))
|
||
{
|
||
if (in.true_length>6)
|
||
{
|
||
in.info_flag=(BYTE)input_char;
|
||
return(OTHER);
|
||
}
|
||
else
|
||
{
|
||
in.buffer[in.true_length++]=(BYTE)input_char;
|
||
key_bx_code_long=in.true_length;
|
||
return(BXMA);
|
||
}
|
||
}
|
||
else{
|
||
in.info_flag=(BYTE)input_char;
|
||
return(OTHER);
|
||
}
|
||
|
||
}
|
||
|
||
/************************************************************************
|
||
FUCTION: disp_help_and_result()
|
||
PURPOSE: seach the bx_table and display the tishi result
|
||
ENTRY: bx string is in inpt_bx.bf
|
||
RESULT: display the result and tishi information
|
||
**************************************************************************/
|
||
int WINAPI disp_help_and_result()
|
||
{
|
||
int i, pass_flag;
|
||
|
||
if (in.true_length==1)
|
||
if (in.buffer[0]!=in_mem_part) //if this part of table is in memory
|
||
load_one_part_bxtab();
|
||
|
||
for (i=0; i<in.true_length; i++)
|
||
key_bx_code[i]=in.buffer[i]&0x0f; // 'and' high 4 bit
|
||
|
||
search_pointer=0;
|
||
current_bx_code_long=0;
|
||
pass_flag=0;
|
||
while (search_pointer<current_part_length)
|
||
{
|
||
if (cmp_bx_word_exactly())
|
||
{ //search correct result
|
||
pass_flag=1;
|
||
break;
|
||
}
|
||
}
|
||
if (!pass_flag)
|
||
return 0;
|
||
|
||
|
||
for (i=0; i<8*2; i++)
|
||
out_svw[i]=0; //clear the prompt result buffer
|
||
|
||
search_pointer=0;
|
||
current_bx_code_long=0;
|
||
pass_flag=0;
|
||
while (search_pointer<current_part_length)
|
||
if (cmp_bx_code2()) //search the related prompt result
|
||
pass_flag=1; //if found it, set the flag and continue
|
||
|
||
if (pass_flag)
|
||
{
|
||
disp_bx_result();
|
||
disp_bx_prompt();
|
||
}
|
||
else
|
||
{
|
||
if (group_no>1){ //1993.3
|
||
disp_bx_result(); //1993.3
|
||
disp_bx_prompt();
|
||
}
|
||
else //1993.3
|
||
send_bx_result();
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
/***********************************************************************
|
||
FUCTION: cmp_bx_word_exactly()
|
||
PURPOSE: find the correct result position, and send the result
|
||
into buffer.
|
||
ENTRY: the input bx is in the key_bx_code buffer
|
||
RESULT: CLC--- the input bx is matched with the current bx in the table
|
||
the correct result is in the out_svw buffer
|
||
STC--- not match
|
||
the search_pointer points the position the next bx in
|
||
the table.
|
||
************************************************************************/
|
||
int WINAPI cmp_bx_word_exactly()
|
||
{
|
||
BYTE x;
|
||
int i;
|
||
|
||
for (i=0;i<20;i++)
|
||
result_area[i]= 0;
|
||
conbine(); //get the bx from the bx_table
|
||
|
||
result_area_pointer=0;
|
||
if (key_bx_code_long==current_bx_code_long){
|
||
if (cmp_subr()){
|
||
group_no=0;
|
||
search_pointer++;
|
||
while (lib_p[search_pointer]>0xa0){
|
||
// result_area[result_area_pointer++]=group_no|0x40;
|
||
// result_area[result_area_pointer++]=0x2e;
|
||
result_area[result_area_pointer++]=lib_p[search_pointer++]; //save the "quma"
|
||
result_area[result_area_pointer++]=lib_p[search_pointer++]; //save the "weima"
|
||
// result_area[result_area_pointer++]=0x20;
|
||
group_no++; //sum of chinese word
|
||
}//while
|
||
return(CLC);
|
||
}//if (cmp_subr())
|
||
}//if(key_bx_code_long)
|
||
|
||
search_pointer++;
|
||
while (lib_p[search_pointer]>=0xa0)
|
||
search_pointer+=2; //move the pointer to the beginning
|
||
return(STC); //of the next bx in the table
|
||
|
||
}
|
||
|
||
/**************************************************************************
|
||
FUCTION: cmp_bx_code2()
|
||
PURPOSE: search the prompt information and get the chinese word
|
||
which is related with the input.
|
||
**************************************************************************/
|
||
int WINAPI cmp_bx_code2()
|
||
{
|
||
WORD x;
|
||
|
||
conbine(); //get the bx from the bx_table
|
||
|
||
if (key_bx_code_long==(current_bx_code_long-1)){
|
||
if (cmp_subr()){
|
||
bx_help_flag|=0x80;
|
||
|
||
x=(lib_p[search_pointer++]&0x0f)-1;
|
||
if (x>7) //if the bx overflow
|
||
x=7;
|
||
|
||
out_svw[x*2]=lib_p[search_pointer++]; //get the prompt bx
|
||
out_svw[x*2+1]=lib_p[search_pointer++];
|
||
|
||
while (lib_p[search_pointer]>0xa0)
|
||
search_pointer+=2; //move the pointer to the next string
|
||
|
||
return(CLC);
|
||
}//if (cmp_subr())
|
||
}//if (key_bx_code_long)
|
||
|
||
search_pointer++;
|
||
while (lib_p[search_pointer]>0xa0)
|
||
search_pointer+=2; //move the pointer to the next string
|
||
return(STC);
|
||
|
||
}
|
||
|
||
/************************************************************************
|
||
FUCTION: conbine()
|
||
PURPOSE: get the bx from the table and change the high 4 bit into
|
||
the position where the last bit of bx should put in and
|
||
get this string of bx's length.
|
||
*************************************************************************/
|
||
void WINAPI conbine()
|
||
{
|
||
int x;
|
||
|
||
x=(lib_p[search_pointer]>>4)&0x0f;
|
||
current_bx_code[x]=lib_p[search_pointer]&0x0f;
|
||
current_bx_code_long=x+1;
|
||
|
||
}
|
||
|
||
|
||
/***********************************************************************
|
||
FUCTION: cmp_surb()
|
||
PURPOSE: compare the input bx with the bx in the table
|
||
************************************************************************/
|
||
int WINAPI cmp_subr()
|
||
{
|
||
int i;
|
||
|
||
for (i=0; i<key_bx_code_long; i++)
|
||
if(key_bx_code[i]!=current_bx_code[i])
|
||
return(STC);
|
||
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
void WINAPI cls_bx_disp(int flag)
|
||
{
|
||
if(!flag)
|
||
cls_prompt();
|
||
|
||
input_cur=input_msg_disp;
|
||
cs_p(input_msg_disp);
|
||
in.true_length=0;
|
||
in.info_flag=0;
|
||
bx_inpt_on=0;
|
||
group_no=0;
|
||
current_no = 0;
|
||
step_mode=START;
|
||
}
|
||
|
||
|
||
int WINAPI load_one_part_bxtab()
|
||
{
|
||
int hd, close_hd;
|
||
int op_count,i;
|
||
WORD distance;
|
||
|
||
|
||
in_mem_part=in.buffer[0]&0x0f; //save the current first bx ma
|
||
distance=bxtable_ndx[in_mem_part-1]; //get the beginning position
|
||
current_part_length=bxtable_ndx[in_mem_part]-distance; //get the read length
|
||
hd=OpenFile("winabc.ovl",&reopen,OF_READ);
|
||
if (hd==-1)
|
||
{
|
||
err_exit_proc("OPEN WINABC.OVL ERROR!");
|
||
return (FALSE);
|
||
}
|
||
|
||
_llseek(hd,distance,0);
|
||
last_size=0;
|
||
last_item_name=0;
|
||
op_count=_lread(hd,&lib_w,current_part_length);
|
||
|
||
lib_p[op_count]=0;
|
||
lib_p[op_count+1]=0; // cls the below limited
|
||
|
||
if (op_count!=current_part_length)
|
||
{
|
||
err_exit_proc("READ WINABC.OVL ERROR!");
|
||
close_hd = _lclose(hd);
|
||
return (FALSE);
|
||
}
|
||
|
||
|
||
close_hd = _lclose(hd);
|
||
|
||
return (TRUE);
|
||
}
|
||
|
||
int WINAPI disp_bx_result()
|
||
{
|
||
BYTE buffer[50];
|
||
int keep_cs, i;
|
||
|
||
for (i=0; i<50; i++) buffer[i] = ' ' ;
|
||
|
||
input_cur=input_msg_disp;
|
||
cs_p(input_msg_disp);
|
||
for (i=0; i<in.true_length; i++)
|
||
buffer[i]= in.buffer[i];
|
||
|
||
show_char(buffer, i);
|
||
now_cs= i; //restore
|
||
cs_p(now_cs); //disp cs
|
||
return (0);
|
||
}
|
||
|
||
void WINAPI disp_bx_prompt()
|
||
{
|
||
int i,j,n;
|
||
HWND hhh;
|
||
int GroupCounter;
|
||
BYTE buffer [100];
|
||
|
||
|
||
disp_head=0;
|
||
disp_tail=8;
|
||
|
||
j=0,n=0;
|
||
GroupCounter= 0;
|
||
if (group_no) { //if the results are more the 5
|
||
for (i=0; i<group_no*2; i=i+2) //display the rest in the prompt area
|
||
if(result_area[i]){
|
||
buffer[j++]=result_area[i];
|
||
buffer[j++]=result_area[i+1];
|
||
buffer[j++]=0xa1;
|
||
buffer[j++]=0xa1;}
|
||
}
|
||
|
||
n =group_no*2;
|
||
for(i=0; i<16; i = i+2){
|
||
if(out_svw[i]){
|
||
buffer[j++] = out_svw[i];
|
||
result_area[n++] = out_svw[i];
|
||
buffer[j++] = out_svw[i+1];
|
||
result_area[n++] = out_svw[i+1];
|
||
buffer[j++] = 0xa2;
|
||
buffer[j++] = 0xd9+GroupCounter;}
|
||
GroupCounter++;
|
||
}//for
|
||
|
||
|
||
group_no = j/4;
|
||
|
||
unit_length = 4;
|
||
current_no=0;
|
||
disp_tail=0;
|
||
V_Flag=0;
|
||
msg_type=2; //94/8/22
|
||
fmt_transfer();
|
||
SetToIMC(ghIMC,(LPSTR)&buffer,(WORD)group_no,(WORD)(unit_length+0x1000));
|
||
prompt_disp();
|
||
step_mode=SELECT;
|
||
}
|
||
|
||
void WINAPI send_bx_result()
|
||
{
|
||
out_length=1;
|
||
send_msg(&result_area[current_no*2],2);
|
||
cls_bx_disp(1);
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> data_init() //
|
||
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> //
|
||
// <20><><EFBFBD><EFBFBD> 1. ?MMR.REM //
|
||
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ȱ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ʻ<EFBFBD><CABB><EFBFBD> //
|
||
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ʿ<EFBFBD><CABF>IJ<EFBFBD><C4B2><EFBFBD>. //
|
||
// 4. <20><><EFBFBD><EFBFBD>TMMR.REM, <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ʿⲻ<CABF><E2B2BB><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>֮. //
|
||
// 5. <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ʿ<EFBFBD> //
|
||
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><> //
|
||
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: TURE <20><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD> //
|
||
// FALSE <20><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7> //
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
void WINAPI data_init()
|
||
{
|
||
|
||
BYTE new_flag=0; //һ<>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ļ<EFBFBD>?
|
||
BYTE the_para='U'; //<2F><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
||
BYTE disp_mode=0;
|
||
BYTE current_dd=0;
|
||
BYTE current_disk='C';
|
||
BYTE current_path[64];
|
||
HFILE hd;
|
||
DWORD op_count;
|
||
BYTE tmp_buffer[16]={0};
|
||
int i;
|
||
|
||
char god[]="WINABC.CWD";
|
||
char cw_ovr[]="WINABC.OVL";
|
||
char no_file[]=ERR01; //ȱ<>ٴʿ<D9B4><CABF>ļ<EFBFBD>WINABC.CWD
|
||
char read_ndx_wrong[]=ERR03; //"<22>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||
char m_short[]=ERR14; //"<22>ڴ治<DAB4><E6B2BB><EFBFBD><EFBFBD>";
|
||
char no_cw_ovr[]=ERR04; //"ȱ<>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>WINABC.OVL<56><4C>";
|
||
char jiyi_wenjian_cuo[]=ERR13; //"<22>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!";
|
||
char TMMR_WRITE_WRONG[]=ERR09; // "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>д<EFBFBD><D0B4>";
|
||
|
||
OFSTRUCT ofs;
|
||
|
||
LPSTR cisu_1;
|
||
|
||
memset(tmmr_rem, 0, sizeof(tmmr_rem));
|
||
memset(user_lib, 0, sizeof(user_lib));
|
||
|
||
// support multi-user
|
||
|
||
lstrcpy(tmmr_rem, sImeG.szIMEUserPath);
|
||
lstrcat(tmmr_rem, TEXT("\\tmmr.rem") );
|
||
|
||
lstrcpy(user_lib, sImeG.szIMEUserPath);
|
||
lstrcat(user_lib, TEXT("\\user.rem") );
|
||
|
||
hd =OpenFile(god, &ofs, OF_READ|OF_SHARE_COMPAT|GENERIC_READ);
|
||
if ( hd==HFILE_ERROR)
|
||
err_exit(no_file);
|
||
op_count = _lread(hd,&ndx,NDX_REAL_LENGTH);
|
||
|
||
if(op_count!=NDX_REAL_LENGTH)
|
||
err_exit(read_ndx_wrong);
|
||
|
||
_lclose(hd);
|
||
|
||
hd = OpenFile(cw_ovr, &ofs, OF_READ|OF_SHARE_COMPAT|GENERIC_READ);
|
||
if (hd==HFILE_ERROR)
|
||
err_exit(no_cw_ovr);
|
||
|
||
_llseek(hd, PTZ_LIB_START_POINTER, FILE_BEGIN); // <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||
|
||
cisu_hd=GlobalAlloc(GMEM_MOVEABLE,(DWORD)PTZ_LIB_LENGTH);
|
||
if (!cisu_hd)
|
||
{
|
||
err_exit(ERR22); //Memory Alloc Wrong!");
|
||
_lclose(hd);
|
||
return;
|
||
}
|
||
|
||
cisu_1=GlobalLock(cisu_hd); /*GlobalWire* for v32*/
|
||
|
||
if (!cisu_1)
|
||
err_exit(ERR22); //"Memory Alloc Wrong!");
|
||
|
||
cisu=(struct TBF FAR *)cisu_1;
|
||
op_count=_lread((HFILE)hd,(LPSTR)&cisu->t_bf_start,PTZ_LIB_LENGTH); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
if (op_count!=PTZ_LIB_LENGTH)
|
||
err_exit(ERR06); //"Read WINABC.OVL Wrong!");
|
||
|
||
_llseek((HFILE)hd, PD_START_POINTER, 0); //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||
op_count=_lread((HFILE)hd,(LPSTR)&pindu.pd_bf0,PD_LENGTH); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>Ƶ<EFBFBD>ȱ<EFBFBD>
|
||
if (op_count!=PD_LENGTH)
|
||
err_exit(ERR06); //("Read WINABC.OVL Wrong!");
|
||
|
||
_llseek(hd, SPBX_START_POINTER, 0); //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||
op_count=_lread(hd,(LPSTR)&spbx_tab,SPBX_LENGTH); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>
|
||
if (op_count!=SPBX_LENGTH)
|
||
err_exit(ERR06); //("Read WINABC.OVL Wrong!");
|
||
_lclose((HFILE)hd);
|
||
|
||
|
||
if (CheckAndCreate(tmmr_rem,user_lib)){
|
||
hd = OpenFile(tmmr_rem, &ofs, OF_READWRITE); //1993.4.15
|
||
if (hd==HFILE_ERROR)
|
||
err_exit(ERR13); //(jiyi_wenjian_cuo);
|
||
op_count=_lread(hd,(LPSTR)&tmmr,TMMR_REAL_LENGTH);
|
||
if (op_count!=TMMR_REAL_LENGTH)
|
||
err_exit(ERR06); //(jiyi_wenjian_cuo);
|
||
|
||
_llseek(hd,TMMR_REAL_LENGTH,0); //move the pointer to the paremeter area
|
||
op_count=_lread(hd,tmp_buffer, PAREMETER_LENGTH); //read the paremeters to the buffer
|
||
if (!op_count) { //1993.4.15 if old tmmr.rem hasn't this ten parameters
|
||
memset(tmp_buffer, 0 , PAREMETER_LENGTH);
|
||
|
||
tmp_buffer[0] = (BYTE)IfTopMost; //transfer the peremeters
|
||
tmp_buffer[1] = sImeG.auto_mode ;
|
||
tmp_buffer[2] = bdd_flag;
|
||
tmp_buffer[3] = sImeG.cbx_flag;
|
||
|
||
op_count = _lwrite((HFILE)hd, rem_area, PAREMETER_LENGTH); //writer the file
|
||
if (op_count!=PAREMETER_LENGTH)
|
||
err_exit (ERR09); //(TMMR_WRITE_WRONG);
|
||
}//if (!op_count)
|
||
else {
|
||
if (op_count!=PAREMETER_LENGTH)
|
||
err_exit(ERR08); //(jiyi_wenjian_cuo);
|
||
}//else
|
||
|
||
_lclose(hd);
|
||
|
||
IfTopMost = tmp_buffer[0]; //transfer the paremeter
|
||
sImeG.auto_mode = tmp_buffer[1]; //1993.4
|
||
bdd_flag = tmp_buffer[2];
|
||
sImeG.cbx_flag = tmp_buffer[3];
|
||
|
||
hd = OpenFile(user_lib, &ofs, OF_READ); //1993.4.15
|
||
if (hd==-1)
|
||
err_exit(ERR10); //(jiyi_wenjian_cuo);
|
||
_llseek(hd,0xa000l,0);
|
||
op_count=_lread(hd,(LPSTR)&kzk_ndx,NDX_REAL_LENGTH);
|
||
if (op_count!=NDX_REAL_LENGTH)
|
||
err_exit(ERR11); //(jiyi_wenjian_cuo);
|
||
_lclose(hd);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
//
|
||
//Popose: check user_word dictionary files "TMMR.REM"
|
||
// "USER.REM"
|
||
// If they are not exist, created.
|
||
//
|
||
|
||
int WINAPI CheckAndCreate(tmmr_rem,user_rem)
|
||
BYTE *tmmr_rem,*user_rem;
|
||
{
|
||
struct INDEX user_file_head;
|
||
struct M_NDX mulu_head={
|
||
0,
|
||
0, //MULU_START_LOW Ŀ¼<C4BF><C2BC>д<EFBFBD><D0B4><EFBFBD>ֽ<EFBFBD>
|
||
0x1800, //MULU_LENGTH_MAX SIZELIB+SIZELIB_KZK Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>=<3D><><EFBFBD><EFBFBD><EFBFBD>صij<D8B5><C4B3><EFBFBD>
|
||
0x10, //MULU_TRUE_LENGTH 10H Ŀ¼<C4BF><C2BC>ʵ<EFBFBD>ʳ<EFBFBD><CAB3><EFBFBD>,<2C><>ʼֻ<CABC>в<EFBFBD><D0B2><EFBFBD>.
|
||
0xA, //MULU_RECORD_LENGTH 10 Ŀ¼ÿ<C2BC><C3BF><EFBFBD><EFBFBD>¼<EFBFBD>ij<EFBFBD><C4B3>ȡ<EFBFBD>
|
||
0, //DATA_START_HI 0 <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>64K֮<4B><D6AE>.
|
||
0x1800, //DATA_START_LOW DW SIZE LIB_W Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD>.
|
||
0x20}; //DATA_RECORD_LENGTH 32 ÿ<><C3BF><EFBFBD><EFBFBD>¼<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>.
|
||
|
||
OFSTRUCT ofs;
|
||
int hd,i,count;
|
||
HANDLE hMem;
|
||
LPSTR rem_area,p;
|
||
WORD *pp;
|
||
|
||
char TMMR_OPEN_WRONG[]= ERR07; //"<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>";
|
||
char TMMR_READ_WRONG[]= ERR08; //"<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>";
|
||
char TMMR_WRITE_WRONG[]=ERR09; // "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>д<EFBFBD><D0B4>";
|
||
char USER_OPEN_WRONG[]= ERR10; //"<22>û<EFBFBD><C3BB>ʿ<EFBFBD><CABF><EFBFBD>";
|
||
char USER_READ_WRONG[]= ERR11; //"<22>û<EFBFBD><C3BB>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>";
|
||
char USER_WRITE_WRONG[]=ERR12; // "<22>û<EFBFBD><C3BB>ʿ<EFBFBD>д<EFBFBD><D0B4>";
|
||
|
||
|
||
hMem=GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT ,TMMR_LIB_LENGTH );
|
||
|
||
if ( hMem == NULL )
|
||
return 0;
|
||
|
||
rem_area=GlobalLock(hMem);
|
||
|
||
hd = OpenFile(tmmr_rem, &ofs, OF_READ);
|
||
if (hd!=-1){
|
||
count = _lread(hd, rem_area, TMMR_LIB_LENGTH);
|
||
if ((rem_area[CHECK_POINT]=='T')&& (rem_area[CHECK_POINT+1]=='X')
|
||
&& (rem_area[CHECK_POINT+2]=='L')
|
||
&& (rem_area[CHECK_POINT+3]=='N'))
|
||
_lclose(hd);
|
||
else
|
||
_lclose(hd),hd=-1;
|
||
} // if (hd!=-1)....
|
||
|
||
if (hd==-1){
|
||
hd = OpenFile(tmmr_rem, &ofs, OF_CREATE|OF_SHARE_DENY_NONE);
|
||
if (hd==-1)
|
||
err_exit(TMMR_OPEN_WRONG);
|
||
else{
|
||
for (i = 0; i<TMMR_LIB_LENGTH; i++)
|
||
rem_area[i]=0; // Init the temp rem
|
||
// area by zero.
|
||
rem_area[CHECK_POINT]='T';
|
||
rem_area[CHECK_POINT+1]='X';
|
||
rem_area[CHECK_POINT+2]='L';
|
||
rem_area[CHECK_POINT+3]='N';
|
||
//give Mark!
|
||
|
||
count = _lwrite(hd, rem_area, TMMR_LIB_LENGTH);
|
||
if (count!=TMMR_LIB_LENGTH)
|
||
err_exit(TMMR_WRITE_WRONG);
|
||
|
||
for (i=0; i<PAREMETER_LENGTH; i++)
|
||
rem_area[0]=0; //clear the buffer
|
||
|
||
rem_area[0] = (CHAR)IfTopMost; //transfer the peremeters
|
||
rem_area[1] = sImeG.auto_mode =0;
|
||
rem_area[2] = bdd_flag=0;
|
||
rem_area[3] = sImeG.cbx_flag=0;
|
||
|
||
count = _lwrite(hd, rem_area, PAREMETER_LENGTH); //writer the file
|
||
if (count!=PAREMETER_LENGTH)
|
||
err_exit (TMMR_WRITE_WRONG);
|
||
|
||
_lclose(hd); //close the file
|
||
} //else...
|
||
}//if (hd==-1)...
|
||
|
||
|
||
//
|
||
// Check or create TMMR.REM file is over. Now, deel with USER.REM.
|
||
//
|
||
hd = OpenFile(user_rem, &ofs, OF_READ);
|
||
if (hd!=-1){
|
||
_llseek(hd,(LONG)LENGTH_OF_USER, 0);
|
||
count = _lread(hd, rem_area, NDX_REAL_LENGTH);
|
||
|
||
if ((rem_area[CHECK_POINT2]=='T')&&(rem_area[CHECK_POINT2+1]=='X')
|
||
&&(rem_area[CHECK_POINT2+2]=='L')
|
||
&& (rem_area[CHECK_POINT2+3]=='N'))
|
||
_lclose(hd);
|
||
else
|
||
_lclose(hd),hd=-1;
|
||
} // if (hd!=-1)....
|
||
|
||
if (hd==-1){
|
||
hd = OpenFile(user_rem, &ofs, OF_CREATE|OF_SHARE_DENY_NONE);
|
||
if (hd==-1)
|
||
err_exit(USER_OPEN_WRONG);
|
||
else{
|
||
for (i = 0; i<TMMR_LIB_LENGTH ; i++)
|
||
rem_area[i]=0; // Init the temp rem
|
||
// area by zero.
|
||
// First, write file para for force remenber.
|
||
|
||
p=(BYTE *)&mulu_head.mulu_start_hi;
|
||
for (i=0; i<16; i++) rem_area[i]=p[i];
|
||
|
||
// Init force rem file
|
||
|
||
for (i=0; i<LENGTH_OF_USER/0x1000; i++){
|
||
count = _lwrite(hd, rem_area, 0x1000);
|
||
if (count!=0x1000 )
|
||
err_exit(USER_WRITE_WRONG);}
|
||
|
||
//Init user dictionary file
|
||
p=(BYTE *)&user_file_head.body_start;
|
||
for (i=0; i<sizeof user_file_head;i++) p[i]=0;
|
||
|
||
user_file_head.body_start=NDX_REAL_LENGTH/16;
|
||
user_file_head.ttl_length=NDX_REAL_LENGTH/16;
|
||
user_file_head.body_length=0;
|
||
user_file_head.index_start=3;
|
||
user_file_head.index_length=NDX_REAL_LENGTH/16-3;
|
||
user_file_head.unused1=0x2000;
|
||
|
||
|
||
p[CHECK_POINT2]='T';
|
||
p[CHECK_POINT2+1]='X';
|
||
p[CHECK_POINT2+2]='L';
|
||
p[CHECK_POINT2+3]='N';
|
||
//give Mark!
|
||
|
||
count = _lwrite(hd,(LPSTR)&user_file_head, NDX_REAL_LENGTH );
|
||
if (count!=NDX_REAL_LENGTH )
|
||
err_exit(TMMR_WRITE_WRONG);
|
||
_lclose(hd);
|
||
} //else...
|
||
}//if (hd==-1)...
|
||
|
||
GlobalUnlock(hMem);
|
||
GlobalFree(hMem);
|
||
return(CLC);
|
||
}// create and check
|
||
|
||
|
||
|
||
//
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ĿǰΪģ<CEAA><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>
|
||
// <20><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>: RETRY, IGNORE, CANCEL
|
||
//
|
||
|
||
void WINAPI err_exit(err_msg)
|
||
char *err_msg;
|
||
{
|
||
|
||
MessageBox(hWnd, err_msg, "ERR", MB_OKCANCEL);
|
||
PostMessage(hWnd,WM_DESTROY,0,0l);
|
||
}
|
||
|
||
|
||
void WINAPI err_exit_proc( err_msg)
|
||
char *err_msg;
|
||
{
|
||
|
||
MessageBox(NULL, err_msg, "ERR", MB_OKCANCEL);
|
||
return ;
|
||
}
|
||
|
||
|
||
int WINAPI GetText32( HDC hdc,LPCTSTR lpString,int cbString)
|
||
{
|
||
|
||
|
||
SIZE lSize;
|
||
|
||
GetTextExtentPoint32(hdc,lpString,cbString,(LPSIZE)&lSize);
|
||
|
||
return lSize.cx;
|
||
}
|
||
|
||
|
||
int WINAPI makep(LPARAM lParam, LPPOINT oldPoint)
|
||
{
|
||
|
||
POINTS newPoint;
|
||
newPoint=MAKEPOINTS(lParam);
|
||
oldPoint->x=(WORD)newPoint.x;
|
||
oldPoint->y=(WORD)newPoint.y;
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
/*******************************************************
|
||
&3:
|
||
cwp_proc():
|
||
********************************************************/
|
||
int WINAPI cwp_proc(mtype)
|
||
int mtype;
|
||
{
|
||
int i, j, m;
|
||
BYTE x;
|
||
switch (mtype){
|
||
case 0:
|
||
return(normal()); //normal pinyin convert
|
||
|
||
case 1:
|
||
abbr(); //ABBR
|
||
return(normal());
|
||
|
||
case 2: // "I" capital chinese number
|
||
case 3: // "i" small chinese number
|
||
if (in.true_length==1){
|
||
in.buffer[1]='1';
|
||
in.true_length++;}
|
||
if (in.true_length>20) in.true_length=20;
|
||
|
||
m=0;
|
||
for(i=1; i<in.true_length; i++){
|
||
x=in.buffer[i];
|
||
if (if_number_or_not(in.buffer[i])){
|
||
if (mtype==2)
|
||
x=in.buffer[i]-0x30;
|
||
}
|
||
if (if_zimu_or_not(in.buffer[i])){
|
||
x=in.buffer[i]&0xdf;
|
||
if (mtype==2)
|
||
if (x=='S' || x=='B' || x=='Q')
|
||
x=x|0x20;
|
||
}
|
||
|
||
for (j=0; j<160; j=j+3){
|
||
if (x==fk_tab[j]){
|
||
out_svw[m++]=fk_tab[j+1];
|
||
out_svw[m++]=fk_tab[j+2];
|
||
x=0xff; // found it
|
||
break;}
|
||
}// for(j)
|
||
if (x!=0xff)
|
||
goto err_back;
|
||
|
||
} // for(i)
|
||
|
||
group_no=1;
|
||
unit_length=m;
|
||
msg_type=2;
|
||
return(1); // success!
|
||
|
||
case 4: // "u" user define word
|
||
return(user_definition());
|
||
|
||
case 12: //continue to change
|
||
return(find_next());
|
||
|
||
case 13: // backword
|
||
return(normal_1(word_back_flag));
|
||
|
||
case 14:
|
||
return(recall());
|
||
|
||
default:
|
||
err_back:
|
||
return(-1);
|
||
|
||
}// switch
|
||
}
|
||
|
||
|
||
|
||
/************************************************
|
||
find_next()
|
||
*************************************************/
|
||
int WINAPI find_next()
|
||
{
|
||
if (wp.yjs<=wp.xsyjw)
|
||
return(STC);
|
||
|
||
return( normal_1(0) );
|
||
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
normal()
|
||
**************************************************/
|
||
int WINAPI normal()
|
||
{
|
||
extb_ps=0xffff;
|
||
by_cchar_flag=0;
|
||
wp.yjs=0;
|
||
wp.xsyjw=0;
|
||
wp.dw_count=0;
|
||
wp.dw_stack[0]=0;
|
||
|
||
if (in.info_flag==0x81)
|
||
by_cchar_flag=1;
|
||
detail_analyse();
|
||
|
||
if (!convert(0)){
|
||
zdyb();
|
||
return(STC);
|
||
}
|
||
|
||
wp.xsyjs=wp.xsyjw;
|
||
wp.xsyjw+=word_long;
|
||
wp.dw_stack[++wp.dw_count]=(BYTE)wp.xsyjw;
|
||
|
||
if (by_cchar_flag!=1){
|
||
if (wp.yjs==wp.xsyjw){
|
||
if (wp.xsyjs!=0){
|
||
sfx_attr=2; //mark for finding sfx_table
|
||
rzw();}
|
||
}//if (wp.xsyjs)
|
||
|
||
else{
|
||
if (word_long<=1){
|
||
if (wp.xsyjs==0){
|
||
sfx_attr=1; //mark for finding sfx_table
|
||
rzw();}//if (wp.xsyjs)
|
||
}//if (word_long)
|
||
}//else
|
||
|
||
}//if (by_cchar...
|
||
|
||
if (wp.yjs<=wp.xsyjw)
|
||
jiyi_mode=0;
|
||
else
|
||
jiyi_mode=1;
|
||
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
/*******************************************************
|
||
normal_1()
|
||
********************************************************/
|
||
int WINAPI normal_1(flag)
|
||
int flag;
|
||
{
|
||
if (in.info_flag==0x81)
|
||
by_cchar_flag=1;
|
||
|
||
if (!convert(flag)){
|
||
zdyb();
|
||
return(STC);
|
||
}
|
||
|
||
wp.xsyjs=wp.xsyjw;
|
||
wp.xsyjw+=word_long;
|
||
wp.dw_stack[++wp.dw_count]=(BYTE)wp.xsyjw;
|
||
|
||
if (by_cchar_flag!=1){
|
||
if (wp.yjs==wp.xsyjw){
|
||
if (wp.xsyjs!=0){
|
||
sfx_attr=2; //mark for finding sfx_table
|
||
rzw();}
|
||
}//if (wp.xsyjs)
|
||
|
||
else{
|
||
if (word_long<=1){
|
||
if (wp.xsyjs==0){
|
||
sfx_attr=1; //mark for finding sfx_table
|
||
rzw();}//if (wp.xsyjs)
|
||
}//if (word_long)
|
||
}//else
|
||
|
||
}//if (by_cchar...
|
||
|
||
|
||
if (wp.yjs<=wp.xsyjw)
|
||
jiyi_mode=0;
|
||
else
|
||
jiyi_mode=1;
|
||
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
int WINAPI recall()
|
||
{
|
||
cls_prompt_only();
|
||
in.info_flag=1;
|
||
wp.yjs=0;
|
||
wp.xsyjw=0;
|
||
by_cchar_flag=0;
|
||
detail_analyse();
|
||
if (!recall_rc())
|
||
return(-1);
|
||
|
||
return (0);
|
||
|
||
}
|
||
|
||
/*************************************************************
|
||
user_definition(): produce the user define word
|
||
**************************************************************/
|
||
int WINAPI user_definition()
|
||
{
|
||
int i,rec_cnt;
|
||
|
||
kbf.max_length=in.max_length;
|
||
kbf.true_length=in.true_length-1; //delete the word "u"
|
||
|
||
for (i=0; i<kbf.true_length; i++)
|
||
kbf.buffer[i]=in.buffer[i+1];
|
||
|
||
read_mulu();
|
||
if (!(rec_cnt=look_for_code()))
|
||
return(STC); //not found
|
||
if (!read_data(rec_cnt-1)) //-1 get the real record count
|
||
return(STC); //not found
|
||
|
||
unit_length=out_svw[0]-0x30; //plus 1 is plus the mark
|
||
word_long=(out_svw[0]-0x30)/2;
|
||
group_no=1;
|
||
CopyMemory/*memmove*/(out_svw,&out_svw[2],unit_length);
|
||
msg_type|=2;
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
|
||
|
||
/***************************************************************
|
||
detail_analyse()
|
||
***************************************************************/
|
||
|
||
int WINAPI detail_analyse()
|
||
{
|
||
int i=0,j=0;
|
||
BYTE *p;
|
||
|
||
copy_input();
|
||
|
||
p=(BYTE *)kbf.buffer;
|
||
do{
|
||
if (!slbl(p)){
|
||
if (i==0)
|
||
return(STC);
|
||
else
|
||
break;
|
||
}
|
||
|
||
if (sb.length==0)
|
||
break;
|
||
|
||
p+=sb.length;
|
||
if (LOBYTE(sb.value)=='V')
|
||
if (sb.head=='J'||sb.head=='Q'||sb.head=='X')
|
||
(BYTE)sb.value='U';
|
||
|
||
wp.syj[i]=sb.head;
|
||
wp.bx_stack[i]=sb.bx1;
|
||
wp.tone[i]=sb.tune;
|
||
wp.yj[j]=sb.value; //WORD transport
|
||
wp.yj_ps[j]=(int)(p-(BYTE *)kbf.buffer);
|
||
|
||
i++, j++;
|
||
if (i>=10) //10 1994.4
|
||
break;
|
||
|
||
if (sb.flag==TRUE)
|
||
break;
|
||
|
||
}while(1);
|
||
|
||
wp.yjs=i;
|
||
|
||
input_msg_type();
|
||
|
||
return (0);
|
||
}
|
||
|
||
|
||
|
||
|
||
int WINAPI slbl(s_buffer)
|
||
BYTE *s_buffer;
|
||
{
|
||
|
||
int i=0,j;
|
||
BYTE cmp_buffer[5]={0};
|
||
char *p;
|
||
BYTE x,attr,y;
|
||
|
||
/* analize the SHENGMU */
|
||
x=s_buffer[i++];
|
||
attr=(BYTE)getattr(x,&x); // get char's attribute
|
||
if (!attr){
|
||
sb.length=i-1;
|
||
sb.flag=TRUE;
|
||
return(1);}
|
||
|
||
if (attr==NUMBER)
|
||
return(0); // error
|
||
if (x=='I' || x=='U' || x=='V')
|
||
return(0); // error
|
||
switch (attr) { //1993.4.22
|
||
case FIRST_T:
|
||
case SECOND_T:
|
||
case THIRD_T:
|
||
case FORTH_T:
|
||
return (0); //error
|
||
} //1993.4.22
|
||
|
||
sb.value=0;
|
||
sb.head=0;
|
||
sb.length=0;
|
||
sb.tune=0;
|
||
sb.bx1=0;
|
||
sb.bx2=0;
|
||
sb.flag=FALSE;
|
||
|
||
sb.head=x;
|
||
if (attr==FUYIN){
|
||
if (x=='Z' || x=='C' || x=='S' ){
|
||
if ((s_buffer[i]&0xdf)==0x48){
|
||
for (j=0; j<15; j=j+5){
|
||
if (x==slbl_tab[j]){
|
||
sb.value=(WORD)slbl_tab[j+4]<<8;
|
||
sb.head=slbl_tab[j+4];
|
||
break;}
|
||
}// for()
|
||
i++;
|
||
}// if (s_buffer)
|
||
else
|
||
sb.value=(WORD)x<<8;
|
||
}// if (x=='z')
|
||
else
|
||
sb.value=(WORD)x<<8;
|
||
}//if (attr==FUYIN)
|
||
else{
|
||
i--;
|
||
sb.value=0;
|
||
} //else
|
||
|
||
|
||
/* analize the YUNMU */
|
||
x=s_buffer[i];
|
||
attr=(BYTE)getattr(x,&x);
|
||
if (!attr){
|
||
sb.length=(WORD)i;
|
||
sb.flag=TRUE;
|
||
return(1);}
|
||
|
||
if (attr==YUANYIN){ //if no YUANYIN, goto step3
|
||
(BYTE)sb.value=x;
|
||
cmp_buffer[0]=x;
|
||
i++;
|
||
for (j=1; j<4; j++){
|
||
x=s_buffer[i++];
|
||
attr=(BYTE)getattr(x,&x);
|
||
if (!attr){
|
||
for (j=j; j<4; j++)
|
||
cmp_buffer[j]='0';
|
||
i--;
|
||
sb.flag=TRUE;
|
||
break;}
|
||
|
||
if (attr==NUMBER){
|
||
for (j=j; j<4; j++)
|
||
cmp_buffer[j]='0';
|
||
i--;
|
||
break;
|
||
}// if
|
||
else
|
||
cmp_buffer[j]=x;
|
||
}//for
|
||
|
||
for (j=3; j>0; j--){
|
||
p=(LPSTR)ABCstrstr((LPSTR)slbl_tab,cmp_buffer); //search the YUNMU
|
||
if (p!=NULL){
|
||
(BYTE)sb.value=*(p+4); //get the YUNMU value
|
||
break;
|
||
}// if (p)
|
||
if (cmp_buffer[j]!=0x30){
|
||
cmp_buffer[j]='0';
|
||
i--;}//if (cmp)
|
||
}// for(j)
|
||
|
||
|
||
}//if (x!=YUANYIN)
|
||
else
|
||
(BYTE)sb.value=0;
|
||
|
||
|
||
/* see if the next is YUANYIN */
|
||
x=s_buffer[i];
|
||
attr=(BYTE)getattr(x,&x);
|
||
if (!attr){
|
||
sb.length=(WORD)i;
|
||
sb.flag=TRUE;
|
||
if (sb.value<=0xff)
|
||
sb.value=sb.value<<8;
|
||
return(1);}
|
||
if (attr==YUANYIN){
|
||
y=s_buffer[i-1]&0xdf;
|
||
if (y=='R'||y=='N'||y=='G'){
|
||
i--;
|
||
(BYTE)sb.value=0;
|
||
for (j=3; j>0; j--){
|
||
if (cmp_buffer[j]!=0x30){
|
||
cmp_buffer[j]='0';
|
||
break;}//if
|
||
}//for
|
||
for (j=3; j>0; j--){
|
||
p=(LPSTR)ABCstrstr((LPSTR)slbl_tab,cmp_buffer); //search the YUNMU
|
||
if (p!=NULL){
|
||
(BYTE)sb.value=*(p+4); //get the YUNMU value
|
||
break;
|
||
}// if (p)
|
||
if (cmp_buffer[j]!=0x30){
|
||
cmp_buffer[j]='0';
|
||
i--;}//if (cmp)
|
||
}// for(j)
|
||
if (!(BYTE)sb.value)
|
||
(BYTE)sb.value=cmp_buffer[0];
|
||
}//if (y=='R')
|
||
}//if (attr==YUANYIN)
|
||
|
||
if (sb.value<=0xff)
|
||
sb.value=sb.value<<8;
|
||
|
||
/* analize the tune */
|
||
x=s_buffer[i];
|
||
attr=(BYTE)getattr(x,&x);
|
||
if (!attr){
|
||
sb.length=(WORD)i;
|
||
sb.flag=TRUE;
|
||
return(1);}
|
||
if (attr==FIRST_T||attr==SECOND_T||attr==THIRD_T||attr==FORTH_T){
|
||
sb.tune=attr;
|
||
i++;}
|
||
|
||
|
||
|
||
/* analize the BIXING */
|
||
for (j=0; j<6; j++){
|
||
x=s_buffer[i++];
|
||
attr=(BYTE)getattr(x,&x);
|
||
if (!attr){
|
||
sb.flag=TRUE;
|
||
sb.length=i-1;
|
||
return(1);}
|
||
|
||
if (attr==SEPERATOR){
|
||
sb.flag=FALSE;
|
||
sb.length=(WORD)i;
|
||
return(1); // if the string has seperator, move the
|
||
} // pointer to the beginning of next YINJIE
|
||
|
||
if (attr!=NUMBER){
|
||
do{ //1993.4.22
|
||
if (attr==YUANYIN || attr==FUYIN){
|
||
sb.flag=FALSE;
|
||
sb.length=i-1;
|
||
return(1);}
|
||
|
||
x=s_buffer[i++];
|
||
attr=(BYTE)getattr(x,&x);
|
||
|
||
if (!attr){
|
||
sb.flag=TRUE;
|
||
sb.length=i-1;
|
||
return(1);}
|
||
}while(i<100);
|
||
return (1);
|
||
} //1993.4.22
|
||
|
||
|
||
if (x>'0' && x<'9'){
|
||
switch(j){
|
||
case 0:
|
||
sb.bx1=x<<4;
|
||
break;
|
||
case 1:
|
||
sb.bx1+=x&0x0f;
|
||
break;
|
||
case 2:
|
||
sb.bx2=(WORD)x;
|
||
sb.bx2<<=12;
|
||
break;
|
||
case 3:
|
||
sb.bx2=sb.bx2+(WORD)((x&0xf)<<8);
|
||
break;
|
||
case 4:
|
||
(BYTE)sb.bx2=x<<4;
|
||
break;
|
||
case 5:
|
||
(BYTE)sb.bx2+=x&0x0f;
|
||
break;
|
||
}//switch
|
||
|
||
}//if(x)
|
||
|
||
}// for
|
||
|
||
do{
|
||
x=s_buffer[i++];
|
||
attr=(BYTE)getattr(x,&x);
|
||
|
||
if (!attr){
|
||
sb.flag=TRUE;
|
||
sb.length=i-1;
|
||
return(1);}
|
||
|
||
if (attr==YUANYIN || attr==FUYIN){
|
||
sb.flag=FALSE;
|
||
sb.length=(WORD)i;
|
||
return(1);}
|
||
|
||
}while(i<100);
|
||
|
||
return (0);
|
||
|
||
}
|
||
|
||
|
||
|
||
/*******************************************************
|
||
getchr(x)
|
||
*******************************************************/
|
||
int WINAPI getattr(x,p)
|
||
BYTE x;
|
||
char *p;
|
||
{
|
||
if (x==0)
|
||
return(FALSE);
|
||
|
||
if (if_number_or_not(x))
|
||
return(NUMBER);
|
||
|
||
if (if_zimu_or_not(x)){
|
||
x=x&0xdf;
|
||
*p=x;
|
||
if (x=='A'||x=='E'||x=='I'||x=='O'||x=='U'||x=='V')
|
||
return(YUANYIN);
|
||
else
|
||
return(FUYIN);
|
||
}
|
||
|
||
if (x==SEPERATOR)
|
||
return(SEPERATOR);
|
||
|
||
|
||
switch(x){
|
||
case '-':
|
||
return(FIRST_T);
|
||
case '/':
|
||
return(SECOND_T);
|
||
case '~':
|
||
case '^':
|
||
return(THIRD_T);
|
||
case '\\':
|
||
return(FORTH_T);
|
||
|
||
}
|
||
|
||
return (FALSE);
|
||
}
|
||
|
||
|
||
|
||
/*******************************************************
|
||
neg_slbl()
|
||
********************************************************/
|
||
int WINAPI neg_slbl(value)
|
||
WORD value;
|
||
{
|
||
int i=0;
|
||
BYTE x;
|
||
|
||
s_tune();
|
||
x=HIBYTE(value);
|
||
if (x>=0x41)
|
||
neg.buffer[i++]=x;
|
||
else{
|
||
if (x!=0)
|
||
i=neg_sc(i,x);
|
||
}
|
||
|
||
x=LOBYTE(value);
|
||
if (x>=0x41)
|
||
neg.buffer[i++]=x;
|
||
else{
|
||
if (x!=0)
|
||
i=neg_sc(i,x);
|
||
}
|
||
|
||
neg.buffer[i]=sb.tune;
|
||
neg.length=i;
|
||
for (x=0; x<i+1; x++)
|
||
neg.buffer[x]=neg.buffer[x]|0x20;
|
||
return(1);
|
||
|
||
}
|
||
|
||
|
||
/******************************************
|
||
neg_sc(i,x)
|
||
*******************************************/
|
||
int WINAPI neg_sc(i,x)
|
||
int i;
|
||
BYTE x;
|
||
{
|
||
int j,n;
|
||
|
||
n=(x-1)*5;
|
||
for (j=0; j<4; j++){
|
||
if (slbl_tab[n+j]!=0x30)
|
||
neg.buffer[i++]=slbl_tab[n+j];
|
||
else
|
||
break;
|
||
}
|
||
return(i);
|
||
}
|
||
|
||
|
||
|
||
// if (in.buffer[2]==1)
|
||
// return(recall_rc());
|
||
//========================================================================
|
||
// Covert
|
||
//========================================================================
|
||
//
|
||
|
||
int WINAPI convert(flag)
|
||
int flag;
|
||
{
|
||
int j;
|
||
|
||
// if (sb.bx2!=0)
|
||
// return(0);
|
||
|
||
if (!flag)
|
||
word_long=wp.yjs-wp.xsyjw;
|
||
else
|
||
word_long=flag;
|
||
|
||
if (word_long>9) //?
|
||
word_long=9; //?
|
||
|
||
if (by_cchar_flag==1)
|
||
word_long=1;
|
||
|
||
if (word_long==1)
|
||
return(pre_nt_w1(wp.xsyjw));
|
||
|
||
|
||
|
||
for (j=word_long; j>1; j--){
|
||
word_long=j;
|
||
prepare_search1();
|
||
abbr_s1();
|
||
if (group_no){
|
||
unit_length=j*2;
|
||
return(CLC);
|
||
}// if ()
|
||
}// for()
|
||
|
||
return(pre_nt_w1(wp.xsyjw));
|
||
|
||
}
|
||
|
||
/*********************************************
|
||
copy_input()
|
||
**********************************************/
|
||
int WINAPI copy_input()
|
||
{
|
||
int i=0, j=0;
|
||
|
||
if (in.info_flag==VK_MULTIPLY) //if "*"
|
||
return(0);
|
||
|
||
kbf.true_length=in.true_length;
|
||
if (in.buffer[0]==SEPERATOR){
|
||
kbf.true_length=in.true_length-1;
|
||
i=1;
|
||
}// if ((in.buffer)
|
||
|
||
for (i=i; i<in.true_length+2; i++)
|
||
kbf.buffer[j++]=in.buffer[i];
|
||
|
||
kbf.max_length=in.max_length;
|
||
kbf.info_flag=in.info_flag;
|
||
|
||
return (0);
|
||
|
||
}
|
||
|
||
/**************************************************
|
||
input_msg_type()
|
||
**************************************************/
|
||
void WINAPI input_msg_type()
|
||
{
|
||
int i;
|
||
for (i=0; i<wp.yjs; i++){
|
||
wp.cmp_stack[i]=QP_FLAG;
|
||
if (LOBYTE(wp.yj[i])==0)
|
||
if (wp.syj[i]==HIBYTE(wp.yj[i]))
|
||
wp.cmp_stack[i]=JP_FLAG;
|
||
|
||
if (wp.tone[i]!=0)
|
||
wp.cmp_stack[i]|=YD_FLAG;
|
||
|
||
if (wp.bx_stack[i]!=0)
|
||
wp.cmp_stack[i]|=BX_FLAG;
|
||
|
||
}// for
|
||
|
||
|
||
}
|
||
|
||
/*****************************************************
|
||
pre_nt_w1()
|
||
******************************************************/
|
||
int WINAPI pre_nt_w1(ps)
|
||
int ps;
|
||
{
|
||
unit_length=2;
|
||
word_long=1;
|
||
cmp_yj=wp.yj[ps];
|
||
cmp_head=wp.syj[ps];
|
||
cmp_bx=wp.bx_stack[ps];
|
||
cmp_state=wp.cmp_stack[ps];
|
||
|
||
find_one_hi();
|
||
|
||
w1_no_tune();
|
||
return(group_no);
|
||
|
||
}
|
||
|
||
/********************************************************
|
||
w1_no_tune()
|
||
*********************************************************/
|
||
void WINAPI w1_no_tune()
|
||
{
|
||
out_svw_cnt=0;
|
||
sc_gb();
|
||
sc_gbdy();
|
||
group_no=out_svw_cnt;
|
||
paidui(group_no);
|
||
|
||
}
|
||
|
||
/*********************************************************
|
||
sc_gb()
|
||
**********************************************************/
|
||
int WINAPI sc_gb()
|
||
{
|
||
BYTE x;
|
||
int cnt,i;
|
||
|
||
cnt=(87-15)*94;
|
||
if (cmp_state&4){
|
||
if (cmp_bx==0){
|
||
x=HIBYTE(cmp_yj);
|
||
if (x!='A'&&x!='O'&&x!='E'){
|
||
cnt=(55-15)*94;
|
||
cmp_state=cmp_state|0x80;
|
||
}// if (x=='A')
|
||
else
|
||
cmp_state=(cmp_state&0xfb)|QP_FLAG;
|
||
|
||
}// if (!cmp_bx)
|
||
}// if (cmp_state)
|
||
|
||
for (i=0; i<cnt; i++){
|
||
if (cmp_yj==cisu->t_bf1[i])
|
||
get_the_one(i);
|
||
else{
|
||
if (cmp_state&4){
|
||
if (cmp_head==HIBYTE(cisu->t_bf1[i]))
|
||
get_the_one(i);
|
||
else
|
||
if ( cmp_head==fu_sm(HIBYTE(cisu->t_bf1[i])) )
|
||
get_the_one(i);
|
||
|
||
}// if (cmp_state)
|
||
}//else
|
||
}//for()
|
||
|
||
return(0);
|
||
|
||
}
|
||
|
||
/*******************************************************
|
||
sc_gbdy()
|
||
*******************************************************/
|
||
int WINAPI sc_gbdy()
|
||
{
|
||
int cnt,i;
|
||
|
||
cnt=cisu->t_bf_start[2]/2;
|
||
for (i=0; i<cnt; i=i+2){
|
||
if (cmp_yj==cisu->t_bf2[i])
|
||
get_the_one2(i);
|
||
else{
|
||
if (cmp_state&4){
|
||
if (cmp_head==HIBYTE(cisu->t_bf2[i]))
|
||
get_the_one2(i);
|
||
else {
|
||
if (cmp_head==fu_sm(HIBYTE(cisu->t_bf2[i])))
|
||
get_the_one2(i);}
|
||
}// if (cmp_state)
|
||
}//else
|
||
}//for()
|
||
|
||
return(0);
|
||
|
||
}
|
||
|
||
/********************************************************
|
||
get_the_one()
|
||
*********************************************************/
|
||
int WINAPI get_the_one(i)
|
||
int i;
|
||
{
|
||
BYTE x;
|
||
|
||
WORD *out_svw_p=(WORD *)out_svw;
|
||
BYTE *msx_p=(BYTE *)msx_area;
|
||
|
||
if (cmp_bx1(i)!=0)
|
||
return(0);
|
||
|
||
out_svw_p[out_svw_cnt]=i+0x2020;
|
||
|
||
if (i>=(55-16+1)*94)
|
||
x=0x20;
|
||
else
|
||
x=pindu.pd_bf1[i];
|
||
|
||
if (cmp_state&0x80){
|
||
if (x<=(154+50)){
|
||
return(0);
|
||
}// if (x)
|
||
}// if (cmp_state)
|
||
msx_p[out_svw_cnt]=x;
|
||
out_svw_cnt++;
|
||
return(0);
|
||
|
||
}
|
||
|
||
/***********************************************************
|
||
cmp_bx1()
|
||
************************************************************/
|
||
int WINAPI cmp_bx1(i)
|
||
int i;
|
||
{
|
||
BYTE x;
|
||
|
||
if (cmp_bx==0)
|
||
return(0);
|
||
|
||
x=spbx_tab[i];
|
||
if (x==cmp_bx)
|
||
return(0);
|
||
|
||
x=x&0xf0;
|
||
if (x==cmp_bx)
|
||
return(0);
|
||
|
||
return(1);
|
||
|
||
}
|
||
|
||
|
||
/********************************************************
|
||
get_the_one2()
|
||
*********************************************************/
|
||
int WINAPI get_the_one2(i)
|
||
int i;
|
||
{
|
||
BYTE x;
|
||
|
||
WORD *out_svw_p=(WORD *)out_svw;
|
||
BYTE *msx_p=(BYTE *)msx_area;
|
||
|
||
if (cmp_bx2(i)!=0)
|
||
return(0);
|
||
|
||
out_svw_p[out_svw_cnt]=i+0x8000;
|
||
|
||
if ((i/2)>=pindu.pd_bf0[2])
|
||
x=0x20;
|
||
else
|
||
x=pindu.pd_bf2[i/2];
|
||
|
||
if (cmp_state&0x80){
|
||
if (x<=(154+50)){
|
||
return(0);
|
||
}// if (x)
|
||
}// if (cmp_state)
|
||
msx_p[out_svw_cnt]=x;
|
||
out_svw_cnt++;
|
||
return(0);
|
||
|
||
}
|
||
|
||
/***********************************************************
|
||
cmp_bx2()
|
||
************************************************************/
|
||
int WINAPI cmp_bx2(i)
|
||
int i;
|
||
{
|
||
BYTE x;
|
||
WORD y;
|
||
|
||
if (cmp_bx==0)
|
||
return(0);
|
||
|
||
i++;
|
||
y=cisu->t_bf2[i];
|
||
y=((BYTE)y-0xb0)*94+(HIBYTE(y)-0xa1);
|
||
|
||
x=spbx_tab[y];
|
||
if (x==cmp_bx)
|
||
return(0);
|
||
|
||
x=x&0xf0;
|
||
if (x==cmp_bx)
|
||
return(0);
|
||
|
||
return(1);
|
||
|
||
}
|
||
|
||
/***********************************************************
|
||
paidui()
|
||
************************************************************/
|
||
int WINAPI paidui(cnt)
|
||
int cnt;
|
||
{
|
||
int i,j,n,flag;
|
||
BYTE x1,y1;
|
||
WORD x,y;
|
||
WORD *out_p;
|
||
BYTE *msx_p=(BYTE *)msx_area;
|
||
|
||
out_p=(WORD *)out_svw;
|
||
if (cnt<=1)
|
||
return(0);
|
||
|
||
for (n=cnt-1; n>0; n--){
|
||
flag=0;
|
||
for (i=0; i<n; i++){
|
||
if (msx_p[i]==msx_p[i+1]){
|
||
if (out_p[i]>out_p[i+1]){
|
||
x=out_p[i];
|
||
out_p[i]=out_p[i+1];
|
||
out_p[i+1]=x;
|
||
flag++;
|
||
}//if (out_p)
|
||
}// if (msx_p)
|
||
else{
|
||
if (msx_p[i]<msx_p[i+1]){
|
||
x1=msx_p[i];
|
||
msx_p[i]=msx_p[i+1];
|
||
msx_p[i+1]=x1;
|
||
x=out_p[i];
|
||
out_p[i]=out_p[i+1];
|
||
out_p[i+1]=x;
|
||
flag++;
|
||
}
|
||
}//else
|
||
}// for(i)
|
||
if (flag==0)
|
||
break;
|
||
|
||
}// for(n)
|
||
|
||
return (0);
|
||
}
|
||
|
||
|
||
|
||
void WINAPI s_tune()
|
||
{
|
||
}
|
||
|
||
int WINAPI fu_sm(fy)
|
||
BYTE fy;
|
||
{
|
||
switch(fy){
|
||
case 1:
|
||
return('Z');
|
||
case 2:
|
||
return('S');
|
||
case 3:
|
||
return('C');
|
||
default:
|
||
return(fy);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/**********************************************
|
||
find_one_hi()
|
||
***********************************************/
|
||
int WINAPI find_one_hi()
|
||
{
|
||
WORD foh_save=0;
|
||
int i;
|
||
|
||
if (!cmp_bx)
|
||
if (cmp_state&4)
|
||
return(0);
|
||
|
||
sImeG.cp_ajust_flag=0;
|
||
|
||
i=0;
|
||
do{
|
||
if (czcx(&tmmr.stack1[i])){
|
||
if (!foh_save)
|
||
foh_save=cmp_cisu;
|
||
else{
|
||
if (foh_save==cmp_cisu){
|
||
sImeG.cp_ajust_flag=1;
|
||
result_area[result_area_pointer++]=LOBYTE(cmp_cisu);
|
||
result_area[result_area_pointer++]=HIBYTE(cmp_cisu);
|
||
return(0);
|
||
}//if (foh_save)
|
||
}//else
|
||
}//if (czcx)
|
||
i++;
|
||
}while(i<(sizeof tmmr.stack1)/2); //94.1 add div 2
|
||
|
||
return (0);
|
||
}
|
||
|
||
/*************************************************
|
||
czcx()
|
||
**************************************************/
|
||
int WINAPI czcx(stack)
|
||
WORD *stack;
|
||
{
|
||
|
||
cmp_cisu=stack[0];
|
||
|
||
if (!cmp_cisu)
|
||
return(STC);
|
||
|
||
if (cmp_bx)
|
||
if (HIBYTE(cmp_cisu)&0x40)
|
||
cmp_cisu&=0xbfff;
|
||
|
||
if (cmp_a_slbl_with_bx())
|
||
return(CLC);
|
||
|
||
return(STC);
|
||
|
||
}
|
||
|
||
/********************************************
|
||
find_multy_hi()
|
||
*********************************************/
|
||
int WINAPI find_multy_hi()
|
||
{
|
||
if (word_long==2)
|
||
find_two_hi();
|
||
if (word_long==3)
|
||
find_three_hi();
|
||
return(0);
|
||
|
||
}
|
||
|
||
/********************************************
|
||
find_two_hi()
|
||
*********************************************/
|
||
int WINAPI find_two_hi()
|
||
{
|
||
int i,j;
|
||
WORD *result_p;
|
||
|
||
result_p=(WORD *)result_area;
|
||
|
||
for (i=0; i<(sizeof tmmr.stack2)/(2*2); i=i+2){ //94.1 add *2
|
||
if (!tmmr.stack2[i]){
|
||
sImeG.cp_ajust_flag=0;
|
||
return(0);
|
||
}
|
||
|
||
if (cmp_2_and_3(&tmmr.stack2[i])){
|
||
sImeG.cp_ajust_flag=1;
|
||
for (j=0; j<word_long; j++)
|
||
result_p[result_area_pointer/2+j]=tmmr.stack2[j+i]&0xbfff;
|
||
result_area_pointer+=word_long*2;
|
||
return(0);
|
||
}//if
|
||
}//for
|
||
|
||
sImeG.cp_ajust_flag=0;
|
||
return(0);
|
||
|
||
}
|
||
|
||
/********************************************
|
||
find_three_hi()
|
||
*********************************************/
|
||
int WINAPI find_three_hi()
|
||
{
|
||
int i,j;
|
||
WORD *result_p;
|
||
|
||
result_p=(WORD *)result_area;
|
||
|
||
for (i=0; i<(sizeof tmmr.stack3)/(3*2); i=i+3){ //94.1 add *2
|
||
if (!tmmr.stack3[i]){
|
||
sImeG.cp_ajust_flag=0;
|
||
return(0);
|
||
}
|
||
|
||
if (cmp_2_and_3(&tmmr.stack3[i])){
|
||
sImeG.cp_ajust_flag=1;
|
||
for (j=0; j<word_long; j++)
|
||
result_p[result_area_pointer/2+j]=tmmr.stack3[j+i]&0xbfff;
|
||
result_area_pointer+=word_long*2;
|
||
return(0);
|
||
}// if (cmp_2_and_3)
|
||
}//for
|
||
|
||
sImeG.cp_ajust_flag=0;
|
||
return(0);
|
||
|
||
}
|
||
|
||
/***********************************************
|
||
cmp_2_and_3()
|
||
************************************************/
|
||
int WINAPI cmp_2_and_3(t_stack)
|
||
WORD *t_stack;
|
||
{
|
||
int i,yj_p;
|
||
|
||
yj_p=wp.xsyjw; //1993,10,8
|
||
for (i=0; i<word_long; i++){
|
||
cmp_cisu=t_stack[i];
|
||
pre_cmp((WORD)yj_p);
|
||
if (word_long==2)
|
||
if (cmp_state&4)
|
||
if (!(HIBYTE(cmp_cisu)&0x40))
|
||
return(STC);
|
||
else
|
||
cmp_cisu&=0xbfff;
|
||
|
||
if (!cmp_a_slbl_with_bx())
|
||
return(STC);
|
||
yj_p++;
|
||
}
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
|
||
void WINAPI find_that()
|
||
{
|
||
}
|
||
|
||
int WINAPI find_hz(x)
|
||
WORD x;
|
||
{
|
||
if (x>0xa000 || x<0x2020)
|
||
return(x);
|
||
|
||
if (x>=0x8000){
|
||
x=(x-0x8000)+1;
|
||
return(cisu->t_bf2[x]);
|
||
}
|
||
|
||
return((x-0x2020)/94+0xb0+((x-0x2020)%94+0xa1)*0x100);
|
||
|
||
|
||
}
|
||
|
||
/*************************************************
|
||
prepare_search1()
|
||
**************************************************/
|
||
int WINAPI prepare_search1()
|
||
{
|
||
BYTE f_ci1,f_ci2,x;
|
||
|
||
f_ci1=wp.syj[wp.xsyjw];
|
||
f_ci2=wp.syj[wp.xsyjw+1];
|
||
f_ci1=(BYTE)fu_sm(f_ci1);
|
||
f_ci2=(BYTE)fu_sm(f_ci2);
|
||
|
||
if(f_ci1<0x41)
|
||
f_ci1=0x41;
|
||
if (word_long>=5)
|
||
f_ci2=(BYTE)word_long;
|
||
|
||
search_and_read(f_ci1,f_ci2);
|
||
//
|
||
// After reading, counting the search place is needed
|
||
// First, count the STD dictionary buffers
|
||
//
|
||
search_start=6;
|
||
search_end=6;
|
||
if (word_lib_state&1){
|
||
x=word_long-2;
|
||
if (x>=3){
|
||
x-=3;
|
||
search_start+=4;}
|
||
|
||
if (x>0)
|
||
{
|
||
if (sizeof lib_w<lib_w[x-1])
|
||
search_start=sizeof lib_w;
|
||
else
|
||
search_start=lib_w[x-1];
|
||
}
|
||
|
||
search_end=lib_w[x];
|
||
if (sizeof lib_w<search_end)
|
||
search_end=sizeof lib_w;
|
||
|
||
}//if (word_lib_state)
|
||
|
||
//
|
||
// Second, count the User dic. area.
|
||
//
|
||
|
||
kzk_search_start=6;
|
||
kzk_search_end=6;
|
||
if (!(word_lib_state&2)) //Note exp: !word...&2
|
||
return(1); // and !(word&2)
|
||
|
||
x=word_long-2;
|
||
if (x>=3){
|
||
x-=3;
|
||
kzk_search_start+=4;}
|
||
|
||
if (x>0)
|
||
{
|
||
if (sizeof kzk_lib_w<kzk_lib_w[x-1])
|
||
kzk_search_start=sizeof kzk_lib_w;
|
||
else
|
||
kzk_search_start=kzk_lib_w[x-1];
|
||
}
|
||
|
||
kzk_search_end=kzk_lib_w[x];
|
||
if (sizeof kzk_lib_w<kzk_search_end)
|
||
kzk_search_end=sizeof kzk_lib_w;
|
||
|
||
return (0);
|
||
}
|
||
|
||
|
||
/********************************************
|
||
search_and_read()
|
||
entry: LOBYTE(f_ci)=the first letter,
|
||
HIBYTE(f_ci)=the second letter,
|
||
exit: NC success; C not success;
|
||
**********************************************/
|
||
int WINAPI search_and_read(f_ci1,f_ci2)
|
||
BYTE f_ci1,f_ci2;
|
||
{
|
||
if (if_already_in(f_ci1,f_ci2))
|
||
return(0);
|
||
|
||
count_basic_pera(f_ci1,f_ci2);
|
||
if (item_length!=0)
|
||
if (read_a_page(0,r_addr,item_length))
|
||
word_lib_state=word_lib_state|1;
|
||
read_kzk_lib();
|
||
|
||
return (1);
|
||
}
|
||
|
||
/***************************************************************
|
||
if_already_in(): adjust if the page has already in the memory
|
||
*****************************************************************/
|
||
int WINAPI if_already_in(f_ci1,f_ci2)
|
||
BYTE f_ci1,f_ci2;
|
||
{
|
||
WORD x;
|
||
|
||
(BYTE)x=f_ci2;
|
||
x=x*0x100+f_ci1;
|
||
|
||
if (x==last_item_name)
|
||
return(CLC);
|
||
|
||
if (f_ci1==(BYTE)last_item_name)
|
||
if (f_ci2>9)
|
||
return(STC);
|
||
else
|
||
if (HIBYTE(last_item_name)>9)
|
||
return(STC);
|
||
else
|
||
return(CLC);
|
||
|
||
return(STC);
|
||
|
||
}
|
||
|
||
/********************************************************
|
||
count_basic_pera(): count the sub_library address;
|
||
count the page address;
|
||
count the read_write length;
|
||
********************************************************/
|
||
int WINAPI count_basic_pera(f_ci1,f_ci2)
|
||
BYTE f_ci1,f_ci2;
|
||
{
|
||
BYTE x;
|
||
|
||
word_lib_state=0;
|
||
item_addr=0xffff;
|
||
item_length=0;
|
||
(BYTE)last_item_name=f_ci2;
|
||
last_item_name=last_item_name*0x100+f_ci1;
|
||
|
||
if (f_ci1>'I'&& f_ci1<'U')
|
||
slib_addr=(f_ci1-0x41-1)*27;
|
||
else
|
||
if (f_ci1>'V')
|
||
slib_addr=(f_ci1-0x41-3)*27;
|
||
else
|
||
slib_addr=(f_ci1-0x41)*27;
|
||
|
||
r_addr=ndx.dir[slib_addr+1];
|
||
r_addr+=ndx.body_start;
|
||
r_addr=r_addr*16;
|
||
|
||
if (f_ci2<'A')
|
||
item_addr=slib_addr+MORE_THAN_5;
|
||
else
|
||
if (f_ci2>'I' && f_ci2<'U')
|
||
item_addr=slib_addr+(f_ci2-0x41-1);
|
||
else
|
||
if (f_ci2>'V')
|
||
item_addr=slib_addr+(f_ci2-0x41-3);
|
||
else
|
||
item_addr=slib_addr+(f_ci2-0x41);
|
||
|
||
r_addr=r_addr+ndx.dir[item_addr+1+1];
|
||
item_length=ndx.dir[item_addr+1+1+1];
|
||
item_length-=ndx.dir[item_addr+1+1];
|
||
return(0);
|
||
|
||
}
|
||
|
||
/***********************************************************
|
||
read_kzk_lib(): search the expended lib
|
||
************************************************************/
|
||
int WINAPI read_kzk_lib()
|
||
{
|
||
r_addr=kzk_ndx.dir[slib_addr+1];
|
||
r_addr+=kzk_ndx.body_start;
|
||
r_addr=r_addr*16+KZK_BASE;
|
||
r_addr=r_addr+kzk_ndx.dir[item_addr+1+1];
|
||
kzk_item_length=kzk_ndx.dir[item_addr+1+1+1];
|
||
item_length-=kzk_ndx.dir[item_addr+1+1];
|
||
if (kzk_item_length<0)
|
||
kzk_item_length=0;
|
||
if (!kzk_item_length)
|
||
return(STC);
|
||
if (!read_a_page(1,r_addr,kzk_item_length))
|
||
return(STC);
|
||
word_lib_state|=2;
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////////////////////
|
||
// <20><><EFBFBD>ʿ<EFBFBD> READ_A_PAGE() //
|
||
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ĵʿ<C4B4>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD> //
|
||
// <20><><EFBFBD><EFBFBD>: START_PS <20><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>ʼλ<CABC><CEBB> //
|
||
// FILE_FLAG =0 <20><><EFBFBD><EFBFBD><EFBFBD><D7BC> //
|
||
// =1 <20><>չ<EFBFBD><D5B9> //
|
||
// SIZE <20><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>(<28>ֽ<EFBFBD><D6BD><EFBFBD>) //
|
||
// <20><><EFBFBD><EFBFBD>: TRUE <20>ɹ<EFBFBD> //
|
||
// FALSE ʧ<><CAA7> //
|
||
// ע<><D7A2>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ж<EFBFBD>SIZE<5A>Ĵ<EFBFBD>С<EFBFBD>Ƿ<EFBFBD>Խ<EFBFBD><D4BD>,<2C>Է<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>. //
|
||
// <20><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD>ض<EFBFBD>. //
|
||
///////////////////////////////////////////////////////////////////////////
|
||
|
||
int WINAPI read_a_page(file_flag, start_ps, size)
|
||
BYTE file_flag;
|
||
LONG start_ps;
|
||
WORD size;
|
||
{
|
||
// 94/4/16 HANDLE hd;
|
||
int hd = -1;
|
||
|
||
if ((last_flag==file_flag)&&(last_start_ps==start_ps)&&(last_size==size))
|
||
return(1);
|
||
//<2F><><EFBFBD>ζ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>ȫ<EFBFBD><C8AB>ͬ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲<EFBFBD><CCB2><EFBFBD>;
|
||
|
||
|
||
|
||
if (file_flag==0)
|
||
{
|
||
if (size> sizeof lib_w) size=sizeof lib_w;
|
||
hd=OpenFile(std_dct,&openbuf,OF_READ);
|
||
if (hd == -1) return(0);
|
||
_llseek(hd,start_ps,0);
|
||
if(_lread(hd,(LPSTR)lib_w,size)<=0)
|
||
{
|
||
_lclose(hd);
|
||
return(0);
|
||
}
|
||
}
|
||
|
||
|
||
if (file_flag==1)
|
||
{
|
||
hd=OpenFile(user_lib,&openbuf_kzk,OF_READ);
|
||
if (hd == -1) return(0);
|
||
if (size>sizeof kzk_lib_w) size=sizeof kzk_lib_w;
|
||
//<2F>жϻ<D0B6><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
_llseek(hd,start_ps,0);
|
||
if(_lread(hd,(LPSTR)kzk_lib_w,size)<=0)
|
||
{
|
||
_lclose(hd);
|
||
return(0);
|
||
}
|
||
}
|
||
|
||
if ( hd != -1 )
|
||
_lclose(hd);
|
||
|
||
last_flag=file_flag;
|
||
last_start_ps=start_ps; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
last_size=size;
|
||
return(1);
|
||
}
|
||
|
||
/**********************************************************************
|
||
Name: abbr_s1()
|
||
Popurse: Find match words arrcoding to the given input message.
|
||
Search order is:
|
||
Temp_rem area
|
||
Standard Dictionary
|
||
User Dictionary
|
||
If there are more than one words, judge what is the
|
||
suitable one.
|
||
|
||
**********************************************************************/
|
||
int WINAPI abbr_s1()
|
||
{
|
||
group_no=0;
|
||
msx_area_cnt=0;
|
||
out_svw_cnt=0;
|
||
|
||
find_new_word(); // Search temp rem_area
|
||
|
||
abbr_entry((BYTE *)kzk_lib_w+kzk_search_start,(BYTE *)kzk_lib_w+kzk_search_end,4);
|
||
// Search User dic.
|
||
abbr_entry((BYTE *)lib_w+search_start, (BYTE *)lib_w+search_end,0);
|
||
// Search stndard dic.
|
||
|
||
if (!group_no) return(STC); // Without any results...
|
||
if (group_no==1) return(CLC); // Only one!
|
||
|
||
order_result2(); // Results more than one...
|
||
if (sImeG.auto_mode) find_multy_hi(); // If in frenquency ajust mode...
|
||
return(CLC); // Return OK.
|
||
}
|
||
|
||
/********************************************************
|
||
find_new_word()
|
||
*********************************************************/
|
||
void WINAPI find_new_word()
|
||
{
|
||
fczs1((LPSTR)tmmr.temp_rem_area,sizeof tmmr.temp_rem_area,2);
|
||
fczs1((LPSTR)tmmr.rem_area,sizeof tmmr.rem_area,0x82);
|
||
|
||
}
|
||
|
||
/*****************************************************
|
||
fczs1()
|
||
******************************************************/
|
||
int WINAPI fczs1(rem_p,end,area_flag)
|
||
BYTE *rem_p; //92-12-18 SZ
|
||
int end,area_flag;
|
||
{
|
||
int i=0,w_long,j;
|
||
WORD *p;
|
||
|
||
w_long=word_long*2;
|
||
|
||
while(i<end){
|
||
if (w_long==rem_p[i]){
|
||
if (find_long_word2(&rem_p[i])){
|
||
group_no+=1;
|
||
if (!trs_new_word(i,&rem_p[i],area_flag)) //
|
||
return(0);
|
||
}// if (find_long_word2)
|
||
}// if (w_long)
|
||
|
||
if (rem_p[i]==0)
|
||
return(0);
|
||
|
||
if (rem_p[i]>18||(rem_p[i]&1)){
|
||
p=(WORD *)&rem_p[i];
|
||
for (j=0; j<(end-i)/2; j++){ //94.2.3 ZHU (end-i)/2
|
||
if (p[j]!=0)
|
||
p[j]=0;
|
||
else
|
||
return(0);
|
||
}// for
|
||
}//if (rem_p)
|
||
|
||
i+=rem_p[i]+2;
|
||
|
||
}//while
|
||
|
||
return (0);
|
||
}
|
||
|
||
/************************************************
|
||
find_long_word2()
|
||
*************************************************/
|
||
int WINAPI find_long_word2(buffer)
|
||
BYTE *buffer;
|
||
{
|
||
int yj_p,i;
|
||
|
||
yj_p=wp.xsyjw;
|
||
for (i=0; i<word_long*2; i=i+2){
|
||
cmp_cisu=buffer[i+2]+buffer[i+2+1]*0x100;
|
||
pre_cmp((WORD)yj_p);
|
||
if (!cmp_a_slbl_with_bx())
|
||
return(STC);
|
||
yj_p++;
|
||
}
|
||
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
trs_new_word()
|
||
**************************************************/
|
||
int WINAPI trs_new_word(word_addr,buffer,area_flag)
|
||
int word_addr,area_flag;
|
||
BYTE *buffer;
|
||
{
|
||
int i;
|
||
|
||
if (out_svw_cnt>=sizeof out_svw){
|
||
group_no--;
|
||
return(STC);
|
||
}// if (out_svw_cnt)
|
||
|
||
for (i=0;i<word_long*2; i++)
|
||
out_svw[out_svw_cnt++]=buffer[i+2];
|
||
|
||
msx_area[msx_area_cnt].pindu=0x70+(BYTE)group_no;
|
||
msx_area[msx_area_cnt].from=(BYTE)area_flag; //come from temp_area
|
||
msx_area[msx_area_cnt].addr=(WORD)word_addr;
|
||
if (buffer[1]&0x80)
|
||
msx_area[msx_area_cnt].pindu=0x31;
|
||
|
||
msx_area_cnt++;
|
||
|
||
return(CLC);
|
||
}
|
||
|
||
/****************************************
|
||
pre_cmp()
|
||
*****************************************/
|
||
void WINAPI pre_cmp(x)
|
||
WORD x;
|
||
{
|
||
cmp_yj=wp.yj[x];
|
||
cmp_head=wp.syj[x];
|
||
cmp_state=wp.cmp_stack[x];
|
||
cmp_bx=wp.bx_stack[x];
|
||
}
|
||
|
||
/******************************************
|
||
cmp_a_slbl_with_bx()
|
||
*******************************************/
|
||
int WINAPI cmp_a_slbl_with_bx()
|
||
{
|
||
if (cmp_cisu<0x2020)
|
||
return(STC);
|
||
|
||
if (cmp_cisu>=0x8000){
|
||
if ((cmp_cisu-0x8000)>=cisu->t_bf_start[2]/2)
|
||
return(STC);}
|
||
else{
|
||
if ((cmp_cisu-0x2020)>=cisu->t_bf_start[1]/2)
|
||
return(STC);}
|
||
|
||
if (!cmp_a_slbl())
|
||
return(STC);
|
||
|
||
if (!cmp_bx)
|
||
return(CLC);
|
||
|
||
|
||
if (!yjbx())
|
||
return(STC);
|
||
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
/*******************************************
|
||
cmp_a_slbl()
|
||
********************************************/
|
||
int WINAPI cmp_a_slbl()
|
||
{
|
||
|
||
if (cmp_state&2) {
|
||
|
||
if (cmp_cisu>=0x8000){
|
||
if (cmp_yj==cisu->t_bf2[cmp_cisu-0x8000])
|
||
return(CLC);
|
||
else
|
||
return(STC);
|
||
//?? return(cmp_first_letter());
|
||
} //if (cmp_cisu...
|
||
|
||
else{
|
||
if (cmp_yj==cisu->t_bf1[cmp_cisu-0x2020])
|
||
return(CLC);
|
||
else
|
||
return(STC);
|
||
}//else
|
||
}// if (cmp_state...
|
||
|
||
return(cmp_first_letter());
|
||
|
||
}
|
||
|
||
/************************************************
|
||
cmp_first_letter()
|
||
*************************************************/
|
||
int WINAPI cmp_first_letter()
|
||
{
|
||
WORD py_nm;
|
||
if (!(cmp_state&4)) //NOte!!!
|
||
return(STC);
|
||
|
||
py_nm=(WORD)cisu_to_py();
|
||
if ((HIBYTE(py_nm)&0x5f)==cmp_head)
|
||
return(CLC);
|
||
else{
|
||
py_nm=(WORD)get_head(HIBYTE(py_nm));
|
||
if ((LOBYTE(py_nm)&0xdf)==cmp_head)
|
||
return(CLC);
|
||
else
|
||
return(STC);
|
||
}
|
||
|
||
}
|
||
|
||
/***********************************************
|
||
cisu_to_py()
|
||
************************************************/
|
||
int WINAPI cisu_to_py()
|
||
{
|
||
if (cmp_cisu>=0x8000)
|
||
return(cisu->t_bf2[(cmp_cisu-0x8000)]);
|
||
else
|
||
return(cisu->t_bf1[(cmp_cisu-0x2020)]);
|
||
|
||
}
|
||
|
||
/**************************************************
|
||
get_head()
|
||
***************************************************/
|
||
int WINAPI get_head(first_letter)
|
||
BYTE first_letter;
|
||
{
|
||
if (first_letter>=0x41)
|
||
return(first_letter);
|
||
|
||
first_letter=(first_letter-1)*5;
|
||
return(slbl_tab[first_letter]);
|
||
|
||
}
|
||
|
||
/******************************************************
|
||
yjbx()
|
||
*******************************************************/
|
||
int WINAPI yjbx()
|
||
{
|
||
BYTE bx;
|
||
WORD pos;
|
||
|
||
if (cmp_cisu<0x8000)
|
||
pos = cmp_cisu-0x2020;
|
||
else{
|
||
pos =cisu->t_bf2[(cmp_cisu-0x8000)+1];
|
||
pos =(HIBYTE(pos)-0xa1)+(LOBYTE(pos)-0xb0)*94;
|
||
}
|
||
if (pos>= 94*94) return (STC);
|
||
bx=spbx_tab[pos];
|
||
if (cmp_bx==bx)
|
||
return(CLC);
|
||
else
|
||
if (cmp_bx==(bx&0xf0))
|
||
return(CLC);
|
||
else
|
||
return(STC);
|
||
|
||
}
|
||
|
||
|
||
/****************************************************
|
||
abbr_entry()
|
||
*****************************************************/
|
||
int WINAPI abbr_entry(s_start,s_end,ComeFrom)
|
||
BYTE *s_start,*s_end,ComeFrom; //Search start and Ending
|
||
|
||
{ // position
|
||
int i;
|
||
|
||
while (s_start<s_end){
|
||
if (cmp_long_word2(s_start)){ //Compare word by word.
|
||
if (out_svw_cnt>=sizeof out_svw) // If buffer out_svw
|
||
// is full, sorry...
|
||
return(STC);
|
||
for (i=0; i<word_long*2; i++)
|
||
out_svw[out_svw_cnt++]=s_start[i]; //Move the words
|
||
|
||
msx_area[msx_area_cnt].pindu=s_start[i];
|
||
msx_area[msx_area_cnt].from=ComeFrom; //come from ...
|
||
msx_area[msx_area_cnt].addr=(WORD)s_start; // Where is the ...
|
||
|
||
msx_area_cnt++; // Increae the pointer
|
||
// for the attribue area
|
||
|
||
group_no+=1; // In case of OK, increaase
|
||
// results counter.
|
||
}//if(cmp..
|
||
|
||
s_start+=(word_long+word_long+1); // Push down the search pointer
|
||
// by word_long*2+1
|
||
}
|
||
|
||
return(CLC); // The value of return is no
|
||
// use for the route.
|
||
}
|
||
|
||
/******************************************************
|
||
cmp_long_word2()
|
||
*******************************************************/
|
||
int WINAPI cmp_long_word2(buffer)
|
||
BYTE *buffer;
|
||
{
|
||
int yj_p,i;
|
||
|
||
yj_p=wp.xsyjw;
|
||
for (i=0; i<word_long*2; i=i+2){
|
||
cmp_cisu=buffer[i]+buffer[i+1]*0x100;
|
||
if (cmp_cisu<0x2020)
|
||
return(STC);
|
||
pre_cmp((WORD)yj_p);
|
||
if (!cmp_a_slbl_with_bx())
|
||
return(STC);
|
||
yj_p++;
|
||
}
|
||
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
/*******************************************************
|
||
order_result2()
|
||
********************************************************/
|
||
int WINAPI order_result2()
|
||
{
|
||
int lng,i,j,n;
|
||
BYTE x,flag;
|
||
WORD y;
|
||
|
||
lng=word_long*2;
|
||
if (xs_flag==1){
|
||
xs_flag=0;
|
||
if (!fenli_daxie())
|
||
return(0);
|
||
}
|
||
|
||
if (msx_area_cnt==1)
|
||
return(0);
|
||
|
||
|
||
for (i=group_no-1; i>0; i--){
|
||
flag=0;
|
||
for (j=0; j<i; j++){
|
||
if (msx_area[j].pindu<msx_area[j+1].pindu){
|
||
for (n=j*lng; n<j*lng+lng; n++){
|
||
x=out_svw[n];
|
||
out_svw[n]=out_svw[n+lng];
|
||
out_svw[n+lng]=x;
|
||
}//for
|
||
x=msx_area[j].pindu;
|
||
msx_area[j].pindu=msx_area[j+1].pindu;
|
||
msx_area[j+1].pindu=x;
|
||
x=msx_area[j].from;
|
||
msx_area[j].from=msx_area[j+1].from;
|
||
msx_area[j+1].from=x;
|
||
y=msx_area[j].addr;
|
||
msx_area[j].addr=msx_area[j+1].addr;
|
||
msx_area[j+1].addr=y;
|
||
flag=1;
|
||
|
||
}// if (msx)
|
||
}//for(j)
|
||
|
||
if (!flag)
|
||
break;
|
||
}// for(i)
|
||
|
||
|
||
return (0);
|
||
|
||
}
|
||
|
||
/*****************************************************
|
||
fenli_daxie()
|
||
******************************************************/
|
||
int WINAPI fenli_daxie()
|
||
{
|
||
int i,j,n,lng;
|
||
|
||
j=0;
|
||
lng=word_long*2;
|
||
for (i=0; i<msx_area_cnt; i++){
|
||
if (msx_area[i].pindu==0x31){
|
||
msx_area[j].pindu=msx_area[i].pindu;
|
||
msx_area[j].from=msx_area[i].from;
|
||
msx_area[j].addr=msx_area[i].addr;
|
||
for (n=0; n<lng; n++)
|
||
out_svw[j*lng+n]=out_svw[i*lng+n];
|
||
j++;
|
||
}//if
|
||
}// for
|
||
|
||
if (!j)
|
||
return(CLC); // there is no Caps;
|
||
group_no=j;
|
||
return(STC); // there has Caps;
|
||
|
||
}
|
||
|
||
/*************************************************
|
||
rzw()
|
||
**************************************************/
|
||
int WINAPI rzw()
|
||
{
|
||
if (!(system_info&1)) //if strength mode, ret
|
||
sfx_proc();
|
||
return(0);
|
||
|
||
}
|
||
|
||
/************************************************
|
||
abbr()
|
||
*************************************************/
|
||
int WINAPI abbr()
|
||
{
|
||
int i;
|
||
WORD x;
|
||
WORD *kbf_p;
|
||
|
||
if (in.true_length<2){
|
||
xs_flag=1;
|
||
jiyi_pindu|=0x80;
|
||
return(0);
|
||
}
|
||
|
||
for (i=0; i<in.true_length; i++){
|
||
if (in.buffer[i]&0x20){ //if not Caps
|
||
xs_flag=1;
|
||
jiyi_pindu|=0x80;
|
||
return(0);
|
||
}// if
|
||
}//for
|
||
|
||
kbf_p=(WORD *)kbf.buffer;
|
||
x=0x2d*0x100;
|
||
|
||
kbf.true_length=in.true_length*2;
|
||
for (i=0; i<in.true_length; i++){
|
||
(BYTE)x=in.buffer[i];
|
||
*(LPUNAWORD)&kbf_p[i]=x;
|
||
}
|
||
kbf.buffer[in.true_length*2]=0;
|
||
in.info_flag=VK_MULTIPLY;
|
||
return(0);
|
||
|
||
}
|
||
|
||
|
||
/***************************************************
|
||
sfx_proc()
|
||
****************************************************/
|
||
int WINAPI sfx_proc()
|
||
{
|
||
int i,j;
|
||
WORD x,save_xsyjw;
|
||
WORD *result_p;
|
||
BYTE *sfx_p;
|
||
|
||
result_p=(WORD *)result_area;
|
||
sfx_p=(BYTE *)sfx_table;
|
||
|
||
if (sImeG.cp_ajust_flag==1)
|
||
return(0);
|
||
if (word_long>=3)
|
||
return(0);
|
||
|
||
save_xsyjw=(WORD)wp.xsyjw;
|
||
wp.xsyjw=wp.xsyjs;
|
||
|
||
i=0;
|
||
do{
|
||
x=sfx_table[i];
|
||
if (HIBYTE(x)&sfx_attr)
|
||
if (LOBYTE(x)==word_long*2)
|
||
if (cmp_long_word2(&sfx_p[i*2+2])){
|
||
for (j=0; j<word_long; j++)
|
||
result_p[result_area_pointer/2+j]=sfx_table[i+1+j];
|
||
result_area_pointer+=word_long*2;
|
||
wp.xsyjw=save_xsyjw;
|
||
sImeG.cp_ajust_flag=1;
|
||
return(0);
|
||
}//if (cmp_...
|
||
|
||
i+=LOBYTE(x)/2+1;
|
||
|
||
}while(i<sfx_table_size);
|
||
|
||
wp.xsyjw=save_xsyjw;
|
||
|
||
return (0);
|
||
|
||
}
|
||
|
||
|
||
void WINAPI zdyb()
|
||
{
|
||
}
|
||
|
||
/************************************************
|
||
recall_rc()
|
||
*************************************************/
|
||
int WINAPI recall_rc()
|
||
{
|
||
int i;
|
||
BYTE x;
|
||
|
||
word_long=wp.yjs-wp.xsyjw;
|
||
unit_length=word_long*2;
|
||
|
||
i=0;
|
||
do{
|
||
x=logging_stack[i];
|
||
if (!x)
|
||
break;
|
||
if (word_long*2>x)
|
||
i+=x+1;
|
||
else{
|
||
if (x>20) //if more than 10 chinese words?
|
||
break;
|
||
if ((i+x)>=logging_stack_size)
|
||
break; //if the last word is not completely
|
||
if (find_long_word3((WORD *)&logging_stack[i+1],(int)(x/2))){
|
||
trs_new_word3(x,i);
|
||
group_no++;
|
||
if (group_no>5)
|
||
break;
|
||
}
|
||
i+=x+1;
|
||
}//else
|
||
}while(i<logging_stack_size);
|
||
|
||
if (group_no){
|
||
word_long=4;
|
||
unit_length=8;
|
||
return(CLC);
|
||
}
|
||
|
||
return(STC);
|
||
}
|
||
|
||
/*********************************************
|
||
find_long_word3()
|
||
**********************************************/
|
||
int WINAPI find_long_word3(stack,length)
|
||
WORD *stack;
|
||
int length;
|
||
{
|
||
int yj_p,i,err_flg,m;
|
||
|
||
|
||
yj_p=wp.xsyjw;
|
||
|
||
m=0;
|
||
while ((length-m)>=word_long){
|
||
err_flg=0;
|
||
for (i=0; i<word_long; i++){
|
||
cmp_cisu=stack[m+i];
|
||
pre_cmp((WORD)(yj_p+i));
|
||
if (!cmp_a_slbl_with_bx()){
|
||
m++, err_flg=1;
|
||
break;
|
||
}
|
||
}//for
|
||
if (!err_flg)
|
||
return(CLC);
|
||
|
||
}
|
||
return(STC);
|
||
|
||
}
|
||
|
||
|
||
/*************************************************
|
||
trs_new_word3()
|
||
**************************************************/
|
||
void WINAPI trs_new_word3(length,addr)
|
||
int addr;
|
||
BYTE length;
|
||
{
|
||
int cnt,i;
|
||
char *msx_area_p;
|
||
|
||
cnt=8*group_no;
|
||
|
||
msx_area_p=(BYTE *)msx_area;
|
||
msx_area_p[22*group_no]=length;
|
||
addr++;
|
||
for (i=0; i<length; i++)
|
||
msx_area_p[22*group_no+1+i]=logging_stack[addr+i];
|
||
for (i=0; i<8; i++)
|
||
out_svw[cnt+i]=0xa1;
|
||
if ((length/2)<=4){
|
||
for (i=0; i<length; i++)
|
||
out_svw[cnt+i]=logging_stack[addr+i];
|
||
}
|
||
else{
|
||
for (i=0; i<4; i++)
|
||
out_svw[cnt+i]=logging_stack[addr+i];
|
||
out_svw[cnt+i]=0xa1,i++;
|
||
out_svw[cnt+i]=0xad,i++;
|
||
out_svw[cnt+i]=logging_stack[addr+length-2],i++;
|
||
out_svw[cnt+i]=logging_stack[addr+length-1],i++;
|
||
}
|
||
|
||
}
|
||
|
||
/******************************************************
|
||
new_word():
|
||
*******************************************************/
|
||
int WINAPI new_word()
|
||
{
|
||
WORD temp_save,suc_flag,i,j;
|
||
|
||
by_cchar_flag=0;
|
||
wp.xsyjw=0;
|
||
temp_save=sImeG.cp_ajust_flag;
|
||
|
||
suc_flag=0;
|
||
|
||
if (convert(0)){
|
||
sImeG.cp_ajust_flag=(BYTE)temp_save;
|
||
if (unit_length==new_no){
|
||
for (i=0; i<group_no; i++){
|
||
suc_flag = 0; //1993 11 4
|
||
for(j=0; j<new_no; j++){
|
||
if (result_area[j]!=out_svw[i*unit_length+j])
|
||
suc_flag=1;
|
||
}//for(j)
|
||
if (!suc_flag){
|
||
return(0);}
|
||
}//for(i)
|
||
}//if (unit_length)
|
||
}//if(convert)
|
||
|
||
sImeG.cp_ajust_flag=(BYTE)temp_save;
|
||
by_cchar_flag=1;
|
||
return(rem_new_word());
|
||
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
rem_new_word(): fill the new word in temp_rem_area
|
||
************************************************************/
|
||
int WINAPI rem_new_word()
|
||
{
|
||
WORD i,count; //SZ
|
||
WORD *result_area_p;
|
||
|
||
count=(WORD)( (sizeof tmmr.temp_rem_area)-(new_no+2) ); //92-12-18 SZ
|
||
CopyMemory/*memmove*/(&tmmr.temp_rem_area[(new_no+2)/2],
|
||
tmmr.temp_rem_area,
|
||
count);
|
||
|
||
tmmr.temp_rem_area[0]=new_no+jiyi_pindu*0x100;
|
||
|
||
result_area_p=(WORD *)result_area;
|
||
for (i=0; i<new_no/2; i++)
|
||
tmmr.temp_rem_area[i+1]=result_area_p[i];
|
||
|
||
write_new_word(1);
|
||
|
||
return(0);
|
||
|
||
}
|
||
|
||
/**********************************************************************
|
||
Function: AddExtLib()
|
||
Purpose: Get a temperary rem word into high level depanding
|
||
how many times it has been used.
|
||
Entry: Must be called from out_result.
|
||
Out : None.
|
||
***********************************************************************/
|
||
int WINAPI AddExtLib(){
|
||
|
||
int x,count,i;
|
||
|
||
|
||
if((unit_length>=4)&&(unit_length<=18)) //rem word limited
|
||
if(msx_area[current_no].from==2)
|
||
{ // If a rem word?
|
||
x=msx_area[current_no].addr/2; //get word addr in temp...
|
||
|
||
if (x<sizeof tmmr.temp_rem_area/2)
|
||
{ //Insure random errof out limited
|
||
if ((tmmr.temp_rem_area[x]&0xff)!=unit_length)
|
||
return(STC);
|
||
|
||
tmmr.temp_rem_area[x]+=0x100; //Increase used times.
|
||
|
||
if((tmmr.temp_rem_area[x]&0xf00)>=0x300)
|
||
{
|
||
count=(sizeof tmmr.rem_area)
|
||
-(unit_length+2); // Push down middle rem area
|
||
CopyMemory(&tmmr.rem_area[(unit_length+2)/2],
|
||
tmmr.rem_area,
|
||
count);
|
||
|
||
for(i=0; i<unit_length/2+1; i++)
|
||
tmmr.rem_area[i]=tmmr.temp_rem_area[x+i];
|
||
//move to middle rem area.
|
||
|
||
count=sizeof tmmr.temp_rem_area-x*2
|
||
-(unit_length+2); //delete it from temp ...
|
||
CopyMemory(&tmmr.temp_rem_area[x],
|
||
&tmmr.temp_rem_area[x+unit_length/2+1],
|
||
count);
|
||
|
||
write_new_word(0);
|
||
if(tmmr.rem_area[50]) //[400]) //1994.4.21
|
||
{
|
||
UpdateProc();
|
||
}
|
||
} //write changes
|
||
else
|
||
write_new_word(1);
|
||
}
|
||
|
||
}
|
||
|
||
return (0);
|
||
}
|
||
|
||
/********************************************************
|
||
write_new_word():
|
||
*********************************************************/
|
||
void WINAPI write_new_word(flag)
|
||
int flag;
|
||
{
|
||
int count;
|
||
LONG distance;
|
||
WORD *p;
|
||
|
||
distance=sizeof tmmr.stack1+sizeof tmmr.stack2+sizeof tmmr.stack3;
|
||
count=sizeof tmmr.temp_rem_area;
|
||
p=tmmr.temp_rem_area;
|
||
|
||
if (flag!=1){
|
||
distance=sizeof tmmr.stack1+sizeof tmmr.stack2
|
||
+sizeof tmmr.stack3+sizeof tmmr.temp_rem_area;
|
||
p=tmmr.rem_area;
|
||
if (flag<1){
|
||
distance=sizeof tmmr.stack1
|
||
+sizeof tmmr.stack2
|
||
+sizeof tmmr.stack3; //92-12-18 SZ
|
||
p=tmmr.temp_rem_area;
|
||
count=(sizeof tmmr.temp_rem_area)+(sizeof tmmr.rem_area);
|
||
}
|
||
}
|
||
|
||
writefile(tmmr_rem,distance,(LPSTR)p,count);
|
||
|
||
|
||
}
|
||
|
||
/*******************************************************
|
||
writefile(): write file in disk
|
||
********************************************************/
|
||
int WINAPI writefile(file_n,distance,p,count)
|
||
BYTE *file_n;
|
||
LONG distance;
|
||
LPSTR p; //WORD *p;
|
||
int count;
|
||
{
|
||
int hd;
|
||
int write_c;
|
||
|
||
hd=OpenFile(file_n,&open_tmmr,OF_WRITE);
|
||
if (hd==-1) return(STC);
|
||
|
||
_llseek(hd,distance,0);
|
||
write_c=_lwrite(hd,(LPSTR)p,count);
|
||
if (write_c!=count)
|
||
{
|
||
_lclose(hd);
|
||
return(STC);
|
||
}
|
||
hd=_lclose(hd);
|
||
return(CLC);
|
||
}
|
||
|
||
/***************************************************************
|
||
look_for_code(): search if the code is in the index
|
||
****************************************************************/
|
||
int WINAPI look_for_code()
|
||
{
|
||
int i,rec_cnt;
|
||
|
||
rec_cnt=0;
|
||
for (i=0x10; i<(mulu_true_length+0x10); i=i+mulu_record_length){
|
||
if (if_code_equ(i))
|
||
return(rec_cnt+1); //find the code, rec_cnt+1 in order to avoid
|
||
else //confusing with STC
|
||
rec_cnt++;
|
||
}
|
||
return(STC); // not found
|
||
|
||
}
|
||
|
||
|
||
/**************************************************************
|
||
read_data(): read the record correspond to the code
|
||
***************************************************************/
|
||
int WINAPI read_data(rec_cnt)
|
||
int rec_cnt;
|
||
{
|
||
int hd;
|
||
int op_count;
|
||
|
||
hd=OpenFile(user_lib,&open_user, OF_READ);
|
||
if (hd==-1)
|
||
return(FALSE);
|
||
_llseek(hd,(data_start+rec_cnt*data_record_length), 0);
|
||
op_count=_lread(hd,(LPSTR)&out_svw,data_record_length);
|
||
if (op_count!=data_record_length)
|
||
{
|
||
_lclose(hd);
|
||
return(FALSE);
|
||
}
|
||
_lclose(hd);
|
||
|
||
if (out_svw[0]<2)
|
||
return(STC);
|
||
if ((out_svw[0]-0x30)>30)
|
||
return(STC);
|
||
|
||
return(CLC);
|
||
|
||
}
|
||
|
||
int WINAPI UpdateProc()
|
||
{
|
||
|
||
|
||
UpdateFlag=1;
|
||
ExeCmdLine[ParaPos]='7';
|
||
WinExec(ExeCmdLine,SW_SHOW);
|
||
return(0);
|
||
|
||
}
|
||
|
||
|
||
/***********************************************
|
||
rem_pd1()
|
||
************************************************/
|
||
int WINAPI rem_pd1(buffer)
|
||
WORD *buffer;
|
||
{
|
||
WORD temp;
|
||
|
||
temp=buffer[0];
|
||
|
||
if (wp.bx_stack[wp.xsyjs])
|
||
temp|=0x4000;
|
||
else
|
||
if (wp.cmp_stack[wp.xsyjs]==4)
|
||
return(0);
|
||
|
||
push_down_stack1();
|
||
|
||
tmmr.stack1[0]=temp;
|
||
return(0);
|
||
|
||
}
|
||
|
||
/**********************************************
|
||
push_down_stack1()
|
||
***********************************************/
|
||
int WINAPI push_down_stack1()
|
||
{
|
||
int i;
|
||
|
||
i=(sizeof tmmr.stack1-2);
|
||
|
||
CopyMemory/*memmove*/((BYTE *)&tmmr.stack1[1],(BYTE *)&tmmr.stack1[0],i);
|
||
stack1_move_counter++;
|
||
if (stack1_move_counter>=4)
|
||
writefile(tmmr_rem, 0l, (LPSTR)&tmmr.stack1, sizeof tmmr.stack1);
|
||
return(0);
|
||
|
||
}
|
||
|
||
/***********************************************
|
||
rem_pd2()
|
||
************************************************/
|
||
void WINAPI rem_pd2(buffer)
|
||
WORD *buffer;
|
||
{
|
||
|
||
WORD temp1,temp2;
|
||
|
||
int i;
|
||
|
||
temp1=buffer[0], temp2=buffer[1];
|
||
|
||
if (wp.cmp_stack[wp.xsyjs]!=2)
|
||
temp1|=0x4000;
|
||
if (wp.cmp_stack[wp.xsyjs+1]!=2)
|
||
temp2|=0x4000;
|
||
|
||
i=(sizeof tmmr.stack2-4-4);
|
||
CopyMemory/*memmove*/((BYTE *)&tmmr.stack2[2],(BYTE *)&tmmr.stack2[0],i);
|
||
tmmr.stack2[0]=temp1;
|
||
tmmr.stack2[1]=temp2;
|
||
writefile(tmmr_rem, (LONG)sizeof tmmr.stack1,
|
||
(LPSTR)&tmmr.stack2, sizeof tmmr.stack2);
|
||
|
||
|
||
}
|
||
|
||
/***********************************************
|
||
rem_pd3()
|
||
************************************************/
|
||
void WINAPI rem_pd3(buffer)
|
||
WORD *buffer;
|
||
{
|
||
int i;
|
||
i=(sizeof tmmr.stack3-6);
|
||
CopyMemory/*memmove*/((BYTE *)&tmmr.stack3[3],(BYTE *)&tmmr.stack3[0],i);
|
||
for (i=0; i<3; i++)
|
||
tmmr.stack3[i]=buffer[i];
|
||
writefile(tmmr_rem, (LONG)(sizeof tmmr.stack1+sizeof tmmr.stack2),
|
||
(LPSTR)&tmmr.stack3, sizeof tmmr.stack3);
|
||
|
||
}
|
||
|
||
//this module is come from ABCWIN.EXE
|
||
BOOL CALLBACK ImeAboutDlgProc(hDlg, message, wParam, lParam)
|
||
HWND hDlg; /* window handle of the dialog box */
|
||
UINT message; /* type of message */
|
||
WPARAM wParam; /* message-specific information */
|
||
LPARAM lParam;
|
||
{
|
||
RECT rc;
|
||
LONG DlgWidth, DlgHeight;
|
||
|
||
switch (message) {
|
||
case WM_INITDIALOG: /* message: initialize dialog box */
|
||
hCrtDlg = hDlg;
|
||
CenterWindow(hDlg);
|
||
|
||
return (TRUE); // don't want to set focus to special control
|
||
|
||
case WM_CLOSE:
|
||
EndDialog(hDlg, TRUE);
|
||
return (TRUE);
|
||
|
||
case WM_PAINT:
|
||
{
|
||
RECT Rect;
|
||
HDC hDC;
|
||
PAINTSTRUCT ps;
|
||
|
||
GetClientRect(hDlg, &Rect); //get the whole window area
|
||
InvalidateRect(hDlg, &Rect, 1);
|
||
hDC=BeginPaint(hDlg, &ps);
|
||
|
||
|
||
// FillRect(hDC, &Rect, GetStockObject(LTGRAY_BRUSH)); //paint the whole area
|
||
Rect.left+=10;//5;
|
||
Rect.top+=8;//5;
|
||
Rect.right-=10;//5;
|
||
Rect.bottom-=40;//5;
|
||
|
||
DrawEdge(hDC, &Rect, EDGE_RAISED,/*EDGE_SUNKEN,*/ BF_RECT);
|
||
|
||
//FrameRect(hDC, &Rect, GetStockObject(WHITE_BRUSH)); //draw the frame
|
||
EndPaint(hDlg, &ps);
|
||
|
||
|
||
break;
|
||
}
|
||
case WM_COMMAND:
|
||
switch (wParam) {
|
||
case IDOK:
|
||
EndDialog(hDlg, FALSE);
|
||
break;
|
||
case IDCANCEL:
|
||
EndDialog(hDlg, FALSE);
|
||
break;
|
||
default:
|
||
return (FALSE);
|
||
break;
|
||
}
|
||
return (TRUE);
|
||
}
|
||
return (FALSE); /* Didn't process a message */
|
||
}
|
||
|
||
int CommandProc(WPARAM wParam,HWND hWnd)
|
||
|
||
{
|
||
|
||
lpImeL->TempUIWnd = hWnd;
|
||
switch(wParam){
|
||
case IDM_SKL1:
|
||
case IDM_SKL2:
|
||
case IDM_SKL3:
|
||
case IDM_SKL4:
|
||
case IDM_SKL5:
|
||
case IDM_SKL6:
|
||
case IDM_SKL7:
|
||
case IDM_SKL8:
|
||
case IDM_SKL9:
|
||
case IDM_SKL10:
|
||
case IDM_SKL11:
|
||
case IDM_SKL12:
|
||
case IDM_SKL13:
|
||
{
|
||
HIMC hIMC;
|
||
LPINPUTCONTEXT lpIMC;
|
||
LPPRIVCONTEXT lpImcP;
|
||
DWORD fdwConversion;
|
||
|
||
hIMC =(HIMC)GetWindowLongPtr(GetWindow(hWnd,GW_OWNER),IMMGWLP_IMC);
|
||
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
|
||
if (!lpIMC) {
|
||
return (0L);
|
||
}
|
||
|
||
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
|
||
|
||
if (!lpImcP) {
|
||
return (0L);
|
||
}
|
||
|
||
{
|
||
UINT i;
|
||
|
||
lpImeL->dwSKWant = LOWORD(wParam) - IDM_SKL1;
|
||
lpImeL->dwSKState[lpImeL->dwSKWant] =
|
||
lpImeL->dwSKState[lpImeL->dwSKWant]^1;
|
||
|
||
// clear other SK State
|
||
for(i=0; i<NumsSK; i++) {
|
||
if(i == lpImeL->dwSKWant) continue;
|
||
lpImeL->dwSKState[i] = 0;
|
||
}
|
||
|
||
if(lpImeL->dwSKState[lpImeL->dwSKWant]) {
|
||
if(LOWORD(wParam) == IDM_SKL1)
|
||
lpImcP->iImeState = CST_INIT;
|
||
else
|
||
lpImcP->iImeState = CST_SOFTKB;
|
||
fdwConversion = lpIMC->fdwConversion | IME_CMODE_SOFTKBD;
|
||
} else {
|
||
lpImcP->iImeState = CST_INIT;
|
||
fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_SOFTKBD);
|
||
}
|
||
|
||
}
|
||
ImmSetConversionStatus(hIMC, (fdwConversion & ~(IME_CMODE_SOFTKBD)),
|
||
lpIMC->fdwSentence);
|
||
ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
|
||
|
||
ImmUnlockIMCC(lpIMC->hPrivate);
|
||
ImmUnlockIMC(hIMC);
|
||
break;
|
||
}
|
||
|
||
|
||
case SC_METHOD0:
|
||
break;
|
||
case SC_METHOD9:
|
||
DoPropertySheet(GetActiveWindow(),hWnd);
|
||
ReInitIme( hWnd , lpImeL->wImeStyle );
|
||
|
||
break;
|
||
case SC_METHOD4:
|
||
|
||
WinExec("ABCWM.exe", SW_SHOW);
|
||
break;
|
||
|
||
case SC_METHOD6:
|
||
return 0; // 4.20 94
|
||
|
||
case SC_METHOD7:
|
||
WinHelp(hWnd,"winabc.hlp", HELP_FINDER ,0l);
|
||
return 0;
|
||
case SC_METHOD8:
|
||
MessageBeep(0);
|
||
return 0;
|
||
|
||
case SC_METHOD10:
|
||
{
|
||
HIMC hIMC;
|
||
LPINPUTCONTEXT lpIMC;
|
||
HWND hUIWnd;
|
||
|
||
hUIWnd = GetWindow(hWnd, GW_OWNER);
|
||
|
||
if (!hUIWnd) {
|
||
return (0L);
|
||
}
|
||
|
||
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
|
||
if (!hIMC) {
|
||
return (0L);
|
||
}
|
||
|
||
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
|
||
if (!lpIMC) {
|
||
return (0L);
|
||
}
|
||
|
||
DialogBox(hInst,"wfc", lpIMC->hWnd, OpenDlg);
|
||
|
||
ImmUnlockIMC(hIMC);
|
||
break;
|
||
}
|
||
|
||
case SC_METHODA:
|
||
return(0);
|
||
|
||
case SC_ABOUT:
|
||
{
|
||
HIMC hIMC;
|
||
LPINPUTCONTEXT lpIMC;
|
||
HWND hUIWnd;
|
||
|
||
hUIWnd = GetWindow(hWnd, GW_OWNER);
|
||
|
||
if (!hUIWnd) {
|
||
return (0L);
|
||
}
|
||
|
||
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
|
||
if (!hIMC) {
|
||
return (0L);
|
||
}
|
||
|
||
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
|
||
if (!lpIMC) {
|
||
return (0L);
|
||
}
|
||
|
||
DialogBox(hInst, "ABOUT",lpIMC->hWnd,(DLGPROC)ImeAboutDlgProc);
|
||
|
||
ImmUnlockIMC(hIMC);
|
||
break;
|
||
}
|
||
|
||
default:
|
||
break;
|
||
}
|
||
return 0;
|
||
}
|
||
|