/*++ Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved Module Name: CRTWORD.C ++*/ #include <windows.h> #include <winerror.h> #include <immdev.h> #include <imedefs.h> #ifdef UNICODE #define NUMENCODEAREA 8 #else #define NUMENCODEAREA 252 #endif typedef struct tagENCODEAREA { DWORD PreCount; DWORD StartEncode; DWORD EndEncode; } ENCODEAREA,FAR *LPENCODEAREA; DWORD EncodeToXgbNo(LPTSTR, DWORD , DWORD, HANDLE ); BOOL ConvGetEncode(HANDLE ,LPENCODEAREA ,LPDWORD ,LPDWORD ,LPMAININDEX); void ConvCreateWord(HWND hWnd,LPCTSTR MBFileName,LPTSTR szWordStr,LPTSTR lpCode) { int nWordLen=lstrlen(szWordStr)*sizeof(TCHAR)/2; DWORD i,j,k,dwCodeLen; TCHAR szDBCS[3],szCode[13]; BOOL bReturn=FALSE; HANDLE hMBFile; DWORD dwNumEncodeArea; DWORD dwNumXgbEncodes; DESCRIPTION Descript; HANDLE hRuler0, hEncode; LPRULER lpRuler; LPENCODEAREA lpEncode; MAININDEX MainIndex[NUMTABLES]; PSECURITY_ATTRIBUTES psa; // DWORD dwOffset=lpMainIndex[TAG_CRTWORDCODE-1].dwOffset; lpCode[0] = 0; if(lstrlen(MBFileName)==0 || lstrlen(szWordStr) == 0) return; psa = CreateSecurityAttributes(); hMBFile = CreateFile(MBFileName,GENERIC_READ,FILE_SHARE_READ,psa,OPEN_EXISTING,0,NULL); FreeSecurityAttributes(psa); if (hMBFile == (HANDLE)-1) { FatalMessage(hWnd, IDS_ERROR_OPENFILE); return; } if(!ConvGetMainIndex(hWnd,hMBFile,MainIndex)) { CloseHandle(hMBFile); return; } ConvReadDescript(hMBFile,&Descript, MainIndex); if(Descript.wNumRulers == 0) { CloseHandle(hMBFile); return; } hRuler0 = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(RULER)*Descript.wNumRulers); if(!hRuler0) { CloseHandle(hMBFile); return; } hEncode = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeof(ENCODEAREA)*NUMENCODEAREA); if(!hEncode) { CloseHandle(hMBFile); GlobalFree(hRuler0); return; } if(!(lpRuler = GlobalLock(hRuler0)) ) { CloseHandle(hMBFile); GlobalFree(hRuler0); return; } ConvReadRuler(hMBFile,Descript.wNumRulers ,lpRuler, MainIndex); lpEncode = (LPENCODEAREA) GlobalLock(hEncode); if(!lpEncode){ CloseHandle(hMBFile); GlobalFree(hRuler0); return; } ConvGetEncode(hMBFile, lpEncode, &dwNumXgbEncodes, &dwNumEncodeArea,MainIndex); for(i=0; i<Descript.wNumRulers; i++) if( (lpRuler[i].byLogicOpra == 0 && nWordLen == lpRuler[i].byLength) ||(lpRuler[i].byLogicOpra == 1 && nWordLen >= lpRuler[i].byLength) ||(lpRuler[i].byLogicOpra == 2 && nWordLen <= lpRuler[i].byLength) ) { int retCodeLen = 0; for(j=0; j<lpRuler[i].wNumCodeUnits; j++) { k = lpRuler[i].CodeUnit[j].wDBCSPosition; if(k > (DWORD)nWordLen) k = (DWORD)nWordLen; if(lpRuler[i].CodeUnit[j].dwDirectMode == 0) lstrcpyn(szDBCS,&szWordStr[2*(k-1)/sizeof(TCHAR)],2/sizeof(TCHAR)+1); else lstrcpyn(szDBCS,&szWordStr[2*(nWordLen-k)/sizeof(TCHAR)],2/sizeof(TCHAR)+1); szDBCS[2/sizeof(TCHAR)] = 0; k = EncodeToXgbNo(szDBCS, dwNumEncodeArea,dwNumXgbEncodes,hEncode); if((long)k < 0 || k > dwNumXgbEncodes) { lpCode[j] = (j > 0)?lpCode[j-1]:Descript.szUsedCode[0]; lpCode[j+1] = 0; } else { SetFilePointer(hMBFile,MainIndex[TAG_CRTWORDCODE-1].dwOffset+Descript.wMaxCodes*k*sizeof(TCHAR), 0,FILE_BEGIN); ReadFile(hMBFile,szCode,Descript.wMaxCodes*sizeof(TCHAR),&k,NULL); szCode[Descript.wMaxCodes] = 0; dwCodeLen = lstrlen(szCode); k = lpRuler[i].CodeUnit[j].wCodePosition; if(k > dwCodeLen) k = dwCodeLen; 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]; lpCode[j+1] = 0; } retCodeLen = lstrlen(lpCode); } } bReturn = TRUE; break; } CloseHandle(hMBFile); GlobalFree(hRuler0); return; } BOOL ConvGetMainIndex(HANDLE hWnd, HANDLE hMBFile, LPMAININDEX lpMainIndex) { DWORD dwBytes; int i; BOOL retVal; if(SetFilePointer(hMBFile,ID_LENGTH,0,FILE_BEGIN) != ID_LENGTH) return FALSE; retVal = ReadFile(hMBFile,lpMainIndex,sizeof(MAININDEX)*NUMTABLES,&dwBytes,NULL); if (retVal == FALSE ) return retVal; if(dwBytes < sizeof(MAININDEX)*NUMTABLES ) { return FALSE; } else return TRUE; for(i=0; i<NUMTABLES; i++) { dwBytes = lpMainIndex[i].dwTag+ lpMainIndex[i].dwOffset+ lpMainIndex[i].dwLength; if(lpMainIndex[i].dwCheckSum != dwBytes) { return FALSE; } } } #ifdef IDEBUG extern void OutputDbgWord( ); #endif BOOL ConvReadDescript(HANDLE hMBFile, LPDESCRIPTION lpDescript, LPMAININDEX lpMainIndex) //*** read description from .MB file **** { DWORD dwBytes; BOOL retVal; DWORD dwOffset = lpMainIndex[TAG_DESCRIPTION-1].dwOffset; if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset) return FALSE; retVal = ReadFile(hMBFile,lpDescript,sizeof(DESCRIPTION),&dwBytes,NULL); if ( retVal == FALSE ) return retVal; #ifdef IDEBUG { DWORD dwtmp; OutputDebugString(L"Under ConvReadDescript\n"); OutputDebugString(L"dwBytes="); OutputDbgWord(dwBytes); OutputDebugString(L"Sizeof(MBDESC)="); dwtmp = (DWORD)sizeof(MBDESC); OutputDbgWord(dwtmp); OutputDebugString(L"\n"); OutputDebugString(L"szName="); OutputDebugString(lpDescript->szName); OutputDebugString(L"\n"); OutputDebugString(L"wMaxCodes="); dwtmp = (DWORD)(lpDescript->wMaxCodes); OutputDbgWord( dwtmp ); OutputDebugString(L"\n"); OutputDebugString(L"wNumCodes="); dwtmp = (DWORD)(lpDescript->wNumCodes); OutputDbgWord(dwtmp); OutputDebugString(L"\n"); OutputDebugString(L"byMaxElement="); dwtmp = (DWORD)(lpDescript->byMaxElement) & 0x0000000f; OutputDbgWord(dwtmp); OutputDebugString(L"\n"); OutputDebugString(L"cWildChar="); dwtmp = (DWORD)(lpDescript->cWildChar); OutputDbgWord( dwtmp ); OutputDebugString(L"\n"); OutputDebugString(L"wNumRulers="); dwtmp = (DWORD)(lpDescript->wNumRulers); OutputDbgWord( dwtmp ); OutputDebugString(L"\n"); } #endif if(dwBytes < sizeof(DESCRIPTION) ) return FALSE; else return TRUE; } BOOL ConvReadRuler(HANDLE hMBFile, int nRulerNum, LPRULER lpRuler, LPMAININDEX lpMainIndex) //*** read create word ruler from .MB file **** { DWORD dwBytes; BOOL retVal; DWORD dwOffset = lpMainIndex[TAG_RULER-1].dwOffset; if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset) return FALSE; retVal = ReadFile(hMBFile,lpRuler,nRulerNum*sizeof(RULER),&dwBytes,NULL); if ( retVal == FALSE ) return retVal; if(dwBytes < nRulerNum*sizeof(RULER) ) return FALSE; else return TRUE; } BOOL ConvGetEncode(HANDLE hMBFile, LPENCODEAREA lpEncode, LPDWORD fdwNumSWords, LPDWORD fdwNumEncodeArea, LPMAININDEX lpMainIndex) { DWORD dwBytes; BOOL retVal; DWORD dwOffset=lpMainIndex[TAG_INTERCODE-1].dwOffset; if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset) return FALSE; retVal = ReadFile(hMBFile,fdwNumSWords,4,&dwBytes,NULL); if ( retVal == FALSE ) return retVal; retVal = ReadFile(hMBFile,fdwNumEncodeArea,4,&dwBytes,NULL); if ( retVal == FALSE ) return retVal; retVal = ReadFile(hMBFile,lpEncode, lpMainIndex[TAG_INTERCODE-1].dwLength,&dwBytes,NULL); if ( retVal == FALSE ) return retVal; if(dwBytes < lpMainIndex[TAG_INTERCODE-1].dwLength) return FALSE; else return TRUE; } DWORD EncodeToXgbNo(LPTSTR szDBCS, DWORD dwNumEncodeArea, DWORD dwNumXgbEncodes, HANDLE hEncode) { LPENCODEAREA lpEncode; WORD wCode; DWORD dwNo = 0xffffffff, i; #ifdef UNICODE wCode = szDBCS[0]; #else wCode = (WORD)((UCHAR)szDBCS[0])*256 + (WORD)(UCHAR)szDBCS[1]; #endif lpEncode = (LPENCODEAREA) GlobalLock(hEncode); if(!lpEncode){ return dwNo; } for( i = dwNumEncodeArea -1; (long)i>=0; i--) { if(wCode >= lpEncode[i].StartEncode) { dwNo = lpEncode[i].PreCount; dwNo += wCode - lpEncode[i].StartEncode; break; } } if(dwNo > dwNumXgbEncodes ) dwNo = 0xffffffff; GlobalUnlock(hEncode); return dwNo; }