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

📄 tnineinit.cpp

📁 输入法源代码自由拼音输入法源代码(T9)
💻 CPP
字号:

#include <windows.h>
#include <imm.h>
#include <malloc.h>
#include "imedefs.h"


extern CO_DIGIT_PINYIN_ITEM g_CoDigitPinyin[TOTAL_PINYIN_DATA_ITEMS];
extern PINYIN_DATA_ITEM* g_PinyinItem;
extern char* g_RawPinyinData;


BOOL TranslatePinyinToDigit(char* pinyin, char* digit)
{
      int i,j=0;
      while(pinyin[0]==' ') 	pinyin++;
      if( pinyin[1] == (char)0xC7 && 
	   pinyin[2] == (char)0xF8) {
           if(pinyin[0] <'F' ) {
		     digit[0] = '0';
           } else {
		     digit[0] = '1';
	  }
	  digit[1] = 0;
      return (TRUE);
      }
	  for(i=0;i<6;i++) {
		switch(pinyin[i])
		{
		case 'A':
		case 'B':
		case 'C':	
		case 'a':
		case 'b':
		case 'c':	digit[j++]='2'; break;
		case 'D':
		case 'E':
		case 'F':
		case 'd':
		case 'e':
		case 'f':	digit[j++]='3'; break;

		case 'G':
		case 'H':
		case 'I':
		case 'g':
		case 'h':
		case 'i':	digit[j++]='4'; break;

		case 'J':
		case 'K':
		case 'L':
		case 'j':
		case 'k':
		case 'l':	digit[j++]='5'; break;

		case 'M':
		case 'N':
		case 'O':
		case 'm':
		case 'n':
		case 'o':	digit[j++]='6'; break;

		case 'P':
		case 'Q':
		case 'R':
		case 'S':	
		case 'p':
		case 'q':
		case 'r':
		case 's':	digit[j++]='7'; break;

		case 'T':
		case 'U':
		case 'V':	
		case 't':
		case 'u':
		case 'v':	digit[j++]='8'; break;

		case 'W':
		case 'X':
		case 'Y':
		case 'Z':
		case 'w':
		case 'x':
		case 'y':
		case 'z':	digit[j++]='9'; break;
		case 0:		digit[j]=0;		return j;
		default:
			digit[i]=0;
			return 0;
		}
	}

	return 0;
}

int PASCAL PinyinToDigit()
{
	int i,j;
	CO_DIGIT_PINYIN_ITEM* coTmp;
	PINYIN_DATA_ITEM* pyItem;
	CO_DIGIT_PINYIN_ITEM* coItem;
	unsigned short pos;
	char* digit;
	coTmp = (CO_DIGIT_PINYIN_ITEM*)malloc(sizeof(CO_DIGIT_PINYIN_ITEM)*TOTAL_PINYIN_DATA_ITEMS);
	if(0==coTmp)  return 0;

	pyItem=g_PinyinItem;
	coItem=coTmp;
	for(i=0;i<TOTAL_PINYIN_DATA_ITEMS;i++) {
		TranslatePinyinToDigit(pyItem->szPinyin, coItem->szDigit);
		coItem->pinyinItem = pyItem;
		coItem++;
		pyItem++;
	}
	
	//Sort and copy coTmp into g_CoDigitPinyin
	memset(g_CoDigitPinyin, 0, TOTAL_PINYIN_DATA_ITEMS*sizeof(CO_DIGIT_PINYIN_ITEM));
	i = 0;
	while(i<TOTAL_PINYIN_DATA_ITEMS) {
	  j =  pos = 0;
	  digit = coTmp[0].szDigit;
	  while(j<TOTAL_PINYIN_DATA_ITEMS) {
		 if(coTmp[j].szDigit[0] == 0x29 ) {
			j++;
			continue;
		 }
         if(strcmp(coTmp[j].szDigit, digit) < 0 ) {
			j++;
			continue;
		 }
		 digit = coTmp[j].szDigit;
		 pos = (unsigned short)j;
		 j++;   
	}
	memcpy(g_CoDigitPinyin+i, coTmp+pos, sizeof(CO_DIGIT_PINYIN_ITEM));
	coTmp[pos].szDigit[0] = 0x29;
	i++;
    }
    free(coTmp);
    return 1;
}



int PASCAL EnumPinyinByDigit(char* digitString, char pinyin[][8])
{
	int count=0;
	int i,len;
		
	len = strlen(digitString);
	
	if(0==len)  return 0;

	for(i=TOTAL_PINYIN_DATA_ITEMS-1; i>=0; i--) {
		if(!memcmp(g_CoDigitPinyin[i].szDigit, digitString, len)) {
			strcpy(pinyin[count], g_CoDigitPinyin[i].pinyinItem->szPinyin);
			count++;
			if(count>=(PY_EDITER_PY_ITEMS-1)) break;
		}
	}
	if(count>0)
	pinyin[count][0] = 0;
	return count;
}


PINYIN_DATA_ITEM* pyGetPinyinItem(char* pinyin)
{
	int res;
	int pos1,pos2,mid;
	
	pos1 = 0;
	pos2 = TOTAL_PINYIN_DATA_ITEMS;
	
	while(pos1<pos2) {
		mid = (pos1+pos2)>>1;
		res = strcmp(g_PinyinItem[mid].szPinyin, pinyin);
		if(!res)
			return &(g_PinyinItem[mid]);
		if(res>0) {
			if(!strcmp(g_PinyinItem[pos1].szPinyin, pinyin))
				return &(g_PinyinItem[pos1]);
			pos2 = mid-1;
		} else {
			if(!strcmp(g_PinyinItem[pos2].szPinyin, pinyin))
				return &(g_PinyinItem[pos2]);
			pos1 = mid+1;
		}
	}
	return 0;
}

int PASCAL GetHanZiByPinyin(char* pinyin,char hanzi[][4])
{
     int ret;
     char *ptr;
     PINYIN_DATA_ITEM* pItem;
	 
     if( NULL == pinyin )   return   0 ;
	 
     pItem = pyGetPinyinItem( pinyin);

     if(pItem == 0 )       return   0 ;

     ptr = g_RawPinyinData + pItem->nHanziOffset;

     ret = 0;	 

     while((ret<pItem->nHanziNumber) && (ret<PY_EDITER_HZ_ITEMS)) {
	    hanzi[ret][0]=ptr[0];
 	    hanzi[ret][1]=ptr[1];
	    hanzi[ret][2]=0;
	    ptr += 2;
	    ret++;
     }
     return (ret) ; 	 
}



⌨️ 快捷键说明

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