📄 compose.c
字号:
/*++
Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
Module Name:
compose.c
++*/
#include <windows.h>
#include <imm.h>
#include <imedefs.h>
void PASCAL XGBAddCodeIntoCand(LPCANDIDATELIST, WORD);
#if defined(COMBO_IME)
void PASCAL UnicodeAddCodeIntoCand(LPCANDIDATELIST, WORD);
#endif
#if defined(COMBO_IME)
/**********************************************************************/
/* UnicodeEngine() */
/* Description: */
/* Conv GBcode */
/**********************************************************************/
WORD PASCAL UnicodeEngine(LPPRIVCONTEXT lpImcP)
{
if (lpImcP->bSeq[3] || lpImcP->bSeq[2] == TEXT('?') || lpImcP->bSeq[2] == TEXT(' ')) {
if (lpImcP->bSeq[2] == TEXT('?') || lpImcP->bSeq[2] == TEXT(' ')){
lpImcP->bSeq[2] = TEXT('0');
lpImcP->bSeq[3] = TEXT('0');
}
return (AsciiToGB(lpImcP));
} else {
return (0);
}
}
#endif //COMBO_IME
/**********************************************************************/
/* XGBEngine() */
/* Description: */
/* Conv GBcode */
/**********************************************************************/
WORD PASCAL XGBEngine(LPPRIVCONTEXT lpImcP)
{
WORD wCode;
if (lpImcP->bSeq[3] ||(lpImcP->bSeq[2] == TEXT('?'))) {
if (lpImcP->bSeq[2] == TEXT('?')){ //add 626
lpImcP->bSeq[2] = TEXT('4');
lpImcP->bSeq[3] = TEXT('0');
}
wCode = AsciiToGB(lpImcP);
return wCode;
} else {
return ((WORD)NULL);
}
}
/**********************************************************************/
/* XGBSpcEng() */
/* Description: */
/* Conv GBcode for Space */
/**********************************************************************/
WORD PASCAL XGBSpcEng(LPPRIVCONTEXT lpImcP)
{
WORD wCode;
lpImcP->bSeq[2] = TEXT('4');
lpImcP->bSeq[3] = TEXT('0');
wCode = AsciiToGB(lpImcP);
return wCode;
}
/**********************************************************************/
/* GBEngine() */
/* Description: */
/* Conv GBcode */
/**********************************************************************/
WORD PASCAL GBEngine(LPPRIVCONTEXT lpImcP)
{
WORD wCode;
if (lpImcP->bSeq[3] ||(lpImcP->bSeq[2] == TEXT('?'))) {
if (lpImcP->bSeq[0] >=TEXT('0') && lpImcP->bSeq[0] <=TEXT('9')) { //Area mode
if (lpImcP->bSeq[2] == TEXT('?')){
lpImcP->bSeq[2] = TEXT('0');
lpImcP->bSeq[3] = TEXT('1');
}
return (AsciiToArea(lpImcP));
}
else if (lpImcP->bSeq[0] >=TEXT('a') && lpImcP->bSeq[0] <=TEXT('f')) { //GB mode
if (lpImcP->bSeq[2] == TEXT('?')){
lpImcP->bSeq[2] = TEXT('a');
lpImcP->bSeq[3] = TEXT('1');
}
wCode = AsciiToGB(lpImcP);
return wCode;
} else {
return ((WORD)NULL);
}
} else
return ((WORD)NULL);
}
/**********************************************************************/
/* GBSpcEng() */
/* Description: */
/* Conv GBcode for Space */
/**********************************************************************/
WORD PASCAL GBSpcEng(LPPRIVCONTEXT lpImcP)
{
if (lpImcP->bSeq[0] >=TEXT('0') && lpImcP->bSeq[0] <=TEXT('9')) { //Area mode
lpImcP->bSeq[2] = TEXT('0');
lpImcP->bSeq[3] = TEXT('1');
return (AsciiToArea(lpImcP));
} else if (lpImcP->bSeq[0] >=TEXT('a') && lpImcP->bSeq[0] <=TEXT('f')) { //GB mode
lpImcP->bSeq[2] = TEXT('a');
lpImcP->bSeq[3] = TEXT('1');
return (AsciiToGB(lpImcP));
} else {
return ((WORD)NULL);
}
}
/**********************************************************************/
/* AsciiToGB */
/* Description: */
/**********************************************************************/
WORD PASCAL AsciiToGB(LPPRIVCONTEXT lpImcP)
{
WORD GBCode;
GBCode = (CharToHex(lpImcP->bSeq[2]) << 4) + CharToHex(lpImcP->bSeq[3]);
GBCode = GBCode * 256;
GBCode = (CharToHex(lpImcP->bSeq[0]) << 4) + CharToHex(lpImcP->bSeq[1]) + GBCode;
return (GBCode);
}
/**********************************************************************/
/* AsciiToArea */
/* Description: */
/**********************************************************************/
WORD PASCAL AsciiToArea(LPPRIVCONTEXT lpImcP)
{
WORD AreaCode;
AreaCode = (CharToHex(lpImcP->bSeq[2]) * 10) + CharToHex(lpImcP->bSeq[3]) + 0xa0;
AreaCode = AreaCode * 256;
AreaCode = (CharToHex(lpImcP->bSeq[0]) * 10) + CharToHex(lpImcP->bSeq[1]) + AreaCode + 0xa0;
return (AreaCode);
}
WORD PASCAL CharToHex(
TCHAR cChar)
{
if (cChar >= TEXT('0') && cChar <= TEXT('9'))
return((WORD)(cChar - TEXT('0')));
else if (cChar >= TEXT('a') && cChar <= TEXT('f'))
return((WORD)(cChar-TEXT('a')+ 0x0a));
else
return ((WORD)NULL);
}
/**********************************************************************/
/* Engine() */
/* Description: */
/* search MB and fill lpCompStr and lpCandList */
/**********************************************************************/
int PASCAL Engine(
LPCOMPOSITIONSTRING lpCompStr,
LPCANDIDATELIST lpCandList,
LPPRIVCONTEXT lpImcP,
LPINPUTCONTEXT lpIMC,
WORD wCharCode)
{
if(lpCompStr->dwCursorPos < 4
&& (lpImcP->bSeq[2] != TEXT('?'))
&& (wCharCode != TEXT(' '))) {
return (ENGINE_COMP);
} else if((lpCompStr->dwCursorPos==4)
||(lpImcP->bSeq[2] == TEXT('?'))
||((wCharCode == TEXT(' ')) && (lpCompStr->dwCursorPos == 2))) {
if (!lpCompStr) {
MessageBeep((UINT)-1);
return -1;
}
if (!lpImcP) {
MessageBeep((UINT)-1);
return -1;
}
#if defined(COMBO_IME)
if(sImeL.dwRegImeIndex == INDEX_GB)
{
// GB
DWORD i;
WORD wCode;
TCHAR ResaultStr[3];
if((lpImcP->bSeq[2] == TEXT('?'))) {
wCode = GBEngine(lpImcP);
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < IME_MAXCAND; i++, wCode++) {
AddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else if(wCharCode == TEXT(' ')) {
wCode = GBSpcEng(lpImcP);
lpImcP->bSeq[2] = 0;
lpImcP->bSeq[3] = 0;
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < IME_MAXCAND; i++, wCode++) {
AddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else {
InitCompStr(lpCompStr);
// the result string = the selected candidate;
wCode = GBEngine(lpImcP);
#ifdef UNICODE
MultiByteToWideChar(NATIVE_ANSI_CP, 0, (LPCSTR)&wCode, 2, ResaultStr, sizeof(ResaultStr)/sizeof(TCHAR));
ResaultStr[1] = TEXT('\0');
#else
ResaultStr[0] = LOBYTE(wCode);
ResaultStr[1] = HIBYTE(wCode);
ResaultStr[2] = 0x00;
#endif
lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset),ResaultStr);
// calculate result string length
lpCompStr->dwResultStrLen = lstrlen(ResaultStr);
return (ENGINE_RESAULT);
}
}else if(sImeL.dwRegImeIndex == INDEX_GBK)
{
// XGB
DWORD i;
WORD wCode;
TCHAR ResaultStr[3];
if((lpImcP->bSeq[2] == TEXT('?'))) {
wCode = XGBEngine(lpImcP);
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < (0x7e-0x40+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
wCode ++;
for (i = 0; i < (0xfe-0x80+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else if(wCharCode == TEXT(' ')) {
wCode = XGBSpcEng(lpImcP);
lpImcP->bSeq[2] = 0;
lpImcP->bSeq[3] = 0;
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < (0x7e-0x40+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
wCode ++;
for (i = 0; i < (0xfe-0x80+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else {
InitCompStr(lpCompStr);
// the result string = the selected candidate;
wCode = XGBEngine(lpImcP);
#ifdef UNICODE
MultiByteToWideChar(NATIVE_ANSI_CP, 0, (LPCSTR)&wCode, 2, ResaultStr, sizeof(ResaultStr)/sizeof(TCHAR));
ResaultStr[1] = TEXT('\0');
#else
ResaultStr[0] = LOBYTE(wCode);
ResaultStr[1] = HIBYTE(wCode);
ResaultStr[2] = 0x00;
#endif
lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset),ResaultStr);
// calculate result string length
lpCompStr->dwResultStrLen = lstrlen(ResaultStr);
return (ENGINE_RESAULT);
}
}else if(sImeL.dwRegImeIndex == INDEX_UNICODE)
{
// UNICODE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -