📄 mmihzapi.c
字号:
static void SearchSomeHanZi_ByBiShun(chinese_Data* pchinese_Data)
{
unsigned int Smart, OffSetPositoin,OffSetEnd,PCode;
unsigned short TempString[10],ch1[3];
char* ProgramCode=(char*)pchinese_Data->ProgramCode;
OffSetPositoin = 0;
OffSetEnd = MaxHanZi;
if(ProgramCode[4]) Smart=0xffff;
else if(ProgramCode[3]) Smart=0xfff0;
else if(ProgramCode[2]) Smart=0xff00;
else if(ProgramCode[1]) Smart=0xf000;
else Smart=0x0000;
PCode= ((int)ProgramCode[1]<<12)+((int)ProgramCode[2]<<8)+
((int)ProgramCode[3]<<4 )+(int)ProgramCode[4];
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<pchinese_Data->MAX_Satisfy*pchinese_Data->PageNum)
{
if((( *(HLCode+OffSetPositoin+2))& Smart) == PCode && ((ProgramCode[0]=='*') || ((*(HLCode+OffSetPositoin)))>>8 ==ProgramCode[0])
&& (((*(HLCode+OffSetPositoin)>>4)&0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0))
pchinese_Data->SatisfyNum++;
OffSetPositoin += 4;
}
pchinese_Data->SatisfyNum = 0;
memset(TempString,0,sizeof(TempString));
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<=pchinese_Data->MAX_Satisfy)
{
if((( *(HLCode+OffSetPositoin+2))& Smart) == PCode && ((ProgramCode[0]=='*') || ((*(HLCode+OffSetPositoin))>>8) ==ProgramCode[0])
&& (((*(HLCode+OffSetPositoin)>>4)& 0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0))
{ /* ch1[0] = (*(HLCode+OffSetPositoin+3));
ch1[1] = ' '; //(char)(*(HLCode+OffSetPositoin+3)>>8);
ch1[2] = 0;
*/
ch1[0]=0;
ch1[1]=(*(HLCode+OffSetPositoin+3));
ch1[2]=0;
if((ch1[1]!=pchinese_Data->PromptBuf[0]) && (ch1[1]!=pchinese_Data->PromptBuf[2]) &&
(ch1[1]!=pchinese_Data->PromptBuf[4]) && (ch1[1]!=pchinese_Data->PromptBuf[6]) &&
(ch1[1]!=pchinese_Data->PromptBuf[8]) && (ch1[1]!=pchinese_Data->PromptBuf[10]) &&
(ch1[1]!=pchinese_Data->PromptBuf[12]) && (ch1[1]!=pchinese_Data->PromptBuf[14])&&
(ch1[1]!=pchinese_Data->PromptBuf[16]) && (ch1[1]!=pchinese_Data->PromptBuf[18]))
{
pchinese_Data->SatisfyNum++;
if(pchinese_Data->SatisfyNum%10==0)
ch1[0]=0x30;
else ch1[0]=pchinese_Data->SatisfyNum+0x30;
// wsprintf(TempString,"%s",ch1);
// wordstrcat(PromptBuf,TempString);
wordstrcat(pchinese_Data->PromptBuf,ch1);
}
}
OffSetPositoin += 4;
}
}
static void SearchSomeHanZi_ByBiaoDian(chinese_Data* pchinese_Data)
{
unsigned int OffSetPositoin,OffSetEnd;
unsigned short TempString[10],ch1[6];
char msg[100];
OffSetPositoin =MaxHanZi-41*4;
OffSetEnd = MaxHanZi;
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<pchinese_Data->MAX_Satisfy*pchinese_Data->PageNum)
{
if((*(HLCode+OffSetPositoin+2)& 0xf000) == 0xe000)
pchinese_Data->SatisfyNum++;
OffSetPositoin += 4;
}
pchinese_Data->SatisfyNum = 0;
memset(TempString,0,sizeof(TempString));
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<=pchinese_Data->MAX_Satisfy)
{
if((*(HLCode+OffSetPositoin+2)& 0xf000) == 0xe000)
{
pchinese_Data->SatisfyNum++;
if(pchinese_Data->SatisfyNum%10==0)
ch1[0]=0x30;
else ch1[0]=pchinese_Data->SatisfyNum+0x30;
ch1[1]=(*(HLCode+OffSetPositoin+3));
if((ch1[1]>>8&0xff)==0)
{
ch1[2]=' ';
ch1[3]=0;
}
else ch1[2]=0;
wordstrcat(pchinese_Data->PromptBuf,ch1);
/*
if(SatisfyNum%7==0){
ch1[0]=' ';
ch1[1]=0;
// wsprintf(TempString,"%s",ch1);
// wordstrcat(PromptBuf,TempString);
sprintf(msg,"ch1:0x%x",ch1[0]);
TRACE_EVENT(msg);
wordstrcat(PromptBuf,ch1);
sprintf(msg,"PromptBuf[]:0x%x",PromptBuf[SatisfyNum]);
TRACE_EVENT(msg);
}
if(SatisfyNum>=0&&SatisfyNum<=5){
ch1[0] = *(HLCode+OffSetPositoin+3);
ch1[1] = 0;
SatisfyNum++;
}
else{
ch1[0] = *(HLCode+OffSetPositoin+3);
ch1[1] = ' '; // (char)(*(HLCode+OffSetPositoin+3)>>8);
ch1[2] = 0;
SatisfyNum++;
}
// wsprintf(TempString,"%s",ch1);
// wordstrcat(PromptBuf,TempString);
sprintf(msg,"ch1:0x%x",ch1[0]);
TRACE_EVENT(msg);
wordstrcat(PromptBuf,ch1);
sprintf(msg,"PromptBuf[SatisfyNum]:0x%x",PromptBuf[SatisfyNum]);
TRACE_EVENT(msg);
*/
}
OffSetPositoin += 4;
}
}
/*
* clrobert modify this function, 2003/09/17
*/
static void SearchSomeAssociateHanZi(chinese_Data* pchinese_Data) /*折半查找法查找联想字*/
{
unsigned short* ConditionHz = pchinese_Data->ConditionHz;
unsigned int mid, low, hig;
unsigned short ch1[3];
low = 0;
hig = MaxAssHanZi-1;
do
{
mid = (low + hig) / 2;
if((mid % 2) != 0)
mid--; // align to even index because odd index to the associated code
if(ASSCode[mid] == ConditionHz[0])
{
while(ASSCode[mid-2] == ASSCode[mid])
mid = mid - 2; // go to the first matched code
/*
while((mid <= hig) && (pchinese_Data->SatisfyNum < pchinese_Data->MAX_Satisfy * pchinese_Data->PageNum))
{
if(ASSCode[mid+2] == ASSCode[mid])
{
pchinese_Data->SatisfyNum++;
mid = mid + 2;
}
else
{
pchinese_Data->SatisfyNum++;
break;
}
}
*/
pchinese_Data->SatisfyNum = 0;
while((mid <= hig) && (pchinese_Data->SatisfyNum <= pchinese_Data->MAX_Satisfy))
{
pchinese_Data->SatisfyNum++;
ch1[0] = (pchinese_Data->SatisfyNum % 10) + 0x30; //index to chinese char(0-9) to be displayed in result editor.
ch1[1] = (*(ASSCode + mid + 1)); // one chinese char. to be displayed in input result editor
ch1[2] = 0; // space
wordstrcat(pchinese_Data->PromptBuf, ch1);
if(ASSCode[mid+2] == ASSCode[mid])
mid = mid + 2;
else
break;
}
}
else if(ASSCode[mid] < ConditionHz[0])
{
low = mid + 2;
}
else
{
hig = mid - 2;
}
}while((low <= hig) && (ASSCode[mid] != ConditionHz[0]));
/*
* following deal the case that there are not enough chinese char(10 chars) associated
* with the chinese char has been entered, using random chinese char. to fill the space
*/
if(pchinese_Data->PageNum != 0)
return;
hig = 0; // hig as a index to HLCode table
while(pchinese_Data->SatisfyNum < pchinese_Data->MAX_Satisfy)
{
pchinese_Data->SatisfyNum++;
ch1[0] = (pchinese_Data->SatisfyNum % 10) + 0x30; //index to chinese char(0-9) to be displayed in result editor.
ch1[1] = (*(HLCode + hig + 3)); // one chinese char. to be displayed in input result editor
ch1[2] = 0; // space
wordstrcat(pchinese_Data->PromptBuf, ch1);
hig += 4;
}
}
static void BiShunProgramCode(chinese_Data* pchinese_Data)
{
unsigned int Num;
char* ConditionStr =(char*)pchinese_Data->ConditionStr;
char* ProgramCode=(char*)pchinese_Data->ProgramCode;
ProgramCode[0] = ConditionStr[0];
for(Num=1; Num<strlen(ConditionStr); Num++)
switch(ConditionStr[Num])
{
case '-': ProgramCode[Num]=1; break;
case '|': ProgramCode[Num]=2; break;
case '/': ProgramCode[Num]=3; break;
case '\\': ProgramCode[Num]=4; break;
case '>': ProgramCode[Num]=5; break;
default : ProgramCode[Num]=0; break;
}
for(;Num<7;Num++) ProgramCode[Num]=0;
}
void SetTheConditionStr(chinese_Data * pChineseData,int keyCode)
{
char *str;
int Index;
char msg[100];
str = pChineseData->ConditionStr;
if(strlen(str)==0 && keyCode)
{
pChineseData->Index = 0;
pChineseData->CurCode= keyCode;
str[0]=InputMethodFirstChar[keyCode-2][pChineseData->Index];
}
else if(strlen(str)==1 && (pChineseData->InTheTime) && (pChineseData->CurCode==keyCode) && keyCode)
{
pChineseData->Index = (pChineseData->Index + 1) % strlen(InputMethodFirstChar[pChineseData->CurCode-2]);
str[0]=InputMethodFirstChar[pChineseData->CurCode-2][pChineseData->Index];
}
else if((strlen(str) || keyCode) && (strlen(str)<6))
{
if((pChineseData->CurCode)!=keyCode || !(pChineseData->InTheTime)) pChineseData->Index=0; // Next KCD,then New the Index;
else str[strlen(str)-1]= 0; // in the same KCD loop,Del The Last Key;
pChineseData->CurCode= keyCode;
SetOtherMightChar(pChineseData,keyCode);
if(strlen(pChineseData->OtherMightChar))
{
str[strlen(str)]= pChineseData->OtherMightChar[pChineseData->Index];
pChineseData->Index = (pChineseData->Index + 1) % strlen(pChineseData->OtherMightChar);
}
else str[strlen(str)]= (char)(0x30 + keyCode);
}
}
int OtherCharIsOnlyOne(chinese_Data *pChineseData)
{
if((strlen(pChineseData->ConditionStr)==1 && strlen(InputMethodFirstChar[pChineseData->CurCode-2])<2 )
||( strlen(pChineseData->ConditionStr) >1 && strlen(pChineseData->OtherMightChar)<2 ))
return 1;
else return 0;
}
void SetThePromptBuf(chinese_Data *pChineseData)
{
int Loop,CurRule;
char* ConditionStr =pChineseData->ConditionStr;
unsigned short* ConditionHz=pChineseData->ConditionHz;
pChineseData->SatisfyNum = 0;
Loop=strlen(ConditionStr)-1;
memset(pChineseData->PromptBuf,0,sizeof(pChineseData->PromptBuf));
if(wordstrlen(ConditionHz))
{
SearchSomeAssociateHanZi(pChineseData);
return;
}
else if(ConditionStr[0]=='*') CurRule = FindBiShun(ConditionStr);
else
{
CurRule = 10;
for(;Loop;Loop--)
if(ConditionStr[Loop]>'z' || ConditionStr[Loop]<'a')
{
CurRule = FindBiShun(ConditionStr);
break;
}
}
if(CurRule == 10) // PinYin
{
PinYinProgramCode(pChineseData);
SearchSomeHanZi_ByPinYin(pChineseData);
}
else if(CurRule == 1) // BiShun
{
ChangCharToBs(pChineseData->ConditionStr);
BiShunProgramCode(pChineseData);
SearchSomeHanZi_ByBiShun(pChineseData);
}
else if(ConditionStr[5] == ':') // BiaoDian
SearchSomeHanZi_ByBiaoDian(pChineseData);
/* if(PromptBuf[0]==0) Input_one_key(KCD_RIGHT); */// 如果没有找到汉字,删除当前输入字符
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -