⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmihzapi.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 2 页
字号:


#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 + -