📄 hzutil.c
字号:
/*
* 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 + -