mmihz.c

来自「是一个手机功能的模拟程序」· C语言 代码 · 共 1,669 行 · 第 1/5 页

C
1,669
字号
    {   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];
    TRACE_EVENT("change to bishun");
    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;
        }
        sprintf(msg,"zxp bishun:%s",ConditionStr);
        TRACE_EVENT(msg);
}

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;
        }

    }
}

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;
    }
}

static void    SearchSomeAssociateHanZi(chinese_Data* pchinese_Data) /*折半查找法查找联想字*/
{   

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?