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.

1167 lines
33 KiB

  1. /*************************************************
  2. * convcomm.c *
  3. * *
  4. * Copyright (C) 1995-1999 Microsoft Inc. *
  5. * *
  6. *************************************************/
  7. #include "conv.h"
  8. int CheckDescription(HANDLE hWnd, LPDESCRIPTION lpDescript)
  9. //*** check description illegal ****
  10. {
  11. TCHAR szStr[256];
  12. if(lstrlen(lpDescript->szName) == 0) {
  13. LoadString(NULL,IDS_IMENAMEENTRY,szStr, sizeof(szStr)/sizeof(TCHAR));
  14. InfoMessage(hWnd,szStr);
  15. lpDescript->szName[24] = 0;
  16. return FALSE;
  17. }
  18. if(lpDescript->wMaxCodes == 0) {
  19. LoadString(NULL,IDS_MAXCODESENTRY,szStr, sizeof(szStr)/sizeof(TCHAR));
  20. WarnMessage(hWnd,szStr);
  21. return FALSE;
  22. }
  23. if(lpDescript->byMaxElement == 0) {
  24. lpDescript->byMaxElement = 1;
  25. LoadString(NULL,IDS_ELEMENTENTRY,szStr, sizeof(szStr)/sizeof(TCHAR));
  26. WarnMessage(hWnd,szStr);
  27. return FALSE;
  28. }
  29. if( !CheckCodeCollection(hWnd,lpDescript->szUsedCode) )
  30. return FALSE;
  31. lpDescript->wNumCodes = (WORD) lstrlen(lpDescript->szUsedCode);
  32. if(lpDescript->cWildChar == 0)
  33. lpDescript->cWildChar = '?';
  34. if(_tcschr(lpDescript->szUsedCode,lpDescript->cWildChar) != NULL) {
  35. ProcessError(ERR_WILDCHAR,hWnd,ERR);
  36. return FALSE;
  37. }
  38. if(lpDescript->wNumRules >= 12) {
  39. lpDescript->wNumRules=0;
  40. LoadString(NULL,IDS_NUMRULESENTRY,szStr, sizeof(szStr)/sizeof(TCHAR));
  41. WarnMessage(szStr,hWnd);
  42. return FALSE;
  43. }
  44. return TRUE;
  45. }
  46. int GetDescriptEntry(LPTSTR szSrcStr, LPDESCRIPTION lpDescript)
  47. //*** get one description entry from source string ****
  48. {
  49. TCHAR szStr[256];
  50. int retValue;
  51. SetCursor (LoadCursor (NULL, IDC_WAIT));
  52. if( GetEntryString(szSrcStr,
  53. TEXT("Name"),
  54. lpDescript->szName,
  55. lpDescript->szName,
  56. NAMESIZE-1)
  57. )
  58. return TRUE;
  59. if( GetEntryInt(szSrcStr,
  60. TEXT("MaxCodes"),
  61. (int)lpDescript->wMaxCodes,
  62. &retValue)
  63. )
  64. {
  65. lpDescript->wMaxCodes = (WORD)retValue;
  66. return TRUE;
  67. }
  68. if( GetEntryInt(szSrcStr,
  69. TEXT("MaxElement"),
  70. (int)lpDescript->byMaxElement,
  71. & retValue)
  72. )
  73. {
  74. lpDescript->byMaxElement = (BYTE) retValue;
  75. return TRUE;
  76. }
  77. retValue = GetEntryString(szSrcStr,
  78. TEXT("UsedCodes"),
  79. lpDescript->szUsedCode,
  80. szStr,
  81. MAXUSEDCODES
  82. );
  83. if(retValue)
  84. {
  85. DelSpace(szStr);
  86. lstrncpy(lpDescript->szUsedCode,MAXUSEDCODES,szStr);
  87. return TRUE;
  88. }
  89. szStr[0] = lpDescript->cWildChar;
  90. szStr[1] = 0;
  91. retValue = GetEntryString(szSrcStr,
  92. TEXT("WildChar"),
  93. szStr,
  94. szStr,
  95. sizeof(szStr)/sizeof(TCHAR));
  96. if(retValue)
  97. {
  98. DelSpace(szStr);
  99. lpDescript->cWildChar = szStr[0];
  100. return TRUE;
  101. }
  102. if(GetEntryInt(szSrcStr,
  103. TEXT("NumRules"),
  104. (int)lpDescript->wNumRules,
  105. &retValue )
  106. )
  107. lpDescript->wNumRules = (WORD)retValue;
  108. return TRUE;
  109. }
  110. int ConvGetDescript(HANDLE hWnd,
  111. LPCTSTR FileName,
  112. LPDWORD fdwOffset,
  113. LPDWORD fdwLen,
  114. LPDESCRIPTION lpDescript,
  115. BOOL bOnlyGetLength)
  116. {
  117. TCHAR szStr[1024];
  118. TCHAR *Buffer;
  119. BOOL bDescript = FALSE,bText = FALSE,bRule = FALSE;
  120. BOOL bGetDes = FALSE;
  121. register int i,j;
  122. DWORD dwFstOffset=0 , dwOffset;
  123. DWORD dwReadBytes;
  124. HANDLE hFile;
  125. HLOCAL hBuffer;
  126. int errno;
  127. if(!bOnlyGetLength)
  128. {
  129. memset(lpDescript->szName,0,sizeof(lpDescript->szName));
  130. lpDescript->wMaxCodes=0;
  131. lpDescript->byMaxElement=1;
  132. memset(lpDescript->szUsedCode,0,sizeof(lpDescript->szUsedCode));
  133. lpDescript->wNumRules=0;
  134. lpDescript->wNumCodes=0;
  135. lpDescript->cWildChar=0;
  136. }
  137. hFile = Create_File(hWnd,FileName,GENERIC_READ,OPEN_EXISTING);
  138. if (hFile == (HANDLE)-1)
  139. return (-ERR_FILENOTOPEN);
  140. hBuffer = LocalAlloc(LMEM_ZEROINIT|LMEM_MOVEABLE, MAXREADBUFFER);
  141. Buffer = (TCHAR *) LocalLock(hBuffer);
  142. SetCursor (LoadCursor (NULL, IDC_WAIT));
  143. *fdwOffset = 0;
  144. SetFilePointer(hFile,0,0,FILE_BEGIN);
  145. while(ReadFile(hFile,Buffer,MAXREADBUFFER,&dwReadBytes,NULL))
  146. {
  147. dwReadBytes = dwReadBytes/sizeof(TCHAR);
  148. lstrcpy(szStr,TEXT(""));
  149. j=0;
  150. for(i=0;i<(int)dwReadBytes;i++) {
  151. if(Buffer[i] == 0x0d || Buffer[i] == 0xfeff)
  152. continue;
  153. else if(Buffer[i] == TEXT('\n')) {
  154. szStr[j]=0;
  155. j=0;
  156. if(lstrlen(szStr) < 6) continue;
  157. if(lstrcmpi(szStr,TEXT(DescriptSeg))==0) {
  158. #ifdef UNICODE
  159. *fdwOffset= dwOffset - 2; //the size of 0xfeff flag
  160. #else
  161. *fdwOffset= dwOffset;
  162. #endif
  163. bDescript = TRUE;
  164. bGetDes = TRUE;
  165. lstrcpy(szStr,TEXT(""));
  166. continue;
  167. }
  168. if( lstrcmpi(szStr,TEXT(TextSeg))==0)
  169. {
  170. bText =TRUE;
  171. bGetDes = FALSE;
  172. }
  173. if( lstrcmpi(szStr,TEXT(RuleSeg))==0)
  174. {
  175. bRule = TRUE;
  176. bGetDes = FALSE;
  177. }
  178. if( (bText||bRule)&& bDescript && !bGetDes) {
  179. *fdwLen = dwOffset - (*fdwOffset);
  180. if(!bOnlyGetLength)
  181. errno = CheckDescription(hWnd, lpDescript);
  182. LocalUnlock(hBuffer);
  183. LocalFree(hBuffer);
  184. CloseHandle(hFile);
  185. SetCursor (LoadCursor (NULL, IDC_ARROW));
  186. return errno;
  187. }
  188. if(bGetDes && !bOnlyGetLength)
  189. {
  190. GetDescriptEntry(szStr,lpDescript);
  191. }
  192. lstrcpy(szStr,TEXT(""));
  193. continue;
  194. }
  195. else {
  196. if(j == 0)
  197. dwOffset = dwFstOffset + i*sizeof(TCHAR);
  198. if(j<1024){
  199. szStr[j]=Buffer[i];
  200. j++;
  201. }
  202. }
  203. }
  204. if(dwReadBytes*sizeof(TCHAR) < MAXREADBUFFER) break;
  205. dwFstOffset += MAXREADBUFFER;
  206. };
  207. *fdwLen = dwFstOffset+dwReadBytes-(*fdwOffset);
  208. if(!bDescript) *fdwLen = 0;
  209. LocalUnlock(hBuffer);
  210. LocalFree(hBuffer);
  211. CloseHandle(hFile);
  212. errno = 0;
  213. if(!bText) {
  214. ProcessError(ERR_TEXTSEG,hWnd,ERR);
  215. errno |= 4;
  216. }
  217. if(!bDescript) {
  218. if(bText)
  219. ProcessError(ERR_DESCRIPTSEG,hWnd,ERR);
  220. errno |= 1;
  221. }
  222. if(!bRule){
  223. if(bText && bDescript)
  224. ProcessError(ERR_RULESEG,hWnd,WARNING);
  225. errno |= 2;
  226. }
  227. SetCursor (LoadCursor (NULL, IDC_ARROW));
  228. if(bDescript && bRule && bText)
  229. return TRUE;
  230. else
  231. return (-errno);
  232. }
  233. BOOL ConvSaveDescript(LPCTSTR SrcFileName,
  234. LPDESCRIPTION lpDescript,
  235. DWORD dwOffset,
  236. DWORD dwLength)
  237. //*** save MB description to source text file ****
  238. {
  239. TCHAR szStr[256],szTemp[80],Buffer[4096];
  240. DWORD dwBytes,dwNewLen;
  241. HANDLE hSrcFile;
  242. BOOL bText=TRUE;
  243. WORD wFlag;
  244. hSrcFile = Create_File(GetFocus(),SrcFileName,GENERIC_READ|GENERIC_WRITE,OPEN_EXISTING);
  245. if (hSrcFile == (HANDLE)-1)
  246. return FALSE;
  247. #ifdef UNICODE
  248. Buffer[0] = 0xfeff;
  249. lstrcpy(&Buffer[1],TEXT("[Description]\r\n"));
  250. #else
  251. lstrcpy(Buffer,TEXT("[Description]\r\n"));
  252. #endif
  253. SetFilePointer(hSrcFile,dwOffset+dwLength,0,FILE_BEGIN);
  254. ReadFile(hSrcFile,szTemp,sizeof(szTemp), &dwBytes,NULL);
  255. if(dwBytes == 0 || szTemp[0] != TEXT('['))
  256. bText = FALSE;
  257. if(SetFilePointer(hSrcFile,dwOffset,0,FILE_BEGIN) != dwOffset) {
  258. CloseHandle(hSrcFile);
  259. return FALSE;
  260. }
  261. if(!CheckCodeCollection(GetFocus(),lpDescript->szUsedCode))
  262. {
  263. CloseHandle(hSrcFile);
  264. return FALSE;
  265. }
  266. SetCursor (LoadCursor (NULL, IDC_WAIT));
  267. //write code list name to buffer ****
  268. wsprintf(szStr,TEXT("Name=%s\r\n"),lpDescript->szName);
  269. lstrcat(Buffer,szStr);
  270. //write maximum length of codes to buffer***
  271. wsprintf(szStr,TEXT("MaxCodes=%d\r\n"),(int)lpDescript->wMaxCodes);
  272. lstrcat(Buffer,szStr);
  273. //write maximum element to Buffer ***
  274. wsprintf(szStr,TEXT("MaxElement=%d\r\n"),(int)lpDescript->byMaxElement);
  275. lstrcat(Buffer,szStr);
  276. //write used codes collection ***
  277. lstrncpy(szTemp,MAXUSEDCODES,lpDescript->szUsedCode);
  278. szTemp[MAXUSEDCODES]=0;
  279. wsprintf(szStr,TEXT("UsedCodes=%s\r\n"),lpDescript->szUsedCode);
  280. lstrcat(Buffer,szStr);
  281. //write wild char ***
  282. if(lpDescript->cWildChar == 0)
  283. lpDescript->cWildChar = TEXT('?'); //**** add by yehfeh 95.10.11
  284. wsprintf(szStr,TEXT("WildChar=%c\r\n"),lpDescript->cWildChar);
  285. lstrcat(Buffer,szStr);
  286. //write number of rules ***
  287. wsprintf(szStr,TEXT("NumRules=%d\r\n"),(int)lpDescript->wNumRules);
  288. lstrcat(Buffer,szStr);
  289. if(!bText)
  290. lstrcat(Buffer,TEXT("[Text]\r\n"));
  291. dwNewLen = lstrlen(Buffer)*sizeof(TCHAR);
  292. if(dwNewLen > dwLength)
  293. MoveFileBlock(hSrcFile,dwOffset+dwLength,dwNewLen-dwLength,1);
  294. else
  295. MoveFileBlock(hSrcFile,dwOffset+dwLength,dwLength-dwNewLen,0);
  296. SetFilePointer(hSrcFile,dwOffset,0,FILE_BEGIN);
  297. WriteFile(hSrcFile,Buffer,dwNewLen,&dwBytes,NULL);
  298. CloseHandle(hSrcFile);
  299. SetCursor (LoadCursor (NULL, IDC_ARROW));
  300. return TRUE;
  301. }
  302. int ConvGetRule(HANDLE hWnd,LPCTSTR lpSrcFile,LPDWORD fdwOffset,
  303. LPDWORD fdwRuleLen,LPRULE lpRule, LPDESCRIPTION lpDescript)
  304. //*** read create word rule from source text file****
  305. {
  306. TCHAR szStr[256],Buffer[MAXREADBUFFER];
  307. BOOL bRule=FALSE;
  308. register int i,j;
  309. DWORD dwReadBytes;
  310. DWORD dwNumRules = 0;
  311. DWORD dwFstOffset = 0, dwOffset;
  312. HANDLE hSrcFile;
  313. *fdwOffset = 0;
  314. hSrcFile = Create_File(hWnd,lpSrcFile,GENERIC_READ,OPEN_EXISTING);
  315. if (hSrcFile == (HANDLE)-1)
  316. return (-ERR_FILENOTOPEN);
  317. SetCursor (LoadCursor (NULL, IDC_WAIT));
  318. SetFilePointer(hSrcFile,0,0,FILE_BEGIN);
  319. while(ReadFile(hSrcFile,Buffer,MAXREADBUFFER,&dwReadBytes,NULL))
  320. {
  321. dwReadBytes = dwReadBytes/sizeof(TCHAR);
  322. lstrcpy(szStr,TEXT(""));
  323. j=0;
  324. for(i=0;i<(int)dwReadBytes;i++) {
  325. if(Buffer[i] == 0x0d || Buffer[i] == 0xfeff)
  326. continue;
  327. else if(Buffer[i] == TEXT('\n')) {
  328. szStr[j]=0;
  329. j=0;
  330. if(lstrlen(szStr) < 4) continue;
  331. if(lstrcmpi(szStr,TEXT(RuleSeg))==0) {
  332. *fdwOffset= dwOffset;
  333. bRule = TRUE;
  334. lstrcpy(szStr,TEXT(""));
  335. continue;
  336. }
  337. if( (lstrcmpi(szStr,TEXT(TextSeg))==0
  338. ||lstrcmpi(szStr,TEXT(DescriptSeg))==0)
  339. && bRule) {
  340. *fdwRuleLen = dwOffset - (*fdwOffset);
  341. CloseHandle(hSrcFile);
  342. SetCursor (LoadCursor (NULL, IDC_ARROW));
  343. if(dwNumRules != lpDescript->wNumRules) {
  344. ProcessError(ERR_RULENUM,hWnd,ERR);
  345. lpDescript->wNumRules =(WORD) dwNumRules;
  346. return (-ERR_RULENUM);
  347. }
  348. return TRUE;
  349. }
  350. if(bRule) {
  351. if(RuleParse(hWnd,szStr,dwNumRules,lpRule,lpDescript->wMaxCodes))
  352. dwNumRules ++;
  353. else {
  354. CloseHandle(hSrcFile);
  355. SetCursor (LoadCursor (NULL, IDC_ARROW));
  356. return (-ERR_RULENUM);
  357. }
  358. lstrcpy(szStr,TEXT(""));
  359. if(dwNumRules > lpDescript->wNumRules) {
  360. ProcessError(ERR_RULENUM,hWnd,ERR);
  361. CloseHandle(hSrcFile);
  362. SetCursor (LoadCursor (NULL, IDC_ARROW));
  363. return(-ERR_RULENUM);
  364. }
  365. continue;
  366. }
  367. else {
  368. lstrcpy(szStr,TEXT(""));
  369. continue;
  370. }
  371. }
  372. else {
  373. if(j == 0)
  374. dwOffset = dwFstOffset + i*sizeof(TCHAR);
  375. szStr[j]=Buffer[i];
  376. j++;
  377. }
  378. } /*** for (i=0;...) ****/
  379. if(dwReadBytes*sizeof(TCHAR) < MAXREADBUFFER) break;
  380. dwFstOffset += MAXREADBUFFER;
  381. };
  382. *fdwRuleLen = dwFstOffset+dwReadBytes-(*fdwOffset);
  383. if(!bRule)
  384. *fdwRuleLen=0;
  385. CloseHandle(hSrcFile);
  386. SetCursor (LoadCursor (NULL, IDC_ARROW));
  387. if(bRule||lpDescript->wNumRules==0)
  388. return TRUE;
  389. else {
  390. ProcessError(ERR_RULESEG,hWnd,ERR);
  391. lpDescript->wNumRules=0;
  392. return (-ERR_RULESEG);
  393. }
  394. }
  395. BOOL ConvSaveRule(HANDLE hWnd,LPCTSTR SrcFileName,DWORD dwOffset, DWORD dwLength,
  396. LPRULE lpRule, DWORD dwNumRules)
  397. //*** save create word rule to source text file****
  398. {
  399. TCHAR szStr[256],Buffer[4096];
  400. DWORD dwBytes,dwNewLen;
  401. DWORD i;
  402. HANDLE hFile;
  403. hFile = Create_File(hWnd,SrcFileName,GENERIC_READ|GENERIC_WRITE,OPEN_EXISTING);
  404. if (hFile == (HANDLE)-1)
  405. return FALSE;
  406. SetCursor (LoadCursor (NULL, IDC_WAIT));
  407. lstrcpy(Buffer,TEXT("[Rule]\r\n"));
  408. for(i=0; i<dwNumRules; i++) {
  409. RuleToText(&lpRule[i], szStr);
  410. lstrcat(Buffer,szStr);
  411. }
  412. dwNewLen = lstrlen(Buffer)*sizeof(TCHAR);
  413. if(dwNewLen > dwLength)
  414. MoveFileBlock(hFile,dwOffset+dwLength,dwNewLen-dwLength,1);
  415. else
  416. MoveFileBlock(hFile,dwOffset+dwLength,dwLength-dwNewLen,0);
  417. SetFilePointer(hFile,dwOffset,0,FILE_BEGIN);
  418. WriteFile(hFile,Buffer,dwNewLen,&dwBytes,NULL);
  419. CloseHandle(hFile);
  420. SetCursor (LoadCursor (NULL, IDC_ARROW));
  421. return TRUE;
  422. }
  423. LPTSTR ConvCreateWord(HWND hWnd,LPCTSTR MBFileName,LPTSTR szWordStr)
  424. {
  425. int nWordLen = lstrlen(szWordStr)*sizeof(TCHAR)/2;
  426. DWORD i,j,k,dwCodeLen;
  427. TCHAR szDBCS[3],szCode[MAXCODELEN+1];
  428. static TCHAR lpCode[128];
  429. BOOL bReturn=FALSE;
  430. HANDLE hMBFile;
  431. DESCRIPTION Descript;
  432. HANDLE hRule0;
  433. LPRULE lpRule;
  434. MAININDEX MainIndex[NUMTABLES];
  435. for(i=0; i< 128; i++)
  436. lpCode[0] = 0;
  437. if(lstrlen(MBFileName)==0 || lstrlen(szWordStr) == 0)
  438. return (LPTSTR)lpCode;
  439. hMBFile = Create_File(hWnd,MBFileName,GENERIC_READ,OPEN_EXISTING);
  440. if(hMBFile == (HANDLE)-1)
  441. return (LPTSTR)lpCode;
  442. if(!ConvGetMainIndex(hWnd,hMBFile,MainIndex)) {
  443. CloseHandle(hMBFile);
  444. return (LPTSTR)lpCode;
  445. }
  446. ConvReadDescript(hMBFile,&Descript, MainIndex);
  447. if(Descript.wNumRules == 0) {
  448. MessageBeep((UINT)-1);
  449. MessageBeep((UINT)-1);
  450. CloseHandle(hMBFile);
  451. return (LPTSTR)lpCode;
  452. }
  453. hRule0 = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(RULE)*Descript.wNumRules);
  454. if(!hRule0) {
  455. ProcessError(ERR_OUTOFMEMORY,hWnd,ERR);
  456. CloseHandle(hMBFile);
  457. return (LPTSTR)lpCode;
  458. }
  459. if(!(lpRule = GlobalLock(hRule0)) ) {
  460. ProcessError(ERR_GLOBALLOCK,hWnd,ERR);
  461. CloseHandle(hMBFile);
  462. GlobalFree(hRule0);
  463. return (LPTSTR)lpCode;
  464. }
  465. ConvReadRule(hMBFile,Descript.wNumRules ,lpRule, MainIndex);
  466. for(i=0; i<Descript.wNumRules; i++)
  467. if( (lpRule[i].byLogicOpra == 0 && nWordLen == lpRule[i].byLength)
  468. ||(lpRule[i].byLogicOpra == 1 && nWordLen >= lpRule[i].byLength)
  469. ||(lpRule[i].byLogicOpra == 2 && nWordLen <= lpRule[i].byLength) ) {
  470. int retCodeLen = 0;
  471. for(j=0; j<lpRule[i].wNumCodeUnits; j++) {
  472. k = lpRule[i].CodeUnit[j].wDBCSPosition;
  473. if(k > (DWORD)nWordLen) k = (DWORD)nWordLen;
  474. if(lpRule[i].CodeUnit[j].dwDirectMode == 0)
  475. lstrncpy(szDBCS,2,&szWordStr[2*(k-1)]);
  476. else
  477. lstrncpy(szDBCS,2,&szWordStr[2*(nWordLen-k)]);
  478. szDBCS[2] = 0;
  479. k = EncodeToNo(szDBCS);
  480. if((long)k >= 0 && k < NUM_OF_ENCODE )
  481. {
  482. SetFilePointer(hMBFile,MainIndex[TAG_CRTWORDCODE-1].dwOffset+Descript.wMaxCodes*k*sizeof(TCHAR),
  483. 0,FILE_BEGIN);
  484. ReadFile(hMBFile,szCode,Descript.wMaxCodes,&k,NULL);
  485. szCode[Descript.wMaxCodes] = 0;
  486. dwCodeLen = lstrlen(szCode);
  487. k = lpRule[i].CodeUnit[j].wCodePosition;
  488. if(k == 0)
  489. {
  490. if(retCodeLen + dwCodeLen > Descript.wMaxCodes)
  491. szCode[Descript.wMaxCodes - retCodeLen] = 0;
  492. lstrcat(lpCode,szCode);
  493. }
  494. else
  495. {
  496. if(k > dwCodeLen) k = dwCodeLen;
  497. lpCode[j] = (szCode[k-1] == 0)?((k > 1)? szCode[k-2]:Descript.szUsedCode[0]):szCode[k-1];
  498. }
  499. }
  500. else
  501. lpCode[j] = (j > 0)?lpCode[j-1]:Descript.szUsedCode[0];
  502. retCodeLen = lstrlen(lpCode);
  503. }
  504. bReturn = TRUE;
  505. break;
  506. }
  507. if(!bReturn)
  508. ProcessError(ERR_NOTDEFRULE,GetFocus(),ERR);
  509. lpCode[Descript.wMaxCodes] = 0;
  510. CloseHandle(hMBFile);
  511. GlobalFree(hRule0);
  512. return (LPTSTR)lpCode;
  513. }
  514. INT ReadDescript(LPCTSTR MBFileName, LPDESCRIPTION lpDescript,DWORD ShareMode)
  515. //*** read description from .MB file ****
  516. {
  517. HANDLE hMBFile;
  518. DWORD dwBytes,i;
  519. DWORD dwOffset;
  520. MAININDEX lpMainIndex[NUMTABLES];
  521. hMBFile = Create_File(GetFocus(),MBFileName,GENERIC_READ,OPEN_EXISTING);
  522. if(hMBFile==INVALID_HANDLE_VALUE)
  523. return -1;
  524. SetFilePointer(hMBFile,ID_LENGTH,0,FILE_BEGIN);
  525. ReadFile(hMBFile,lpMainIndex,sizeof(MAININDEX)*NUMTABLES,&dwBytes,NULL);
  526. for(i=0; i<NUMTABLES; i++) {
  527. dwBytes = lpMainIndex[i].dwTag+
  528. lpMainIndex[i].dwOffset+
  529. lpMainIndex[i].dwLength;
  530. if(lpMainIndex[i].dwCheckSum != dwBytes) {
  531. CloseHandle(hMBFile);
  532. return FALSE;
  533. }
  534. }
  535. dwOffset = lpMainIndex[TAG_DESCRIPTION-1].dwOffset;
  536. SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN);
  537. ReadFile(hMBFile,lpDescript,sizeof(DESCRIPTION),&dwBytes,NULL);
  538. CloseHandle(hMBFile);
  539. if(dwBytes < sizeof(DESCRIPTION) )
  540. return FALSE;
  541. else
  542. return TRUE;
  543. }
  544. BOOL ReadRule(HWND hWnd,
  545. LPCTSTR MBFileName,
  546. int nRuleNum,
  547. LPRULE lpRule)
  548. //*** read create word rule from .MB file ****
  549. {
  550. HANDLE hMBFile;
  551. DWORD dwBytes,i;
  552. DWORD dwOffset;
  553. MAININDEX lpMainIndex[NUMTABLES];
  554. hMBFile = Create_File(hWnd,MBFileName,GENERIC_READ,OPEN_EXISTING);
  555. if(hMBFile==INVALID_HANDLE_VALUE)
  556. return(0);
  557. SetFilePointer(hMBFile,ID_LENGTH,0,FILE_BEGIN);
  558. ReadFile(hMBFile,lpMainIndex,sizeof(MAININDEX)*NUMTABLES,&dwBytes,NULL);
  559. for(i=0; i<NUMTABLES; i++) {
  560. dwBytes = lpMainIndex[i].dwTag+
  561. lpMainIndex[i].dwOffset+
  562. lpMainIndex[i].dwLength;
  563. if(lpMainIndex[i].dwCheckSum != dwBytes) {
  564. //ProcessError(ERR_READMAININDEX,hWnd);
  565. return FALSE;
  566. }
  567. }
  568. dwOffset = lpMainIndex[TAG_RULE-1].dwOffset;
  569. SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN);
  570. ReadFile(hMBFile,lpRule,nRuleNum*sizeof(RULE),&dwBytes,NULL);
  571. CloseHandle(hMBFile);
  572. if(dwBytes < nRuleNum*sizeof(RULE) )
  573. return FALSE;
  574. else
  575. return TRUE;
  576. }
  577. BOOL RuleParse(HANDLE hWnd, LPTSTR szStr,DWORD dwRuleNum, LPRULE lpRule, WORD wMaxCodes)
  578. {
  579. LPTSTR lpString;
  580. DWORD i,j;
  581. DWORD dwLen;
  582. BYTE byDBCSLen, byDBCSPos, byCodePos;
  583. static TCHAR subDBCS[] =TEXT("123456789abcdef");
  584. static TCHAR subCode[] =TEXT("0123456789abc");
  585. DelSpace(szStr);
  586. dwLen = lstrlen(szStr);
  587. if(dwLen == 0) return FALSE;
  588. if(_tcschr(szStr,TEXT('=')) == NULL) {
  589. ProcessError(ERR_RULEEQUAL,hWnd,ERR);
  590. return FALSE;
  591. }
  592. if(_tcschr(TEXT("Cc"),szStr[0]) == NULL) {
  593. ProcessError(ERR_RULEHEADER,hWnd,ERR);
  594. return FALSE;
  595. }
  596. if(_tcschr(TEXT("EeAaBb"),szStr[1]) == NULL) {
  597. ProcessError(ERR_RULELOGICOPRA,hWnd,ERR);
  598. return FALSE;
  599. }
  600. if(_tcschr(subDBCS,szStr[2]) == NULL
  601. || szStr[3] != TEXT('=')) {
  602. ProcessError(ERR_RULEWORDLEN,hWnd,ERR);
  603. return FALSE;
  604. }
  605. byDBCSLen = (szStr[2] > TEXT('9'))?szStr[2]-TEXT('a')+10:szStr[2]-TEXT('0');
  606. lpRule[dwRuleNum].wNumCodeUnits = 0;
  607. lpString = &szStr[4];
  608. for(i=0; i<dwLen-4; i+=4) {
  609. if(_tcschr(TEXT("PpNn"), lpString[i]) == NULL) {
  610. ProcessError(ERR_RULEDIRECTMODE,hWnd,ERR);
  611. return FALSE;
  612. }
  613. byDBCSPos = (lpString[i+1]>TEXT('9'))?10+lpString[i+1]-TEXT('a'):lpString[i+1]-TEXT('0');
  614. if(_tcschr(subDBCS, lpString[i+1]) == NULL
  615. ||byDBCSPos > byDBCSLen) {
  616. ProcessError(ERR_RULEDBCSPOS,hWnd,ERR) ;
  617. return FALSE;
  618. }
  619. byCodePos = (lpString[i+2]>TEXT('9'))?lpString[i+2]-TEXT('a')+10:lpString[i+2]-TEXT('0');
  620. if(_tcschr(subCode, lpString[i+2]) == NULL
  621. || (lpString[i+3] != TEXT('+') && lpString[i+3] != 0)
  622. || byCodePos > wMaxCodes) {
  623. ProcessError(ERR_RULECODEPOS,hWnd,ERR);
  624. return FALSE;
  625. }
  626. j = lpRule[dwRuleNum].wNumCodeUnits;
  627. lpRule[dwRuleNum].CodeUnit[j].dwDirectMode=(lpString[i]==TEXT('p'))?0:1;
  628. lpRule[dwRuleNum].CodeUnit[j].wDBCSPosition=(WORD)byDBCSPos;
  629. lpRule[dwRuleNum].CodeUnit[j].wCodePosition=(WORD)byCodePos;
  630. lpRule[dwRuleNum].wNumCodeUnits ++;
  631. }
  632. lpRule[dwRuleNum].byLogicOpra = (szStr[1]==TEXT('e'))?0:(szStr[1]==TEXT('a'))?1:2;
  633. lpRule[dwRuleNum].byLength = byDBCSLen;
  634. return TRUE;
  635. }
  636. BOOL ConvGetMainID(HANDLE hMBFile,LPMAINID lpMainID)
  637. {
  638. DWORD dwBytes;
  639. SetFilePointer(hMBFile,0,0,FILE_BEGIN);
  640. ReadFile(hMBFile,lpMainID,sizeof(MAINID),&dwBytes,NULL);
  641. if(dwBytes < sizeof(MAINID) )
  642. return FALSE;
  643. else
  644. return TRUE;
  645. }
  646. BOOL ConvWriteMainID(HANDLE hMBFile,LPMAINID lpMainID)
  647. {
  648. DWORD dwBytes;
  649. if(SetFilePointer(hMBFile,0,0,FILE_BEGIN) != 0)
  650. return FALSE;
  651. WriteFile(hMBFile,lpMainID,sizeof(MAINID),&dwBytes,NULL);
  652. if(dwBytes < sizeof(MAINID) )
  653. return FALSE;
  654. else
  655. return TRUE;
  656. }
  657. BOOL ConvGetMainIndex(HANDLE hWnd, HANDLE hMBFile, LPMAININDEX lpMainIndex)
  658. {
  659. DWORD dwBytes;
  660. int i;
  661. if(SetFilePointer(hMBFile,ID_LENGTH,0,FILE_BEGIN) != ID_LENGTH)
  662. return FALSE;
  663. ReadFile(hMBFile,lpMainIndex,sizeof(MAININDEX)*NUMTABLES,&dwBytes,NULL);
  664. if(dwBytes < sizeof(MAININDEX)*NUMTABLES ) {
  665. ProcessError(ERR_READMAININDEX,hWnd,ERR);
  666. return FALSE;
  667. }
  668. else
  669. return TRUE;
  670. for(i=0; i<NUMTABLES; i++) {
  671. dwBytes = lpMainIndex[i].dwTag+
  672. lpMainIndex[i].dwOffset+
  673. lpMainIndex[i].dwLength;
  674. if(lpMainIndex[i].dwCheckSum != dwBytes) {
  675. ProcessError(ERR_READMAININDEX,hWnd,ERR);
  676. return FALSE;
  677. }
  678. }
  679. }
  680. BOOL ConvWriteMainIndex(HANDLE hMBFile, LPMAININDEX lpMainIndex)
  681. {
  682. DWORD dwBytes;
  683. if(SetFilePointer(hMBFile,ID_LENGTH,0,FILE_BEGIN) != ID_LENGTH)
  684. return FALSE;
  685. WriteFile(hMBFile,lpMainIndex,sizeof(MAININDEX)*NUMTABLES,&dwBytes,NULL);
  686. if(dwBytes < sizeof(MAININDEX)*NUMTABLES )
  687. return FALSE;
  688. else
  689. return TRUE;
  690. }
  691. BOOL ConvReadDescript(HANDLE hMBFile,
  692. LPDESCRIPTION lpDescript,
  693. LPMAININDEX lpMainIndex)
  694. //*** read description from .MB file ****
  695. {
  696. DWORD dwBytes;
  697. DWORD dwOffset = lpMainIndex[TAG_DESCRIPTION-1].dwOffset;
  698. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  699. return FALSE;
  700. ReadFile(hMBFile,lpDescript,sizeof(DESCRIPTION),&dwBytes,NULL);
  701. if(dwBytes < sizeof(DESCRIPTION) )
  702. return FALSE;
  703. else
  704. return TRUE;
  705. }
  706. BOOL ConvWriteDescript(HANDLE hMBFile,
  707. LPDESCRIPTION lpDescript,
  708. LPMAININDEX lpMainIndex)
  709. //*** write description to .MB file ****
  710. {
  711. DWORD dwBytes;
  712. DWORD dwOffset = lpMainIndex[TAG_DESCRIPTION-1].dwOffset;
  713. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  714. return FALSE;
  715. WriteFile(hMBFile,lpDescript,sizeof(DESCRIPTION),&dwBytes,NULL);
  716. if(dwBytes < sizeof(DESCRIPTION) )
  717. return FALSE;
  718. else
  719. return TRUE;
  720. }
  721. BOOL ConvReadRule(HANDLE hMBFile,
  722. int nRuleNum,
  723. LPRULE lpRule,
  724. LPMAININDEX lpMainIndex)
  725. //*** read create word rule from .MB file ****
  726. {
  727. DWORD dwBytes;
  728. DWORD dwOffset = lpMainIndex[TAG_RULE-1].dwOffset;
  729. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  730. return FALSE;
  731. ReadFile(hMBFile,lpRule,nRuleNum*sizeof(RULE),&dwBytes,NULL);
  732. if(dwBytes < nRuleNum*sizeof(RULE) )
  733. return FALSE;
  734. else
  735. return TRUE;
  736. }
  737. BOOL ConvWriteRule(HANDLE hMBFile,
  738. int nRuleNum,
  739. LPRULE lpRule,
  740. LPMAININDEX lpMainIndex)
  741. //*** write create word rule to .MB file ****
  742. {
  743. DWORD dwBytes;
  744. DWORD dwOffset = lpMainIndex[TAG_RULE-1].dwOffset;
  745. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  746. return FALSE;
  747. WriteFile(hMBFile,lpRule,nRuleNum*sizeof(RULE),&dwBytes,NULL);
  748. if(dwBytes < nRuleNum*sizeof(RULE) )
  749. return FALSE;
  750. else
  751. return TRUE;
  752. }
  753. BOOL ConvGetEncode(HANDLE hMBFile,
  754. LPENCODEAREA lpEncode,
  755. LPDWORD fdwNumSWords,
  756. LPDWORD fdwNumEncodeArea,
  757. LPMAININDEX lpMainIndex)
  758. {
  759. DWORD dwBytes;
  760. DWORD dwOffset=lpMainIndex[TAG_ENCODE-1].dwOffset;
  761. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  762. return FALSE;
  763. ReadFile(hMBFile,fdwNumSWords,4,&dwBytes,NULL);
  764. ReadFile(hMBFile,fdwNumEncodeArea,4,&dwBytes,NULL);
  765. ReadFile(hMBFile,lpEncode,
  766. lpMainIndex[TAG_ENCODE-1].dwLength,&dwBytes,NULL);
  767. if(dwBytes < lpMainIndex[TAG_ENCODE-1].dwLength)
  768. return FALSE;
  769. else
  770. return TRUE;
  771. }
  772. //BOOL ConvInitEncode(LPENCODEAREA lpEncode)
  773. BOOL ConvInitEncode(HGLOBAL hEncode)
  774. {
  775. LPENCODEAREA lpEncode;
  776. DWORD i;
  777. lpEncode = (LPENCODEAREA) GlobalLock(hEncode);
  778. #ifdef UNICODE
  779. //CJK Symbols and Punctuation
  780. lpEncode[0].StartEncode = 0x3000;
  781. lpEncode[0].EndEncode = 0x303f;
  782. //CJK Miscellaneous
  783. lpEncode[1].StartEncode = 0x3190;
  784. lpEncode[1].EndEncode = 0x319f;
  785. //Enclosed CJK Letters
  786. lpEncode[2].StartEncode = 0x3200;
  787. lpEncode[2].EndEncode = 0x32ff;
  788. //CJK Compatibility
  789. lpEncode[3].StartEncode = 0x3300;
  790. lpEncode[3].EndEncode = 0x33ff;
  791. //CJK Unified Ideograph
  792. lpEncode[4].StartEncode = 0x4e00;
  793. lpEncode[4].EndEncode = 0x9fff;
  794. //Private Use Area
  795. lpEncode[5].StartEncode = 0xe000;
  796. lpEncode[5].EndEncode = 0xf8ff;
  797. //CJK Compatibility Ideograph
  798. lpEncode[6].StartEncode = 0xf900;
  799. lpEncode[6].EndEncode = 0xfaff;
  800. //CJK Compatibility Font
  801. lpEncode[7].StartEncode = 0xfe30;
  802. lpEncode[7].EndEncode = 0xfe4f;
  803. lpEncode[0].PreCount = 0;
  804. for(i=1; i< NUMENCODEAREA; i++) {
  805. lpEncode[i].PreCount = lpEncode[i-1].PreCount + lpEncode[i-1].EndEncode
  806. - lpEncode[i-1].StartEncode + 1;
  807. }
  808. #else
  809. for(i=0; i< NUMENCODEAREA/2; i++) {
  810. lpEncode[2*i].PreCount = i*190;
  811. lpEncode[2*i].StartEncode = (0x81+i)*256 + 0x40;
  812. lpEncode[2*i].EndEncode = lpEncode[2*i].StartEncode + 0x3e;
  813. lpEncode[2*i+1].PreCount = i*190 + 0x3f ;
  814. lpEncode[2*i+1].StartEncode = (0x81+i)*256 + 0x80;
  815. lpEncode[2*i+1].EndEncode = lpEncode[2*i+1].StartEncode + 0x7e;
  816. }
  817. #endif
  818. GlobalUnlock(hEncode);
  819. return TRUE;
  820. }
  821. BOOL ConvWriteEncode(HANDLE hMBFile, LPENCODEAREA lpEncode,
  822. LPMAININDEX lpMainIndex)
  823. {
  824. DWORD dwBytes,i;
  825. DWORD dwOffset=lpMainIndex[TAG_ENCODE-1].dwOffset;
  826. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  827. return FALSE;
  828. i = NUM_OF_ENCODE;
  829. WriteFile(hMBFile,&i,4,&dwBytes,NULL);
  830. i = NUMENCODEAREA;
  831. WriteFile(hMBFile,&i,4,&dwBytes,NULL);
  832. WriteFile(hMBFile,lpEncode,
  833. lpMainIndex[TAG_ENCODE-1].dwLength,&dwBytes,NULL);
  834. if(dwBytes < lpMainIndex[TAG_ENCODE-1].dwLength)
  835. return FALSE;
  836. else
  837. return TRUE;
  838. }
  839. BOOL ConvGetCrtData(HANDLE hMBFile, LPCREATEWORD lpCreateWord,
  840. LPMAININDEX lpMainIndex)
  841. {
  842. DWORD dwBytes;
  843. DWORD dwOffset=lpMainIndex[TAG_CRTWORDCODE-1].dwOffset;
  844. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  845. return FALSE;
  846. ReadFile(hMBFile,lpCreateWord,
  847. lpMainIndex[TAG_CRTWORDCODE-1].dwLength,&dwBytes,NULL);
  848. if(dwBytes < lpMainIndex[TAG_CRTWORDCODE-1].dwLength)
  849. return FALSE;
  850. else
  851. return TRUE;
  852. }
  853. BOOL ConvWriteCrtData(HANDLE hMBFile, LPCREATEWORD lpCreateWord,
  854. LPMAININDEX lpMainIndex)
  855. {
  856. DWORD dwBytes;
  857. DWORD dwOffset=lpMainIndex[TAG_CRTWORDCODE-1].dwOffset;
  858. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  859. return FALSE;
  860. WriteFile(hMBFile,lpCreateWord,
  861. lpMainIndex[TAG_CRTWORDCODE-1].dwLength,&dwBytes,NULL);
  862. if(dwBytes < lpMainIndex[TAG_CRTWORDCODE-1].dwLength)
  863. return FALSE;
  864. else
  865. return TRUE;
  866. }
  867. BOOL ConvGetReConvIndex(HANDLE hMBFile, LPRECONVINDEX lpReConvIndex,
  868. LPMAININDEX lpMainIndex)
  869. {
  870. DWORD dwBytes;
  871. DWORD dwOffset= lpMainIndex[TAG_RECONVINDEX-1].dwOffset;
  872. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  873. return FALSE;
  874. ReadFile(hMBFile,lpReConvIndex,
  875. lpMainIndex[TAG_RECONVINDEX-1].dwLength,&dwBytes,NULL);
  876. if(dwBytes < lpMainIndex[TAG_RECONVINDEX-1].dwLength)
  877. return FALSE;
  878. else
  879. return TRUE;
  880. }
  881. BOOL ConvWriteReConvIdx(HANDLE hMBFile, LPRECONVINDEX lpReConvIndex,
  882. LPMAININDEX lpMainIndex)
  883. {
  884. DWORD dwBytes;
  885. DWORD dwOffset= lpMainIndex[TAG_RECONVINDEX-1].dwOffset;
  886. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  887. return FALSE;
  888. WriteFile(hMBFile,lpReConvIndex,
  889. lpMainIndex[TAG_RECONVINDEX-1].dwLength,&dwBytes,NULL);
  890. if(dwBytes < lpMainIndex[TAG_RECONVINDEX-1].dwLength)
  891. return FALSE;
  892. else
  893. return TRUE;
  894. }
  895. BOOL ConvGetCodeIndex(HANDLE hMBFile,LPDWORD fdwMaxXLen,
  896. LPSTR Code, LPMAININDEX lpMainIndex)
  897. {
  898. DWORD dwBytes;
  899. DWORD dwOffset= lpMainIndex[TAG_BASEDICINDEX-1].dwOffset;
  900. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  901. return FALSE;
  902. ReadFile(hMBFile,fdwMaxXLen,sizeof(DWORD),&dwBytes,NULL);
  903. ReadFile(hMBFile,Code,MAXNUMCODES,&dwBytes,NULL);
  904. if(dwBytes < MAXNUMCODES)
  905. return FALSE;
  906. else
  907. return TRUE;
  908. }
  909. BOOL ConvWriteCodeIndex (HANDLE hMBFile, LPDWORD fdwMaxXLen,
  910. LPTSTR Code, LPMAININDEX lpMainIndex)
  911. {
  912. DWORD dwBytes,i;
  913. DWORD dwOffset= lpMainIndex[TAG_BASEDICINDEX-1].dwOffset;
  914. BYTE CodeIndex[MAXNUMCODES];
  915. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  916. return FALSE;
  917. WriteFile(hMBFile,fdwMaxXLen,sizeof(DWORD),&dwBytes,NULL);
  918. for(i=0;i<MAXNUMCODES;i++)
  919. CodeIndex[i] = 0;
  920. for(i=0;i<(DWORD)lstrlen(Code);i++)
  921. CodeIndex[Code[i]] =(BYTE)(i+1);
  922. WriteFile(hMBFile,CodeIndex,MAXNUMCODES,&dwBytes,NULL);
  923. if(dwBytes < MAXNUMCODES)
  924. return FALSE;
  925. else
  926. return TRUE;
  927. }
  928. BOOL ConvGetDicIndex(HANDLE hMBFile, LPDICINDEX lpDicIndex ,
  929. DWORD dwNumCodes, LPMAININDEX lpMainIndex)
  930. {
  931. DWORD dwBytes,ReadBytes;
  932. DWORD dwOffset= lpMainIndex[TAG_BASEDICINDEX-1].dwOffset+
  933. MAXNUMCODES+CODEMAPOFFSET;
  934. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  935. return FALSE;
  936. ReadBytes = sizeof(DWORD)*(dwNumCodes+1)*dwNumCodes;
  937. ReadFile(hMBFile,lpDicIndex,ReadBytes,&dwBytes,NULL);
  938. if(dwBytes < ReadBytes)
  939. return FALSE;
  940. else
  941. return TRUE;
  942. }
  943. BOOL ConvWriteDicIndex(HANDLE hMBFile, LPDICINDEX lpDicIndex ,
  944. DWORD dwNumCodes, LPMAININDEX lpMainIndex)
  945. {
  946. DWORD dwBytes,WriteBytes;
  947. DWORD dwOffset= lpMainIndex[TAG_BASEDICINDEX-1].dwOffset+
  948. MAXNUMCODES+CODEMAPOFFSET;
  949. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  950. return FALSE;
  951. WriteBytes = sizeof(DWORD)*(dwNumCodes+1)*dwNumCodes;
  952. WriteFile(hMBFile,lpDicIndex,WriteBytes,&dwBytes,NULL);
  953. if(dwBytes < WriteBytes)
  954. return FALSE;
  955. else
  956. return TRUE;
  957. }
  958. BOOL ConvGetNumXYWords(HANDLE hMBFile, LPDWORD lpNumXYWords,
  959. DWORD dwNumCodes, LPMAININDEX lpMainIndex)
  960. {
  961. DWORD dwBytes,ReadBytes;
  962. DWORD dwOffset;
  963. ReadBytes = sizeof(DWORD)*(dwNumCodes+1)*dwNumCodes;
  964. dwOffset=lpMainIndex[TAG_BASEDICINDEX-1].dwOffset+
  965. MAXNUMCODES+CODEMAPOFFSET+ReadBytes;
  966. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  967. return FALSE;
  968. ReadFile(hMBFile,lpNumXYWords,ReadBytes,&dwBytes,NULL);
  969. if(dwBytes < ReadBytes)
  970. return FALSE;
  971. else
  972. return TRUE;
  973. }
  974. BOOL ConvWriteNumXYWords(HANDLE hMBFile, LPDWORD lpNumXYWords,
  975. DWORD dwNumCodes, LPMAININDEX lpMainIndex)
  976. {
  977. DWORD dwBytes,WriteBytes;
  978. DWORD dwOffset;
  979. WriteBytes = sizeof(DWORD)*(dwNumCodes+1)*dwNumCodes;
  980. dwOffset=lpMainIndex[TAG_BASEDICINDEX-1].dwOffset+
  981. MAXNUMCODES+CODEMAPOFFSET+WriteBytes;
  982. if(SetFilePointer(hMBFile,dwOffset,0,FILE_BEGIN) != dwOffset)
  983. return FALSE;
  984. SetFilePointer(hMBFile,lpMainIndex[TAG_BASEDICINDEX-1].dwOffset+
  985. WriteBytes+MAXNUMCODES+CODEMAPOFFSET,0,FILE_BEGIN);
  986. WriteFile(hMBFile,lpNumXYWords,WriteBytes,&dwBytes,NULL);
  987. if(dwBytes < WriteBytes)
  988. return FALSE;
  989. else
  990. return TRUE;
  991. }
  992. int ConvReconvIndex(HANDLE hWnd,
  993. LPTSTR szDBCS,
  994. LPCREATEWORD lpCreateWords,
  995. WORDINDEX WordIndex,
  996. LPDESCRIPTION lpDescript,
  997. LPRECONVINDEX lpReConvIndex)
  998. {
  999. int no;
  1000. TCHAR tmpStr[256];
  1001. if(WordIndex.wDBCSLen != 1)
  1002. return FALSE;
  1003. no = EncodeToNo(szDBCS);
  1004. if(no < 0 || no >= NUM_OF_ENCODE)
  1005. return FALSE;
  1006. if(lpDescript->wNumRules != 0 && lpDescript->byMaxElement == 1)
  1007. {
  1008. lstrncpy(tmpStr,
  1009. lpDescript->wMaxCodes,
  1010. lpCreateWords + no*(DWORD)lpDescript->wMaxCodes);
  1011. if(lstrlen(tmpStr) == 0 ||
  1012. #ifdef UNICODE
  1013. (!(WriteCrtFlag[(no/8)] & (1 << (7 - (no%8))) ) && _wcsicmp(WordIndex.szCode,tmpStr) < 0) )
  1014. #else
  1015. (!(WriteCrtFlag[(no/8)] & (1 << (7 - (no%8))) ) && _strcmpi(WordIndex.szCode,tmpStr) < 0) )
  1016. #endif UNICODE
  1017. lstrncpy(lpCreateWords + no*(DWORD)lpDescript->wMaxCodes,
  1018. lpDescript->wMaxCodes,
  1019. WordIndex.szCode);
  1020. }
  1021. else
  1022. {
  1023. lstrncpy(tmpStr,
  1024. lpDescript->wMaxCodes,
  1025. lpReConvIndex + no*(DWORD)lpDescript->wMaxCodes);
  1026. tmpStr[lpDescript->wMaxCodes] = 0;
  1027. #ifdef UNICODE
  1028. if(lstrlen(tmpStr) == 0 || _wcsicmp(WordIndex.szCode,tmpStr) < 0)
  1029. #else
  1030. if(lstrlen(tmpStr) == 0 || _strcmpi(WordIndex.szCode,tmpStr) < 0)
  1031. #endif
  1032. lstrncpy(lpReConvIndex + no*(DWORD)lpDescript->wMaxCodes,
  1033. lpDescript->wMaxCodes,
  1034. WordIndex.szCode);
  1035. }
  1036. return TRUE;
  1037. }