Leaked source code of windows server 2003
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.

346 lines
9.3 KiB

  1. /*++
  2. Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved
  3. Module Name:
  4. CRTWORD.C
  5. ++*/
  6. #include <windows.h>
  7. #include <winerror.h>
  8. #include <immdev.h>
  9. #include <imedefs.h>
  10. #ifdef UNICODE
  11. #define NUMENCODEAREA 8
  12. #else
  13. #define NUMENCODEAREA 252
  14. #endif
  15. typedef struct tagENCODEAREA {
  16. DWORD PreCount;
  17. DWORD StartEncode;
  18. DWORD EndEncode;
  19. } ENCODEAREA,FAR *LPENCODEAREA;
  20. DWORD EncodeToXgbNo(LPTSTR, DWORD , DWORD, HANDLE );
  21. BOOL ConvGetEncode(HANDLE ,LPENCODEAREA ,LPDWORD ,LPDWORD ,LPMAININDEX);
  22. void ConvCreateWord(HWND hWnd,LPCTSTR MBFileName,LPTSTR szWordStr,LPTSTR lpCode)
  23. {
  24. int nWordLen=lstrlen(szWordStr)*sizeof(TCHAR)/2;
  25. DWORD i,j,k,dwCodeLen;
  26. TCHAR szDBCS[3],szCode[13];
  27. BOOL bReturn=FALSE;
  28. HANDLE hMBFile;
  29. DWORD dwNumEncodeArea;
  30. DWORD dwNumXgbEncodes;
  31. DESCRIPTION Descript;
  32. HANDLE hRuler0, hEncode;
  33. LPRULER lpRuler;
  34. LPENCODEAREA lpEncode;
  35. MAININDEX MainIndex[NUMTABLES];
  36. // DWORD dwOffset=lpMainIndex[TAG_CRTWORDCODE-1].dwOffset;
  37. lpCode[0] = 0;
  38. if(lstrlen(MBFileName)==0 || lstrlen(szWordStr) == 0)
  39. return;
  40. hMBFile = CreateFile(MBFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  41. if (hMBFile == (HANDLE)-1) {
  42. FatalMessage(hWnd, IDS_ERROR_OPENFILE);
  43. return;
  44. }
  45. if(!ConvGetMainIndex(hWnd,hMBFile,MainIndex)) {
  46. CloseHandle(hMBFile);
  47. return;
  48. }
  49. ConvReadDescript(hMBFile,&Descript, MainIndex);
  50. if(Descript.wNumRulers == 0) {
  51. CloseHandle(hMBFile);
  52. return;
  53. }
  54. hRuler0 = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(RULER)*Descript.wNumRulers);
  55. if(!hRuler0) {
  56. CloseHandle(hMBFile);
  57. return;
  58. }
  59. hEncode = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeof(ENCODEAREA)*NUMENCODEAREA);
  60. if(!hEncode) {
  61. CloseHandle(hMBFile);
  62. GlobalFree(hRuler0);
  63. return;
  64. }
  65. if(!(lpRuler = GlobalLock(hRuler0)) ) {
  66. CloseHandle(hMBFile);
  67. GlobalFree(hRuler0);
  68. return;
  69. }
  70. ConvReadRuler(hMBFile,Descript.wNumRulers ,lpRuler, MainIndex);
  71. lpEncode = (LPENCODEAREA) GlobalLock(hEncode);
  72. if(!lpEncode){
  73. CloseHandle(hMBFile);
  74. GlobalFree(hRuler0);
  75. return;
  76. }
  77. ConvGetEncode(hMBFile, lpEncode, &dwNumXgbEncodes,
  78. &dwNumEncodeArea,MainIndex);
  79. for(i=0; i<Descript.wNumRulers; i++)
  80. if( (lpRuler[i].byLogicOpra == 0 && nWordLen == lpRuler[i].byLength)
  81. ||(lpRuler[i].byLogicOpra == 1 && nWordLen >= lpRuler[i].byLength)
  82. ||(lpRuler[i].byLogicOpra == 2 && nWordLen <= lpRuler[i].byLength) ) {
  83. int retCodeLen = 0;
  84. for(j=0; j<lpRuler[i].wNumCodeUnits; j++) {
  85. k = lpRuler[i].CodeUnit[j].wDBCSPosition;
  86. if(k > (DWORD)nWordLen) k = (DWORD)nWordLen;
  87. if(lpRuler[i].CodeUnit[j].dwDirectMode == 0)
  88. lstrcpyn(szDBCS,&szWordStr[2*(k-1)/sizeof(TCHAR)],2/sizeof(TCHAR)+1);
  89. else
  90. lstrcpyn(szDBCS,&szWordStr[2*(nWordLen-k)/sizeof(TCHAR)],2/sizeof(TCHAR)+1);
  91. szDBCS[2/sizeof(TCHAR)] = 0;
  92. k = EncodeToXgbNo(szDBCS, dwNumEncodeArea,dwNumXgbEncodes,hEncode);
  93. if((long)k < 0 || k > dwNumXgbEncodes) {
  94. lpCode[j] = (j > 0)?lpCode[j-1]:Descript.szUsedCode[0];
  95. lpCode[j+1] = 0;
  96. }
  97. else
  98. {
  99. SetFilePointer(hMBFile,MainIndex[TAG_CRTWORDCODE-1].dwOffset+Descript.wMaxCodes*k*sizeof(TCHAR),
  100. 0,FILE_BEGIN);
  101. if (!ReadFile(hMBFile,szCode,Descript.wMaxCodes*sizeof(TCHAR),&k,NULL))
  102. {
  103. CloseHandle(hMBFile);
  104. GlobalFree(hRuler0);
  105. return;
  106. }
  107. szCode[Descript.wMaxCodes] = 0;
  108. dwCodeLen = lstrlen(szCode);
  109. k = lpRuler[i].CodeUnit[j].wCodePosition;
  110. if(k > dwCodeLen) k = dwCodeLen;
  111. if(k == 0) {
  112. if(retCodeLen + dwCodeLen > Descript.wMaxCodes)
  113. szCode[Descript.wMaxCodes - retCodeLen] = 0;
  114. lstrcat(lpCode,szCode);
  115. }
  116. else {
  117. if(k > dwCodeLen) k = dwCodeLen;
  118. lpCode[j] = (szCode[k-1] == 0)?((k > 1)? szCode[k-2]:Descript.szUsedCode[0]):szCode[k-1];
  119. lpCode[j+1] = 0;
  120. }
  121. retCodeLen = lstrlen(lpCode);
  122. }
  123. }
  124. bReturn = TRUE;
  125. break;
  126. }
  127. CloseHandle(hMBFile);
  128. GlobalFree(hRuler0);
  129. return;
  130. }
  131. BOOL ConvGetMainIndex(HANDLE hWnd, HANDLE hMBFile, LPMAININDEX lpMainIndex)
  132. {
  133. DWORD dwBytes;
  134. int i;
  135. BOOL retVal;
  136. if(SetFilePointer(hMBFile,ID_LENGTH,0,FILE_BEGIN) != ID_LENGTH)
  137. return FALSE;
  138. retVal = ReadFile(hMBFile,lpMainIndex,sizeof(MAININDEX)*NUMTABLES,&dwBytes,NULL);
  139. if (retVal == FALSE )
  140. return retVal;
  141. if(dwBytes < sizeof(MAININDEX)*NUMTABLES ) {
  142. return FALSE;
  143. }
  144. else
  145. return TRUE;
  146. for(i=0; i<NUMTABLES; i++) {
  147. dwBytes = lpMainIndex[i].dwTag+
  148. lpMainIndex[i].dwOffset+
  149. lpMainIndex[i].dwLength;
  150. if(lpMainIndex[i].dwCheckSum != dwBytes) {
  151. return FALSE;
  152. }
  153. }
  154. }
  155. #ifdef IDEBUG
  156. extern void OutputDbgWord( );
  157. #endif
  158. BOOL ConvReadDescript(HANDLE hMBFile,
  159. LPDESCRIPTION lpDescript,
  160. LPMAININDEX lpMainIndex)
  161. //*** read description from .MB file ****
  162. {
  163. DWORD dwBytes;
  164. BOOL retVal;
  165. DWORD dwOffset = lpMainIndex[TAG_DESCRIPTION-1].dwOffset;
  166. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  167. return FALSE;
  168. retVal = ReadFile(hMBFile,lpDescript,sizeof(DESCRIPTION),&dwBytes,NULL);
  169. if ( retVal == FALSE )
  170. return retVal;
  171. #ifdef IDEBUG
  172. {
  173. DWORD dwtmp;
  174. OutputDebugString(L"Under ConvReadDescript\n");
  175. OutputDebugString(L"dwBytes=");
  176. OutputDbgWord(dwBytes);
  177. OutputDebugString(L"Sizeof(MBDESC)=");
  178. dwtmp = (DWORD)sizeof(MBDESC);
  179. OutputDbgWord(dwtmp);
  180. OutputDebugString(L"\n");
  181. OutputDebugString(L"szName=");
  182. OutputDebugString(lpDescript->szName);
  183. OutputDebugString(L"\n");
  184. OutputDebugString(L"wMaxCodes=");
  185. dwtmp = (DWORD)(lpDescript->wMaxCodes);
  186. OutputDbgWord( dwtmp );
  187. OutputDebugString(L"\n");
  188. OutputDebugString(L"wNumCodes=");
  189. dwtmp = (DWORD)(lpDescript->wNumCodes);
  190. OutputDbgWord(dwtmp);
  191. OutputDebugString(L"\n");
  192. OutputDebugString(L"byMaxElement=");
  193. dwtmp = (DWORD)(lpDescript->byMaxElement) & 0x0000000f;
  194. OutputDbgWord(dwtmp);
  195. OutputDebugString(L"\n");
  196. OutputDebugString(L"cWildChar=");
  197. dwtmp = (DWORD)(lpDescript->cWildChar);
  198. OutputDbgWord( dwtmp );
  199. OutputDebugString(L"\n");
  200. OutputDebugString(L"wNumRulers=");
  201. dwtmp = (DWORD)(lpDescript->wNumRulers);
  202. OutputDbgWord( dwtmp );
  203. OutputDebugString(L"\n");
  204. }
  205. #endif
  206. if(dwBytes < sizeof(DESCRIPTION) )
  207. return FALSE;
  208. else
  209. return TRUE;
  210. }
  211. BOOL ConvReadRuler(HANDLE hMBFile,
  212. int nRulerNum,
  213. LPRULER lpRuler,
  214. LPMAININDEX lpMainIndex)
  215. //*** read create word ruler from .MB file ****
  216. {
  217. DWORD dwBytes;
  218. BOOL retVal;
  219. DWORD dwOffset = lpMainIndex[TAG_RULER-1].dwOffset;
  220. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  221. return FALSE;
  222. retVal = ReadFile(hMBFile,lpRuler,nRulerNum*sizeof(RULER),&dwBytes,NULL);
  223. if ( retVal == FALSE )
  224. return retVal;
  225. if(dwBytes < nRulerNum*sizeof(RULER) )
  226. return FALSE;
  227. else
  228. return TRUE;
  229. }
  230. BOOL ConvGetEncode(HANDLE hMBFile,
  231. LPENCODEAREA lpEncode,
  232. LPDWORD fdwNumSWords,
  233. LPDWORD fdwNumEncodeArea,
  234. LPMAININDEX lpMainIndex)
  235. {
  236. DWORD dwBytes;
  237. BOOL retVal;
  238. DWORD dwOffset=lpMainIndex[TAG_INTERCODE-1].dwOffset;
  239. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  240. return FALSE;
  241. retVal = ReadFile(hMBFile,fdwNumSWords,4,&dwBytes,NULL);
  242. if ( retVal == FALSE )
  243. return retVal;
  244. retVal = ReadFile(hMBFile,fdwNumEncodeArea,4,&dwBytes,NULL);
  245. if ( retVal == FALSE )
  246. return retVal;
  247. retVal = ReadFile(hMBFile,lpEncode,
  248. lpMainIndex[TAG_INTERCODE-1].dwLength,&dwBytes,NULL);
  249. if ( retVal == FALSE )
  250. return retVal;
  251. if(dwBytes < lpMainIndex[TAG_INTERCODE-1].dwLength)
  252. return FALSE;
  253. else
  254. return TRUE;
  255. }
  256. DWORD EncodeToXgbNo(LPTSTR szDBCS,
  257. DWORD dwNumEncodeArea,
  258. DWORD dwNumXgbEncodes,
  259. HANDLE hEncode)
  260. {
  261. LPENCODEAREA lpEncode;
  262. WORD wCode;
  263. DWORD dwNo = 0xffffffff, i;
  264. #ifdef UNICODE
  265. wCode = szDBCS[0];
  266. #else
  267. wCode = (WORD)((UCHAR)szDBCS[0])*256 + (WORD)(UCHAR)szDBCS[1];
  268. #endif
  269. lpEncode = (LPENCODEAREA) GlobalLock(hEncode);
  270. if(!lpEncode){
  271. return dwNo;
  272. }
  273. for( i = dwNumEncodeArea -1; (long)i>=0; i--) {
  274. if(wCode >= lpEncode[i].StartEncode) {
  275. dwNo = lpEncode[i].PreCount;
  276. dwNo += wCode - lpEncode[i].StartEncode;
  277. break;
  278. }
  279. }
  280. if(dwNo > dwNumXgbEncodes )
  281. dwNo = 0xffffffff;
  282. GlobalUnlock(hEncode);
  283. return dwNo;
  284. }