📄 mmihzapi.c
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "uniparad.h"
#include "uniassociate.h"
#include "mmihzapi.h"
#define MaxPinYin 402
#define MaxHanZi 7334*4
#define MaxAssHanZi 11833*2
#define TIM_TAKE_OVER 1000 // one second as shorttimer
#define TIM_TAKE_OVERLONG 1200 // six second as longtimer
static const char * InputMethodFirstChar[8] = {"abc","def","gh","jkl","mno","pqrs","t" ,"wxyz"};
static const char * InputMethodOtherChar[8] = {"a" ,"e" ,"ghi","" ,"no" ,"r" ,"uv",""};
static const char * Table[MaxPinYin] = {
"a","ai","an","ang","ao","ba","bai","ban","bang","bao",
"bei","ben","beng","bi","bian","biao","bie","bin","bing","bo",
"bu","ca","cai","can","cang","cao","ce","cen","ceng","cha",
"chai","chan","chang","chao","che","chen","cheng","chi","chong","chou",
"chu","chuai","chuan","chuang","chui","chun","chuo","ci","cong","cou",
"cu","cuan","cui","cun","cuo","da","dai","dan","dang","dao",
"de","deng","di","dia","dian","diao","die","ding","diu","dong",
"dou","du","duan","dui","dun","duo","e","ei","en","er",
"fa","fan","fang","fei","fen","feng","fo","fou","fu","ga",
"gai","gan","gang","gao","ge","gei","gen","geng","gong","gou",
"gu","gua","guai","guan","guang","gui","gun","guo","ha","hai",
"han","hang","hao","he","hei","hen","heng","hong","hou","hu",
"hua","huai","huan","huang","hui","hun","huo","ji","jia","jian",
"jiang","jiao","jie","jin","jing","jiong","jiu","ju","juan","jue",
"jun","ka","kai","kan","kang","kao","ke","ken","keng","kong",
"kou","ku","kua","kuai","kuan","kuang","kui","kun","kuo","la",
"lai","lan","lang","lao","le","lei","leng","li","lia","lian",
"liang","liao","lie","lin","ling","liu","long","lou","lu","luan",
"lue","lun","luo","lv","ma","mai","man","mang","mao","me",
"mei","men","meng","mi","mian","miao","mie","min","ming","miu",
"mo","mou","mu","na","nai","nan","nang","nao","ne","nei",
"nen","neng","ni","nian","niang","niao","nie","nin","ning","niu",
"nong","nou","nu","nuan","nue","nuo","nv","o","ou","pa",
"pai","pan","pang","pao","pei","pen","peng","pi","pian","piao",
"pie","pin","ping","po","pou","pu","qi","qia","qian","qiang",
"qiao","qie","qin","qing","qiong","qiu","qu","quan","que","qun",
"ran","rang","rao","re","ren","reng","ri","rong","rou","ru",
"ruan","rui","run","ruo","sa","sai","san","sang","sao","se",
"sen","seng","sha","shai","shan","shang","shao","she","shen","sheng",
"shi","shou","shu","shua","shuai","shuan","shuang","shui","shun","shuo",
"si","song","sou","su","suan","sui","sun","suo","ta","tai",
"tan","tang","tao","te","teng","ti","tian","tiao","tie","ting",
"tong","tou","tu","tuan","tui","tun","tuo","wa","wai","wan",
"wang","wei","wen","weng","wo","wu","xi","xia","xian","xiang",
"xiao","xie","xin","xing","xiong","xiu","xu","xuan","xue","xun",
"ya","yan","yang","yao","ye","yi","yin","ying","yo","yong",
"you","yu","yuan","yue","yun","za","zai","zan","zang","zao",
"ze","zei","zen","zeng","zha","zhai","zhan","zhang","zhao","zhe",
"zhen","zheng","zhi","zhi","zhong","zhou","zhu","zhua","zhuai","zhuan",
"zhuang","zhui","zhun","zhuo","zi","zong","zou","zu","zuan","zui","zun","zuo"};
unsigned int wordstrlen(const unsigned short *ws)
{
const unsigned short *wr = ws - 1;
while(*++wr);
return wr - ws;
}
unsigned short *wordstrcat(unsigned short *ws1, const unsigned short *ws2)
{
unsigned short *result = ws1;
while(*ws1++); /* FIND END OF STRING */
--ws1; /* BACK UP OVER NULL */
while(*ws1++ = *ws2++); /* APPEND SECOND STRING */
return result;
}
static int PinYinCode(char * ConditionStr,char CheckChar)
{
int Loop;
// char g_str[10];
for(Loop=0;Loop<MaxPinYin;Loop++)
{
if(strncmp(Table[Loop],ConditionStr,strlen(ConditionStr))==0 &&
Table[Loop][strlen(ConditionStr)]==CheckChar)
return 1;
}
return 0;
}
static void SetOtherMightChar(chinese_Data* pchinese_Data,int KeyCode)
{
unsigned int Position;
Position=0;
memset(pchinese_Data->OtherMightChar,0,sizeof(pchinese_Data->OtherMightChar));
while(KeyCode>1 && strlen(InputMethodOtherChar[KeyCode-2])!=Position)
{
if(PinYinCode(pchinese_Data->ConditionStr,InputMethodOtherChar[KeyCode-2][Position]))
pchinese_Data->OtherMightChar[strlen(pchinese_Data->OtherMightChar)]=InputMethodOtherChar[KeyCode-2][Position];
Position++;
}
}
static int FindBiShun(char *ConditionStr)
{
unsigned int Num;
char c;
for(Num=1; Num<strlen(ConditionStr); Num++)
{
c = ConditionStr[Num];
if(c!='5' && c!='8' && c!='9' && c!='7' && c!='0'
&& c!='-' && c!='|' && c!='/' && c!='\\' && c!='>'
&& c!='r' && c!='u' && c!='v')
return 0;
}
return 1;
}
static void ChangCharToBs(char * ConditionStr)
{
unsigned int Num;
char msg[100];
for(Num=1; Num<strlen(ConditionStr); Num++)
switch(ConditionStr[Num])
{
case '5': ConditionStr[Num]='-';
break;
case 'u':
case 'v':
case '8': ConditionStr[Num]='|';
break;
case 'r':
case '7': ConditionStr[Num]='/';
break;
case '9': ConditionStr[Num]='\\';
break;
case '0': ConditionStr[Num]='>';
break;
case '-':
case '|':
case '/':
case '\\':
case '>': break;
default : ConditionStr[Num]='?';
break;
}
}
static void PinYinProgramCode(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 'a': ProgramCode[Num]=2; break;
case 'e': ProgramCode[Num]=3; break;
case 'i': ProgramCode[Num]=4; break;
case 'n': ProgramCode[Num]=5; break;
case 'o': ProgramCode[Num]=6; break;
case 'r': ProgramCode[Num]=7; break;
case 'u': ProgramCode[Num]=8; break;
case 'g': ProgramCode[Num]=9; break;
case 'h': ProgramCode[Num]=12; break;
case 'v': ProgramCode[Num]=11; break;
default : ProgramCode[Num]=0; break;
}
for(;Num<8;Num++) ProgramCode[Num]=0;
}
static void SearchSomeHanZi_ByPinYin(chinese_Data* pchinese_Data)
{
unsigned int Smart, OffSetPositoin,OffSetEnd,IsNotPinyinCode;
unsigned int PCode;
unsigned short TempString[10],ch1[3];
char msg[100];
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];
IsNotPinyinCode = 1 - PinYinCode(pchinese_Data->ConditionStr,0);
if(ProgramCode[5]) IsNotPinyinCode =1;
if(pchinese_Data->PageNum)
//if(LineNum>1)
{
memset(TempString,0,sizeof(TempString));
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<pchinese_Data->MAX_Satisfy) // page 0
{
if((( *(HLCode+OffSetPositoin+1))& Smart) == PCode && ((*(HLCode+OffSetPositoin))>>8) ==ProgramCode[0] &&
((*(HLCode+OffSetPositoin)&0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0))
pchinese_Data->SatisfyNum++;
OffSetPositoin += 4;
}
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<pchinese_Data->MAX_Satisfy*pchinese_Data->PageNum)// page 1 to n-1 (n=1....Max)
{
if((( *(HLCode+OffSetPositoin+1))& Smart) == PCode && ((*(HLCode+OffSetPositoin))>>8) ==ProgramCode[0] &&
((*(HLCode+OffSetPositoin)&0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0) &&
(IsNotPinyinCode || ((*(HLCode+OffSetPositoin)&0x000f)==0 && *(HLCode+OffSetPositoin+1) == PCode)))
pchinese_Data->SatisfyNum++;
OffSetPositoin += 4;
}
pchinese_Data->SatisfyNum = 0;
/*
if(LineNum==2){
while( OffSetPositoin<OffSetEnd && SatisfyNum<MAX_Satisfy/2) // page 0
{ if( (( *(HLCode+OffSetPositoin+1))& Smart) == PCode && ((*(HLCode+OffSetPositoin))>>8) ==ProgramCode[0] &&
((*(HLCode+OffSetPositoin)&0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0) )
{// ch1[0] = (*(HLCode+OffSetPositoin+3));
//ch1[1] = ' ';
//ch1[2] = 0;
SatisfyNum++;
ch1[0]=SatisfyNum+0x30;
ch1[1]=(*(HLCode+OffSetPositoin+3));
ch1[2]=0;
// wsprintf(TempString,"%s",ch1);
// wordstrcat(PromptBuf,TempString);
wordstrcat(PromptBuf,ch1);
}
OffSetPositoin += 4;
}
}
*/
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<=pchinese_Data->MAX_Satisfy)
{
if((( *(HLCode+OffSetPositoin+1))& Smart) == PCode && ((*(HLCode+OffSetPositoin))>>8) ==ProgramCode[0] &&
((*(HLCode+OffSetPositoin)&0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0) &&
(IsNotPinyinCode || ((*(HLCode+OffSetPositoin)&0x000f)==0 && *(HLCode+OffSetPositoin+1) == PCode)))
{ // ch1[0] = (char)(*(HLCode+OffSetPositoin+3)>>8);
// ch1[0] = (*(HLCode+OffSetPositoin+3));
// ch1[1] = ' ';
// ch1[2] = 0;
pchinese_Data->SatisfyNum++;
if(pchinese_Data->SatisfyNum%10==0)
ch1[0]=0x30;
else ch1[0]=pchinese_Data->SatisfyNum+0x30;
ch1[1]=(*(HLCode+OffSetPositoin+3));
ch1[2]=0;
//wsprintf(TempString,"%d%c%c ",SatisfyNum,ch1,ch2);
// wsprintf(TempString,"%s",ch1);
// wordstrcat(PromptBuf,TempString);
wordstrcat(pchinese_Data->PromptBuf,ch1);
}
OffSetPositoin += 4;
}
}
else
{
memset(TempString,0,sizeof(TempString));
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum<pchinese_Data->MAX_Satisfy) // 0 to Max_Satisfy-1 HanZi
{
if((( *(HLCode+OffSetPositoin+1))& Smart) == PCode && ((*(HLCode+OffSetPositoin))>>8) ==ProgramCode[0] &&
((*(HLCode+OffSetPositoin)&0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0))
{ /* ch1[0] = (*(HLCode+OffSetPositoin+3));
ch1[1] = ' ';
ch1[2] = 0;
*/
//ch1 = (char)(*(HLCode+OffSetPositoin+3)>>8);
pchinese_Data->SatisfyNum++;
if(pchinese_Data->SatisfyNum%10==0)
ch1[0]=0x30;
else ch1[0]=pchinese_Data->SatisfyNum+0x30;
ch1[1]=(*(HLCode+OffSetPositoin+3));
ch1[2]=0;
// wsprintf(TempString,"%d%c%c ",SatisfyNum,ch1,ch2);
// wsprintf(TempString,"%s",ch1);
// wordstrcat(PromptBuf,TempString);
wordstrcat(pchinese_Data->PromptBuf,ch1);
}
OffSetPositoin += 4;
}
while(OffSetPositoin<OffSetEnd && pchinese_Data->SatisfyNum==pchinese_Data->MAX_Satisfy) // Is (MAX_Satisfy HanZi) Exist?
{
if((( *(HLCode+OffSetPositoin+1))& Smart) == PCode && ((*(HLCode+OffSetPositoin))>>8) ==ProgramCode[0] &&
((*(HLCode+OffSetPositoin)&0x000f)==(int)ProgramCode[5] || ProgramCode[5]==0) &&
(IsNotPinyinCode || ((*(HLCode+OffSetPositoin)&0x000f)==0 && *(HLCode+OffSetPositoin+1) == PCode)))
{ /* ch1[0] = (*(HLCode+OffSetPositoin+3));
ch1[1] = ' ';
ch1[2] = 0;
*/
//ch1 = (char)(*(HLCode+OffSetPositoin+3)>>8);
pchinese_Data->SatisfyNum++;
if(pchinese_Data->SatisfyNum%10==0)
ch1[0]=0x30;
else ch1[0]=pchinese_Data->SatisfyNum+0x30;
ch1[1]=(*(HLCode+OffSetPositoin+3));
ch1[2]=0;
//wsprintf(TempString,"%d%c%c ",SatisfyNum,ch1,ch2);
// wsprintf(TempString,"%s",ch1);
// wordstrcat(PromptBuf,TempString);
wordstrcat(pchinese_Data->PromptBuf,ch1);
}
OffSetPositoin += 4;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -