/*++ Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved Module Name: CRTWORD.C ++*/ #include #include #include #include #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= lpRuler[i].byLength) ||(lpRuler[i].byLogicOpra == 2 && nWordLen <= lpRuler[i].byLength) ) { int retCodeLen = 0; for(j=0; j (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=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; }