Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1514 lines
44 KiB

/*************************************************
* conv.c *
* *
* Copyright (C) 1995-1999 Microsoft Inc. *
* *
*************************************************/
#include "conv.h"
DWORD dwBaseWordNum;
HGLOBAL hCreateWord;
HGLOBAL hWordIndex;
HGLOBAL hEncode;
#ifdef UNICODE
TCHAR Title[] = {0x6D4F, 0x89C8, 0x0000};
TCHAR szVer[] = {0x8F93, 0x5165, 0x6CD5, 0x0020, 0x7248, 0x672C, 0x0000};
#else
BYTE Title[] = "浏览";
BYTE szVer[] = "输入法 版本";
#endif
/*****************************************************************************
FUNCTION: ConvConv(HANDLE hWnd,LPCSTR lpSrcFileName, LPCSTR lpszMBFileName)
PURPOSE: Processes MB conversion .
PARAMETERS:
hWnd - window handle of the parent window.
lpSrcFileName - pointer to source text file name.
lpszMBFileName - pointer to destinate .mb file name.
RETURN VALUE:
TRUE - conversion completed
FALSE - conversion not completed
HISTORY:
****************************************************************************/
BOOL ConvConv(HANDLE hWnd,LPCTSTR lpSrcFileName, LPCTSTR lpszMBFileName)
{
int nTemp;
DWORD dwDBCS;
DWORD dwRuleOffset, dwRuleLen;
DWORD dwDesOffset, dwDesLen;
DWORD i;
int nPages;
TCHAR szDBCS[512];
//dwRuleOffset: Rule segment's offset in source file
MAINID MainID;
LPMAININDEX lpMainIndex;
LPCREATEWORD lpCreateWords;
DESCRIPTION Descript;
LPWORDINDEX lpWordIndex;
LPRULE lpRule;
HANDLE hReConvIndex, hMainIndex;
LPRECONVINDEX lpReConvIndex;
LPENCODEAREA lpEncode;
DispInfo(hWnd,IDS_CONVERTINFO);
nTemp = (int)ConvGetDescript(hWnd,lpSrcFileName,&dwDesOffset,
&dwDesLen,&Descript,FALSE);
if(nTemp == -ERR_FILENOTOPEN || nTemp < -4 )
return FALSE;
hMainIndex = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(MAININDEX)*NUMTABLES);
if(!(lpMainIndex = GlobalLock(hMainIndex) ) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
return FALSE;
}
ConvInit(&Descript,&MainID,lpMainIndex);
nPages = 1;
dwBaseWordNum = 0;
nTemp = sizeof(WORDINDEX)*GMEM_PAGESIZE;
hWordIndex=GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, nTemp);
hCreateWord = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
(DWORD)Descript.wMaxCodes*NUM_OF_ENCODE*sizeof(TCHAR));
if(!hMainIndex||!hCreateWord || !hWordIndex || !hRule) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
goto err;
}
if(!(lpCreateWords = GlobalLock(hCreateWord) )
||!(lpWordIndex = (LPWORDINDEX) GlobalLock(hWordIndex))
||!(lpRule = GlobalLock(hRule)) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
goto err;
}
if(ConvGetRule(hWnd,lpSrcFileName,&dwRuleOffset,&dwRuleLen,
lpRule,&Descript)<=0)
goto err;
hSRCFile = Create_File(hWnd,lpSrcFileName,GENERIC_READ,OPEN_EXISTING);
if (hSRCFile == (HANDLE)-1)
return FALSE;
hMBFile = Create_File(hWnd,lpszMBFileName,GENERIC_READ|GENERIC_WRITE,
CREATE_ALWAYS);
if (hMBFile == (HANDLE)-1) {
CloseHandle(hSRCFile);
return FALSE;
}
if(!ConvWriteMainID(hMBFile,&MainID)) {
ProcessError(ERR_WRITEID,hWnd,ERR);
goto err;
}
if(!ConvWriteMainIndex(hMBFile,lpMainIndex)) {
ProcessError(ERR_WRITEMAININDEX,hWnd,ERR);
goto err;
}
if(!ConvWriteDescript(hMBFile, &Descript, lpMainIndex)) {
ProcessError(ERR_WRITEDESCRIPT,hWnd,ERR);
goto err;
}
if(lpMainIndex[TAG_RULE-1].dwLength != 0)
if(!ConvWriteRule( hMBFile,Descript.wNumRules,lpRule, lpMainIndex)) {
ProcessError(ERR_WRITERULE,hWnd,ERR);
goto err;
}
hReConvIndex = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
(DWORD)Descript.wMaxCodes*NUM_OF_ENCODE*sizeof(TCHAR));
if(!hReConvIndex) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
goto err;
}
if(!(lpReConvIndex = GlobalLock(hReConvIndex))
|| !(lpEncode = GlobalLock(hEncode)) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
goto err;
}
DispInfo(hWnd,IDS_READTEXTINFO);
if(!ReadSRCFile(hWnd,&nPages,hSRCFile,lpCreateWords,
lpWordIndex,&dwDBCS,&Descript,lpReConvIndex)) {
goto err;
}
DispInfo(hWnd,IDS_WRCRTINFO);
//****** fill code mapping *****
ConvWriteEncode(hMBFile,lpEncode,lpMainIndex);
if(Descript.wNumRules != 0) {
LoadString(NULL,IDS_ISCHECKCRTWORD,szDBCS, sizeof(szDBCS)/sizeof(TCHAR));
if(ErrMessage(hWnd, szDBCS))
{
if(!CheckCrtData(hWnd,lpCreateWords,lpEncode,Descript.wMaxCodes) ) {
ProcessError(ERR_GB2312NOTENTIRE,hWnd,ERR);
goto err;
}
}
} //******* Debug *******
if(lpMainIndex[TAG_CRTWORDCODE-1].dwLength != 0)
ConvWriteCrtData(hMBFile,lpCreateWords,lpMainIndex);
if(lpMainIndex[TAG_RECONVINDEX-1].dwLength != 0)
ConvWriteReConvIdx(hMBFile,lpReConvIndex,lpMainIndex);
GlobalUnlock(hEncode);
//****95.10.12 auto add code for phrases not exist code
SetCursor (LoadCursor (NULL, IDC_WAIT));
if( Descript.wNumRules != 0)
{
for(i=0; i<dwBaseWordNum; i++)
{
if(lpWordIndex[i].wDBCSLen > 1
&& (lstrlen(lpWordIndex[i].szCode) == 0)
) {
SetFilePointer(hSRCFile,lpWordIndex[i].dwOffset,0,FILE_BEGIN);
nTemp = 2*(DWORD)lpWordIndex[i].wDBCSLen;
ReadFile(hSRCFile,szDBCS,nTemp,&dwDBCS,NULL);
szDBCS[nTemp] = 0;
ConvBatCreate(hWnd,Descript,lpRule,
lpCreateWords,szDBCS,
lpWordIndex[i].szCode);
if(lpWordIndex[i].szCode[0] == TEXT(',') && lpWordIndex[i].szCode[1] == TEXT('z'))
continue;
if(lstrlen(lpWordIndex[i].szCode) == 0)
{
goto err;
}
}
}
}
SetCursor (LoadCursor (NULL, IDC_ARROW));
DispInfo(hWnd,IDS_SORT);
ConvSort(hWnd,lpWordIndex,dwBaseWordNum);
SetFilePointer(hMBFile,lpMainIndex[TAG_BASEDICINDEX-1].dwOffset,0,FILE_BEGIN);
//***** fill index area with null *****
nTemp = Descript.wNumCodes;
nTemp = sizeof(DWORD)*(nTemp+1)*nTemp;
WriteFile(hMBFile,NULL,nTemp,&nTemp,NULL);
//***** fill index area and length area *****
ConvCalc(hWnd,hMBFile,lpWordIndex,lpMainIndex,&Descript);
//***** fill dictionary area *****
WriteMBFile(hWnd,hSRCFile,hMBFile,lpWordIndex,lpMainIndex,&Descript);
MainID.dwNumWords = dwBaseWordNum;
//***** fill changed MainID *****
ConvWriteMainID(hMBFile,&MainID);
GlobalUnlock(hRule);
if(hCreateWord)
GlobalFree(hCreateWord);
GlobalUnlock(hReConvIndex);
GlobalFree(hReConvIndex);
GlobalUnlock(hWordIndex);
GlobalFree(hWordIndex);
CloseHandle(hMBFile);
CloseHandle(hSRCFile);
ProcessError(ERR_CONVEND, hWnd, INFO);
return TRUE;
err:
if(hSRCFile)
CloseHandle(hSRCFile);
if(hMBFile)
CloseHandle(hMBFile);
if(hMainIndex)
GlobalFree(hMainIndex);
if(hWordIndex)
GlobalFree(hWordIndex);
if(hCreateWord)
GlobalFree(hCreateWord);
if(hReConvIndex)
GlobalFree(hReConvIndex);
if(hRule)
GlobalUnlock(hRule);
return FALSE;
}
/*****************************************************************************
FUNCTION: ConvReadFile(HANDLE hWnd,LPCSTR lpSrcFileName, LPCSTR lpDestFile)
PURPOSE: Processes source text file sorting.
PARAMETERS:
hWnd - window handle of the parent window.
lpSrcFileName - pointer to source text file name.
lpDestFile - pointer to destinate sorted text file name.
RETURN VALUE:
TRUE - sorting completed
FALSE - sorting not completed
HISTORY:
****************************************************************************/
BOOL ConvReadFile(HANDLE hWnd,
LPCTSTR lpSrcFileName,
LPCTSTR lpDestFile)
{
DWORD i,j;
DWORD dwRuleOffset, dwRuleLen;
DWORD dwDesOffset, dwDesLen;
DWORD dwReadBytes;
DWORD dwFstOffset=0;
DWORD dwOffset=0;
TCHAR szStr[512],szDBCS[512];
TCHAR Buffer[MAXREADBUFFER];
BOOL bReadText = FALSE, bSameFile=FALSE;
int nRet;
int nPages;
BOOL IsGenCmb = FALSE;
HANDLE hRule0;
LPCREATEWORD lpCreateWords;
LPWORDINDEX lpWordIndex;
LPRULE lpRule;
DESCRIPTION Descript;
HANDLE hDlgItem;
nRet = (int)ConvGetDescript(hWnd,lpSrcFileName,&dwDesOffset,
&dwDesLen,&Descript,FALSE);
if(nRet == -ERR_FILENOTOPEN)
return FALSE;
if((-nRet)&7)
bReadText = TRUE;
if(Descript.wMaxCodes <= 0)
Descript.wMaxCodes = MAXCODELEN;
nPages = 1;
dwBaseWordNum = 0;
dwReadBytes = sizeof(WORDINDEX)*GMEM_PAGESIZE;
hCreateWord = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
MAXCODELEN*NUM_OF_ENCODE*sizeof(TCHAR));
hWordIndex=GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, dwReadBytes);
if(!hWordIndex ) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
goto err;
}
if(!hCreateWord ) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
goto err;
}
if(!(lpCreateWords = GlobalLock(hCreateWord) )
||!(lpWordIndex = (LPWORDINDEX) GlobalLock(hWordIndex))
) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
goto err;
}
hRule0= GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
sizeof(RULE)*MAXCODELEN);
if(!(lpRule = GlobalLock(hRule0)) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
goto err;
}
if(ConvGetRule(hWnd,lpSrcFileName,&dwRuleOffset,&dwRuleLen,
lpRule,&Descript) == -ERR_FILENOTOPEN)
goto err;
hSRCFile = Create_File(hWnd,lpSrcFileName,GENERIC_READ,OPEN_EXISTING);
if (hSRCFile == (HANDLE)-1)
goto err;
if(lstrcmpi(lpDestFile,lpSrcFileName)==0) {
bSameFile = TRUE;
LoadString(NULL,IDS_OVERWRITE,szStr, sizeof(szStr)/sizeof(TCHAR));
wsprintf(szDBCS,TEXT("\'%s\'\n%s"),lpSrcFileName,szStr);
if(!ErrMessage(hWnd, szDBCS))
{
CloseHandle(hSRCFile);
goto err;
}
#ifdef UNICODE
if(!_waccess(TEXT(TempFile),0))
#else
if(!_access(TEXT(TempFile),0))
#endif
DeleteFile(TEXT(TempFile));
hMBFile = Create_File(hWnd,TEXT(TempFile),GENERIC_WRITE|GENERIC_READ,CREATE_ALWAYS);
}
else
hMBFile = Create_File(hWnd,lpDestFile,GENERIC_WRITE|GENERIC_READ,CREATE_ALWAYS);
if(hMBFile==(HANDLE)-1) {
CloseHandle(hSRCFile);
goto err;
}
CloseHandle(hMBFile);
DispInfo(hWnd,IDS_READTEXTINFO);
SetFilePointer(hSRCFile,0,0,FILE_BEGIN);
szStr[0] = 0;
j = 0;
SetCursor (LoadCursor (NULL, IDC_WAIT));
SetDlgItemText (hWnd,TM_TOTALINFO,TEXT(""));
LoadString(NULL,IDS_SORTWORDS,szStr,sizeof(szStr)/sizeof(TCHAR));
SetDlgItemText (hWnd,TM_TOTAL,szStr);
SetDlgItemInt (hWnd,TM_TOTALNUM,dwBaseWordNum,FALSE);
hDlgItem=GetDlgItem(hWnd,TM_CONVNUM);
InvalidateRect (hWnd,NULL,FALSE);
while(ReadFile(hSRCFile,Buffer,MAXREADBUFFER,&dwReadBytes,NULL))
{
dwReadBytes = dwReadBytes/sizeof(TCHAR);
for(i=0;i<(int)dwReadBytes;i++) {
if(Buffer[i] == 0x0d || Buffer[i] == 0xfeff)
continue;
if(Buffer[i] == TEXT('\n'))
{
szStr[j]=0;
j=0;
if(lstrcmpi(szStr,TEXT(TextSeg))==0) {
bReadText = TRUE;
// lstrcpy(szStr,"");
continue;
}
if(lstrcmpi(szStr,TEXT(RuleSeg))==0
|| lstrcmpi(szStr,TEXT(DescriptSeg))==0) {
bReadText = FALSE;
// lstrcpy(szStr,"");
continue;
}
if(bReadText) {
trim(szStr);
if(lstrlen(szStr) != 0) {
nRet = SimpleSplit(hWnd,&nPages,szStr,lpCreateWords,lpWordIndex,Descript.wMaxCodes);
if(nRet == 1)
{
lpWordIndex[dwBaseWordNum-1].dwOffset = dwOffset;
searchPos(lpWordIndex,dwBaseWordNum);
if(dwBaseWordNum%100 == 0)
{
SetDlgItemInt (hWnd,TM_TOTALNUM,dwBaseWordNum,FALSE);
InvalidateRect(hDlgItem,NULL,FALSE);
}
}
}
}
else
lstrcpy(szStr,TEXT(""));
continue;
}
else {
if(j == 0)
dwOffset = dwFstOffset + i*sizeof(TCHAR);
szStr[j]=Buffer[i];
j++;
}
}
if(dwReadBytes*sizeof(TCHAR) < MAXREADBUFFER)
break;
dwFstOffset += MAXREADBUFFER;
};
SetDlgItemInt (hWnd,TM_TOTALNUM,dwBaseWordNum,FALSE);
InvalidateRect(hDlgItem,NULL,FALSE);
if(bSameFile) {
if(dwDesLen != 0)
ConvSaveDescript(TEXT(TempFile),&Descript, 0,0);
if(dwRuleLen != 0)
ConvSaveRule(hWnd,TEXT(TempFile), dwDesLen, 0,
lpRule, Descript.wNumRules);
hMBFile= Create_File(hWnd,TEXT(TempFile),GENERIC_READ|GENERIC_WRITE,OPEN_EXISTING);
}
else {
if(dwDesLen != 0)
ConvSaveDescript(lpDestFile,&Descript, 0,0);
if(dwRuleLen != 0)
ConvSaveRule(hWnd,lpDestFile, dwDesLen, 0,
lpRule, Descript.wNumRules);
hMBFile= Create_File(hWnd,lpDestFile,GENERIC_READ|GENERIC_WRITE,OPEN_EXISTING);
}
SetCursor (LoadCursor (NULL, IDC_ARROW));
if (hMBFile == (HANDLE)-1) {
CloseHandle(hSRCFile);
goto err;
}
SetCursor (LoadCursor (NULL, IDC_WAIT));
DispInfo(hWnd,IDS_WRITETEXTINFO);
{
#ifdef UNICODE
TCHAR cmbStr[] = {0x662F, 0x5426, 0x751F, 0x6210, 0x91CD, 0x7801, 0x8868, 0x0028, 0x0059, 0x002F, 0x004E, 0x0029, 0x003F, 0x0000};
#else
BYTE cmbStr[] = "是否生成重码表(Y/N)?";
#endif //UNICODE
TCHAR cmbExt[] = TEXT(".CMB");
LPTSTR lpString;
TCHAR cmbFileName[MAX_PATH];
IsGenCmb = ErrMessage(hWnd, cmbStr);
if(IsGenCmb)
{
lstrcpy(cmbFileName, lpSrcFileName);
if( (lpString = _tcsrchr(cmbFileName, TEXT('.'))) != NULL)
*lpString = 0;
lstrcat(cmbFileName, cmbExt);
hCmbFile= Create_File(hWnd, cmbFileName, GENERIC_READ|GENERIC_WRITE, CREATE_ALWAYS);
if(hCmbFile == (HANDLE)-1)
{
CloseHandle(hSRCFile);
CloseHandle(hMBFile);
goto err;
}
}
}
SetCursor (LoadCursor (NULL, IDC_ARROW));
WriteSortFile(hWnd,hSRCFile,hMBFile,lpWordIndex,lpCreateWords);
GlobalUnlock(hCreateWord);
GlobalFree(hCreateWord);
GlobalFree(hWordIndex);
SetCursor (LoadCursor (NULL, IDC_ARROW));
if(hRule0)
GlobalFree(hRule0);
CloseHandle(hSRCFile);
CloseHandle(hMBFile);
if(hCmbFile > 0)
CloseHandle(hCmbFile);
if(bSameFile) {
DeleteFile(lpSrcFileName);
nRet = MoveFile(TEXT(TempFile),lpSrcFileName);
}
LoadString(NULL,IDS_SORTEND,szStr,sizeof(szStr));
#ifdef UNICODE
{
TCHAR UniTmp[]={0x8BCD, 0x8BED, 0x6392, 0x5E8F, 0x0000};
MessageBox(hWnd,szStr,UniTmp,MB_OK);
}
#else
MessageBox(hWnd,szStr,"词语排序",MB_OK);
#endif
return TRUE;
err:
if(!_taccess(TEXT(TempFile),0))
DeleteFile(TEXT(TempFile));
if(hWordIndex)
GlobalFree(hWordIndex);
if(hCreateWord)
GlobalFree(hCreateWord);
if(hRule0)
GlobalFree(hRule0);
return FALSE;
}
/*****************************************************************************
FUNCTION: ConvReConv(HANDLE hWnd,LPCSTR lpSrcFileName, LPCSTR lpszMBFileName)
PURPOSE: Processes MB reconversion .
PARAMETERS:
hWnd - window handle of the parent window.
lpSrcFileName - pointer to source .mb file name.
lpszMBFileName - pointer to destinate text file name.
RETURN VALUE:
TRUE - reconversion completed
FALSE - reconversion not completed
HISTORY:
05-21-95 Yehfew Tie modifyed.
****************************************************************************/
BOOL ConvReConv(HANDLE hWnd,LPCTSTR lpSrcFileName,LPCTSTR lpMBFileName)
{
DWORD dwDesOffset,dwDesLen;
HANDLE hRule0;
MAINID MainID;
LPRULE lpRule;
DESCRIPTION Descript;
HANDLE hReConvIndex;
LPCREATEWORD lpCreateWords, lpReConvIndex;
MAININDEX MainIndex[NUMTABLES];
hMBFile = Create_File(hWnd,lpMBFileName,GENERIC_READ,OPEN_EXISTING);
if (hMBFile == (HANDLE)-1)
return FALSE;
DispInfo(hWnd,IDS_RECONVINFO);
ConvGetMainID(hMBFile,&MainID);
if(!ConvGetMainIndex(hWnd,hMBFile,MainIndex)) {
CloseHandle(hMBFile);
return FALSE;
}
hSRCFile = Create_File(hWnd,lpSrcFileName,
GENERIC_READ|GENERIC_WRITE,CREATE_ALWAYS);
if (hSRCFile == (HANDLE)-1)
return FALSE;
CloseHandle(hSRCFile);
ConvReadDescript(hMBFile,&Descript, MainIndex);
ConvSaveDescript(lpSrcFileName,&Descript, 0,0);
ConvGetDescript(hWnd,lpSrcFileName,&dwDesOffset,
&dwDesLen,&Descript,FALSE);
hCreateWord = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
(DWORD)Descript.wMaxCodes*NUM_OF_ENCODE*sizeof(TCHAR));
if(!hCreateWord ) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
return FALSE;
}
if(!(lpCreateWords = GlobalLock(hCreateWord)) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
return FALSE;
}
hReConvIndex = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
(DWORD)Descript.wMaxCodes*NUM_OF_ENCODE*sizeof(TCHAR));
if(!hReConvIndex ) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
CloseHandle(hMBFile);
GlobalFree(hCreateWord);
return FALSE;
}
if( !(lpReConvIndex = GlobalLock(hReConvIndex)) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
GlobalFree(hReConvIndex);
CloseHandle(hMBFile);
GlobalFree(hCreateWord);
return FALSE;
}
if(Descript.wNumRules != 0) {
hRule0 = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
sizeof(RULE)*Descript.wNumRules);
if(!hRule0) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
GlobalFree(hReConvIndex);
CloseHandle(hMBFile);
GlobalFree(hCreateWord);
return FALSE;
}
if(!(lpRule = GlobalLock(hRule0)) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
CloseHandle(hMBFile);
GlobalFree(hCreateWord);
GlobalFree(hRule0);
GlobalFree(hReConvIndex);
return FALSE;
}
ConvReadRule(hMBFile,Descript.wNumRules ,lpRule, MainIndex);
ConvSaveRule(hWnd,lpSrcFileName, dwDesLen, 0, lpRule, Descript.wNumRules);
}
ConvGetCrtData(hMBFile, lpCreateWords, MainIndex);
ConvGetReConvIndex(hMBFile, lpReConvIndex,MainIndex);
hSRCFile = Create_File(hWnd,lpSrcFileName,
GENERIC_READ|GENERIC_WRITE,OPEN_EXISTING);
if (hSRCFile == (HANDLE)-1)
return FALSE;
ConvWriteBaseWord(hWnd,hSRCFile,hMBFile,MainID,
MainIndex[TAG_BASEDIC-1].dwOffset, lpCreateWords, lpReConvIndex,Descript.wMaxCodes);
// DispInfo(hWnd,IDS_RECONVEND); bug#57932
CloseHandle(hSRCFile);
CloseHandle(hMBFile);
GlobalFree(hCreateWord);
GlobalFree(hReConvIndex);
if(Descript.wNumRules != 0)
GlobalFree(hRule0);
ProcessError(ERR_RECONVEND, hWnd, INFO);
return TRUE;
}
void ConvInit(LPDESCRIPTION lpDescript,
LPMAINID lpMainID,
LPMAININDEX lpMainIndex)
{
DWORD dwTotal;
int i;
//*** initializes struct MainID ***
lstrcpy(lpMainID->szVersion,TEXT("95.01"));
lpMainID->dwLanguageID = WIN95_PRC;
#ifdef UNICODE
lpMainID->dwEncodeID = UNICODE_IME;
#else
lpMainID->dwEncodeID = GBK_IME;
#endif
lpMainID->dwNumTables = NUMTABLES;
lpMainID->dwNumWords = dwBaseWordNum;
lpMainID->dwFileFlag = 0;
if(lpDescript->byMaxElement > 1 )
lpMainID->dwFileFlag |= FFLG_MULTIELEMENT;
if(lpDescript->wNumRules > 0)
lpMainID->dwFileFlag |= FFLG_RULE;
//*** set tables tag ****
lpMainIndex[TAG_DESCRIPTION-1].dwTag = TAG_DESCRIPTION;
lpMainIndex[TAG_RULE-1].dwTag = TAG_RULE;
lpMainIndex[TAG_ENCODE-1].dwTag = TAG_ENCODE;
lpMainIndex[TAG_CRTWORDCODE-1].dwTag = TAG_CRTWORDCODE;
lpMainIndex[TAG_RECONVINDEX-1].dwTag = TAG_RECONVINDEX;
lpMainIndex[TAG_BASEDICINDEX-1].dwTag = TAG_BASEDICINDEX;
lpMainIndex[TAG_BASEDIC-1].dwTag = TAG_BASEDIC;
//*** set tables length ****
lpMainIndex[TAG_DESCRIPTION-1].dwLength = sizeof(DESCRIPTION);
lpMainIndex[TAG_RULE-1].dwLength= sizeof(RULE)* lpDescript->wNumRules;
lpMainIndex[TAG_ENCODE-1].dwLength =
2*sizeof(DWORD) + NUMENCODEAREA*sizeof(ENCODEAREA);
lpMainIndex[TAG_CRTWORDCODE-1].dwLength =
(DWORD)NUM_OF_ENCODE*(DWORD)lpDescript->wMaxCodes*sizeof(TCHAR);
lpMainIndex[TAG_RECONVINDEX-1].dwLength =
(DWORD)lpDescript->wMaxCodes*NUM_OF_ENCODE*sizeof(TCHAR);
switch(lpMainID->dwFileFlag) {
case FFLG_RULE|FFLG_SINGLEELEMENT:
lpMainIndex[TAG_RECONVINDEX-1].dwLength = 0;
break;
case FFLG_RULE|FFLG_MULTIELEMENT:
break;
case FFLG_NORULE|FFLG_SINGLEELEMENT:
case FFLG_NORULE|FFLG_MULTIELEMENT:
lpMainIndex[TAG_RULE-1].dwLength = 0;
lpMainIndex[TAG_CRTWORDCODE-1].dwLength = 0;
break;
default:
break;
}
lpMainIndex[TAG_BASEDICINDEX-1].dwLength =( (DWORD)lpDescript->wNumCodes+1)*
(DWORD)lpDescript->wNumCodes*sizeof(DWORD)*2+MAXNUMCODES+CODEMAPOFFSET;
lpMainIndex[TAG_BASEDIC-1].dwLength = 0;
//***** set tables offset *****
dwTotal = sizeof(MAINID) + sizeof(MAININDEX)*NUMTABLES;
lpMainIndex[TAG_DESCRIPTION-1].dwOffset = dwTotal;
dwTotal += lpMainIndex[TAG_DESCRIPTION-1].dwLength;
lpMainIndex[TAG_RULE-1].dwOffset = dwTotal;
dwTotal += lpMainIndex[TAG_RULE-1].dwLength;
lpMainIndex[TAG_ENCODE-1].dwOffset = dwTotal;
dwTotal += lpMainIndex[TAG_ENCODE-1].dwLength;
lpMainIndex[TAG_CRTWORDCODE-1].dwOffset = dwTotal;
dwTotal += lpMainIndex[TAG_CRTWORDCODE-1].dwLength;
lpMainIndex[TAG_RECONVINDEX-1].dwOffset = dwTotal;
dwTotal += lpMainIndex[TAG_RECONVINDEX-1].dwLength;
lpMainIndex[TAG_BASEDICINDEX-1].dwOffset = dwTotal;
dwTotal += lpMainIndex[TAG_BASEDICINDEX-1].dwLength;
lpMainIndex[TAG_BASEDIC-1].dwOffset = dwTotal;
for(i=0; i<NUMTABLES; i++)
lpMainIndex[i].dwCheckSum = lpMainIndex[i].dwTag +
lpMainIndex[i].dwLength +
lpMainIndex[i].dwOffset;
}
BOOL ReadSRCFile(HANDLE hWnd,
LPINT nPages,
HANDLE hFile,
LPCREATEWORD lpCreateWords,
LPWORDINDEX lpWordIndex,
LPINT dwWord, LPDESCRIPTION lpDescript,
LPRECONVINDEX lpReConvIndex)
{
TCHAR szStr[256];
TCHAR Buffer[MAXREADBUFFER];
BOOL bReadText=FALSE;
register int i,j;
int nRet;
DWORD dwReadBytes;
DWORD dwFstOffset=0;
DWORD dwOffset=0;
SetCursor (LoadCursor (NULL, IDC_WAIT));
SetFilePointer(hFile,0,0,FILE_BEGIN);
szStr[0] = 0;
j = 0;
dwLineNo = 0;
dwOffset = 0;
memset(WriteCrtFlag, 0, (NUM_OF_ENCODE+7)/8);
while(ReadFile(hFile,Buffer,MAXREADBUFFER,&dwReadBytes,NULL))
{
dwReadBytes = dwReadBytes/sizeof(TCHAR);
for(i=0;i<(int)dwReadBytes;i++) {
if(Buffer[i] == 0x0d || Buffer[i] == 0xfeff) continue;
if(Buffer[i] == TEXT('\n'))
{
dwLineNo ++;
szStr[j]=0;
j = 0;
if(lstrcmpi(szStr,TEXT("[TEXT]"))==0) {
bReadText = TRUE;
lstrcpy(szStr,TEXT(""));
continue;
}
if(lstrcmpi(szStr,TEXT(RuleSeg))==0
|| lstrcmpi(szStr,TEXT(DescriptSeg))==0) {
bReadText = FALSE;
lstrcpy(szStr,TEXT(""));
continue;
}
if(bReadText) {
trim(szStr);
if(lstrlen(szStr) != 0) {
nRet = WordSplit(hWnd,nPages,szStr,lpCreateWords,lpWordIndex,
lpDescript,lpReConvIndex);
if(nRet == 1)
lpWordIndex[dwBaseWordNum-1].dwOffset = dwOffset;
else if(!nRet) {
SetCursor (LoadCursor (NULL, IDC_ARROW));
return FALSE;
}
}
}
else
lstrcpy(szStr,TEXT(""));
continue;
}
else {
if(j == 0)
dwOffset = dwFstOffset + i*sizeof(TCHAR);
szStr[j]=Buffer[i];
j++;
}
}
if(dwReadBytes*sizeof(TCHAR) < MAXREADBUFFER) break;
dwFstOffset += MAXREADBUFFER;
};
SetCursor (LoadCursor (NULL, IDC_ARROW));
if(dwBaseWordNum == 0) {
ProcessError(ERR_TEXTSEG,hWnd,ERR);
return FALSE;
}
else
return TRUE;
}
BOOL ConvCalc(HANDLE hWnd,
HANDLE hMBFile,
LPWORDINDEX lpWordIndex,
LPMAININDEX lpMainIndex,
LPDESCRIPTION lpDescript)
{
DWORD i,j,dwRecLen,dwOffset;
BYTE bySwap;
TCHAR Code[MAXNUMCODES],cc;
DWORD NumX,NumY,NumCodes,FstAdr,dwXStart,dwYStart,dwMaxXLen=0;
HGLOBAL hNumXYWords,hDicIndex;
LPNUMXYWORDS lpNumXYWords;
LPDICINDEX lpDicIndex;
BOOL bStart = FALSE;
NumCodes=lpDescript->wNumCodes;
hNumXYWords = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(DWORD)*((NumCodes+1)*NumCodes+1L));
hDicIndex = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(DWORD)*(NumCodes+1)*NumCodes);
if(!hNumXYWords || !hDicIndex) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
return FALSE;
}
if( !(lpNumXYWords = GlobalLock(hNumXYWords))
||!(lpDicIndex = GlobalLock(hDicIndex)) ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
GlobalFree(hNumXYWords);
GlobalFree(hDicIndex);
return FALSE;
}
lstrcpy(Code,lpDescript->szUsedCode);
FstAdr = lpMainIndex[TAG_BASEDIC-1].dwOffset;
NumX=0;
NumY=0;
dwXStart=0;
dwYStart=0;
dwOffset=0;
lpNumXYWords[0]=0;
lpDicIndex[0]=0;
for(i =0; i<dwBaseWordNum;i++) {
bySwap =(BYTE) lstrlen(lpWordIndex[i].szCode);
dwRecLen = (DWORD)bySwap*sizeof(TCHAR)+sizeof(TCHAR);
bySwap =(BYTE) lpWordIndex[i].wDBCSLen;
// if the DBCS str length is longer than 126, just get the first 126 characters.
if ( bySwap >= 126 )
bySwap = 126;
dwRecLen += 2*(DWORD)bySwap+sizeof(TCHAR);
while( lpWordIndex[i].szCode[0] != Code[NumX] )
{
if(!bStart && NumY == 0)
{
lpNumXYWords[NumX*(NumCodes+1)+NumY+1] = i;
lpDicIndex[NumX*(NumCodes+1)+NumY+1] = dwOffset;
}
while(NumY < NumCodes-1 )
{
NumY ++;
lpNumXYWords[NumX*(NumCodes+1)+NumY+1] = i;
lpDicIndex[NumX*(NumCodes+1)+NumY+1] = dwOffset;
}
NumX ++;
if(NumX >= NumCodes) break;
lpNumXYWords[NumX*(NumCodes+1)] = i;
lpDicIndex[NumX*(NumCodes+1)] = dwOffset;
NumY = 0;
bStart = FALSE;
}
if(NumX >= NumCodes) break;
cc = lpWordIndex[i].szCode[1];
if(!bStart && cc != 0 && NumY == 0)
{
lpNumXYWords[NumX*(NumCodes+1)+1] = i;
lpDicIndex[NumX*(NumCodes+1)+1] = dwOffset;
bStart = TRUE;
}
while(bStart && cc != 0 && cc != Code[NumY] && NumY < NumCodes - 1 )
{
NumY ++;
lpNumXYWords[NumX*(NumCodes+1)+NumY+1] = i;
lpDicIndex[NumX*(NumCodes+1)+NumY+1] = dwOffset;
}
dwOffset += dwRecLen;
if(i == dwBaseWordNum-1) {
j = NumX*(NumCodes+1) + NumY + 1;
while(j < (NumCodes+1)*NumCodes - 1 )
{
j ++;
lpNumXYWords[j] = i + 1;
lpDicIndex[j] = dwOffset;
}
lpNumXYWords[NumCodes*(NumCodes+1)] = i;
}
}
for(i = 0; i < NumCodes ; i++)
{
for(j = 0; j < NumCodes + 1; j++)
{
if(j == 0)
{
lpNumXYWords[i*(NumCodes+1)] = lpNumXYWords[(i+1)*(NumCodes+1)] -
lpNumXYWords[i*(NumCodes+1)];
}
else
{
lpNumXYWords[i*(NumCodes+1)+j] = lpNumXYWords[i*(NumCodes+1)+j+1] -
lpNumXYWords[i*(NumCodes+1)+j];
lpDicIndex[i*(NumCodes+1)+j] = lpDicIndex[i*(NumCodes+1)+j] -
lpDicIndex[i*(NumCodes+1)];
}
}
}
lpMainIndex[TAG_BASEDIC-1].dwLength = dwOffset;
lpMainIndex[TAG_BASEDIC-1].dwCheckSum = TAG_BASEDIC +
lpMainIndex[TAG_BASEDIC-1].dwOffset+
dwOffset;
for(i=0; i< NumCodes - 1;i++) {
dwRecLen = lpDicIndex[(i+1)*(NumCodes+1)]-lpDicIndex[(NumCodes+1)*i];
dwMaxXLen = (dwRecLen>dwMaxXLen)? dwRecLen:dwMaxXLen;
}
dwRecLen = dwOffset - lpDicIndex[(NumCodes+1)*(NumCodes-1)];
dwMaxXLen = (dwRecLen>dwMaxXLen)? dwRecLen:dwMaxXLen;
ConvWriteMainIndex(hMBFile,lpMainIndex);
ConvWriteCodeIndex(hMBFile,&dwMaxXLen,lpDescript->szUsedCode,lpMainIndex);
ConvWriteDicIndex(hMBFile,lpDicIndex,lpDescript->wNumCodes,lpMainIndex);
ConvWriteNumXYWords(hMBFile,lpNumXYWords,
lpDescript->wNumCodes,lpMainIndex);
GlobalUnlock(hDicIndex);
GlobalUnlock(hNumXYWords);
GlobalFree(hDicIndex);
GlobalFree(hNumXYWords);
return TRUE;
}
BOOL WriteMBFile(HANDLE hWnd,
HANDLE hSRCFile,
HANDLE hMBFile,
LPWORDINDEX lpWordIndex,
LPMAININDEX lpMainIndex,
LPDESCRIPTION lpDescript)
{
DWORD i,dwBytes,NumCodes,FstAdr;
WORD bySwap;
TCHAR szStr[256];
TCHAR Code[MAXNUMCODES];
DWORD dwReadSum;
HANDLE hDlgItem;
SetCursor (LoadCursor (NULL, IDC_WAIT));
SetDlgItemText(hWnd,TM_TOTALINFO,TEXT(""));
LoadString(NULL,IDS_TOTALINFO,szStr,sizeof(szStr)/sizeof(TCHAR));
SetDlgItemText(hWnd,TM_TOTAL,szStr);
LoadString(NULL,IDS_CONVWORDS,szStr,sizeof(szStr)/sizeof(TCHAR));
SetDlgItemText(hWnd,TM_CONVINFO,szStr);
SetDlgItemInt(hWnd,TM_TOTALNUM,dwBaseWordNum,FALSE);
dwReadSum = 0;
SetDlgItemInt(hWnd,TM_CONVNUM,dwReadSum,FALSE);
InvalidateRect(hWnd,NULL,FALSE);
NumCodes=lpDescript->wNumCodes;
lstrncpy(Code,NumCodes,lpDescript->szUsedCode);
FstAdr = lpMainIndex[TAG_BASEDIC-1].dwOffset;
SetFilePointer(hMBFile,FstAdr,0, FILE_BEGIN);
for(i =0; i<dwBaseWordNum;i++) {
SetFilePointer(hSRCFile,lpWordIndex[i].dwOffset,0,FILE_BEGIN);
bySwap =(WORD) lpWordIndex[i].wDBCSLen;
ReadFile(hSRCFile,szStr,2*(DWORD)bySwap,&dwBytes,NULL);
bySwap =(WORD) lstrlen(lpWordIndex[i].szCode);
WriteFile(hMBFile,&bySwap,sizeof(TCHAR),&dwBytes,NULL);
WriteFile(hMBFile,&(lpWordIndex[i].szCode),bySwap*sizeof(TCHAR),&dwBytes,NULL);
bySwap =(WORD) lpWordIndex[i].wDBCSLen;
// if the DBCS str length is longer than 126, just get the first 126 characters.
if ( bySwap >= 126 )
bySwap = 126;
WriteFile(hMBFile,&bySwap,sizeof(TCHAR),&dwBytes,NULL);
WriteFile(hMBFile,szStr,2*bySwap,&dwBytes,NULL);
dwReadSum ++;
if(dwReadSum%100 ==0 || dwReadSum == dwBaseWordNum) {
SetDlgItemInt(hWnd,TM_CONVNUM,dwReadSum,FALSE);
hDlgItem=GetDlgItem(hWnd,TM_CONVNUM);
InvalidateRect(hDlgItem,NULL,FALSE);
}
}
SetCursor (LoadCursor (NULL, IDC_ARROW));
return TRUE;
}
BOOL WriteSortFile(HANDLE hWnd,
HANDLE hSRCFile,
HANDLE hDestFile,
LPWORDINDEX lpWordIndex,
LPCREATEWORD lpCreateWords)
{
DWORD i, k, dwBytes;
WORD wRecLen;
BYTE bySwap;
TCHAR szStr[512],szDBCS[512];
TCHAR szCode[13],szCreate[13];
BOOL IsGenCmb = (hCmbFile)?TRUE:FALSE;
BOOL bExistNext = FALSE;
DWORD dwReadSum;
SetFilePointer(hDestFile,0,0, FILE_END);
dwReadSum = 0;
for(i =0; i<dwBaseWordNum;i++) {
SetFilePointer(hSRCFile,lpWordIndex[i].dwOffset,0,FILE_BEGIN);
wRecLen = 2*lpWordIndex[i].wDBCSLen/sizeof(TCHAR);
ReadFile(hSRCFile,szDBCS,wRecLen*sizeof(TCHAR),&dwBytes,NULL);
szDBCS[wRecLen] = 0;
lstrcpy(szCode,lpWordIndex[i].szCode);
bySwap =(BYTE)lstrlen(lpWordIndex[i].szCode);
if(wRecLen == 2/sizeof(TCHAR)){
k = EncodeToNo(szDBCS);
if((long)k>=0 && k < NUM_OF_ENCODE) {
lstrncpy(szCreate,MAXCODELEN,&lpCreateWords[k*MAXCODELEN]);
szCreate[MAXCODELEN]=0;
if(lstrlen(szCreate))
wsprintf(szStr,TEXT("%s%s %s\r\n"),szDBCS,szCode,szCreate);
else
wsprintf(szStr,TEXT("%s%s\r\n"),szDBCS,szCode);
}
else
wsprintf(szStr,TEXT("%s%s\r\n"),szDBCS,szCode);
}
else
wsprintf(szStr,TEXT("%s%s\r\n"),szDBCS,szCode);
WriteFile(hDestFile,szStr,lstrlen(szStr)*sizeof(TCHAR),&dwBytes,NULL);
if(IsGenCmb)
{
if(i != dwBaseWordNum - 1
&& _wcsicmp(lpWordIndex[i].szCode, lpWordIndex[i+1].szCode) == 0)
{
wsprintf(szStr,TEXT("%s%s\r\n"),szCode,szDBCS);
WriteFile(hCmbFile,szStr,lstrlen(szStr)*sizeof(TCHAR),&dwBytes,NULL);
bExistNext = TRUE;
dwReadSum ++;
}
else
{
if(bExistNext)
{
wsprintf(szStr,TEXT("%s%s\r\n"),szCode,szDBCS);
WriteFile(hCmbFile,szStr,lstrlen(szStr)*sizeof(TCHAR),&dwBytes,NULL);
}
bExistNext = FALSE;
}
}
}
if(IsGenCmb)
{
#ifdef UNICODE
TCHAR UniTmp[] = {0x5171, 0x8BA1, 0x91CD, 0x7801, 0x8BCD, 0x6761, 0x6570, 0x0000};
wsprintf(szStr,TEXT("%ws = %d\n"), UniTmp, dwReadSum);
#else
wsprintf(szStr,"共计重码词条数 = %ld\n", dwReadSum);
#endif
WriteFile(hCmbFile,szStr,lstrlen(szStr)*sizeof(TCHAR),&dwBytes,NULL);
}
return TRUE;
}
int SimpleSplit(HANDLE hWnd,
LPINT nPages,
LPTSTR szStr,
LPCREATEWORD lpCreateWords,
LPWORDINDEX lpWordIndex,
WORD wMaxCodes)
{
register int i=0;
int nDBCS=0, nCodes=0, nCreate = 0;
TCHAR szDBCS[512],szCode[13],szCreate[128];
if(ParseDBCSstr(hWnd,szStr,szDBCS,szCode,szCreate,wMaxCodes) != TRUE)
{
if(lstrlen(szDBCS) == 0)
{
LoadString(NULL, IDS_NOTEXISTDBCS, szCreate, sizeof(szCreate)/sizeof(TCHAR));
wsprintf(szDBCS,TEXT("\'%s%lu)"),szCreate,dwLineNo);
FatalMessage(hWnd,szDBCS);
}
return FALSE;
}
nDBCS = lstrlen(szDBCS);
DelIllegalCode(szCode);
nCodes = lstrlen(szCode);
nCreate = lstrlen(szCreate);
dwBaseWordNum ++;
lpWordIndex[dwBaseWordNum-1].wDBCSLen =(WORD)(nDBCS*sizeof(TCHAR)/2);
lstrcpy(lpWordIndex[dwBaseWordNum-1].szCode,szCode);
if(nDBCS == 2/sizeof(TCHAR)) {
i = EncodeToNo(szDBCS);
if(i>=0 && i < NUM_OF_ENCODE)
{
if(nCreate != 0)
lstrncpy(lpCreateWords+i*MAXCODELEN,
MAXCODELEN, szCreate);
}
}
return TRUE;
}
int WordSplit(HANDLE hWnd,
LPINT nPages,
LPTSTR szStr,
LPCREATEWORD lpCreateWords,
LPWORDINDEX lpWordIndex,
LPDESCRIPTION lpDescript,
LPRECONVINDEX lpReConvIndex)
{
int i, nDBCS=0, nCodes=0, nCreate = 0;
TCHAR szTemp[512],szTmpStr[256];
TCHAR szDBCS[512],szCode[13],szCreate[128];
if(ParseDBCSstr(hWnd,szStr,szDBCS,szCode,szCreate,lpDescript->wMaxCodes) != TRUE)
{
if(lstrlen(szDBCS) == 0)
{
LoadString(NULL, IDS_NOTEXISTDBCS, szTmpStr, sizeof(szTmpStr)/sizeof(TCHAR));
wsprintf(szTemp,TEXT("\'%s%lu)"),szTmpStr,dwLineNo);
FatalMessage(hWnd,szTemp);
}
return FALSE;
}
if ( lstrlen(szDBCS) > 126 ) {
// if the string is longer than 126, the rest will be cut.
// so show a message to end user.
LoadString(NULL, IDS_DBCSTOOLONG, szTmpStr, sizeof(szTmpStr)/sizeof(TCHAR));
#ifdef UNICODE
{
TCHAR UniTmp[] = {0x0027, 0x0025, 0x0077, 0x0073, 0x0027, 0x0020, 0x0020,
0x0020, 0x0028, 0x884C, 0x003A, 0x0025, 0x006C, 0x0075,
0x0029, 0x0025, 0x0077, 0x0073, 0x000D, 0x000A, 0x000D,
0x000A, 0x9000, 0x51FA, 0x5426, 0x003F, 0x0020, 0x0000};
wsprintf(szTemp, UniTmp, szDBCS,dwLineNo,szTmpStr);
}
#else
wsprintf(szTemp,"\'%s\'%s(行:%lu)\n退出否? ",szDBCS,szTmpStr,dwLineNo);
#endif
if (ErrMessage(hWnd,szTemp))
return FALSE;
}
if(!CheckCodeLegal(hWnd,szDBCS,szCode,szCreate,lpDescript))
return FALSE;
nDBCS = lstrlen(szDBCS);
nCodes = lstrlen(szCode);
nCreate = lstrlen(szCreate);
if(nDBCS == 0)
return -1;
if(nDBCS == 2/sizeof(TCHAR))
{
i = EncodeToNo(szDBCS);
if(i < 0 || i >= NUM_OF_ENCODE)
return FALSE;
if(nCodes == 0) {
LoadString(NULL, IDS_CODEEMPTY, szTmpStr, sizeof(szTmpStr)/sizeof(TCHAR));
#ifdef UNICODE
{
TCHAR UniTmp[] = {0x005C, 0x0027, 0x0025, 0x0077, 0x0073, 0x005C, 0x0027, 0x0025, 0x0077, 0x0073, 0x0028, 0x884C, 0x003A, 0x0025, 0x006C, 0x0075, 0x0029, 0x005C, 0x006E, 0x9000, 0x51FA, 0x5426, 0x003F, 0x0020, 0x0000};
wsprintf(szTemp, UniTmp, szDBCS,szTmpStr,dwLineNo);
}
#else
wsprintf(szTemp,"\'%s\'%s(行:%lu)\n退出否? ",szDBCS,szTmpStr,dwLineNo);
#endif \\UNICODE
if(ErrMessage(hWnd,szTemp))
return FALSE;
}
//**** write create words
if(lpDescript->wNumRules != 0 && nCreate != 0)
{
if(nCreate > lpDescript->wMaxCodes) {
LoadString(NULL,IDS_DBCSCODE,szTmpStr,sizeof(szTmpStr)/sizeof(TCHAR));
#ifdef UNICODE
{
TCHAR UniTmp[] = {0x005C, 0x0027, 0x0025, 0x0077, 0x0073, 0x0025, 0x0077, 0x0073, 0x005C, 0x0027, 0x0020, 0x0025, 0x0064, 0x0021, 0x0028, 0x884C, 0x003A, 0x0025, 0x006C, 0x0075, 0x0029, 0x005C, 0x006E, 0x9000, 0x51FA, 0x5426, 0x003F, 0x0000};
wsprintf(szTemp,UniTmp, szDBCS,szTmpStr,
lpDescript->byMaxElement,dwLineNo);
}
#else
wsprintf(szTemp,"\'%s%s\' %d!(行:%lu)\n退出否?", szDBCS,szTmpStr,
lpDescript->byMaxElement,dwLineNo);
#endif \\UNICODE
if( ErrMessage(hWnd,szTemp))
return FALSE;
}
lstrncpy(szTmpStr,lpDescript->wMaxCodes,
lpCreateWords+i*(DWORD)lpDescript->wMaxCodes);
szTmpStr[lpDescript->wMaxCodes] = 0;
if(!(WriteCrtFlag[i/8] & (1 << (7 - (i%8))) ) )
lstrncpy(lpCreateWords+i*(DWORD)lpDescript->wMaxCodes,
lpDescript->wMaxCodes,
szCreate);
WriteCrtFlag[i/8] |= (1 << (7 - (i%8)) );
}
}
else if(nDBCS>2*sizeof(TCHAR) && nCodes==0 && lpDescript->wNumRules==0)
{
LoadString(NULL,IDS_CODEEMPTY,szTmpStr,sizeof(szTmpStr)/sizeof(TCHAR));
#ifdef UNICODE
{
TCHAR UniTmp[] = {0x005C, 0x0027, 0x0025, 0x0077, 0x0073, 0x005C, 0x0027, 0x0025, 0x0077, 0x0073, 0x0028, 0x884C, 0x003A, 0x0025, 0x006C, 0x0064, 0x0029, 0x0000};
wsprintf(szTemp,UniTmp, szDBCS,szTmpStr,dwLineNo);
}
#else
wsprintf(szTemp,"\'%s\'%s(行:%ld)", szDBCS,szTmpStr,dwLineNo);
#endif
WarnMessage(hWnd,szTemp);
return FALSE;
}
dwBaseWordNum ++;
if(dwBaseWordNum >(DWORD)(*nPages)*GMEM_PAGESIZE) {
GlobalUnlock(hWordIndex);
hWordIndex = IndexReAlloc(hWordIndex,nPages);
if(!hWordIndex) {
ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
return FALSE;
}
lpWordIndex = (LPWORDINDEX) GlobalLock(hWordIndex);
if( !lpWordIndex ) {
ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
return FALSE;
}
}
lpWordIndex[dwBaseWordNum-1].wDBCSLen =(WORD)(nDBCS*sizeof(TCHAR)/2);
lstrcpy(lpWordIndex[dwBaseWordNum-1].szCode,szCode);
ConvReconvIndex(hWnd,szDBCS,lpCreateWords,lpWordIndex[dwBaseWordNum-1],lpDescript,lpReConvIndex);
return TRUE;
}
BOOL ConvWriteBaseWord (HANDLE hWnd,
HANDLE hSRCFile,
HANDLE hMBFile,
MAINID MainID,
DWORD dwOffset,
LPCREATEWORD lpCreateWords,
LPRECONVINDEX lpReConvIndex,
DWORD MaxCodes)
{
TCHAR szCode[13],szCreate[13],szDBCS[512],szReCode[13];
TCHAR szStr[512];
static TCHAR ReadBuf[MAXREADBUFFER];
static TCHAR WriteBuf[2*MAXREADBUFFER];
DWORD dwReadBytes,dwRecLen,i,j,k,dwReadWords=0;
DWORD dwFileFlag = MainID.dwFileFlag;
DWORD dwNumWords = MainID.dwNumWords;
DWORD dwReadSum;
HWND hDlgItem;
SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN);
SetFilePointer(hSRCFile,0,0,FILE_END);
SetDlgItemText(hWnd,TM_TOTALINFO,TEXT(""));
LoadString(NULL,IDS_TOTALINFO,szStr,sizeof(szStr)/sizeof(TCHAR));
SetDlgItemText(hWnd,TM_TOTAL,szStr);
LoadString(NULL,IDS_RECONVWORDS,szStr,sizeof(szStr)/sizeof(TCHAR));
SetDlgItemText(hWnd,TM_CONVINFO,szStr);
SetDlgItemInt(hWnd,TM_TOTALNUM,dwNumWords,FALSE);
dwReadSum = 0;
SetDlgItemInt(hWnd,TM_CONVNUM,dwReadSum,FALSE);
InvalidateRect(hWnd,NULL,FALSE);
i=0;
do {
ReadFile(hMBFile,ReadBuf,sizeof(ReadBuf),&dwReadBytes,NULL);
i=0;
if(dwReadBytes == 0 ) break;
WriteBuf[0]=0;
dwReadBytes = dwReadBytes/sizeof(TCHAR);
while( i < dwReadBytes-1 ) {
j = (DWORD)ReadBuf[i]+1;
dwRecLen = j+(DWORD)ReadBuf[i+j]*2/sizeof(TCHAR)+1;
if( (dwReadBytes*sizeof(TCHAR) < MAXREADBUFFER) ||
((i+j) < (dwReadBytes-1) && (i+dwRecLen) < (dwReadBytes-1) ) ) {
lstrncpy(szCode,ReadBuf[i],&ReadBuf[i+1]);
szCode[ReadBuf[i]] = 0;
lstrncpy(szDBCS,ReadBuf[i+j]*2/sizeof(TCHAR),&ReadBuf[i+j+1]);
szDBCS[ReadBuf[i+j]*2/sizeof(TCHAR)] = 0;
if(ReadBuf[i+j]==1
&&(dwFileFlag&FFLG_RULE)) {
k = EncodeToNo(szDBCS);
if((long)k>=0 && k < NUM_OF_ENCODE) {
lstrncpy(szCreate,MaxCodes,&lpCreateWords[k*MaxCodes]);
lstrncpy(szReCode,MaxCodes,&lpReConvIndex[k*MaxCodes]);
szCreate[MaxCodes]=0;
szReCode[MaxCodes]=0;
if(lstrlen(szCreate) != 0 && lstrcmpi(szCreate,szCode) != 0)
wsprintf(szStr,TEXT("%s%s %s\r\n"),szDBCS,szCode,szCreate);
else
wsprintf(szStr,TEXT("%s%s\r\n"),szDBCS,szCode);
}
else
wsprintf(szStr,TEXT("%s%s\r\n"),szDBCS,szCode);
}
else
wsprintf(szStr,TEXT("%s%s\r\n"),szDBCS,szCode);
lstrcat(WriteBuf,szStr);
dwReadWords ++;
dwReadSum = dwReadWords;
if(dwReadSum%100 ==0 || dwReadSum == dwNumWords) {
SetDlgItemInt(hWnd,TM_CONVNUM,dwReadSum,FALSE);
hDlgItem=GetDlgItem(hWnd,TM_CONVNUM);
InvalidateRect(hDlgItem,NULL,FALSE);
}
i += dwRecLen;
}
else {
SetFilePointer(hMBFile,(i-dwReadBytes)*sizeof(TCHAR),0,FILE_CURRENT);
break;
}
}
WriteFile(hSRCFile,WriteBuf,lstrlen(WriteBuf)*sizeof(TCHAR),&k,NULL);
}while (dwReadBytes == MAXREADBUFFER) ;
return TRUE;
}
BOOL ConvBatCreate (HANDLE hWnd,
DESCRIPTION Descript,
LPRULE lpRule,
LPCREATEWORD lpCreateWord,
LPTSTR szWordStr,
LPTSTR lpCode)
{
int nWordLen=lstrlen(szWordStr)*sizeof(TCHAR)/2;
DWORD i,j,k,dwCodeLen;
DWORD dwNumRules = Descript.wNumRules;
WORD wMaxCodes = Descript.wMaxCodes;
TCHAR szDBCS[3],szCode[MAXCODELEN+1];
BOOL bReturn = FALSE;
lpCode[0] = 0;
if(dwNumRules == 0) {
ProcessError(ERR_NORULE,hWnd,ERR);
return FALSE;
}
for(i=0; i<dwNumRules; i++)
if( (lpRule[i].byLogicOpra == 0 && nWordLen == lpRule[i].byLength)
||(lpRule[i].byLogicOpra == 1 && nWordLen >= lpRule[i].byLength)
||(lpRule[i].byLogicOpra == 2 && nWordLen <= lpRule[i].byLength) ) {
int retCodeLen = 0;
for(j=0; j<lpRule[i].wNumCodeUnits; j++) {
k = lpRule[i].CodeUnit[j].wDBCSPosition;
if(k > (DWORD)nWordLen) k = (DWORD)nWordLen;
if(lpRule[i].CodeUnit[j].dwDirectMode == 0)
lstrncpy(szDBCS,2,&szWordStr[2*(k-1)]);
else
lstrncpy(szDBCS,2,&szWordStr[2*(nWordLen-k)]);
szDBCS[2] = 0;
k = EncodeToNo(szDBCS);
if((long)k>=0 && k< NUM_OF_ENCODE )
{
lstrncpy(szCode,wMaxCodes,&lpCreateWord[wMaxCodes*k]);
szCode[wMaxCodes] = 0;
dwCodeLen = lstrlen(szCode);
k = lpRule[i].CodeUnit[j].wCodePosition;
if(k == 0)
{
if(retCodeLen + dwCodeLen > Descript.wMaxCodes)
szCode[Descript.wMaxCodes - retCodeLen] = 0;
lstrcat(lpCode,szCode);
}
else
{
if(k > dwCodeLen) k = dwCodeLen;
lpCode[j] = (szCode[k-1] == 0)?((k > 1)? szCode[k-2]:Descript.szUsedCode[0]):szCode[k-1];
}
}
else
lpCode[j] = (j > 0)?lpCode[j-1]:Descript.szUsedCode[0];
retCodeLen = lstrlen(lpCode);
}
bReturn = TRUE;
break;
}
if(!bReturn)
ProcessError(ERR_NOTDEFRULE,hWnd,ERR);
lpCode[wMaxCodes] = 0;
return bReturn;
}
BOOL searchPos(LPWORDINDEX lpWordIndex, DWORD dwNumWords)
{
DWORD i, retPos;
WORDINDEX InsWordIndex = lpWordIndex[dwNumWords-1];
if(dwNumWords == 1)
return TRUE;
retPos = bSearch(lpWordIndex, 0, dwNumWords-2, InsWordIndex);
if(retPos == dwNumWords - 1)
return TRUE;
memmove(&lpWordIndex[retPos+1], &lpWordIndex[retPos],
sizeof(WORDINDEX)*(dwNumWords - 1 - retPos) );
lpWordIndex[retPos] = InsWordIndex;
return TRUE;
}
DWORD bSearch(LPWORDINDEX lpWordIndex, DWORD left, DWORD right, WORDINDEX InsWordIndex)
{
WORDINDEX MidWordIndex;
DWORD mid;
if(left > right)
return left;
mid = (left + right)/2;
MidWordIndex = lpWordIndex[mid];
if(_wcsicmp(MidWordIndex.szCode, InsWordIndex.szCode) <= 0)
{
if(mid == right || _wcsicmp(lpWordIndex[mid+1].szCode, InsWordIndex.szCode) > 0)
return mid+1;
else
return bSearch(lpWordIndex, mid+1, right, InsWordIndex);
}
else
{
if(mid == left || _wcsicmp(lpWordIndex[mid-1].szCode, InsWordIndex.szCode) <= 0)
return mid;
else
// return bSearch(lpWordIndex, left, mid, InsWordIndex);
return bSearch(lpWordIndex, left, mid-1, InsWordIndex);
}
return 0;
}
//***** end 95.10.17