📄 imecomm.c
字号:
#include "Kernel.h"
#include "ImeIn.h"
/*************************************************************************/
/* FUNCTION: _ImDichSearch */
/* DESCRIPTION:根据输入内容查找输出内容的索引 */
/* INPUTS: startNum,开始序号 */
/* endNum,结束的序号 */
/* searchFunc,比较函数 */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/*************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ===========================================*/
/* Qorse 2003-03-25 创建初始版本 */
/*************************************************************************/
FOR_IME_ALL
INT _ImDichSearch(UINT startNum, UINT endNum, INT (*searchFunc)(UINT))
{
UINT middleNum;
BOOL find;
INT sign;
find = FALSE;
if (startNum > endNum)
{
return FALSE;
}
while ((startNum <= endNum) && (!find))
{
middleNum = (startNum + endNum) / 2;
sign = searchFunc(middleNum);
if (sign == 0)
{
find = TRUE;
}
else if (sign < 0)
{
endNum = middleNum - 1;
}
else
{
startNum = middleNum + 1;
}
}
if (find)
{
return middleNum;
}
else
{
return -1;
}
}
/*************************************************************************/
/* FUNCTION: __IMEGetChar */
/* DESCRIPTION:将未处理按键以字符输出 */
/* INPUTS: pEvent,按键消息 */
/* OUTPUTS: pEvent */
/* RETURN: NONE */
/*************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ===========================================*/
/* Qorse 2003-04-04 创建初始版本 */
/*************************************************************************/
FOR_IME_ALL
VOID __IMEGetChar(UINT *pEvent, UINT *pParam)
{
UINT16 wMsgX;
wMsgX = (UINT16)(*pParam);
if (*pEvent == EVENT_KEY)
{
if (wMsgX >= 0x20 && wMsgX <= 0x7e)
{
*pEvent = EVENT_CHAR;
}
}
}
VOID __ImeConvertCase(UINT *pEvent, UINT *pParam)
{
UINT16 wMsgX;
wMsgX = (UINT16)(*pParam);
if (*pEvent == EVENT_CHAR)
{
if ((wMsgX >= 'A') && (wMsgX <= 'Z'))
{
*pParam = wMsgX + 0x20;
}
}
}
/*************************************************************************/
/* FUNCTION: _imOutputData */
/* DESCRIPTION:输出数据 */
/* INPUTS: index,用户选择的字符的相对编号 */
/* getedzi,输出字符 */
/* pEvent,变更消息 */
/* OUTPUTS: pEvent */
/* RETURN: NONE */
/*************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ===========================================*/
/* Qorse 2003-03-25 创建初始版本 */
/*************************************************************************/
FOR_IME_ALL
BOOL _imOutputData(UINT16 index, UINT16 *getedzi, UINT *pEvent)
{
UINT16 wIndex;
UINT8 *pCodeSource;
if (index)
{
index --;
}
else
{
index = 9;
}
if (g_pIMECandiPos + index >= g_pIMEWordNum) //无法再翻页
{
return FALSE;
}
wIndex = g_pIMECandiPos + index; //下一页的索引
pCodeSource = g_pIMEDataAddr + wIndex * 2; //下一页的数据
g_pIMEOutWordBuf[0] = pCodeSource[0];
g_pIMEOutWordBuf[1] = pCodeSource[1];
g_pIMEOutWordBuf[2] = 0;
WRITE_WORD(getedzi, MAKEWORD(pCodeSource[1], pCodeSource[0]));
MsgPost((APGUI_STRUCT_MODEL* )NULL, EVENT_IMESTR, (UINT)g_pIMEOutWordBuf);
*pEvent = EVENT_NOTHING;
return TRUE;
}
/*************************************************************************/
/* FUNCTION: _ImGetAssociation */
/* DESCRIPTION:根据输入内容获取联想字 */
/* INPUTS: code,字符内码 */
/* OUTPUTS: NONE */
/* RETURN: TRUE:找到联想字 */
/*************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ===========================================*/
/* Qorse 2003-03-25 创建初始版本 */
/*************************************************************************/
FOR_IME_ALL
BOOL _ImGetAssociation(UINT16 code) //取联想字
{
UINT16 charIdx;
UINT8 *addr;
UINT32 imAssStart, imAssEnd;
IMEGUI_STRUCT *pApGui;
pApGui = (IMEGUI_STRUCT *)GetApHandle();
if (pApGui == NULL)
{
return FALSE;
}
if (pApGui->wImeOption & IME_OPTION_NOASSOC)
{
return FALSE;
}
g_pIMEAssocNum = 0;
if ((HIBYTE(code) < 0xB0) || (HIBYTE(code) > 0xF7)
|| (LOBYTE(code) < 0xA1))
{
return FALSE;
}
charIdx = HIBYTE(code);
charIdx -= 0xb0;
charIdx *= 94;
charIdx += LOBYTE(code);
charIdx -= 0xa1;
addr = (UINT8*)(LX_ADDRESS + charIdx * 3);
imAssStart = 0;
imAssEnd = 0;
memmove(&imAssStart, addr, 3);
memmove(&imAssEnd, addr + 3, 3);
if (imAssStart == imAssEnd)
{
return FALSE;
}
g_pIMEWordNum = (UINT16)(imAssEnd - imAssStart) / 2;
g_pIMEDataAddr = (UINT8*)(LX_ADDRESS + imAssStart);
g_pIMECandiPos = 0;
g_pIMEWordTypeNum = HZ_PER_PAGE;
return TRUE;
}
/*************************************************************************/
/* FUNCTION: _imLeftRight */
/* DESCRIPTION:翻动候选字 */
/* INPUTS: pEvent,按键消息 */
/* OUTPUTS: pEvent */
/* RETURN: TRUE:有效操作 */
/*************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ===========================================*/
/* Qorse 2003-03-25 创建初始版本 */
/*************************************************************************/
FOR_IME_ALL
BOOL _imLeftRight(UINT *pEvent, UINT *pParam)
{
if (*pParam == MVK_LEFT)
{
if (g_pIMECandiPos >= g_pIMEWordTypeNum)
{
g_pIMECandiPos -= g_pIMEWordTypeNum;
return TRUE;
}
}
else
{
if (g_pIMECandiPos + g_pIMEWordTypeNum < g_pIMEWordNum)
{
g_pIMECandiPos += g_pIMEWordTypeNum;
return TRUE;
}
}
return FALSE;
}
/*************************************************************************/
/* FUNCTION: _IMEGetSelectWord */
/* DESCRIPTION:处理用户选择了备选字 */
/* INPUTS: pEvent,消息结构 */
/* OUTPUTS: pEvent */
/* RETURN: TRUE:有效选择 */
/*************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ===========================================*/
/* Qorse 2003-04-04 创建初始版本 */
/*************************************************************************/
FOR_IME_ALL
BOOL _IMEGetSelectWord(UINT *pEvent, UINT *pParam) //用户选择了输出
{
UINT16 getedzi;
//获得新字符
if (_imOutputData((UINT16)(*pParam - '0'), &getedzi, pEvent))
{
if (_ImGetAssociation(getedzi))
g_mInputBox.state = IM_INPUT_LX;
else
{
memset(g_pIMEInBuffer, 0, IM_INBUFF_LEN);
g_pIMEInputednum = 0;
g_mInputBox.state = IM_INPUT_NULL;
}
return TRUE;
}
return FALSE;
}
/*************************************************************************/
/* FUNCTION: _imBihuaGetData */
/* DESCRIPTION:笔画输入法取数据函数 */
/* INPUTS: NONE */
/* OUTPUTS: TRUE/FALSE */
/*************************************************************************/
FOR_IME_BIHUA
BOOL _imBihuaGetData(void)
{
UINT16 index, i, number1, number2;
UINT32 addr;
UINT8 num;
if (g_pIMEInBuffer[1] == 0)
{
index = g_pIMEInBuffer[0] - '0';
}
else
{
index = (g_pIMEInBuffer[0] - '0') * 10 + g_pIMEInBuffer[1] - '0';
}
for (i = 0; i < IMBUHUATOTAL; i++)
{
addr = (UINT32)BIHUA_ADDRESS + i * 3;
memcpy((UINT8 *)&num, (UINT8 *)addr, 1);
if (num == index)
{
addr = (UINT32)BIHUA_ADDRESS + (i * 3 + 1);
memcpy((UINT8 *)&number1, (UINT8 *)addr, sizeof(UINT16));
if (i == IMBUHUATOTAL - 1)
{
number2 = BIHUA_LENGTH;
}
else
{
i++;
addr = (UINT32)BIHUA_ADDRESS + (i * 3 + 1);
memcpy((UINT8 *)&number2, (UINT8 *)addr, sizeof(UINT16));
}
g_pIMEWordNum = (number2 - number1) / 2;
g_pIMEDataAddr = (UINT8 *)BIHUA_ADDRESS + number1;
g_pIMECandiPos = 0;
g_pIMEBushouWordLen = 2;
g_pIMEWordTypeNum = HZ_PER_PAGE;
return TRUE;
}
}
return FALSE;
}
/*************************************************************************/
/* GET部首和难检数据的地址 */
/*************************************************************************/
FOR_IME_BUSHOU
void ImGetBiShouDataAddr(void)
{
UINT32 pAddr;
pAddr = (UINT32)BUSHOU_ADDRESS + 3;
memcpy((UINT8 *)(&g_pIMEBushou_bhbh), (UINT8 *)pAddr, 2);
pAddr = pAddr + 3;
memcpy((UINT8 *)(&g_pIMEBushou_bsb), (UINT8 *)pAddr, 2);
pAddr = pAddr + 3;
memcpy((UINT8 *)(&g_pIMEBushou_bs), (UINT8 *)pAddr, 2);
pAddr = pAddr + 3;
memcpy((UINT8 *)(&g_pIMEBushou_bh), (UINT8 *)pAddr, 2);
pAddr = pAddr + 3;
memcpy((UINT8 *)(&g_pIMEBushou_hz), (UINT8 *)pAddr, 2);
}
/*************************************************************************/
/* FUNCTION: _imBushouGetData */
/* DESCRIPTION:部首输入法取数据函数 */
/* INPUTS: NONE */
/* OUTPUTS: T/F */
/*************************************************************************/
FOR_IME_BUSHOU
BOOL _imBushouGetData(void)
{
UINT16 pIndex, pNumber1, pNumber2;
UINT32 pAddr;
UINT16 pNumno1, pNumno2, pIndex1, pIndex2, i;
if (g_pIMEInBuffer[1] == 0)
{
pIndex = g_pIMEInBuffer[0] - '0';
}
else
{
pIndex = (g_pIMEInBuffer[0] - '0') * 10 + g_pIMEInBuffer[1] - '0';
}
// if (!g_bSecond) { //MODIFIED BY JU
if (!g_pIMEBushouState){
if ((pIndex > 12) || (pIndex == 0))
{
return FALSE;
}
else {
pAddr = (UINT32)BUSHOU_ADDRESS + g_pIMEBushou_bhbh + pIndex - 1;
memcpy((UINT8 *)(&pNumno1), (UINT8 *)pAddr, 2);
pNumber1 = (UINT8)pNumno1;
pNumber2 = (UINT8)(pNumno1 >> 8);
g_pIMEWordNum = pNumber2 - pNumber1;
pNumno1 = (UINT16)pNumber1 * 3;
if (g_pIMEWordNum == 0)
{
return FALSE;
}
g_pIMEDataAddr
= (UINT8 *)(BUSHOU_ADDRESS + g_pIMEBushou_bsb + pNumno1);
g_pIMECandiPos = 0;
g_pIMEBushouWordLen = 3;
g_pIMEWordTypeNum =HZ_PER_PAGE;
return TRUE;
}
}
else{
// pAddr = (UINT32)g_pBushouAddr + g_pIMEBushouWordIndex * 3 + 2; ???
pAddr = (UINT32)g_pIMEDataAddr + g_pIMEBushouWordIndex * 3 + 2;
pNumber1 = 0;
memcpy((UINT8 *)(&pNumber1), (UINT8 *)pAddr, 1);
pAddr = (UINT32)BUSHOU_ADDRESS + g_pIMEBushou_bs + pNumber1 * 4;
memcpy((UINT8 *)(&pIndex1), (UINT8 *)(pAddr + 2), 2);
pAddr += 6;
memcpy((UINT8 *)(&pIndex2), (UINT8 *)pAddr, 2);
pNumno1 = pIndex2 - pIndex1;
pAddr = (UINT32)BUSHOU_ADDRESS + g_pIMEBushou_bh + pIndex1 * 4;
for (i = 0; i < pNumno1; i++) {
memcpy((UINT8 *)(&pNumno2), (UINT8 *)pAddr, 2);
pNumber1 = (UINT8)pNumno2;
pNumber2 = (UINT8)((pNumno2 >> 8) & 0xff);
if (pNumno1 == 1 && pNumber1 == 0 && pNumber2 == 0)
{
pIndex=0;
}
if (pIndex == pNumber1
|| pIndex >= pNumber1 && pIndex <= pNumber2)
{
memcpy((UINT8 *)(&pIndex1), (UINT8 *)(pAddr + 2), 2);
pAddr += 6;
memcpy((UINT8 *)(&pIndex2), (UINT8 *)pAddr, 2);
g_pIMEWordNum = pIndex2 - pIndex1;
if (g_pIMEWordNum == 0)
{
return FALSE;
}
pNumno2 = (UINT16)pIndex1 * 2;
g_pIMEDataAddr
= (UINT8 *)(BUSHOU_ADDRESS + g_pIMEBushou_hz + pNumno2);
g_pIMECandiPos = 0;
g_pIMEBushouWordLen = 2;
return TRUE;
}
pAddr += 4;
}
return FALSE;
}
}
/*************************************************************************/
/* GET难检数据 */
/*************************************************************************/
FOR_IME_NANJIAN
void _imNanjianGetData(void)
{
UINT16 pIndex, pNumber1, pNumber2;
UINT32 pAddr, pAddr1, pAddr2;
if (g_pIMEInBuffer[1] == 0)
{
pIndex = g_pIMEInBuffer[0] - '0';
}
else
{
pIndex = (g_pIMEInBuffer[0] - '0') * 10 + g_pIMEInBuffer[1] - '0';
}
if (pIndex > 32 || pIndex == 0)
{
g_mInputBox.state = IM_INPUT_ERROR;
return;
}
if (pIndex > 20)
{
pIndex = 20;
}
pAddr = (UINT32)NJZ_ADDRESS + pIndex * 4 - 4;
pAddr1 = pAddr + 2;
pAddr2 = pAddr + 6;
memcpy((UINT8 *)(&pNumber1), (UINT8 *)pAddr1, 2);
memcpy((UINT8 *)(&pNumber2), (UINT8 *)pAddr2, 2);
g_pIMEWordNum = (pNumber2 - pNumber1) / 2;
g_pIMECandiPos = 0;
g_pIMEDataAddr = (UINT8*)(NJZ_ADDRESS + pNumber1);
g_pIMEBushouWordLen = 2;
g_mInputBox.state = IM_INPUT_ZC;
g_pIMEWordTypeNum = HZ_PER_PAGE;
}
/*****************************拼音五笔共用部分****************************/
BOOL _PyWbGetData(UINT uType)
{
BOOL retval;
if (uType == IME_WUBI)
{
retval = _ImWbGetWord();
}
else
{
retval = __ImPyGetWord();
}
if (!retval)
{
g_pIMEWordNum = 0;
g_pIMECandiPos = 0;
}
return retval;
}
/*************************************************************************/
/* FUNCTION: _ImWbGetWord */
/* DESCRIPTION:五笔输入法取数据 */
/* INPUTS: NONE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -