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

📄 mmihzapi.c

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

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