You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4328 lines
192 KiB
4328 lines
192 KiB
/*++
|
|
|
|
Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved
|
|
|
|
Module Name:
|
|
|
|
UI.c
|
|
|
|
++*/
|
|
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
#include <string.h>
|
|
#include <memory.h>
|
|
#include <immdev.h>
|
|
#include "imedefs.h"
|
|
|
|
typedef struct tagINTERCODEAREA {
|
|
DWORD PreCount;
|
|
DWORD StartInterCode;
|
|
DWORD EndInterCode;
|
|
} INTERCODEAREA,*LPINTERCODEAREA;
|
|
|
|
PPRIVCONTEXT lpEngPrivate;
|
|
|
|
EMB_Head *EMB_Table;
|
|
TCHAR *ZM_Area;
|
|
HANDLE HmemEMB_Table;
|
|
DWORD MaxXLen;
|
|
WORD MaxCodes, NumCodes;
|
|
TCHAR UsedCode[MAXUSEDCODES];
|
|
TCHAR WildChar;
|
|
BYTE CodeAIndex[128];
|
|
int MAX_LEN;
|
|
MB_Head MB_Head_Table[48];
|
|
LPBYTE EMBM = NULL;
|
|
LPBYTE g_lptep = NULL;
|
|
|
|
extern UINT UI_CANDSTR;
|
|
extern MBINDEX MBIndex;
|
|
|
|
#pragma data_seg (".sgroup")
|
|
HMapStruc HMapTab[MaxTabNum] = {0};
|
|
|
|
#pragma data_seg ()
|
|
|
|
UINT WINAPI MB_SUB(HIMCC,TCHAR,BYTE,UINT);
|
|
int WINAPI StartEngine(HIMCC) ;
|
|
int WINAPI EndEngine(HIMCC);
|
|
void CapKeyProc(TCHAR);
|
|
|
|
int GetMBHead(void);
|
|
BYTE GetEMBHead(void);
|
|
|
|
UINT DelDoubleBuf(void);
|
|
void ClrDoubleBuf(void);
|
|
void ClrSelBuf(void);
|
|
void DelSelBuf(void);
|
|
void DelWCEdit(void);
|
|
void ClrWCBuf(void);
|
|
|
|
UINT CoreMBComp(TCHAR,BYTE);
|
|
UINT WildProcess(TCHAR) ;
|
|
int EMBWCWildComp(TCHAR,BYTE,int);
|
|
int MBWCWildComp(TCHAR,BYTE,int);
|
|
void SearchEMBPos(TCHAR,BYTE);
|
|
UINT SearchEMBCompMatch(void);
|
|
UINT SearchMBCompMatch(TCHAR);
|
|
void SearchBEMBCompMatch(void);
|
|
void SearchBMBCompMatch(void);
|
|
|
|
void SearchEMBWildMatch(void);
|
|
void SearchMBWildMatch(BYTE);
|
|
void SearchBEMBWildMatch(void);
|
|
void SearchBMBWildMatch(BYTE);
|
|
void SearchBMBWWMatch(TCHAR,BYTE);
|
|
void SearchMBWWMatch(TCHAR,BYTE);
|
|
void SearchBEMBWWMatch(TCHAR,BYTE);
|
|
void SearchEMBWWMatch(TCHAR,BYTE);
|
|
|
|
void SearchEMBLXMatch(void);
|
|
void SearchMBLXMatch(void);
|
|
void SearchBEMBLXMatch(void);
|
|
void SearchBMBLXMatch(void);
|
|
void PageDnUp(BYTE);
|
|
void CoreMBCompDnUp(BYTE);
|
|
void CoreLXCompDnUp(BYTE);
|
|
int CoreMCCompDnUp(BYTE);
|
|
void CoreWWCompDnUp(BYTE);
|
|
UINT CoreUnitProcess(TCHAR);
|
|
void TurnToFirstPage(void);
|
|
void TurnToEndPage(void);
|
|
UINT CoreProcess(BYTE);
|
|
UINT SelectCandi(TCHAR);
|
|
UINT LXSelectCandi(TCHAR);
|
|
UINT DefSelect(void);
|
|
void TSMulCProc(void);
|
|
void CoreLXComp(void);
|
|
DWORD Skip_CaWord(DWORD);
|
|
int Scan_Word(DWORD,LPTSTR);
|
|
int VerScan_Word(DWORD,LPTSTR);
|
|
BYTE WildInBuffer(void);
|
|
BYTE CodeInSet(char);
|
|
UINT InCodeSet(TCHAR);
|
|
|
|
void Sort_EMB(int,int) ;
|
|
void IMDReset(int) ;
|
|
BOOL WriteEMBToFile(LPTSTR) ;
|
|
BOOL GetUDCItem(HIMCC,UINT,LPTSTR,LPTSTR);
|
|
int GetUDCIndex(HIMCC,LPTSTR,LPTSTR);
|
|
|
|
int AddZCItem(HIMCC,LPTSTR,LPTSTR);
|
|
void DelSelCU(HIMCC,int) ;
|
|
void DelExmb(HIMCC);
|
|
void Swap_Item(int,int);
|
|
void ConvertCandi(void);
|
|
|
|
BYTE MBPositionSearch(LPCTSTR ) ;
|
|
BYTE EMBPositionSearch(LPCTSTR ) ;
|
|
int GetFirstCode(LPTSTR ) ;
|
|
DWORD GetNumber(HANDLE ,DWORD ,LPTSTR );
|
|
UINT Conversion(HIMCC,LPCTSTR,UINT );
|
|
UINT ReadArea(TCHAR );
|
|
void ResetCont(HIMCC);
|
|
int NumInSet(void);
|
|
BOOL UnRegisterWord(HIMCC,LPCTSTR,LPCTSTR);
|
|
UINT EnumRegisterWord(HIMCC,LPCTSTR,LPCTSTR,LPVOID);
|
|
|
|
long GetLengthofBuf(void);
|
|
long GetLengthTepBuf(LPTSTR);
|
|
long GetLengthCCharBuf(LPTSTR);
|
|
int Inputcodelen(LPCTSTR);
|
|
int DBCSCharlen(LPCTSTR);
|
|
LPTSTR _tcschr(LPTSTR, TCHAR);
|
|
LPTSTR _rtcschr(LPTSTR string, TCHAR c);
|
|
int IsGBK(LPTSTR);
|
|
|
|
UINT WINAPI MB_SUB(HIMCC HmemPri,TCHAR code ,BYTE c_state, UINT UI_Mode) {
|
|
|
|
UINT ret_state = 0;
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return ((UINT)-1);
|
|
}
|
|
|
|
if(UI_Mode==BOX_UI)
|
|
MAX_LEN = 3000;
|
|
else if(UI_Mode==LIN_UI)
|
|
MAX_LEN = UI_CANDSTR;
|
|
|
|
if(code>=TEXT('A') && code<=TEXT('Z')) {
|
|
|
|
if(lpEngPrivate->PrivateArea.Comp_Status.dwPPTFH==0) //QuanJiao Switch if Off
|
|
return (1); //English char don't do any process ,only return a status
|
|
else {
|
|
CapKeyProc(code); //Process quanjiao char
|
|
return (2);
|
|
}
|
|
} else {
|
|
//Capslock is up*/
|
|
switch (code) {
|
|
case 0x08: //Bac kspace key
|
|
ret_state = DelDoubleBuf();
|
|
break;
|
|
case 0x1b:
|
|
ClrDoubleBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTLX = 0;
|
|
ret_state = 0;
|
|
break;
|
|
case TEXT('='):
|
|
if (CodeAIndex[code] != 0 )
|
|
goto here;
|
|
else {
|
|
if ((lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0) || (lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1))
|
|
ret_state = 1;
|
|
else {
|
|
PageDnUp(1);
|
|
ret_state = 0;
|
|
}
|
|
}
|
|
break;
|
|
case TEXT('-'):
|
|
if (CodeAIndex[code] != 0 )
|
|
goto here;
|
|
else {
|
|
if ((lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0) || (lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1))
|
|
ret_state = 1;
|
|
else {
|
|
PageDnUp(0);
|
|
ret_state = 0;
|
|
}
|
|
}
|
|
break;
|
|
case 0x21: //PGUP
|
|
if ((lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0) || (lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1))
|
|
ret_state = 1;
|
|
else {
|
|
PageDnUp(0);
|
|
ret_state = 0;
|
|
}
|
|
break;
|
|
case 0x22: //VK_PGDN
|
|
if ((lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0) || (lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1))
|
|
ret_state = 1;
|
|
else {
|
|
PageDnUp(1);
|
|
ret_state = 0;
|
|
}
|
|
break;
|
|
/////////////////
|
|
case 0x23: //VK_END
|
|
if ((lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0) || (lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1))
|
|
ret_state = 1;
|
|
else {
|
|
TurnToEndPage();
|
|
ret_state = 0;
|
|
}
|
|
break;
|
|
case 0x24: //VK_HOME
|
|
if ((lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0) || (lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1))
|
|
ret_state = 1;
|
|
else {
|
|
TurnToFirstPage();
|
|
ret_state = 0;
|
|
}
|
|
break;
|
|
default:
|
|
here:
|
|
if (lpEngPrivate->PrivateArea.Comp_Status.dwSTLX==1) {
|
|
if(code>=TEXT('0') && code<=TEXT('9') && c_state==1) {
|
|
ret_state = LXSelectCandi(code); // select candidate
|
|
} else if(CodeAIndex[code] != 0) {
|
|
ClrDoubleBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTLX = 0;
|
|
ret_state = CoreUnitProcess(code); //Retriver MB
|
|
} else if(code>=TEXT('0') && code <=TEXT('9')) {
|
|
ret_state = LXSelectCandi(code); // select candidate
|
|
} else if(code==0x20) {
|
|
ret_state = DefSelect();
|
|
}
|
|
} else {
|
|
if(code>=TEXT('0') && code<=TEXT('9') && c_state==1) {
|
|
ret_state = SelectCandi(code); // select candidate
|
|
} else if(CodeAIndex[code] != 0 ) {
|
|
//After input invalid code ,if input code_unit ,clear double buffer and begin again.
|
|
if (lpEngPrivate->PrivateArea.Comp_Status.dwInvalid) {
|
|
ClrDoubleBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTLX = 0;
|
|
} else {
|
|
ClrSelBuf();
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt<MaxCodes) {
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt!=0 && _tcschr(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,WildChar)!=NULL)
|
|
ret_state = WildProcess(code);
|
|
else
|
|
ret_state = CoreUnitProcess(code); //Retriver MB
|
|
|
|
if ((lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1) && (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt<MaxCodes)) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = code;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1] = 0x0;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt ++;
|
|
MessageBeep((UINT)-1);
|
|
}
|
|
}
|
|
} else if(code>=TEXT('0') && code<=TEXT('9')) {
|
|
if(NumInSet())
|
|
ret_state = 1;
|
|
else
|
|
ret_state = SelectCandi(code); // select candidate
|
|
} else if(code==0x20) {
|
|
ret_state = DefSelect();
|
|
} else if (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0) {
|
|
ret_state = 1;
|
|
} else if(code == WildChar) {
|
|
ClrSelBuf();
|
|
if ((lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==0) || (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt<MaxCodes)) {
|
|
ret_state = WildProcess(code);
|
|
|
|
if ((lpEngPrivate->PrivateArea.Comp_Status.dwInvalid==1) && (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt<MaxCodes)) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = code;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1] = 0x0;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt ++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (ret_state);
|
|
}
|
|
}
|
|
|
|
int WINAPI StartEngine(HIMCC HmemPri) {
|
|
HANDLE hFile,hCProcess,hMProcess=NULL;
|
|
TCHAR path_name[MAX_PATH];
|
|
int i,j;
|
|
TCHAR *tepstr;
|
|
int byte_t_read;
|
|
PSECURITY_ATTRIBUTES psa = NULL;
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return (0);
|
|
}
|
|
|
|
//bugfix to get current mb_name
|
|
lstrcpy(lpEngPrivate->MB_Name,HMapTab[0].MB_Name);
|
|
|
|
for (i=0;i<MaxTabNum;i++ ) {
|
|
if(lstrcmp(HMapTab[i].MB_Name,lpEngPrivate->MB_Name)==0) {
|
|
break;
|
|
}
|
|
}
|
|
if(HMapTab[i].RefCnt) {
|
|
lstrcpy(lpEngPrivate->EMB_Name,lpEngPrivate->MB_Name);
|
|
tepstr = _rtcschr(lpEngPrivate->EMB_Name,TEXT('.'));
|
|
*tepstr = TEXT('\0');
|
|
lstrcat(lpEngPrivate->EMB_Name,TEXT(".EMB"));
|
|
lpEngPrivate->PrivateArea.hMapMB = OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE,
|
|
FALSE,
|
|
HMapTab[i].MB_Obj);
|
|
|
|
hCProcess = GetCurrentProcess();
|
|
hMProcess = OpenProcess(STANDARD_RIGHTS_REQUIRED|PROCESS_DUP_HANDLE,
|
|
FALSE,HMapTab[i].EMB_ID);
|
|
byte_t_read = DuplicateHandle(hMProcess,
|
|
HMapTab[i].hMbFile,
|
|
hCProcess,
|
|
&lpEngPrivate->PrivateArea.hMbFile,
|
|
0,
|
|
FALSE,
|
|
DUPLICATE_SAME_ACCESS);
|
|
|
|
if (HMapTab[i].hEmbFile!=NULL) {
|
|
DuplicateHandle(hMProcess,
|
|
HMapTab[i].hEmbFile,
|
|
hCProcess,
|
|
&lpEngPrivate->PrivateArea.hEmbFile,
|
|
0,
|
|
FALSE,
|
|
DUPLICATE_SAME_ACCESS);
|
|
|
|
HmemEMB_Table = OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE,
|
|
FALSE,
|
|
HMapTab[i].EMB_Obj);
|
|
if(HmemEMB_Table!=NULL) {
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Exist = 1;
|
|
if (EMBM) UnmapViewOfFile(EMBM);
|
|
|
|
EMBM =MapViewOfFile(HmemEMB_Table,
|
|
FILE_MAP_READ|FILE_MAP_WRITE,
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count = *(WORD *)EMBM;
|
|
EMB_Table = (EMB_Head *)(EMBM+2);
|
|
lpEngPrivate->PrivateArea.hMapEMB = HmemEMB_Table ;
|
|
} else
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Exist = 0;
|
|
|
|
} else {
|
|
lpEngPrivate->PrivateArea.hMapEMB = NULL ;
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Exist = 0;
|
|
}
|
|
GetMBHead();
|
|
|
|
} else {
|
|
if (!GetMBHead()) {
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMESystemPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\"));
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->MB_Name);
|
|
|
|
psa = CreateSecurityAttributes();
|
|
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
psa,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
|
|
if(hFile==INVALID_HANDLE_VALUE) {
|
|
FreeSecurityAttributes(psa);
|
|
MessageBeep((UINT)-1);
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
|
|
HMapTab[i].hMbFile = hFile;
|
|
lpEngPrivate->PrivateArea.hMbFile = hFile;
|
|
lstrcpy(HMapTab[i].MB_Obj, lpEngPrivate->MB_Name);
|
|
tepstr = _rtcschr(HMapTab[i].MB_Obj,TEXT('.'));
|
|
*tepstr = TEXT('\0');
|
|
HMapTab[i].EMB_Obj[0] = TEXT('e');
|
|
HMapTab[i].EMB_Obj[1] = 0;
|
|
lstrcat(HMapTab[i].EMB_Obj,HMapTab[i].MB_Obj);
|
|
HMapTab[i].EMB_ID = GetCurrentProcessId();
|
|
|
|
lpEngPrivate->PrivateArea.hMapMB = CreateFileMapping(hFile,
|
|
psa,
|
|
PAGE_READONLY,
|
|
0,
|
|
0,
|
|
HMapTab[i].MB_Obj);
|
|
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist = GetEMBHead()) {
|
|
|
|
HMapTab[i].hEmbFile = lpEngPrivate->PrivateArea.hEmbFile;
|
|
HmemEMB_Table = CreateFileMapping(lpEngPrivate->PrivateArea.hEmbFile,
|
|
psa,
|
|
PAGE_READWRITE,
|
|
0,
|
|
sizeof(EMB_Head)*MAXNUMBER_EMB+2,
|
|
HMapTab[i].EMB_Obj);
|
|
|
|
if (EMBM) UnmapViewOfFile(EMBM);
|
|
|
|
EMBM = (LPBYTE)MapViewOfFile(HmemEMB_Table,
|
|
FILE_MAP_READ|FILE_MAP_WRITE,
|
|
0,
|
|
0,
|
|
sizeof(EMB_Head)*MAXNUMBER_EMB+2);
|
|
|
|
EMB_Table =(EMB_Head *)(EMBM + 2);
|
|
lpEngPrivate->PrivateArea.hMapEMB = HmemEMB_Table ;
|
|
|
|
} else {
|
|
HMapTab[i].hEmbFile = NULL;
|
|
lpEngPrivate->PrivateArea.hEmbFile = NULL;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = 0;
|
|
|
|
EMB_Table = NULL;
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count = 0;
|
|
}
|
|
|
|
}
|
|
|
|
HMapTab[i].RefCnt ++;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt = 0;
|
|
if (psa != NULL)
|
|
FreeSecurityAttributes(psa);
|
|
ImmUnlockIMCC(HmemPri);
|
|
|
|
if (hMProcess)
|
|
CloseHandle(hMProcess);
|
|
|
|
return(1);
|
|
}
|
|
|
|
|
|
int WINAPI EndEngine(HIMCC HmemPri) {
|
|
int i;
|
|
int state;
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return (0);
|
|
}
|
|
|
|
for(i=0; i<MaxTabNum; i++ ) {
|
|
if(lstrcmp(lpEngPrivate->MB_Name, HMapTab[i].MB_Name)==0)
|
|
break;
|
|
}
|
|
if(i==MaxTabNum) {
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
if(EMBM)
|
|
state = FlushViewOfFile(EMBM,0);
|
|
HMapTab[i].RefCnt--;
|
|
if(HMapTab[i].RefCnt>0) {
|
|
if(HMapTab[i].EMB_ID!=GetCurrentProcessId()) {
|
|
if(lpEngPrivate->PrivateArea.hMbFile)
|
|
state = CloseHandle(lpEngPrivate->PrivateArea.hMbFile);
|
|
if(lpEngPrivate->PrivateArea.hEmbFile)
|
|
state = CloseHandle(lpEngPrivate->PrivateArea.hEmbFile);
|
|
}
|
|
} else {
|
|
if(EMBM) {
|
|
UnmapViewOfFile(EMBM);
|
|
EMBM = NULL;
|
|
}
|
|
if(lpEngPrivate->PrivateArea.hMbFile)
|
|
state = CloseHandle(lpEngPrivate->PrivateArea.hMbFile);
|
|
if(lpEngPrivate->PrivateArea.hEmbFile){
|
|
|
|
SetFilePointer(lpEngPrivate->PrivateArea.hEmbFile,
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count*sizeof(EMB_Head)+2,
|
|
NULL,
|
|
FILE_BEGIN);
|
|
|
|
state = SetEndOfFile(lpEngPrivate->PrivateArea.hEmbFile);
|
|
state = CloseHandle(lpEngPrivate->PrivateArea.hEmbFile);
|
|
}
|
|
HMapTab[i].hMbFile = NULL;
|
|
HMapTab[i].hEmbFile = NULL;
|
|
HMapTab[i].RefCnt = 0;
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (1);
|
|
}
|
|
|
|
int GetMBHead() {
|
|
HANDLE hFile;
|
|
TCHAR path_name[MAX_PATH];
|
|
int i;
|
|
MB_Head *lpMB_Head;
|
|
DWORD byte_w_read,byte_t_read;
|
|
DWORD tag,offset;
|
|
PSECURITY_ATTRIBUTES psa;
|
|
BOOL retVal;
|
|
|
|
psa = CreateSecurityAttributes();
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMESystemPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\"));
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->MB_Name);
|
|
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
psa,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
|
|
FreeSecurityAttributes(psa);
|
|
|
|
if(hFile==INVALID_HANDLE_VALUE) {
|
|
MessageBeep((UINT)-1);
|
|
return(0);
|
|
}
|
|
|
|
SetFilePointer(hFile,28,NULL,FILE_BEGIN);
|
|
|
|
for(;;) {
|
|
byte_t_read = 0;
|
|
retVal = ReadFile(hFile,&tag,4,&byte_t_read,NULL);
|
|
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
if(tag==TAG_DESCRIPTION)
|
|
break;
|
|
SetFilePointer(hFile,12,NULL,FILE_CURRENT);
|
|
}
|
|
retVal = ReadFile(hFile,&offset,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
SetFilePointer(hFile,offset,NULL,FILE_BEGIN);
|
|
SetFilePointer(hFile,NAMESIZE*sizeof(TCHAR),NULL,FILE_CURRENT);
|
|
retVal = ReadFile(hFile,&MaxCodes,2,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
retVal = ReadFile(hFile,&NumCodes,2,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
retVal = ReadFile(hFile,UsedCode,MAXUSEDCODES*sizeof(TCHAR),&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
// even though byMaxElement is a BYTE, but there is an alignment issue.
|
|
// the next member cWildChar is a TCHAR, in NT it is a WCHAR, it will skip
|
|
// one byte to make an aligment.
|
|
// so we need to skip 2 bytes here
|
|
|
|
SetFilePointer(hFile,2,NULL,FILE_CURRENT);
|
|
#else
|
|
SetFilePointer(hFile,1,NULL,FILE_CURRENT);
|
|
#endif
|
|
|
|
retVal = ReadFile(hFile,&WildChar,sizeof(TCHAR),&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
|
|
//Get the dic_associate info.
|
|
SetFilePointer(hFile,28,NULL,FILE_BEGIN);
|
|
for(;;) {
|
|
retVal = ReadFile(hFile,&tag,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
if(tag==TAG_BASEDICINDEX)
|
|
break;
|
|
SetFilePointer(hFile,12,NULL,FILE_CURRENT);
|
|
}
|
|
retVal = ReadFile(hFile,&offset,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
SetFilePointer(hFile,offset,NULL,FILE_BEGIN);
|
|
retVal = ReadFile(hFile,&MaxXLen,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
retVal = ReadFile(hFile,CodeAIndex,128,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
lpMB_Head = MB_Head_Table;
|
|
byte_w_read = (NumCodes+1) * sizeof(DWORD);
|
|
for(i=0; i<NumCodes; i++) {
|
|
retVal = ReadFile(hFile,lpMB_Head,byte_w_read,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
lpMB_Head++;
|
|
}
|
|
|
|
CloseHandle(hFile);
|
|
return(1);
|
|
}
|
|
|
|
BYTE GetEMBHead() {
|
|
HANDLE hFile;
|
|
TCHAR path_name[MAX_PATH];
|
|
TCHAR *tepstr;
|
|
DWORD byte_w_read,byte_t_read;
|
|
BOOL retVal;
|
|
|
|
lstrcpy(lpEngPrivate->EMB_Name,lpEngPrivate->MB_Name);
|
|
tepstr = _rtcschr(lpEngPrivate->EMB_Name,TEXT('.'));
|
|
if ( tepstr != NULL )
|
|
lstrcpy(tepstr,TEXT(".EMB"));
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMEUserPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\") );
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->EMB_Name);
|
|
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_READ|GENERIC_WRITE,
|
|
FILE_SHARE_READ|FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
|
|
if(hFile==INVALID_HANDLE_VALUE)
|
|
return(0);
|
|
else if(GetFileSize(hFile,NULL)==0){
|
|
CloseHandle(hFile);
|
|
return (0);
|
|
}
|
|
|
|
byte_t_read = 0;
|
|
byte_w_read = 2;
|
|
|
|
retVal = ReadFile(hFile,&lpEngPrivate->PrivateArea.GlobVac.EMB_Count,byte_w_read,&byte_t_read,NULL);
|
|
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
byte_t_read = 0;
|
|
byte_w_read = lpEngPrivate->PrivateArea.GlobVac.EMB_Count * sizeof(EMB_Head);
|
|
lpEngPrivate->PrivateArea.hEmbFile = hFile;
|
|
return (1);
|
|
}
|
|
|
|
UINT DelDoubleBuf() {
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt<=0)
|
|
return (1);
|
|
else {
|
|
DelWCEdit();
|
|
DelSelBuf();
|
|
return(0);
|
|
}
|
|
}
|
|
|
|
void ClrDoubleBuf() {
|
|
ClrSelBuf();
|
|
ClrWCBuf();
|
|
}
|
|
|
|
void ClrSelBuf() {
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 0;
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[0]= TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos = 0;
|
|
}
|
|
|
|
void DelSelBuf() {
|
|
BYTE i;
|
|
TCHAR incode_buf[MAXCODE];
|
|
BYTE code_num;
|
|
int w_state = 0;
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==0)
|
|
ClrDoubleBuf();
|
|
else {
|
|
code_num = lpEngPrivate->PrivateArea.Comp_Context.PromptCnt;
|
|
lstrcpyn(incode_buf,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,code_num+1);
|
|
ClrDoubleBuf();
|
|
for (i=0;i<code_num;i++) {
|
|
ClrSelBuf();
|
|
if ((incode_buf[i]!=WildChar) && (w_state!=1))
|
|
CoreMBComp((char)incode_buf[i],i);
|
|
else {
|
|
w_state = 1;
|
|
WildProcess(incode_buf[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void DelWCEdit() {
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1] = '\0';;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt--;
|
|
|
|
}
|
|
|
|
void ClrWCBuf() {
|
|
int i;
|
|
|
|
for(i=0; i<lpEngPrivate->PrivateArea.Comp_Context.PromptCnt;i++)
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[i] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwInvalid = 0;
|
|
}
|
|
|
|
|
|
UINT CoreMBComp(TCHAR code,BYTE code_num) {
|
|
UINT byte_t_read;
|
|
int sp;
|
|
int edcm,bdcm;
|
|
BYTE search_fail = 0;
|
|
BYTE code_no,code_no1;
|
|
WORD codelen,wordlen;
|
|
|
|
|
|
if(code_num == 0 ) {
|
|
byte_t_read = ReadArea(code);
|
|
if(byte_t_read!=0) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = byte_t_read;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Area_V_Lenth = byte_t_read;
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
SearchEMBPos(code,(BYTE)(code_num+1));
|
|
} else {
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
SearchEMBPos(code,(BYTE)(code_num+1));
|
|
if (lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos == lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)
|
|
search_fail = 1;
|
|
else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
}
|
|
}
|
|
} else if(code_num == 1) {
|
|
code_no1 = CodeAIndex[lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[0]];
|
|
code_no = CodeAIndex[code];
|
|
sp = MB_Head_Table[code_no1-1].W_offset[code_no-1]/sizeof(TCHAR);
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = sp;
|
|
if (code_no < NumCodes)
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = MB_Head_Table[code_no1-1].W_offset[code_no]/sizeof(TCHAR);
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = lpEngPrivate->PrivateArea.GlobVac.Area_V_Lenth;
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos!=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
SearchEMBPos(code,(BYTE)(code_num+1));
|
|
} else {
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
SearchEMBPos(code,(BYTE)(code_num+1));
|
|
if (lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos == lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)
|
|
search_fail = 1;
|
|
else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
}
|
|
}
|
|
} else if (code_num<MaxCodes) {
|
|
sp = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
if(sp < lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {
|
|
for(;;) {
|
|
codelen = ZM_Area[sp];
|
|
if ((codelen > code_num) && (ZM_Area[sp+code_num+1]==code))
|
|
break;
|
|
else {
|
|
sp += (codelen+1);
|
|
wordlen = ZM_Area[sp];
|
|
sp += (2*wordlen/sizeof(TCHAR)+1);
|
|
}
|
|
if(sp >= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
}
|
|
if (sp != lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {// no this code_word
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = sp;
|
|
for(;;) {
|
|
codelen = ZM_Area[sp];
|
|
if (ZM_Area[sp+code_num+1]>code)
|
|
break;
|
|
else {
|
|
sp += (codelen+1);
|
|
wordlen = ZM_Area[sp];
|
|
sp += (2*wordlen/sizeof(TCHAR)+1);
|
|
}
|
|
if(sp >= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = sp;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
SearchEMBPos(code,(BYTE)(code_num+1));
|
|
} else {
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
SearchEMBPos(code,(BYTE)(code_num+1));
|
|
if (lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos == lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)
|
|
search_fail = 1;
|
|
else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
}
|
|
}
|
|
} else {
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
SearchEMBPos(code,(BYTE)(code_num+1));
|
|
if (lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos == lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)
|
|
search_fail = 1;
|
|
else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
}
|
|
}
|
|
|
|
} else { // too many key
|
|
search_fail =1;
|
|
}
|
|
|
|
|
|
if(!search_fail) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = code;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt ++;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = TEXT('\0');
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
|
|
bdcm = SearchMBCompMatch(code_num);
|
|
if(lpEngPrivate->PrivateArea.GlobVac.SBufPos==0) { //Selectbuf is empty
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
edcm = SearchEMBCompMatch();
|
|
} else if(GetLengthofBuf() < MAX_LEN)
|
|
edcm = SearchEMBCompMatch();
|
|
if(GetLengthofBuf()>=MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
}
|
|
else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
SearchEMBWildMatch();
|
|
if (((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)||(lpEngPrivate->PrivateArea.GlobVac.EMB_Exist==0))&&(GetLengthofBuf() < MAX_LEN)) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
SearchMBWildMatch(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
} else {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos==0) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1] = 0x0;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt --;
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwInvalid = 1;
|
|
return(0);
|
|
} else {
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num = 1;
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwInvalid = 0;
|
|
return (1);
|
|
}
|
|
} else { // Invalid code
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwInvalid = 1;
|
|
return(0);
|
|
}
|
|
}
|
|
|
|
UINT WildProcess(TCHAR code) {
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==MaxCodes) {
|
|
MessageBeep((UINT)-1);
|
|
return(0);
|
|
}
|
|
// wild search clear multi code number
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
|
|
SearchEMBWWMatch(code,lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)&&(GetLengthofBuf() <MAX_LEN)) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
SearchMBWWMatch(code,lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos!=0) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = code;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt++;
|
|
} else {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = code;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1] = 0x0;
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt ++;
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
int MBWCWildComp(TCHAR code,BYTE code_num,int sp) {
|
|
TCHAR codebuf[13];
|
|
int i;
|
|
|
|
if ((code_num+1) > sizeof(codebuf)/sizeof(TCHAR))
|
|
return 0;
|
|
|
|
lstrcpyn(codebuf,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,code_num+1);
|
|
codebuf[code_num] = code;
|
|
codebuf[code_num+1] = 0x0;
|
|
for(i=0; i<=code_num;i++) {
|
|
if((codebuf[i] != ZM_Area[sp+i+1]) && codebuf[i]!=WildChar)
|
|
return(0);
|
|
}
|
|
return (1);
|
|
}
|
|
|
|
void SearchBMBWWMatch(TCHAR code,BYTE code_num){
|
|
int j;
|
|
int i,end_pos;
|
|
int wordlen,len;
|
|
LPTSTR lpStr;
|
|
TCHAR tepbuf[130];
|
|
TCHAR codebuf[13], codelen;
|
|
|
|
end_pos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos-1 ;
|
|
for(;;) {
|
|
j = 0;
|
|
i = end_pos;
|
|
if(i<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos)
|
|
break;
|
|
wordlen = VerScan_Word(i,tepbuf);
|
|
i -= (wordlen+1);
|
|
j = wordlen;
|
|
for (;;) {
|
|
if (InCodeSet(ZM_Area[i])==0)
|
|
break;
|
|
i--;
|
|
}
|
|
codelen = ZM_Area[i];
|
|
|
|
if ((codelen == code_num+1) && (MBWCWildComp(code,code_num,i)==1)){
|
|
len = WildInBuffer();
|
|
lstrcpyn(codebuf,ZM_Area+i+len+1,codelen-len+1);
|
|
codebuf[codelen-len] = 0;
|
|
if(MBIndex.IMEChara[0].IC_CTC==1) {
|
|
if(GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:"))+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
} else {
|
|
if (GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:")) > MAX_LEN) { // SelectBuf is Overflow
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) { // words count is enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
} else if ((MBIndex.IMEChara[0].IC_CZ==1) || (j==2/sizeof(TCHAR))) {
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
i --;
|
|
end_pos = i;
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+i+len+1,codelen-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
i --;
|
|
end_pos = i;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+i+len+1,codelen-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
i --;
|
|
end_pos = i;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+i+len+1,codelen-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
i --;
|
|
end_pos = i;
|
|
#endif //COMBO_IME
|
|
}
|
|
} else {
|
|
i--;
|
|
end_pos = i;
|
|
}
|
|
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
if (end_pos<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos )
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = end_pos+1;
|
|
return ;
|
|
}
|
|
|
|
void SearchMBWWMatch(TCHAR code,BYTE code_num) {
|
|
int j;
|
|
int i,start_pos,sp;
|
|
LPTSTR lpStr;
|
|
TCHAR tepbuf[130];
|
|
int wordlen,len;
|
|
TCHAR codebuf[13], codelen;
|
|
|
|
start_pos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
i = start_pos;
|
|
for(;;) {
|
|
|
|
codelen = ZM_Area[i];
|
|
if ((codelen == code_num+1) && (MBWCWildComp(code,code_num,i)==1)) {
|
|
sp = i;
|
|
j = 0;
|
|
i += (codelen+1);
|
|
wordlen = Scan_Word(i,tepbuf);
|
|
i += (wordlen+1);
|
|
j = wordlen;
|
|
len = WildInBuffer();
|
|
if ((MBIndex.IMEChara[0].IC_CZ==1) || (j==2/sizeof(TCHAR))) {
|
|
lstrcpyn(codebuf,ZM_Area+i+len+1,codelen-len+1);
|
|
codebuf[codelen-len] = 0;
|
|
if(MBIndex.IMEChara[0].IC_CTC==1) {
|
|
if(GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:"))+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
} else {
|
|
if (GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:")) > MAX_LEN) { // SelectBuf is Overflow
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
i = Skip_CaWord(i);
|
|
}else{
|
|
lpStr = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpStr,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lpStr = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpStr,ZM_Area+sp+len+1,codelen-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
start_pos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
}
|
|
}else{
|
|
lpStr = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpStr,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+sp+len+1,codelen-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
start_pos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpStr = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpStr,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lpStr = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpStr,ZM_Area+sp+len+1,codelen-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
start_pos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
#endif //COMBO_IME
|
|
|
|
}
|
|
} else {
|
|
i = Skip_CaWord(i);
|
|
}
|
|
if (i>=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
}
|
|
|
|
if (i>= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
} else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = start_pos;
|
|
}
|
|
}
|
|
|
|
|
|
UINT SearchMBCompMatch(TCHAR code_num) {
|
|
int j;
|
|
int i,start_pos;
|
|
int match_s = 0;
|
|
LPTSTR lpStr;
|
|
TCHAR tepbuf[130], codelen;
|
|
int wordlen;
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos = 0;
|
|
start_pos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
i = start_pos;
|
|
for(;;) {
|
|
if (i>=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
|
|
codelen = ZM_Area[i];
|
|
|
|
if (codelen == code_num+1 ) {
|
|
j = 0;
|
|
i += (codelen+1);
|
|
wordlen = Scan_Word(i,tepbuf);
|
|
i += (wordlen+1);
|
|
j = wordlen;
|
|
|
|
if ((MBIndex.IMEChara[0].IC_CZ==1) || (j==2/sizeof(TCHAR))) {
|
|
if (GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:"))<=MAX_LEN) { //SelectBuffer enough
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
match_s ++;
|
|
start_pos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
}
|
|
}else{
|
|
lpStr = (LPTSTR)lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpStr,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
match_s ++;
|
|
start_pos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
}
|
|
|
|
}
|
|
#else
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
match_s ++;
|
|
start_pos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
#endif ///COMBO_IME
|
|
} else {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
}
|
|
} else
|
|
break;
|
|
}
|
|
|
|
if (start_pos>= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
} else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = start_pos;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicMCSPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
;
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = (BYTE)match_s;
|
|
return (match_s);
|
|
}
|
|
|
|
void SearchBMBCompMatch() {
|
|
int j;
|
|
int i,end_pos;
|
|
int wordlen;
|
|
TCHAR codelen, tepbuf[130];
|
|
|
|
end_pos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos-1 ;
|
|
for(;;) {
|
|
j = 0;
|
|
i = end_pos;
|
|
if(i<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos)
|
|
break;
|
|
wordlen = VerScan_Word(i,tepbuf);
|
|
i -= (wordlen+1);
|
|
j = wordlen;
|
|
for (;;) {
|
|
if (InCodeSet(ZM_Area[i])==0)
|
|
break;
|
|
i--;
|
|
}
|
|
codelen = ZM_Area[i];
|
|
if (GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:")) > MAX_LEN) { //SelectBuffer enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
else if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) { // words count is enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
} else if ((MBIndex.IMEChara[0].IC_CZ==1) || (j==2/sizeof(TCHAR))) {
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
i --;
|
|
end_pos = i;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
i --;
|
|
end_pos = i;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
i --;
|
|
end_pos = i;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
if (end_pos<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos )
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = end_pos+1;
|
|
return ;
|
|
}
|
|
|
|
void SearchMBWildMatch(BYTE codecnt) {
|
|
TCHAR tepbuf[130];
|
|
int candi_start;
|
|
int i,j,start_pos;
|
|
int wordlen;
|
|
TCHAR codelen, codebuf[13];
|
|
|
|
if (GetLengthofBuf()>MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
return ;
|
|
}
|
|
start_pos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos ;
|
|
i = start_pos;
|
|
for(;;) {
|
|
j = 0;
|
|
if(i>=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
|
|
candi_start = i;
|
|
codelen = ZM_Area[i];
|
|
i += (codelen+1);
|
|
wordlen = Scan_Word(i,tepbuf);
|
|
i += (wordlen+1);
|
|
j = wordlen;
|
|
if (codelen>codecnt) {
|
|
lstrcpyn(codebuf,ZM_Area+candi_start+codecnt+1,codelen-codecnt+1);
|
|
codebuf[codelen-codecnt] = 0;
|
|
}
|
|
if(MBIndex.IMEChara[0].IC_CTC==1) {
|
|
if(GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:"))+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
} else {
|
|
if (GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:")) > MAX_LEN) { // SelectBuf is Overflow
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) {// words count is enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
else if ((MBIndex.IMEChara[0].IC_CZ==1) || (j==2/sizeof(TCHAR))) {
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND ] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (codelen>codecnt) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+candi_start+codecnt+1,codelen-codecnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-codecnt);
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND ] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (codelen>codecnt) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+candi_start+codecnt+1,codelen-codecnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-codecnt);
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1)%IME_MAXCAND ] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (codelen>codecnt) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+candi_start+codecnt+1,codelen-codecnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-codecnt);
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
start_pos = i;
|
|
}
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
if (start_pos>= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos )
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = start_pos;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void SearchBMBWildMatch(BYTE codecnt) {
|
|
TCHAR tepbuf[130];
|
|
int j;
|
|
int i,end_pos;
|
|
int wordlen;
|
|
TCHAR codelen, codebuf[13];
|
|
|
|
end_pos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos-1 ;
|
|
i = end_pos;
|
|
for(;;) {
|
|
j = 0;
|
|
|
|
if(i<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicMCSPos)
|
|
break;
|
|
wordlen = VerScan_Word(i,tepbuf);
|
|
i -= (wordlen+1);
|
|
j = wordlen;
|
|
for (;;) {
|
|
if (InCodeSet(ZM_Area[i])==0)
|
|
break;
|
|
i--;
|
|
}
|
|
codelen = ZM_Area[i];
|
|
if(codelen>codecnt) {
|
|
lstrcpyn(codebuf,ZM_Area+i+codecnt+1,codelen-codecnt+1);
|
|
codebuf[codelen-codecnt] = 0;
|
|
}
|
|
if(MBIndex.IMEChara[0].IC_CTC==1) {
|
|
if(GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:"))+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
} else {
|
|
if (GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:")) > MAX_LEN) { // SelectBuf is Overflow
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) { // words count is enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
} else if ((MBIndex.IMEChara[0].IC_CZ==1) || (j==2/sizeof(TCHAR))) {
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (codelen>codecnt) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+i+codecnt+1,codelen-codecnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-codecnt);
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
end_pos = i;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (codelen>codecnt) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+i+codecnt+1,codelen-codecnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-codecnt);
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
end_pos = i;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (codelen>codecnt) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,ZM_Area+i+codecnt+1,codelen-codecnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (codelen-codecnt);
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
end_pos = i;
|
|
#endif //COMBO_IME
|
|
}
|
|
i --;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
if (end_pos<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos )
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = end_pos;//5.15 +1;
|
|
return ;
|
|
}
|
|
|
|
|
|
void SearchBMBLXMatch() {
|
|
TCHAR tepbuf[130];
|
|
int i,j,end_pos;
|
|
int wordlen ;
|
|
|
|
end_pos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
i = end_pos - 1;
|
|
for (;;) {
|
|
j = 0;
|
|
wordlen = VerScan_Word(i,tepbuf);
|
|
i -= (wordlen+1) ;
|
|
j = wordlen;
|
|
if(wcsncmp(ZM_Area+i+2,lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer,lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt)==0 && j>lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt) {
|
|
if (GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:")) > MAX_LEN) {// SelectBuf is Overflow
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) { // words count is enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
for (;;) {
|
|
if (InCodeSet(ZM_Area[i])==0)
|
|
break;
|
|
i--;
|
|
}
|
|
end_pos = i;
|
|
i --;
|
|
if (i<= lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos )
|
|
break;
|
|
|
|
}
|
|
if (i<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos )
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = end_pos;
|
|
}
|
|
|
|
void SearchMBLXMatch() {
|
|
TCHAR codelen,tepbuf[130];
|
|
int i,j,s_pos;
|
|
int wordlen;
|
|
i = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
for (;;) {
|
|
j = 0;
|
|
codelen = ZM_Area[i];
|
|
i += (codelen+1);
|
|
s_pos = i;
|
|
wordlen = Scan_Word(i,tepbuf);
|
|
i += (wordlen+1);
|
|
j = wordlen;
|
|
if(wcsncmp(ZM_Area+s_pos+1,lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer,lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt)==0 && j>lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt) {
|
|
if(GetLengthofBuf()+GetLengthTepBuf(tepbuf)+GetLengthTepBuf(TEXT("9:")) > MAX_LEN) { // SelectBuf is Overflow
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) { // words count is enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<j;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&tepbuf[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,j+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += j;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
if (i>= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos )
|
|
break;
|
|
}
|
|
if (i>=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos;
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = s_pos-codelen-1;
|
|
}
|
|
|
|
|
|
void CoreLXComp() {
|
|
|
|
if (MBIndex.IMEChara[0].IC_LX==1) { // lx Search
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTLX = 1;
|
|
lstrcpy(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,TEXT("LLXX"));
|
|
lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[4] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Context.PromptCnt = 4;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos = lpEngPrivate->PrivateArea.GlobVac.EMB_Count;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = lpEngPrivate->PrivateArea.GlobVac.Area_V_Lenth;;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = 0;
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0; //EMB
|
|
ClrSelBuf();
|
|
SearchEMBLXMatch();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos ==0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
SearchMBLXMatch();
|
|
} else if((GetLengthofBuf() <= MAX_LEN) && (lpEngPrivate->PrivateArea.GlobVac.EMB_Exist!=0))
|
|
SearchMBLXMatch();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos==0) {
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTLX = 0;
|
|
ClrDoubleBuf();
|
|
} else
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num = 1;
|
|
}
|
|
}
|
|
|
|
|
|
void PageDnUp(BYTE direct) {
|
|
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE) {
|
|
CoreMCCompDnUp(direct);
|
|
} else if (_tcschr(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,WildChar)!=NULL) {
|
|
CoreWWCompDnUp(direct);
|
|
} else if (lpEngPrivate->PrivateArea.Comp_Status.dwSTLX==0) {
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 0;
|
|
CoreMBCompDnUp(direct);
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
} else {
|
|
CoreLXCompDnUp(direct);
|
|
}
|
|
|
|
}
|
|
|
|
void CoreWWCompDnUp(BYTE direct) {
|
|
|
|
switch (direct) {
|
|
case 0:
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Page_Num ==1) {
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
ClrSelBuf();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Cur_MB==1) { // Current at Basic EMB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
SearchBMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos==lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos)&&(GetLengthofBuf()<MAX_LEN)) {// Select buffer isn't overflow
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos;
|
|
SearchBEMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
}
|
|
} else { // turn at EMB
|
|
//8.23 emb mb connect position must be process specially
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos;
|
|
SearchBEMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num --;
|
|
ConvertCandi();
|
|
break;
|
|
case 1:
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos >= lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) &&
|
|
(lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos >= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)) { // EMB reach bottom
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
ClrSelBuf();
|
|
if((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos < lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) && (lpEngPrivate->PrivateArea.GlobVac.EMB_Exist!=0)){ // Search at MB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchEMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos == 0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
SearchMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
} else if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) && (GetLengthofBuf()<MAX_LEN)) { // Select buffer isn't overflow
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
SearchMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
}
|
|
} else { // Search at EMB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
SearchMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num ++;
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
|
|
}
|
|
|
|
|
|
int CoreMCCompDnUp(BYTE direct) {
|
|
int i,len;
|
|
|
|
switch (direct) {
|
|
case 0:
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Page_Num ==1) {
|
|
MessageBeep((UINT)-1);
|
|
return(0);
|
|
}
|
|
ClrSelBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 1;
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Cur_MB==0) { // Current at Basic EMB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos;
|
|
SearchBEMBCompMatch();
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos)&&(GetLengthofBuf() <MAX_LEN)) {// Select buffer isn't overflow
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
SearchBMBCompMatch();
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
}
|
|
} else { // turn at MB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
SearchBMBCompMatch();
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num --;
|
|
ConvertCandi();
|
|
break;
|
|
case 1:
|
|
i = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
len = ZM_Area[i];
|
|
if((len>lpEngPrivate->PrivateArea.Comp_Context.PromptCnt) || (i>lpEngPrivate->PrivateArea.Comp_Proc.dBDicMCSPos) || (i>=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)) {
|
|
if (lpEngPrivate->PrivateArea.GlobVac.EMB_Exist==1) {
|
|
i = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
len = Inputcodelen(EMB_Table[i].W_Code);
|
|
if((len>lpEngPrivate->PrivateArea.Comp_Context.PromptCnt) || (i==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)) {
|
|
MessageBeep((UINT)-1);
|
|
return(0);
|
|
}
|
|
} else {
|
|
|
|
MessageBeep((UINT)-1);
|
|
return(0);
|
|
}
|
|
}
|
|
ClrSelBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 1;
|
|
if(lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos < lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos){
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
SearchMBCompMatch((TCHAR)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos == 0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
SearchEMBCompMatch();
|
|
} else if ((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)&&(GetLengthofBuf()<MAX_LEN)) { // Select buffer isn't overflow
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
SearchEMBCompMatch();
|
|
}
|
|
} else { // Search at EMB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchEMBCompMatch();
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num ++;
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
return(1);
|
|
}
|
|
|
|
|
|
void CoreLXCompDnUp(BYTE direct) {
|
|
|
|
switch (direct) {
|
|
case 0: //PgUp Turn
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Page_Num ==1) {
|
|
MessageBeep((UINT)-1);
|
|
|
|
return;
|
|
}
|
|
ClrSelBuf();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Cur_MB) { // Current at Basic MB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
SearchBMBLXMatch();
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos==lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos)
|
|
&& (GetLengthofBuf() <MAX_LEN)
|
|
&& (lpEngPrivate->PrivateArea.GlobVac.EMB_Exist!=0)) { // Select buffer isn't overflow
|
|
SearchBEMBLXMatch(); // pass w_code
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
}
|
|
} else { // turn at EMB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos;
|
|
SearchBEMBLXMatch();
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num --;
|
|
ConvertCandi();
|
|
break;
|
|
case 1: // PgDn Turn
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos >= lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) &&
|
|
(lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos >= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)) { // EMB reach bottom
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
ClrSelBuf();
|
|
if((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos < lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) && (lpEngPrivate->PrivateArea.GlobVac.EMB_Exist!=0)){ // Search at EMB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchEMBLXMatch();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos == 0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
SearchMBLXMatch(); // pass q_code
|
|
} else if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)&&(GetLengthofBuf()<MAX_LEN)) { // Select buffer isn't overflow
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
SearchMBLXMatch(); // pass w_code
|
|
}
|
|
} else { // Search at MB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
SearchMBLXMatch(); // pass w_code
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num ++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CoreMBCompDnUp(BYTE direct) {
|
|
int i;
|
|
TCHAR incode_buf[MAXCODE];
|
|
BYTE code_num;
|
|
|
|
switch (direct) {
|
|
case 0: //PgUp Turn
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Page_Num ==1) {
|
|
MessageBeep((UINT)-1);
|
|
return ;
|
|
}
|
|
ClrSelBuf();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Page_Num ==2) {
|
|
code_num = lpEngPrivate->PrivateArea.Comp_Context.PromptCnt;
|
|
lstrcpyn(incode_buf,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,code_num+1);
|
|
ClrDoubleBuf();
|
|
for (i=0; i<code_num; i++) {
|
|
ClrSelBuf();
|
|
CoreMBComp(incode_buf[i],(BYTE)i);
|
|
}
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num = 1;
|
|
} else {
|
|
if (lpEngPrivate->PrivateArea.GlobVac.Cur_MB) { // Current at Basic MB
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos;
|
|
|
|
SearchBMBWildMatch(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos<=lpEngPrivate->PrivateArea.Comp_Proc.dBDicMCSPos)
|
|
&& (GetLengthofBuf() <MAX_LEN )
|
|
&& (lpEngPrivate->PrivateArea.GlobVac.EMB_Exist!=0)) {
|
|
SearchBEMBWildMatch(); // pass w_code
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
}
|
|
|
|
} else { // turn at EMB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos;
|
|
SearchBEMBWildMatch();
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num --;
|
|
ConvertCandi();
|
|
}
|
|
|
|
break;
|
|
case 1: // PgDn Turn
|
|
if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos >= lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) &&
|
|
(lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos >= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)) { // EMB reach bottom
|
|
MessageBeep((UINT)-1);
|
|
return ;
|
|
}
|
|
ClrSelBuf();
|
|
if((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos < lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) && (lpEngPrivate->PrivateArea.GlobVac.EMB_Exist!=0)){ // Search at EMB
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchEMBWildMatch();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos == 0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
SearchMBWildMatch(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt); // pass q_code
|
|
} else if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) && (GetLengthofBuf() <MAX_LEN)) { // Select buffer isn't overflow
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
SearchMBWildMatch(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt); // pass w_code
|
|
}
|
|
} else {// Search at MB
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
SearchMBWildMatch(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt); // pass w_code
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num ++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void TurnToFirstPage() {
|
|
int i;
|
|
TCHAR incode_buf[MAXCODE];
|
|
BYTE code_num;
|
|
|
|
if(lpEngPrivate->PrivateArea.GlobVac.Page_Num == 1) {
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos;
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE) {
|
|
ClrSelBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 1;
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
SearchMBCompMatch((TCHAR)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos == 0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchEMBCompMatch();
|
|
} else if ((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)&&(GetLengthofBuf()<MAX_LEN)) { // Select buffer isn't overflow
|
|
SearchEMBCompMatch();
|
|
}
|
|
} else if (_tcschr(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,WildChar)!=NULL) {
|
|
ClrSelBuf();
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchEMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos == 0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
} else if ((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) && (GetLengthofBuf()<MAX_LEN)) { // Select buffer isn't overflow
|
|
SearchMBWWMatch(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1],(BYTE)(lpEngPrivate->PrivateArea.Comp_Context.PromptCnt-1));
|
|
}
|
|
} else if (lpEngPrivate->PrivateArea.Comp_Status.dwSTLX==0) {
|
|
ClrSelBuf();
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 0;
|
|
code_num = lpEngPrivate->PrivateArea.Comp_Context.PromptCnt;
|
|
lstrcpyn(incode_buf,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,code_num+1);
|
|
ClrDoubleBuf();
|
|
for (i=0; i<code_num; i++) {
|
|
ClrSelBuf();
|
|
CoreMBComp(incode_buf[i],(BYTE)i);
|
|
}
|
|
} else {
|
|
ClrSelBuf();
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 0;
|
|
SearchEMBLXMatch();
|
|
if (lpEngPrivate->PrivateArea.GlobVac.SBufPos == 0) {
|
|
lpEngPrivate->PrivateArea.GlobVac.Cur_MB = 1;
|
|
SearchMBLXMatch(); // pass q_code
|
|
} else if ((lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos)&&(GetLengthofBuf()<MAX_LEN)) { // Select buffer isn't overflow
|
|
SearchMBLXMatch(); // pass w_code
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.GlobVac.Page_Num = 1;
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
}
|
|
|
|
|
|
void TurnToEndPage() {
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE) {
|
|
for(;;) {
|
|
if(!CoreMCCompDnUp(1))
|
|
break;
|
|
}
|
|
} else {
|
|
for(;;) {
|
|
PageDnUp(1);
|
|
if((lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) && (lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos==lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos))
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
UINT CoreUnitProcess(TCHAR code) {
|
|
int search_state;
|
|
|
|
search_state = CoreMBComp(code,lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
if(search_state) {
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt==MaxCodes ) { // Four_key code
|
|
if (lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt>1 ) { // Mutilple code
|
|
TSMulCProc();
|
|
return (0);
|
|
}
|
|
else { // Result string
|
|
SelectCandi('1');
|
|
return (2);
|
|
}
|
|
}
|
|
return(0);
|
|
} else
|
|
return(0);
|
|
}
|
|
|
|
|
|
UINT SelectCandi(TCHAR code) {
|
|
BYTE resstart;
|
|
BYTE sel_succ,i;
|
|
TCHAR ch;
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.PromptCnt>0) { // there are some w_code
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==0) // now we have 10 Candi_words
|
|
sel_succ = 0;
|
|
else if((code-0x30 <= lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt) && (code-0x30 > 0)) //select is valid
|
|
sel_succ = 1;
|
|
else if(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==10 && code=='0')
|
|
sel_succ = 1;
|
|
else
|
|
sel_succ = 0;
|
|
if (sel_succ) { //select successful
|
|
resstart = lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[code-0x30];
|
|
i = 0;
|
|
for(;;) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.CKBBuf[i] = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart];
|
|
#ifdef UNICODE
|
|
i += 1;
|
|
resstart += 1;
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.CKBBuf[i+1] = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart+1];
|
|
i += 2;
|
|
resstart += 2;
|
|
#endif
|
|
ch = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart];
|
|
if(ch==TEXT(' ') || ch==TEXT('\0') || InCodeSet(ch)==1)
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.CKBBuf[i] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Context.ResultStrCnt = i;
|
|
lstrcpy(lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer,lpEngPrivate->PrivateArea.Comp_Context.CKBBuf);
|
|
lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt = i;
|
|
|
|
//CHP
|
|
#ifdef FUSSYMODE
|
|
MBIndex.IsFussyCharFlag = 0;
|
|
if (lstrlen(lpEngPrivate->PrivateArea.Comp_Context.CKBBuf) == 1)
|
|
if (IsFussyChar(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,
|
|
lpEngPrivate->PrivateArea.Comp_Context.CKBBuf))
|
|
{
|
|
MBIndex.IsFussyCharFlag = 1;
|
|
}
|
|
#endif //FUSSYMODE
|
|
|
|
if (MBIndex.IMEChara[0].IC_LX==1) //&& (lpEngPrivate->PrivateArea.Comp_Context.ResultStrCnt==2))
|
|
CoreLXComp();
|
|
else
|
|
ClrDoubleBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 0;
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
return(2);
|
|
} else {
|
|
MessageBeep((UINT)-1);
|
|
return(0);
|
|
}
|
|
} else {
|
|
if (!lpEngPrivate->PrivateArea.Comp_Status.dwPPTFH)
|
|
return (1);
|
|
else {
|
|
CapKeyProc(code);
|
|
return (2);
|
|
}
|
|
}
|
|
}
|
|
|
|
UINT LXSelectCandi(TCHAR code) {
|
|
BYTE sel_succ,resstart;
|
|
BYTE i;
|
|
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==0) // no candidate
|
|
sel_succ = 0;
|
|
else if((code-0x30 <= lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt) && (code-0x30 > 0)) //select is valid
|
|
sel_succ = 1;
|
|
else if(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==10 && code=='0')
|
|
sel_succ = 1;
|
|
else
|
|
sel_succ = 0;
|
|
if (sel_succ) { //select successful
|
|
//lpEngPrivate->PrivateArea.Comp_Status.dwSTLX = 0;
|
|
resstart = lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[code-0x30];
|
|
resstart += lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt;
|
|
i = 0;
|
|
for(;;) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.CKBBuf[i] = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart];
|
|
#ifdef UNICODE
|
|
i += 1;
|
|
resstart += 1;
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.CKBBuf[i+1] = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart+1];
|
|
i += 2;
|
|
resstart += 2;
|
|
#endif
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart]==TEXT(' ') || lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart]==TEXT('\0'))
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.CKBBuf[i] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Context.ResultStrCnt = i;
|
|
|
|
resstart = lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[code-0x30];
|
|
//resstart += lpEngPrivate->PrivateArea.Comp_Context.ResultStrCnt;
|
|
i = 0;
|
|
for(;;) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer[i] = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart];
|
|
lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer[i+1] = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart+1];
|
|
i += 2;
|
|
resstart += 2;
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart]==TEXT(' ') || lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[resstart]==TEXT('\0'))
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer[i] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt = i;
|
|
|
|
if (MBIndex.IMEChara[0].IC_LX==1) //&& (lpEngPrivate->PrivateArea.Comp_Context.ResultStrCnt==2))
|
|
CoreLXComp();
|
|
else
|
|
ClrDoubleBuf();
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 0;
|
|
return(2);
|
|
} else {
|
|
MessageBeep((UINT)-1);
|
|
return(0);
|
|
}
|
|
}
|
|
|
|
|
|
UINT DefSelect() {
|
|
if (lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt > 1) { // Mutilple code
|
|
TSMulCProc();
|
|
return (0);
|
|
} else { // Result string
|
|
if (lpEngPrivate->PrivateArea.Comp_Status.dwSTLX)
|
|
return(LXSelectCandi(TEXT('1')));
|
|
else
|
|
return (SelectCandi(TEXT('1')));
|
|
//return(2);
|
|
}
|
|
}
|
|
|
|
|
|
void TSMulCProc(void) {
|
|
BYTE mul_code_end;
|
|
if(lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt < lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt) {
|
|
mul_code_end = lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[(lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt+1)%10]-1;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[mul_code_end] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt;
|
|
|
|
}
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Status.dwSTMULCODE = 1;
|
|
|
|
MessageBeep((UINT)-1);
|
|
}
|
|
void SearchEMBPos(TCHAR code,BYTE m_lenth) {
|
|
int i;
|
|
TCHAR codebuf[MAXCODE];
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
|
|
lstrcpyn(codebuf,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,m_lenth-1+1);
|
|
codebuf[m_lenth-1] = code;
|
|
for (i=0; i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count; i++) {
|
|
if (wcsncmp(EMB_Table[i].W_Code,codebuf,m_lenth)==0)
|
|
{
|
|
//CHP
|
|
#ifdef FUSSYMODE
|
|
if ((lstrlen(EMB_Table[i].C_Char) == 1) && !MBIndex.IMEChara[0].IC_FCSR)
|
|
{
|
|
//If EUDC, let it go.
|
|
if (EMB_Table[i].C_Char[0] >= 0xe000 && EMB_Table[i].C_Char[0] <= 0xf8ff)
|
|
break;
|
|
}
|
|
else
|
|
#endif //FUSSYMODE
|
|
break;
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = i;
|
|
for (i;i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count; i++) {
|
|
if (wcsncmp(EMB_Table[i].W_Code, codebuf, m_lenth)!=0)
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos = i;
|
|
}
|
|
|
|
|
|
//CHP
|
|
#ifdef FUSSYMODE
|
|
BOOL IsFussyChar(LPCTSTR lpReading, LPCTSTR lpString)
|
|
{
|
|
int i;
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return FALSE;
|
|
for (i=0; i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count; i++) {
|
|
if (!lstrcmp(EMB_Table[i].W_Code,lpReading) &&
|
|
!lstrcmp(EMB_Table[i].C_Char,lpString))
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
#endif //FUSSYMODE
|
|
|
|
int EMBWCWildComp(TCHAR code,BYTE code_num, int no) {
|
|
TCHAR codebuf[13];
|
|
int i;
|
|
|
|
if ( (code_num+1) > sizeof(codebuf)/sizeof(TCHAR) )
|
|
return 0;
|
|
|
|
lstrcpyn(codebuf,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,code_num+1);
|
|
codebuf[code_num] = code;
|
|
codebuf[code_num+1] = 0x0;
|
|
for(i=0; i<=code_num; i++) {
|
|
if((codebuf[i]!=EMB_Table[no].W_Code[i]) && (codebuf[i]!=WildChar))
|
|
return(0);
|
|
}
|
|
return(1);
|
|
}
|
|
|
|
void SearchBEMBWWMatch(TCHAR code,BYTE code_num) {
|
|
int i,lenw,lenc,len;
|
|
TCHAR codebuf[13];
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
if (GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
return;
|
|
}
|
|
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos-1 ; i>=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos; i--) {
|
|
lenw = Inputcodelen(EMB_Table[i].W_Code);
|
|
if ((lenw == code_num+1) && (EMBWCWildComp(code,code_num,i)==1)) {
|
|
lenc = DBCSCharlen(EMB_Table[i].C_Char);
|
|
len = WildInBuffer();
|
|
if ((MBIndex.IMEChara[0].IC_CZ==1) || (lenc==2/sizeof(TCHAR))) {
|
|
lstrcpyn(codebuf,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
codebuf[lenw-len] = 0;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf()+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
} else {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<lenc;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
// modify 11.9
|
|
//lpEngPrivate->PrivateArea.GlobVac.SBufPos += lstrlen(EMB_Table[i].C_Char);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = i;
|
|
}
|
|
|
|
void SearchEMBWWMatch(TCHAR code,BYTE code_num) {
|
|
int i,lenw,lenc,len;
|
|
TCHAR codebuf[13];
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos; i<lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos; i++) {
|
|
lenw = Inputcodelen(EMB_Table[i].W_Code);
|
|
if ((lenw == code_num+1) && (EMBWCWildComp(code,code_num,i)==1)) {
|
|
lenc = DBCSCharlen(EMB_Table[i].C_Char);
|
|
len = WildInBuffer();
|
|
if ((MBIndex.IMEChara[0].IC_CZ == 1) || (lenc == 2)) {
|
|
lstrcpyn(codebuf,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
codebuf[lenw-len] = 0;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf()+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
} else {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt == IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<lenc;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
if (MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].W_Code+len,lenw-len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-len);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos++;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = i;
|
|
}
|
|
|
|
|
|
|
|
UINT SearchEMBCompMatch() {
|
|
int i,len;
|
|
int match_s = 0;
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return(match_s);
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos; i<lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos; i++) {
|
|
if (wcsncmp(EMB_Table[i].W_Code ,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,MaxCodes)==0) { //Complete code match
|
|
len = DBCSCharlen(EMB_Table[i].C_Char);
|
|
if ((MBIndex.IMEChara[0].IC_CZ == 1) || (len == 2)) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt == IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<len;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += len;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos++;
|
|
match_s ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += len;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos++;
|
|
match_s ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,len+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += len;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos++;
|
|
match_s ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
} else
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = i;
|
|
lpEngPrivate->PrivateArea.GlobVac.ST_MUL_Cnt += (BYTE)match_s;
|
|
return (match_s);
|
|
}
|
|
|
|
void SearchBEMBCompMatch() {
|
|
int i,lenw,lenc;
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
if(GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
return;
|
|
}
|
|
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos-1 ; i>=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos; i--) {
|
|
if (wcsncmp(EMB_Table[i].W_Code ,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,lpEngPrivate->PrivateArea.Comp_Context.PromptCnt)==0) { //Wild code match
|
|
lenc = DBCSCharlen(EMB_Table[i].C_Char);
|
|
lenw = Inputcodelen(EMB_Table[i].W_Code);
|
|
if ((MBIndex.IMEChara[0].IC_CZ==1) || (lenc==2/sizeof(TCHAR))) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<lenc;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = i+1;
|
|
}
|
|
|
|
|
|
void SearchEMBWildMatch() {
|
|
int i,lenw,lenc;
|
|
TCHAR codebuf[13];
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
if(GetLengthofBuf() >= MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
return;
|
|
}
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos ; i<lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos; i++) {
|
|
if (wcsncmp(EMB_Table[i].W_Code ,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,lpEngPrivate->PrivateArea.Comp_Context.PromptCnt)==0) { //Wild code match
|
|
lenc = DBCSCharlen(EMB_Table[i].C_Char);
|
|
lenw = Inputcodelen(EMB_Table[i].W_Code);
|
|
if ((MBIndex.IMEChara[0].IC_CZ==1) || (lenc==2/sizeof(TCHAR))) {
|
|
lstrcpyn(codebuf,EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
codebuf[lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = 0;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf()+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
} else {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
}
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt ==IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<lenc;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,
|
|
EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,
|
|
EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,
|
|
EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = i;
|
|
}
|
|
|
|
|
|
void SearchBEMBWildMatch() {
|
|
int i,lenw,lenc;
|
|
TCHAR codebuf[13];
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
if(GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
return;
|
|
}
|
|
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos-1 ; i>=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos; i--) {
|
|
if (wcsncmp(EMB_Table[i].W_Code ,lpEngPrivate->PrivateArea.Comp_Context.szInBuffer,lpEngPrivate->PrivateArea.Comp_Context.PromptCnt)==0) { //Wild code match
|
|
lenc = DBCSCharlen(EMB_Table[i].C_Char);
|
|
lenw = Inputcodelen(EMB_Table[i].W_Code);
|
|
if ((MBIndex.IMEChara[0].IC_CZ==1) || (lenc==2/sizeof(TCHAR))) {
|
|
lstrcpyn(codebuf,EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
codebuf[lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt] = 0;
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf()+GetLengthTepBuf(codebuf) > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
}else {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<lenc;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,
|
|
EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,
|
|
EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1) ;
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += DBCSCharlen(EMB_Table[i].C_Char);
|
|
if(MBIndex.IMEChara[0].IC_CTC) {
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,
|
|
EMB_Table[i].W_Code+lpEngPrivate->PrivateArea.Comp_Context.PromptCnt,lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += (lenw-lpEngPrivate->PrivateArea.Comp_Context.PromptCnt);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = i;
|
|
}
|
|
|
|
void SearchBEMBLXMatch() {
|
|
int i,lenc;
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
if(GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
return;
|
|
}
|
|
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos-1 ; i>=0; i--) {
|
|
if (wcsncmp(EMB_Table[i].C_Char ,lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer,lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt)==0) { //Wild code match
|
|
lenc = DBCSCharlen(EMB_Table[i].C_Char);
|
|
if (lenc > lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt==IME_MAXCAND) { // words count is enough
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
i++;
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<lenc;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = i;
|
|
}
|
|
|
|
void SearchEMBLXMatch() {
|
|
int i,lenw,lenc;
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist)
|
|
return;
|
|
if(GetLengthofBuf() >= MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
return;
|
|
}
|
|
for (i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos ; i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count; i++) {
|
|
if (wcsncmp(EMB_Table[i].C_Char ,lpEngPrivate->PrivateArea.Comp_Context.szLxBuffer,lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt)==0) {
|
|
lenc = DBCSCharlen(EMB_Table[i].C_Char);
|
|
lenw = Inputcodelen(EMB_Table[i].W_Code);
|
|
if (lenc > lpEngPrivate->PrivateArea.Comp_Context.LxStrCnt) {
|
|
if (GetLengthCCharBuf(EMB_Table[i].C_Char)+GetLengthTepBuf(TEXT("9:"))+GetLengthofBuf() > MAX_LEN) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
|
|
if (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt ==IME_MAXCAND) {
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
break;
|
|
}
|
|
#if defined(COMBO_IME)
|
|
{
|
|
int k;
|
|
BOOL ISGBK = FALSE;
|
|
|
|
if(MBIndex.IMEChara[0].IC_GB){ //should test GB/GBK
|
|
for(k=0;k<lenc;k+=2/sizeof(TCHAR)){
|
|
if(ISGBK = IsGBK(&EMB_Table[i].C_Char[k])){//out of GB range
|
|
break;
|
|
}
|
|
}
|
|
if(ISGBK){
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
}else{
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
}
|
|
|
|
}
|
|
#else
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt = (lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt+1);
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt%IME_MAXCAND] = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,EMB_Table[i].C_Char,lenc+1);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += lenc;
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
#endif //COMBO_IME
|
|
}
|
|
}
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = i;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CapKeyProc(TCHAR code){}
|
|
|
|
|
|
DWORD Skip_CaWord(DWORD sp) { // sp's start position must be chinese's first byte
|
|
TCHAR len;
|
|
|
|
len = ZM_Area[sp];
|
|
sp += (len+1);
|
|
len = ZM_Area[sp];
|
|
|
|
#ifdef UNICODE
|
|
// all the code in MB are Unicode now, len should not be mult by 2.
|
|
sp += len + 1;
|
|
#else
|
|
sp += (2*len+1);
|
|
#endif
|
|
|
|
|
|
return (sp);
|
|
}
|
|
|
|
int Scan_Word(DWORD sp, LPTSTR tbuf) {
|
|
|
|
TCHAR numwords;
|
|
|
|
numwords = ZM_Area[sp];
|
|
numwords = numwords*2/sizeof(TCHAR);
|
|
|
|
//Engine mess up to unreasonable number, force it return. NTBUG #86303
|
|
if (numwords > 130)
|
|
return 0;
|
|
|
|
lstrcpyn(tbuf,&ZM_Area[sp+1],numwords+1);
|
|
tbuf[numwords] = TEXT('\0');
|
|
return (numwords);
|
|
}
|
|
|
|
|
|
int VerScan_Word(DWORD sp, LPTSTR tbuf) { //start position must be the last byte
|
|
TCHAR numwords;
|
|
|
|
for (;;) {
|
|
#ifdef UNICODE
|
|
if(ZM_Area[sp] > 0x100)
|
|
sp -= 1;
|
|
#else
|
|
if(ZM_Area[sp-1]&0x80)
|
|
sp -= 2;
|
|
#endif
|
|
else
|
|
break;
|
|
}
|
|
numwords = ZM_Area[sp];
|
|
numwords = numwords*2/sizeof(TCHAR);
|
|
sp++;
|
|
lstrcpyn(tbuf,ZM_Area+sp,numwords+1);
|
|
*(tbuf+numwords) = TEXT('\0');
|
|
return (numwords);
|
|
}
|
|
|
|
void IMDReset(int i) {
|
|
if(i<=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos++;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos++;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos++;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos++;
|
|
} else if(i<=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos++;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos++;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos++;
|
|
} else if(i<=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos) {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos++;
|
|
}
|
|
}
|
|
|
|
// Write to EMB_File
|
|
|
|
BOOL WriteEMBToFile(LPTSTR embaddress) {
|
|
HANDLE hFile;
|
|
DWORD byte_t_write;
|
|
TCHAR path_name[MAX_PATH];
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMEUserPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\"));
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->EMB_Name);
|
|
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_WRITE|GENERIC_READ,
|
|
FILE_SHARE_WRITE|FILE_SHARE_READ,
|
|
NULL,
|
|
CREATE_ALWAYS,
|
|
0,
|
|
NULL);
|
|
|
|
|
|
if(hFile==INVALID_HANDLE_VALUE) {
|
|
byte_t_write = GetLastError();
|
|
return(0);
|
|
}
|
|
|
|
WriteFile(hFile,
|
|
&lpEngPrivate->PrivateArea.GlobVac.EMB_Count,
|
|
2,
|
|
&byte_t_write,
|
|
NULL);
|
|
|
|
WriteFile(hFile,
|
|
embaddress,
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count*sizeof(EMB_Head),
|
|
&byte_t_write,
|
|
NULL);
|
|
|
|
SetEndOfFile(hFile);
|
|
CloseHandle(hFile);
|
|
return (1);
|
|
}
|
|
|
|
|
|
BOOL GetUDCItem(HIMCC HmemPri,UINT Index,LPTSTR Read_String,LPTSTR Result_String) {
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return (0);
|
|
}
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist) {
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (0);
|
|
}
|
|
else if (lpEngPrivate->PrivateArea.GlobVac.EMB_Count <= Index) {
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (0);
|
|
}
|
|
else {
|
|
lstrcpyn(Read_String, EMB_Table[Index].W_Code, MAXCODE+1);
|
|
Read_String[MAXCODE] = 0;
|
|
lstrcpyn(Result_String, EMB_Table[Index].C_Char, MAXINPUTWORD+1);
|
|
Result_String[MAXINPUTWORD] = 0;
|
|
return(1);
|
|
}
|
|
}
|
|
|
|
|
|
int AddZCItem(HIMCC HmemPri,LPTSTR wai_code,LPTSTR cCharStr) {
|
|
HANDLE hFile,hMProcess,hCProcess;
|
|
TCHAR path_name[MAX_PATH];
|
|
int byte_t_write, i,j;
|
|
TCHAR emp;
|
|
|
|
EMB_Head *emb;
|
|
HANDLE hemb;
|
|
TCHAR szW_Code[MAXCODE];
|
|
TCHAR szC_CharStr[MAXINPUTWORD];
|
|
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return (0);
|
|
}
|
|
|
|
hemb = GlobalAlloc(GMEM_DISCARDABLE,
|
|
(lpEngPrivate->PrivateArea.GlobVac.EMB_Count+1)*sizeof(EMB_Head));
|
|
|
|
if(!hemb){
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (0);
|
|
}
|
|
|
|
emb = GlobalLock(hemb);
|
|
if(!emb){
|
|
GlobalFree(hemb);
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
|
|
for (i=0; i<MAXCODE; i++)
|
|
szW_Code[i] = TEXT('\0');
|
|
|
|
for (i=0; i<MAXINPUTWORD; i++)
|
|
szC_CharStr[i] = TEXT('\0');
|
|
|
|
for (i=0; i<lstrlen(wai_code); i++)
|
|
szW_Code[i] = wai_code[i];
|
|
|
|
for (i=0; i<lstrlen(cCharStr); i++)
|
|
szC_CharStr[i] = cCharStr[i];
|
|
|
|
if (!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist) {
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMEUserPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\"));
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->EMB_Name);
|
|
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_WRITE,
|
|
FILE_SHARE_WRITE,
|
|
NULL,
|
|
CREATE_NEW,
|
|
0,
|
|
NULL);
|
|
|
|
if(hFile==INVALID_HANDLE_VALUE) {
|
|
GlobalUnlock(emb);
|
|
GlobalFree(hemb);
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count = 1;
|
|
WriteFile(hFile,
|
|
&lpEngPrivate->PrivateArea.GlobVac.EMB_Count,
|
|
2,
|
|
&byte_t_write,
|
|
NULL);
|
|
|
|
WriteFile(hFile,
|
|
szW_Code,
|
|
MAXCODE*sizeof(TCHAR),
|
|
&byte_t_write,
|
|
NULL);
|
|
|
|
WriteFile(hFile,
|
|
szC_CharStr,
|
|
MAXINPUTWORD * sizeof(TCHAR),
|
|
&byte_t_write,
|
|
NULL);
|
|
|
|
SetEndOfFile(hFile);
|
|
CloseHandle(hFile);
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Exist = 1;
|
|
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_READ|GENERIC_WRITE,
|
|
FILE_SHARE_READ|FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
|
|
for (i=0;i<MaxTabNum;i++) {
|
|
if(lstrcmp(HMapTab[i].MB_Name,lpEngPrivate->MB_Name)==0)
|
|
break;
|
|
}
|
|
|
|
HmemEMB_Table = CreateFileMapping(hFile,
|
|
NULL,
|
|
PAGE_READWRITE,
|
|
0,
|
|
sizeof(EMB_Head)*MAXNUMBER_EMB+2,
|
|
HMapTab[i].EMB_Obj);
|
|
if (EMBM)
|
|
UnmapViewOfFile(EMBM);
|
|
|
|
EMBM = MapViewOfFile(HmemEMB_Table,
|
|
FILE_MAP_READ|FILE_MAP_WRITE,
|
|
0,
|
|
0,
|
|
sizeof(EMB_Head)*MAXNUMBER_EMB+2);
|
|
|
|
EMB_Table =(EMB_Head *)(EMBM+2);
|
|
lpEngPrivate->PrivateArea.hEmbFile = hFile;
|
|
lpEngPrivate->PrivateArea.hMapEMB = HmemEMB_Table;
|
|
if(GetCurrentProcessId()==HMapTab[i].EMB_ID) {
|
|
HMapTab[i].hEmbFile = hFile;
|
|
} else {
|
|
hCProcess = GetCurrentProcess();
|
|
hMProcess = OpenProcess(STANDARD_RIGHTS_REQUIRED|PROCESS_DUP_HANDLE,
|
|
FALSE,
|
|
HMapTab[i].EMB_ID);
|
|
DuplicateHandle(hCProcess,
|
|
lpEngPrivate->PrivateArea.hEmbFile,
|
|
hMProcess,
|
|
&HMapTab[i].hEmbFile,
|
|
0,
|
|
FALSE,
|
|
DUPLICATE_SAME_ACCESS);
|
|
}
|
|
|
|
} else {
|
|
|
|
if(lpEngPrivate->PrivateArea.GlobVac.EMB_Count==MAXNUMBER_EMB){
|
|
GlobalUnlock(emb);
|
|
GlobalFree(hemb);
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (3);
|
|
}
|
|
|
|
for(i=0; i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count;i++) {
|
|
if(wcsncmp(szW_Code, EMB_Table[i].W_Code, MAXCODE) <=0)
|
|
break;
|
|
}
|
|
|
|
if ((wcsncmp(szW_Code,EMB_Table[i].W_Code,MAXCODE)==0) &&
|
|
(wcsncmp(EMB_Table[i].C_Char,szC_CharStr,MAXINPUTWORD)==0))
|
|
{
|
|
// this record has already been in the dictionary.
|
|
|
|
GlobalUnlock(emb);
|
|
GlobalFree(hemb);
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(2);
|
|
}
|
|
else {
|
|
memmove(EMB_Table+i+1,
|
|
EMB_Table+i,
|
|
(lpEngPrivate->PrivateArea.GlobVac.EMB_Count-i)*sizeof(EMB_Head));
|
|
|
|
for (j=0; j<MAXCODE; j++)
|
|
EMB_Table[i].W_Code[j] = szW_Code[j];
|
|
|
|
for (j=0; j<MAXINPUTWORD; j++)
|
|
EMB_Table[i].C_Char[j] = szC_CharStr[j];
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count ++;
|
|
(LPWORD)(EMBM)[0]++;//=lpEngPrivate->PrivateArea.GlobVac.EMB_Count;
|
|
|
|
//the file is flushed from base address to the end of the mapping
|
|
FlushViewOfFile(EMBM, 0);
|
|
|
|
}
|
|
}
|
|
|
|
IMDReset(i);
|
|
GlobalUnlock(emb);
|
|
GlobalFree(hemb);
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(1);
|
|
}
|
|
|
|
void DelSelCU(HIMCC HmemPri,int item) {
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
ImmUnlockIMCC(HmemPri);
|
|
return ;
|
|
}
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist){
|
|
ImmUnlockIMCC(HmemPri);
|
|
return;
|
|
}
|
|
memcpy(EMB_Table+item,EMB_Table+item+1,(lpEngPrivate->PrivateArea.GlobVac.EMB_Count-item-1)*sizeof(EMB_Head));
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count --;
|
|
*((LPWORD)EMB_Table-1) = lpEngPrivate->PrivateArea.GlobVac.EMB_Count ;
|
|
IMDReset(item);
|
|
|
|
ImmUnlockIMCC(HmemPri);
|
|
}
|
|
|
|
int GetUDCIndex(HIMCC HmemPri,LPTSTR lpreadstring,LPTSTR lpresultstring) {
|
|
int i ;
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (-1);
|
|
}
|
|
|
|
if(!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist) {
|
|
ImmUnlockIMCC(HmemPri);
|
|
return (-1);
|
|
}
|
|
for(i=0;i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count;i++) {
|
|
if((wcsncmp(EMB_Table[i].W_Code, lpreadstring, MAXCODE)==0) && (wcsncmp(EMB_Table[i].C_Char,lpresultstring,MAXINPUTWORD)==0)){
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(i);
|
|
}
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(-1);
|
|
}
|
|
|
|
|
|
void DelExmb(HIMCC HmemPri) {
|
|
|
|
TCHAR path_name[MAX_PATH];
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return ;
|
|
}
|
|
|
|
if (!lpEngPrivate->PrivateArea.GlobVac.EMB_Exist) {
|
|
ImmUnlockIMCC(HmemPri);
|
|
return;
|
|
}
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count = 0;
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMEUserPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\"));
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->EMB_Name);
|
|
|
|
DeleteFile(path_name);
|
|
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Exist = 0;
|
|
ImmUnlockIMCC(HmemPri);
|
|
}
|
|
|
|
BYTE CodeInSet(char ch) {
|
|
BYTE i;
|
|
|
|
for (i=0;i<NumCodes;i++) {
|
|
if(UsedCode[i]==ch)
|
|
break;
|
|
}
|
|
return(i);
|
|
}
|
|
|
|
UINT InCodeSet(TCHAR ch) {
|
|
BYTE i;
|
|
|
|
for (i=0;i<NumCodes;i++) {
|
|
if(UsedCode[i]==ch)
|
|
break;
|
|
}
|
|
if (i==NumCodes)
|
|
return (0);
|
|
else
|
|
return (1);
|
|
}
|
|
|
|
int NumInSet() {
|
|
int i;
|
|
|
|
for (i=0;i<9;i++) {
|
|
if(CodeAIndex[30+i]!=0)
|
|
return(1);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
void ConvertCandi() {
|
|
int i,j;
|
|
BYTE tempos[IME_MAXCAND];
|
|
BYTE s_pos,n_pos;
|
|
TCHAR tembuf[3000];
|
|
TCHAR ch;
|
|
|
|
n_pos = 0;
|
|
j = 1;
|
|
for(i=lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt; i>0; i--) {
|
|
tempos[j%IME_MAXCAND] = n_pos;
|
|
s_pos = lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[i%IME_MAXCAND];
|
|
for(;;) {
|
|
ch = lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[s_pos];
|
|
if(ch==0x20 || ch==0x00)
|
|
break;
|
|
tembuf[n_pos] = ch;
|
|
n_pos ++;
|
|
s_pos ++;
|
|
}
|
|
tembuf[n_pos] = 0x20;
|
|
n_pos ++;
|
|
j ++;
|
|
}
|
|
tembuf[n_pos] = 0x00;
|
|
for(i=0; i<=lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt; i++)
|
|
lpEngPrivate->PrivateArea.Comp_Context.Candi_Pos[i] = tempos[i];
|
|
lstrcpy(lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer,tembuf);
|
|
}
|
|
|
|
|
|
BYTE WildInBuffer() {
|
|
BYTE i;
|
|
for (i=0;i<lpEngPrivate->PrivateArea.Comp_Context.PromptCnt;i++) {
|
|
if(WildChar==lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[i])
|
|
break;
|
|
}
|
|
return(i);
|
|
}
|
|
void ResetCont(HIMCC HmemPri) {
|
|
int i;
|
|
int scs,csce;
|
|
HANDLE hMProcess,hCProcess;
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return ;
|
|
}
|
|
|
|
GetMBHead();
|
|
if(lpEngPrivate->PrivateArea.hMapEMB!=NULL) {
|
|
if (EMBM) UnmapViewOfFile(EMBM);
|
|
EMBM =MapViewOfFile(HmemEMB_Table,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count = *(WORD *)EMBM;
|
|
EMB_Table = (EMB_Head *) (EMBM+2);
|
|
scs = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos - lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos;
|
|
csce = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos - lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos;
|
|
for (i=0;i<lpEngPrivate->PrivateArea.Comp_Context.PromptCnt;i++)
|
|
SearchEMBPos(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[i],(BYTE)(i+1));
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos + scs;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos + csce;
|
|
|
|
} else {
|
|
for (i=0;i<MaxTabNum;i++ ) {
|
|
if(wcscmp(HMapTab[i].MB_Name,lpEngPrivate->MB_Name)==0) {
|
|
break;
|
|
}
|
|
}
|
|
if (HMapTab[i].hEmbFile!=NULL) {
|
|
hCProcess = GetCurrentProcess();
|
|
hMProcess = OpenProcess(STANDARD_RIGHTS_REQUIRED|PROCESS_DUP_HANDLE,FALSE,HMapTab[i].EMB_ID);
|
|
DuplicateHandle(hMProcess,HMapTab[i].hEmbFile,hCProcess,&lpEngPrivate->PrivateArea.hEmbFile,0,FALSE,DUPLICATE_SAME_ACCESS);
|
|
HmemEMB_Table = OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE,FALSE,HMapTab[i].EMB_Obj);
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Exist = 1;
|
|
if (EMBM) UnmapViewOfFile(EMBM);
|
|
EMBM =MapViewOfFile(HmemEMB_Table,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
|
|
lpEngPrivate->PrivateArea.GlobVac.EMB_Count = *(WORD *)EMBM;
|
|
EMB_Table = (EMB_Head *) (EMBM+2);
|
|
lpEngPrivate->PrivateArea.hMapEMB = HmemEMB_Table ;
|
|
|
|
scs = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos - lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos;
|
|
csce = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos - lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos;
|
|
for (i=0;i<lpEngPrivate->PrivateArea.Comp_Context.PromptCnt;i++)
|
|
SearchEMBPos(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[i],(BYTE)(i+1));
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos + scs;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos + csce;
|
|
}
|
|
}
|
|
|
|
ReadArea(lpEngPrivate->PrivateArea.Comp_Context.szInBuffer[0]);
|
|
|
|
ImmUnlockIMCC(HmemPri);
|
|
}
|
|
|
|
UINT ReadArea(TCHAR code) {
|
|
HANDLE hFile;
|
|
TCHAR path_name[MAX_PATH];
|
|
int path_lenth;
|
|
long boffset,offset,area_size;
|
|
DWORD tag,byte_t_read;
|
|
DWORD b_dic_len;
|
|
BYTE code_no;
|
|
PSECURITY_ATTRIBUTES psa;
|
|
BOOL retVal;
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMESystemPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\"));
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->MB_Name);
|
|
|
|
psa = CreateSecurityAttributes();
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
psa,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
|
|
FreeSecurityAttributes(psa);
|
|
|
|
if(hFile == INVALID_HANDLE_VALUE)
|
|
return(0);
|
|
|
|
SetFilePointer(hFile,28,NULL,FILE_BEGIN);
|
|
|
|
for(;;) {
|
|
retVal = ReadFile(hFile,&tag,4,&byte_t_read,NULL);
|
|
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
if(tag==TAG_BASEDIC)
|
|
break;
|
|
SetFilePointer(hFile,12,NULL,FILE_CURRENT);
|
|
}
|
|
|
|
retVal = ReadFile(hFile,&boffset,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
retVal = ReadFile(hFile,&b_dic_len,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
SetFilePointer(hFile,boffset,NULL,FILE_BEGIN);
|
|
code_no = CodeAIndex[code];
|
|
offset = MB_Head_Table[code_no-1].Q_offset;
|
|
|
|
SetFilePointer(hFile,offset,NULL,FILE_CURRENT);
|
|
byte_t_read = 0;
|
|
CloseHandle(hFile);
|
|
if (CodeAIndex[code]<NumCodes) {
|
|
area_size = (MB_Head_Table[code_no].Q_offset - offset)/sizeof(TCHAR);
|
|
if(lpEngPrivate->PrivateArea.hMapMB==NULL) {
|
|
MessageBeep((UINT)-1);
|
|
} else {
|
|
if (g_lptep == NULL)
|
|
g_lptep = MapViewOfFile(lpEngPrivate->PrivateArea.hMapMB,FILE_MAP_READ,0,0,0);
|
|
|
|
ZM_Area = (LPTSTR)((LPBYTE)g_lptep+boffset+offset);
|
|
}//return(0);
|
|
} else {
|
|
area_size = (b_dic_len - offset)/sizeof(TCHAR);
|
|
if (g_lptep == NULL)
|
|
g_lptep = MapViewOfFile(lpEngPrivate->PrivateArea.hMapMB,FILE_MAP_READ,0,0,0);
|
|
ZM_Area = (LPTSTR)((LPBYTE)g_lptep+boffset+offset);
|
|
}
|
|
byte_t_read = area_size;
|
|
return(byte_t_read);
|
|
|
|
}
|
|
|
|
UINT Conversion(HIMCC HmemPri,LPCTSTR lpSrc,UINT uFlag) {
|
|
UINT srclen;
|
|
UINT dstlen;
|
|
UINT byte_t_read;
|
|
BYTE search_suc ;
|
|
UINT wordlen,codelen,len;
|
|
int i,start_pos;
|
|
TCHAR tepbuf[130];
|
|
int areacode;
|
|
TCHAR charbuf[256];
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return (0);
|
|
}
|
|
|
|
switch (uFlag) {
|
|
case 0:
|
|
|
|
srclen = lstrlen(lpSrc);
|
|
byte_t_read = ReadArea(lpSrc[0]);
|
|
if(byte_t_read==0){
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = byte_t_read;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.GlobVac.Area_V_Lenth = byte_t_read;
|
|
|
|
search_suc = MBPositionSearch(lpSrc);
|
|
|
|
if(search_suc) {
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos = 0;
|
|
i = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
for(;;) {
|
|
|
|
codelen = ZM_Area[i];
|
|
if(wcsncmp(ZM_Area+i+1,lpSrc,codelen)==0) {
|
|
i += (codelen+1);
|
|
wordlen = Scan_Word(i,tepbuf);
|
|
i += (wordlen+1);
|
|
lstrcpyn(ConverList.szSelectBuffer+lpEngPrivate->PrivateArea.GlobVac.SBufPos,tepbuf,wordlen+1);
|
|
ConverList.Candi_Pos[ConverList.Candi_Cnt+1] = (BYTE)(lpEngPrivate->PrivateArea.GlobVac.SBufPos);
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos += wordlen;
|
|
ConverList.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT(' ');
|
|
lpEngPrivate->PrivateArea.GlobVac.SBufPos ++;
|
|
ConverList.Candi_Cnt ++;
|
|
} else
|
|
break;
|
|
}
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer[lpEngPrivate->PrivateArea.GlobVac.SBufPos] = TEXT('\0');
|
|
dstlen = lstrlen(ConverList.szSelectBuffer);
|
|
len = dstlen;
|
|
|
|
} else { // Invaild code
|
|
ClrDoubleBuf();
|
|
len = 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
lstrcpyn(charbuf,lpSrc,2/sizeof(TCHAR)+1);
|
|
charbuf[2/sizeof(TCHAR)] = TEXT('\0');
|
|
areacode = GetFirstCode(charbuf);
|
|
if(areacode==0){
|
|
if(g_lptep)
|
|
{
|
|
UnmapViewOfFile(g_lptep);
|
|
g_lptep = NULL;
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
byte_t_read = ReadArea((TCHAR)areacode);
|
|
if (byte_t_read == 0 ) {
|
|
if(g_lptep)
|
|
{
|
|
UnmapViewOfFile(g_lptep);
|
|
g_lptep = NULL;
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = 0;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = byte_t_read;;
|
|
srclen = lstrlen(lpSrc);
|
|
i = 0;
|
|
for (;;) {
|
|
codelen = ZM_Area[i];
|
|
start_pos = i+1;
|
|
i += (codelen+1);
|
|
wordlen = Scan_Word(i,charbuf);
|
|
if (!wordlen) // Engine mess up, force exit. hack for #86303
|
|
{
|
|
if(g_lptep)
|
|
{
|
|
UnmapViewOfFile(g_lptep);
|
|
g_lptep = NULL;
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(0);
|
|
}
|
|
i += (wordlen+1);
|
|
if ((wordlen==srclen) && wcsncmp(charbuf,lpSrc,wordlen)==0) {
|
|
lstrcpyn(tepbuf,ZM_Area+start_pos,codelen+1);
|
|
break;
|
|
}
|
|
if (i>=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
}
|
|
if (i>lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {
|
|
len = 0;
|
|
}else if (i==lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos && wcsncmp(charbuf,lpSrc,wordlen)!=0){
|
|
ConverList.szInBuffer[0] = 0x0;
|
|
len = 0;
|
|
} else {
|
|
lstrcpyn(ConverList.szInBuffer,tepbuf,codelen+1);
|
|
ConverList.szInBuffer[codelen] = 0x0;
|
|
len = codelen;
|
|
}
|
|
|
|
break;
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(len);
|
|
}
|
|
|
|
|
|
|
|
BYTE MBPositionSearch(LPCTSTR lpSrc) {
|
|
|
|
int srclen;
|
|
int sp;
|
|
BYTE search_fail = 0;
|
|
BYTE code_no,code_no1;
|
|
int wordlen,codelen;
|
|
|
|
|
|
srclen = lstrlen(lpSrc);
|
|
if (srclen <=2)
|
|
{
|
|
search_fail = 1;
|
|
return 0;
|
|
}
|
|
else if ((BYTE)lpSrc[0]>=0x80 || (BYTE)lpSrc[1]>=0x80)
|
|
{
|
|
search_fail = 1;
|
|
return 0;
|
|
}
|
|
code_no1 = CodeAIndex[lpSrc[0]];
|
|
code_no = CodeAIndex[lpSrc[1]];
|
|
sp = MB_Head_Table[code_no1-1].W_offset[code_no-1]/sizeof(TCHAR);
|
|
|
|
for(;;) {
|
|
codelen = ZM_Area[sp];
|
|
if ((codelen == srclen) && (wcsncmp(ZM_Area+sp+1,lpSrc,codelen)==0)) {
|
|
break;
|
|
} else {
|
|
sp += (codelen+1);
|
|
wordlen = ZM_Area[sp];
|
|
sp += (2*wordlen/sizeof(TCHAR)+1);
|
|
}
|
|
if (sp>=lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
}
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos = sp;
|
|
if (lpSrc[1] < TEXT('z'))
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = MB_Head_Table[code_no1-1].W_offset[code_no]/sizeof(TCHAR);
|
|
else
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos = lpEngPrivate->PrivateArea.GlobVac.Area_V_Lenth;
|
|
if (lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos==lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {
|
|
search_fail = 1;
|
|
} else {
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCStartPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dBDicCEndPos = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
|
|
sp = lpEngPrivate->PrivateArea.Comp_Proc.dBDicStartPos;
|
|
for(;;) {
|
|
codelen = ZM_Area[sp];
|
|
if ((codelen==srclen) && (wcsncmp(ZM_Area+sp+1,lpSrc,srclen)==0))
|
|
break;
|
|
else {
|
|
sp += (codelen+1);
|
|
wordlen = ZM_Area[sp];
|
|
sp += (2*wordlen/sizeof(TCHAR)+1);
|
|
}
|
|
if(sp >= lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos)
|
|
break;
|
|
}
|
|
if (sp == lpEngPrivate->PrivateArea.Comp_Proc.dBDicEndPos) {// no this code_word
|
|
search_fail = 1;
|
|
return 0;
|
|
}
|
|
}
|
|
return (1);
|
|
}
|
|
|
|
|
|
int GetFirstCode(LPTSTR lpSrc) {
|
|
HANDLE hFile;
|
|
TCHAR path_name[MAX_PATH];
|
|
long offset;
|
|
DWORD tag,byte_t_read;
|
|
DWORD char_no;
|
|
TCHAR areacode;
|
|
PSECURITY_ATTRIBUTES psa;
|
|
BOOL retVal;
|
|
|
|
StringCchCopy(path_name, ARRAYSIZE(path_name), sImeG.szIMESystemPath);
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), TEXT("\\"));
|
|
StringCchCat(path_name, ARRAYSIZE(path_name), lpEngPrivate->MB_Name);
|
|
|
|
psa = CreateSecurityAttributes();
|
|
hFile = CreateFile(path_name,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
psa,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
|
|
FreeSecurityAttributes(psa);
|
|
|
|
if(hFile == INVALID_HANDLE_VALUE)
|
|
return(0);
|
|
|
|
SetFilePointer(hFile,28,NULL,FILE_BEGIN);
|
|
|
|
for(;;) {
|
|
byte_t_read = 0;
|
|
|
|
retVal = ReadFile(hFile,&tag,4,&byte_t_read,NULL);
|
|
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
if(tag==TAG_INTERCODE)
|
|
break;
|
|
SetFilePointer(hFile,12,NULL,FILE_CURRENT);
|
|
}
|
|
|
|
retVal = ReadFile(hFile,&offset,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
char_no = GetNumber(hFile,offset,lpSrc) ;
|
|
|
|
SetFilePointer(hFile,28,NULL,FILE_BEGIN);
|
|
if ((tag & 0x00000003) != FFLG_RULE) {
|
|
for(;;) {
|
|
byte_t_read = 0;
|
|
retVal = ReadFile(hFile,&tag,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
if(tag==TAG_CRTWORDCODE)
|
|
break;
|
|
SetFilePointer(hFile,12,NULL,FILE_CURRENT);
|
|
}
|
|
} else {
|
|
for(;;) {
|
|
byte_t_read = 0;
|
|
retVal = ReadFile(hFile,&tag,4,&byte_t_read,NULL);
|
|
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
if(tag==TAG_RECONVINDEX)
|
|
break;
|
|
SetFilePointer(hFile,12,NULL,FILE_CURRENT);
|
|
}
|
|
}
|
|
|
|
retVal = ReadFile(hFile,&offset,4,&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
SetFilePointer(hFile,offset,NULL,FILE_BEGIN);
|
|
|
|
SetFilePointer(hFile,char_no*MaxCodes*sizeof(TCHAR),NULL,FILE_CURRENT);
|
|
retVal = ReadFile(hFile,&areacode,1*sizeof(TCHAR),&byte_t_read,NULL);
|
|
if ( retVal == FALSE )
|
|
{
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|
|
|
|
CloseHandle(hFile);
|
|
return(areacode);
|
|
}
|
|
|
|
DWORD GetNumber(HANDLE hFile,DWORD dwOffset,LPTSTR szDBCS) {
|
|
DWORD dwNumArea,dwNumWord,dwBytes;
|
|
DWORD i;
|
|
DWORD RetNo = 0;
|
|
HANDLE hInterCode;
|
|
LPINTERCODEAREA lpInterCode;
|
|
BOOL retVal;
|
|
|
|
SetFilePointer(hFile,dwOffset,0,FILE_BEGIN);
|
|
|
|
retVal = ReadFile(hFile,&dwNumWord,4,&dwBytes,NULL);
|
|
|
|
if ( retVal == FALSE )
|
|
return 0;
|
|
|
|
retVal = ReadFile(hFile,&dwNumArea,4,&dwBytes,NULL);
|
|
|
|
if ( retVal == FALSE )
|
|
return 0;
|
|
|
|
hInterCode = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
|
|
dwNumArea*sizeof(INTERCODEAREA));
|
|
if(!hInterCode)
|
|
return (0);
|
|
lpInterCode = GlobalLock(hInterCode);
|
|
if(!lpInterCode){
|
|
GlobalFree(hInterCode);
|
|
return(0);
|
|
}
|
|
|
|
retVal = ReadFile(hFile,lpInterCode,dwNumArea*sizeof(INTERCODEAREA),&dwBytes,NULL);
|
|
|
|
if ( retVal )
|
|
{
|
|
|
|
for(i=dwNumArea-1; (long)i>=0; i--) {
|
|
#ifdef UNICODE
|
|
dwBytes = szDBCS[0];
|
|
#else
|
|
dwBytes = 256*(BYTE)szDBCS[0]+(BYTE)szDBCS[1];
|
|
#endif
|
|
if(dwBytes >= lpInterCode[i].StartInterCode && dwBytes <= lpInterCode[i].EndInterCode) {
|
|
RetNo = lpInterCode[i].PreCount+dwBytes-lpInterCode[i].StartInterCode;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
GlobalUnlock(hInterCode);
|
|
GlobalFree(hInterCode);
|
|
|
|
return (RetNo);
|
|
}
|
|
|
|
BOOL UnRegisterWord(HIMCC HmemPri,LPCTSTR lpReading,LPCTSTR lpString) {
|
|
int i;
|
|
int succ = 0;
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return FALSE;
|
|
}
|
|
|
|
for (i=0;i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count;i++ ) {
|
|
if((wcsncmp(EMB_Table[i].W_Code,lpReading,MAXCODE)==0) && (wcsncmp(EMB_Table[i].C_Char,lpString,MAXINPUTWORD)==0)) {
|
|
DelSelCU(HmemPri,i);
|
|
succ = 1;
|
|
}
|
|
if(succ==1 && wcsncmp(EMB_Table[i].W_Code,lpReading,MAXCODE)!=0)
|
|
break;
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(succ);
|
|
}
|
|
|
|
|
|
UINT EnumRegisterWord(HIMCC HmemPri,LPCTSTR lpReading,LPCTSTR lpString,LPVOID lpData) {
|
|
UINT count;
|
|
int i,pos,wordlen;
|
|
TCHAR *lptep;
|
|
|
|
lpEngPrivate = (PPRIVCONTEXT) ImmLockIMCC(HmemPri);
|
|
if(!lpEngPrivate){
|
|
return (0);
|
|
}
|
|
|
|
lptep = (TCHAR *) lpData;
|
|
if((lpReading==NULL) && (lpString==NULL)) {
|
|
lpData = EMB_Table;
|
|
count = lpEngPrivate->PrivateArea.GlobVac.EMB_Count;
|
|
} else if(lpReading==NULL) {
|
|
pos = 0;
|
|
count = 0;
|
|
for(i=0; i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count; i++) {
|
|
if (wcsncmp(EMB_Table[i].C_Char,lpString,MAXINPUTWORD)==0) {
|
|
wordlen = Inputcodelen(EMB_Table[i].W_Code);
|
|
lstrcpyn(lptep+pos,EMB_Table[i].W_Code,wordlen+1);
|
|
pos += wordlen;
|
|
lptep[pos] = 0x20;
|
|
pos ++;
|
|
count ++;
|
|
}
|
|
}
|
|
} else if(lpString==NULL) {
|
|
if(EMBPositionSearch(lpReading)) {
|
|
pos = 0;
|
|
for(i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos; i<lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos; i++) {
|
|
wordlen = DBCSCharlen(EMB_Table[i].C_Char);
|
|
lstrcpyn(lptep+pos,EMB_Table[i].C_Char,wordlen+1);
|
|
pos += wordlen;
|
|
lptep[pos] = 0x20;
|
|
pos ++;
|
|
}
|
|
count = lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos - lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos;
|
|
} else {
|
|
count = 0;
|
|
}
|
|
} else {
|
|
if(EMBPositionSearch(lpReading)) {
|
|
pos = 0;
|
|
count = 0;
|
|
for(i=lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos; i<lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos; i++) {
|
|
if (wcsncmp(EMB_Table[i].C_Char,lpString,MAXINPUTWORD)==0) {
|
|
wordlen = DBCSCharlen(EMB_Table[i].C_Char);
|
|
lstrcpyn(lptep+pos,EMB_Table[i].C_Char,wordlen+1);
|
|
pos += wordlen;
|
|
lptep[pos] = 0x20;
|
|
pos ++;
|
|
count ++;
|
|
}
|
|
}
|
|
} else {
|
|
count = 0;
|
|
}
|
|
}
|
|
ImmUnlockIMCC(HmemPri);
|
|
return(count);
|
|
}
|
|
|
|
BYTE EMBPositionSearch(LPCTSTR lpSrc) {
|
|
int i;
|
|
int srclen;
|
|
|
|
srclen = lstrlen(lpSrc);
|
|
|
|
for (i=0; i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count; i++) {
|
|
if ((Inputcodelen(EMB_Table[i].W_Code)==srclen) && (wcsncmp(EMB_Table[i].W_Code,lpSrc,srclen)==0))
|
|
break;
|
|
}
|
|
if(i==lpEngPrivate->PrivateArea.GlobVac.EMB_Count)
|
|
return (0);
|
|
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQStartPos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCStartPos = i;
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQCEndPos = i;
|
|
|
|
for (i; i<lpEngPrivate->PrivateArea.GlobVac.EMB_Count; i++) {
|
|
if ((Inputcodelen(EMB_Table[i].W_Code)!=srclen) || (wcsncmp(EMB_Table[i].W_Code,lpSrc,srclen)!=0))
|
|
break;
|
|
}
|
|
lpEngPrivate->PrivateArea.Comp_Proc.dwUDicQEndPos = i;
|
|
return (1);
|
|
}
|
|
|
|
long GetLengthofBuf() {
|
|
SIZE size;
|
|
int ncount;
|
|
BOOL succ;
|
|
TCHAR tepbuf[3000];
|
|
long ret_len ;
|
|
|
|
HDC hDC;
|
|
HGDIOBJ hOldFont;
|
|
LOGFONT lfFont;
|
|
|
|
hDC = GetDC(NULL);
|
|
|
|
hOldFont = GetCurrentObject(hDC, OBJ_FONT);
|
|
GetObject(hOldFont, sizeof(LOGFONT), &lfFont);
|
|
|
|
ZeroMemory(&lfFont, sizeof(lfFont));
|
|
lfFont.lfHeight = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72);
|
|
lfFont.lfCharSet = NATIVE_CHARSET;
|
|
lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
|
|
SelectObject(hDC, CreateFontIndirect(&lfFont));
|
|
|
|
ncount = lpEngPrivate->PrivateArea.GlobVac.SBufPos;
|
|
lstrcpyn(tepbuf,lpEngPrivate->PrivateArea.Comp_Context.szSelectBuffer,ncount+1);
|
|
tepbuf[ncount] = TEXT('\0');
|
|
succ = GetTextExtentPoint(hDC,tepbuf,ncount,(LPSIZE)&size);
|
|
if(!succ){
|
|
memset(&size, 0, sizeof(SIZE));
|
|
}
|
|
ret_len = size.cx;
|
|
succ = GetTextExtentPoint(hDC,TEXT("9:"),2,(LPSIZE)&size);
|
|
if(!succ){
|
|
memset(&size, 0, sizeof(SIZE));
|
|
}
|
|
ret_len += (size.cx*lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt );
|
|
|
|
DeleteObject(SelectObject(hDC, hOldFont));
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
return(ret_len);
|
|
}
|
|
|
|
long GetLengthTepBuf(LPTSTR lpstring) {
|
|
SIZE size;
|
|
int ncount;
|
|
BOOL succ;
|
|
|
|
HDC hDC;
|
|
HGDIOBJ hOldFont;
|
|
LOGFONT lfFont;
|
|
|
|
hDC = GetDC(NULL);
|
|
|
|
hOldFont = GetCurrentObject(hDC, OBJ_FONT);
|
|
GetObject(hOldFont, sizeof(LOGFONT), &lfFont);
|
|
|
|
ZeroMemory(&lfFont, sizeof(lfFont));
|
|
lfFont.lfHeight = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72);
|
|
lfFont.lfCharSet = NATIVE_CHARSET;
|
|
lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
|
|
SelectObject(hDC, CreateFontIndirect(&lfFont));
|
|
|
|
ncount = lstrlen(lpstring);
|
|
succ = GetTextExtentPoint(hDC,lpstring,ncount,(LPSIZE)&size);
|
|
if(!succ){
|
|
memset(&size, 0, sizeof(SIZE));
|
|
}
|
|
|
|
|
|
DeleteObject(SelectObject(hDC, hOldFont));
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt<1 )
|
|
return (0);
|
|
else
|
|
return(size.cx);
|
|
}
|
|
|
|
|
|
long GetLengthCCharBuf(LPTSTR lpstring) {
|
|
TCHAR CCharStr[41];
|
|
SIZE size;
|
|
int ncount;
|
|
BOOL succ;
|
|
|
|
HDC hDC;
|
|
HGDIOBJ hOldFont;
|
|
LOGFONT lfFont;
|
|
|
|
hDC = GetDC(NULL);
|
|
|
|
hOldFont = GetCurrentObject(hDC, OBJ_FONT);
|
|
GetObject(hOldFont, sizeof(LOGFONT), &lfFont);
|
|
|
|
ZeroMemory(&lfFont, sizeof(lfFont));
|
|
lfFont.lfHeight = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72);
|
|
lfFont.lfCharSet = NATIVE_CHARSET;
|
|
lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
|
|
SelectObject(hDC, CreateFontIndirect(&lfFont));
|
|
|
|
lstrcpyn(CCharStr, lpstring, MAXINPUTWORD+1);
|
|
CCharStr[MAXINPUTWORD] = TEXT('\0');
|
|
ncount = lstrlen(CCharStr);
|
|
succ = GetTextExtentPoint(hDC,CCharStr,ncount,(LPSIZE)&size);
|
|
if(!succ){
|
|
memset(&size, 0, sizeof(SIZE));
|
|
}
|
|
|
|
DeleteObject(SelectObject(hDC, hOldFont));
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
if(lpEngPrivate->PrivateArea.Comp_Context.Candi_Cnt<1 )
|
|
return (0);
|
|
else
|
|
return(size.cx);
|
|
}
|
|
|
|
|
|
int Inputcodelen(LPCTSTR string) {
|
|
TCHAR str[13];
|
|
|
|
lstrcpyn(str, string, MAXCODE+1);
|
|
str[MAXCODE] = TEXT('\0');
|
|
return(lstrlen(str));
|
|
}
|
|
|
|
int DBCSCharlen(LPCTSTR string) {
|
|
TCHAR str[41];
|
|
|
|
lstrcpyn(str, string, MAXINPUTWORD+1);
|
|
str[MAXINPUTWORD] = TEXT('\0');
|
|
return(lstrlen(str));
|
|
}
|
|
|
|
LPTSTR _tcschr(LPTSTR string, TCHAR c)
|
|
{
|
|
#ifdef UNICODE
|
|
return (wcschr(string, c));
|
|
#else
|
|
return (strchr(string, c));
|
|
#endif
|
|
}
|
|
|
|
//Backward search specific charactor.
|
|
LPTSTR _rtcschr(LPTSTR string, TCHAR c)
|
|
{
|
|
int i,ilen = lstrlen(string);
|
|
if (ilen)
|
|
for (i=ilen;i>=0;i--)
|
|
{
|
|
if (string[i] == c)
|
|
return (string+i);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int IsGBK(LPTSTR lpStr)
|
|
{
|
|
int iRet = FALSE;
|
|
char szGBK[80];
|
|
|
|
#ifdef UNICODE
|
|
WideCharToMultiByte(NATIVE_ANSI_CP, WC_COMPOSITECHECK, lpStr, -1, szGBK,
|
|
sizeof(szGBK), NULL, NULL);
|
|
#else
|
|
StringCchCopy(szGBK, ARRAYSIZE(szGBK), lpStr);
|
|
#endif
|
|
|
|
if((unsigned char)szGBK[0]<0xa1 || (unsigned char)szGBK[1] < 0xa1) //out of GB range
|
|
iRet = TRUE;
|
|
return iRet;
|
|
}
|