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

📄 hzutil.c

📁 一种中文输入法
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * Copyright (C) 1999.4  Li ZhenChun
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License; or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that is will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, M A 02139, USA.
 *
 * Author: Li ZhenChun  email: zhchli@163.net or zhchli@126.com
 * 
 */

#include "freepy.h"

WORD ParsePY(LPTSTR lpPY, LPTSTR lpTranBuf, WORD wMaxPYLen)
{
	LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
	int i,j;
	WORD wHead,wPYLen,wOffset=0,wCount=1,wTotal=0;
	int flag=0,eqflag=0,slflag=0,yhflag=0,yunflag=0,rflag=0;
	TCHAR szStr[10],szTmpStr[10],szSlStr[3][3];
	TCHAR szYun[7];
	int nTemp;
	LPTSTR pDest;

	wPYLen = _tcslen(lpPY);
	if( wPYLen < 1 || wPYLen > MAX_PHRASE_LEN*wMaxPYLen ) return 0;
	
	if(wPYLen == 1){
		if(*lpPY >= _T('a') && *lpPY <= _T('z')){
			_tcscpy(lpTranBuf,lpPY);
			return 1;
		}
		else return 0;
	}  
	szYun[0] = _T('a');
	szYun[1] = _T('o');
	szYun[2] = _T('e');
	szYun[3] = _T('i');
	szYun[4] = _T('u');
	szYun[5] = _T('v');
	szYun[6] = _T('\0');

	szSlStr[0][0] = _T('c');
	szSlStr[1][0] = _T('s');
	szSlStr[2][0] = _T('z');
	for(i=0;i<3;i++){
		szSlStr[i][1] = _T('h');
		szSlStr[i][2] = _T('\0');
	}
	
	while(1){
		wHead = *(lpPY+wOffset) - _T('a');
		if((wHead < 0 || wHead > 25) && *(lpPY+wOffset) != _T('\'')){
			return 0;
		}
		if(*(lpPY+wOffset) == _T('\'')){
			if(wTotal > 0 && *(lpTranBuf + (wTotal-1)*wMaxPYLen) >= _T('a')
				&& *(lpTranBuf + (wTotal-1)*wMaxPYLen) <= _T('z') ){
				_tcscpy(lpTranBuf+((wTotal)++)*wMaxPYLen,_T("\'"));
			}
			wOffset++;
			if(wOffset == wPYLen){
				return wTotal;
			}
			continue;
		}
		wCount=1;
		while((wOffset+wCount) <= wPYLen){
			_tcsncpy(szStr,lpPY+wOffset,wCount);
			szStr[wCount] = _T('\0');
			if(wCount == 1) flag=1;
			else{
				flag=0;
				for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
					if(_tcsstr( (lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szStr)!=NULL){
						flag=1;
						break;
					}
				}
			}
			
			if( (wOffset+wCount) == wPYLen ){
				if(flag) {
					_tcscpy(lpTranBuf+((wTotal)++)*wMaxPYLen,szStr);
					return wTotal;
				}
				else {
					if(wCount==2){
						_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
						*(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('\0');
						_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr+wCount-1,1);
						*(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('\0');
						return wTotal;
					}
					nTemp = szStr[wCount-1];
					_tcsncpy(szTmpStr,szStr,wCount-1);
					szTmpStr[wCount-1]='\0';
					eqflag=0;
					for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
						if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
							eqflag=1;
							break;
						}
					}
					if(eqflag){
						yunflag = 0;
						if( _tcsrchr(szYun,szStr[wCount-2]) == NULL && _tcsrchr(szYun,nTemp) != NULL) {
							szTmpStr[_tcslen(szTmpStr)-1] = _T('\0');
							for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
								if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
									goto my_next1;
								}
							}
						}
						goto my_next2;
my_next1:
						_tcscpy(szTmpStr,szStr + _tcslen(szStr) -2);
						for(i=0;(lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->wKey;i++){
							if( !_tcscmp((lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
								yunflag = 1;
								break;
							}
						}

my_next2:
						if(yunflag){
							_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-2);
							*(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-2)=_T('\0');
							_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr+wCount-2,2);
							*(lpTranBuf+((wTotal)++)*wMaxPYLen+2)=_T('\0');
						}
						else {
							_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
							*(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('\0');
							_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr+wCount-1,1);
							*(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('\0');
						}
						return wTotal;
					}	   
					else{
						for(i=wCount-2 ;i;i--){
							_tcsncpy(szTmpStr,szStr,i);
							szTmpStr[i]=_T('\0');
							rflag = 0;
							for(j=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+j)->wKey;j++){
								if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+j)->szPY,szTmpStr) ){
									rflag = 1;
									break;
								}
							}
							if(rflag) break;
						}
						if(rflag){
							wOffset += i;
							_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,i);
							*(lpTranBuf+((wTotal)++)*wMaxPYLen+i)=_T('\0');
							break;
						}
						_tcsncpy(szTmpStr,szStr,2);
						szTmpStr[2]=_T('\0');
						slflag=0;
						
						for(i=0;i<3;i++){
							if( !_tcscmp(szTmpStr,szSlStr[i]) ){
								slflag=1;
								break;
							}
						}
						if(slflag){
							wOffset += 2;
							_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,2);
							*(lpTranBuf+((wTotal)++)*wMaxPYLen+2)=_T('\0');
							break;
						}
						else{
							wOffset++;
							_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,1);
							*(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('\0');
							break;
						}
					}
				}
			}
			
			if(flag) wCount++;
			else {
				if(wCount==2){
					wOffset++;
					_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
					*(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('\0');
					break;
				}
				nTemp = szStr[wCount-1];
				_tcsncpy(szTmpStr,szStr,wCount-1);
				szTmpStr[wCount-1]='\0';
				eqflag=0;
				for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
					if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
						eqflag=1;
						break;
					}
				}
				if(eqflag){
					yunflag = 0;
					if( _tcsrchr(szYun,szStr[wCount-2]) == NULL && _tcsrchr(szYun,nTemp) != NULL) {
						szTmpStr[_tcslen(szTmpStr)-1] = _T('\0');
						for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
							if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
								goto my_next3;
							}
						}
					}
					goto my_next4;
my_next3:
					_tcscpy(szTmpStr,szStr + _tcslen(szStr) -2);
					for(i=0;(lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->wKey;i++){
						if( (pDest = _tcsstr((lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->szPY,szTmpStr)) != NULL ){
							if(pDest == (lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->szPY) {
								yunflag = 1;
								break;
							}
						}
					}
my_next4:

					if(yunflag) {
						wOffset += wCount-2;
						_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-2);
						*(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-2)=_T('\0');
					}
					else {
						wOffset += wCount-1;
						_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
						*(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('\0');
					}
				}
				else{
					for(i=wCount-2 ;i;i--){
						_tcsncpy(szTmpStr,szStr,i);
						szTmpStr[i]=_T('\0');
						rflag = 0;
						for(j=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+j)->wKey;j++){
							if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+j)->szPY,szTmpStr) ){
								rflag = 1;
								break;
							}
						}
						if(rflag) break;
					}
					if(rflag){
						wOffset += i;
						_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,i);
						*(lpTranBuf+((wTotal)++)*wMaxPYLen+i)=_T('\0');
						break;
					}

					_tcsncpy(szTmpStr,szStr,2);
					szTmpStr[2]=_T('\0');
					slflag=0;
					
					for(i=0;i<3;i++){
						if( !_tcscmp(szTmpStr,szSlStr[i]) ){
							slflag=1;
							break;
						}
					}
					if(slflag){
						wOffset += 2;
						_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,2);
						*(lpTranBuf+((wTotal)++)*wMaxPYLen+2)=_T('\0');
					}
					else{
						wOffset++;
						_tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,1);
						*(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('\0');
					}
				}
				break;
			}
		}
	}
}
	
void SortPhrase(LPPHRASE lpPh, WORD wLen)
{
	int i,j;
	PHRASE TempPh;
	
	for(i=0;i<wLen;i++){
		for(j=i;j<wLen;j++){
			if( (lpPh+i)->lpHZPH->dwAttrib < (lpPh+j)->lpHZPH->dwAttrib){
				TempPh = *(lpPh+i);
				*(lpPh+i)=*(lpPh+j);
				*(lpPh+j)=TempPh;
			}
		}
	}
}

WORD CreatePYKey(LPTSTR lpPYArray,WORD wMaxPYLen,WORD wPYArrayLen,WORD awPYArrayKey[][2*MAX_EACH_PY_NUM+1])
{
	LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
	LPPINYIN lpPYTemp;
	TCHAR szSlStr[3][3],szPY[4][MAX_PY_LEN],szBStr[3][4],szTemp[4];
	WORD awSlKey[3][MAX_EACH_PY_NUM],awNmKey[3][MAX_EACH_PY_NUM];
	WORD wHead,wCount,wKeyLen,wTemp,wTemp1,wTempKey;
	WORD wSlPos,wFlag;
	TCHAR cTempChar;
	LPTSTR lpDest;
	int i,j,k;
	
	szBStr[0][0] = _T('a');
	szBStr[1][0] = _T('e');
	szBStr[2][0] = _T('i');
	for(i=0;i<3;i++){
		szBStr[i][1] = _T('n');
		szBStr[i][2] = _T('g');
		szBStr[i][3] = _T('\0');
	}

	szSlStr[0][0] = _T('c');
	szSlStr[1][0] = _T('s');
	szSlStr[2][0] = _T('z');
	for(i=0;i<3;i++){
		szSlStr[i][1] = _T('h');
		szSlStr[i][2] = _T('\0');
	}
	
	for(i=0;i<3;i++){
		wTemp = 0;
		wTemp1 = 0;
		for(j=0;(lpPYTemp=(lpPYTab+ (szSlStr[i][0] - _T('a'))*MAX_EACH_PY_NUM+j))->wKey;j++){
			if( _tcsstr(lpPYTemp->szPY,szSlStr[i] ) != NULL )
				awSlKey[i][wTemp++] = lpPYTemp->wKey;
			else
				awNmKey[i][wTemp1++] = lpPYTemp->wKey;
		}
		awSlKey[i][wTemp] = 0;
		awNmKey[i][wTemp1] = 0;
	}

	wCount = 0;
	for(i=0;i<wPYArrayLen;i++){
		if((cTempChar = *(lpPYArray + i*wMaxPYLen))== _T('i') || 
				cTempChar == _T('u') || cTempChar == _T('v') ) 
			continue;

		_tcscpy(szPY[0],lpPYArray + i*wMaxPYLen);
		if(szPY[0][0] < _T('a') || szPY[0][0] > _T('z') ) continue;

		szPY[1][0] = _T('\0');
		szPY[2][0] = _T('\0');
		szPY[3][0] = _T('\0');

		if( wConversionSet & CONVERSION_SET_FUZZYC ) {
			if( (cTempChar = szPY[0][0]) == _T('c') ||
				cTempChar == _T('s') || cTempChar == _T('z') ) {
				if( szPY[0][1] == _T('h') ) {
					szPY[1][0] = cTempChar;
					_tcscpy(szPY[1]+1,szPY[0] + 2);
				}
				else{
					szPY[1][0] = cTempChar;
					szPY[1][1] = _T('h');
					_tcscpy(szPY[1]+2,szPY[0] + 1);
				}
			}
		}
		if( wConversionSet & CONVERSION_SET_FUZZYN ) {
			if( szPY[0][0] == _T('n') ) {
				szPY[1][0] = _T('l');
				_tcscpy(szPY[1]+1,szPY[0] + 1);
			}
			else if(szPY[0][0] == _T('l') ) {
				szPY[1][0] = _T('n');
				_tcscpy(szPY[1]+1,szPY[0] + 1);
			}
		}

		if( wConversionSet & CONVERSION_SET_FUZZYH ) {
			if( szPY[0][0] == _T('h') ) {
				szPY[1][0] = _T('f');
				_tcscpy(szPY[1]+1,szPY[0] + 1);
			}
			else if(szPY[0][0] == _T('f') ) {
				szPY[1][0] = _T('h');
				_tcscpy(szPY[1]+1,szPY[0] + 1);
			}
		}

		if( wConversionSet & CONVERSION_SET_FUZZYB ) {
			for(i=0;i<2;i++){
				wFlag = 0;
				for(j=0;j<3;j++){
					if( (lpDest = _tcsstr(szPY[i],szBStr[j])) != NULL){
						if( (szPY[i] + _tcslen(szPY[i]) - _tcslen(szBStr[j])) == lpDest) {
							wFlag = 1;
							break;
						}
					}
				}
				if(wFlag){
					_tcscpy(szPY[i+2],szPY[i]);
					szPY[i+2][_tcslen(szPY[i+2])-1] = _T('\0');
				}
			}
			for(i=0;i<2;i++){
				wFlag = 0;
				for(j=0;j<3;j++){
					_tcscpy(szTemp,szBStr[j]);
					szTemp[_tcslen(szTemp)-1] = _T('\0');
					if( (lpDest = _tcsstr(szPY[i],szTemp)) != NULL){
						if( (szPY[i] + _tcslen(szPY[i]) - _tcslen(szTemp)) == lpDest) {
							wFlag = 1;
							break;
						}
					}
				}
				if(wFlag){
					_tcscpy(szPY[i+2],szPY[i]);
					szPY[i+2][_tcslen(szPY[i+2])+1] = _T('\0');
					szPY[i+2][_tcslen(szPY[i+2])] = _T('g');
				}
			}
		}

		wKeyLen = 0;
		for(k = 0;k < 4;k++) {
			wHead = (WORD)(szPY[k][0] - _T('a'));
			if( _tcslen(szPY[k]) == 0 ) continue;
			if( _tcslen(szPY[k]) == 1){
				if( (cTempChar = szPY[k][0]) == _T('c') ||
					cTempChar == _T('s') || cTempChar == _T('z') ) {
					if( cTempChar == _T('c') ) wTemp = 0;
					else if( cTempChar == _T('s') ) wTemp = 1;
					else if( cTempChar == _T('z') ) wTemp = 2;
					else wTemp = 0;
					for(j=0;awNmKey[wTemp][j];j++){
						awPYArrayKey[wCount][wKeyLen++] = awNmKey[wTemp][j];
					}
				}
				else {
					for(j=0;wTempKey=((lpPYTab + wHead*MAX_EACH_PY_NUM +j)->wKey);j++)
						awPYArrayKey[wCount][wKeyLen++]=wTempKey;
				}

⌨️ 快捷键说明

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