DictComp.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:7k
源码类别:

DNA

开发平台:

Visual C++

  1. // DictComp.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include "DictComp.h"
  5. #include <comutil.h>
  6. #include <stdio.h>
  7. BOOL APIENTRY DllMain( HANDLE hModule, 
  8.                        DWORD  ul_reason_for_call, 
  9.                        LPVOID lpReserved
  10.  )
  11. {
  12.     return TRUE;
  13. }
  14. // {54BF6567-1007-11D1-B0AA-444553540000}
  15. extern "C" const GUID CLSID_Dictionary = 
  16. { 0x54bf6567, 0x1007, 0x11d1,
  17. { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
  18. BOOL __stdcall CreateObject(const CLSID& clsid, const IID& iid, void **ppv)
  19. {
  20. if (clsid == CLSID_Dictionary ) {
  21. CDictionary *pObject = new CDictionary;
  22. HRESULT result = pObject->QueryInterface(iid, ppv);
  23. return (result == S_OK) ? TRUE : FALSE;
  24. }
  25. return FALSE;
  26. }
  27. // class CDictionary implementation
  28. CDictionary::CDictionary()
  29. {
  30. m_Ref = 0;
  31. m_nWordNumber = 0;
  32. m_nStructNumber = 0;
  33. m_Data = NULL;
  34. }
  35. CDictionary::~CDictionary()
  36. {
  37. if (m_Data != NULL) 
  38. {
  39. delete [] m_Data;
  40. }
  41. }
  42. HRESULT  CDictionary::QueryInterface(const IID& iid, void **ppv)
  43. {
  44. if ( iid == IID_IUnknown )
  45. {
  46. *ppv = (IDictionary *) this ;
  47. ((IDictionary *)(*ppv))->AddRef() ;
  48. } else if ( iid == IID_Dictionary ) 
  49. {
  50. *ppv = (IDictionary *) this ;
  51. ((IDictionary *)(*ppv))->AddRef() ;
  52. } else if ( iid == IID_SpellCheck ) 
  53. {
  54. *ppv = (ISpellCheck *) this ;
  55. ((ISpellCheck *)(*ppv))->AddRef() ;
  56. }
  57. else
  58. {
  59. *ppv = NULL;
  60. return E_NOINTERFACE ;
  61. }
  62. return S_OK;
  63. }
  64. ULONG   CDictionary::AddRef()
  65. {
  66. m_Ref ++;
  67. return  (ULONG) m_Ref;
  68. }
  69. ULONG   CDictionary::Release()
  70. {
  71. m_Ref --;
  72. if (m_Ref == 0 ) {
  73. delete this;
  74. return 0;
  75. }
  76. return  (ULONG) m_Ref;
  77. }
  78. BOOL CDictionary::Initialize()
  79. {
  80. m_nWordNumber = 0;
  81. m_nStructNumber = 0;
  82. if (m_Data != NULL) 
  83. {
  84. delete [] m_Data;
  85. }
  86. m_Data = NULL;
  87. return TRUE;
  88. }
  89. BOOL CDictionary::LoadLibrary(String filename)
  90. {
  91. char *pFileName = _com_util::ConvertBSTRToString(filename);
  92. FILE *fp;
  93. if( (fp = fopen( pFileName, "rt" )) == NULL ) {
  94. printf("Open dictionary file : %s failed.n", pFileName);
  95. delete pFileName;
  96. return FALSE;
  97. }
  98. char LineBuffer[128];
  99. if (feof(fp)) {
  100. printf("It is a null file!n");
  101. fclose(fp);
  102. delete pFileName;
  103. return FALSE; 
  104. }
  105. if (fgets(LineBuffer, 128, fp) == NULL) {
  106. printf("Read TotalNumber failed!n");
  107. fclose(fp);
  108. delete pFileName;
  109. return FALSE; 
  110. }
  111. int nTotalNumber = 0;
  112. sscanf(LineBuffer, "%d", &nTotalNumber);
  113. if ( (nTotalNumber < 1) && (nTotalNumber > 5000) ) {
  114. printf("The Number of words is invalid!n");
  115. fclose(fp);
  116. delete pFileName;
  117. return FALSE; 
  118. }
  119. Initialize();
  120. m_nStructNumber = nTotalNumber+100;
  121. m_Data = new DictWord[m_nStructNumber];
  122. m_nWordNumber = 0;
  123. while(!feof(fp)) {
  124. if (fgets(LineBuffer, MaxWordLength, fp) == NULL) {
  125. printf("Read the first string failed!n");
  126. break;
  127. }
  128. sscanf(LineBuffer, "%s", m_Data[m_nWordNumber].wordForLang1);
  129. if (fgets(LineBuffer, MaxWordLength, fp) == NULL) {
  130. printf("Read the second string failed!n");
  131. break;
  132. }
  133. sscanf(LineBuffer, "%s", m_Data[m_nWordNumber].wordForLang2);
  134. m_nWordNumber ++;
  135. if (m_nWordNumber == nTotalNumber)
  136. break;
  137. if (m_nWordNumber > m_nStructNumber)
  138. break;
  139. }
  140. fclose(fp);
  141. delete pFileName;
  142. return TRUE;
  143. }
  144. BOOL CDictionary::InsertWord(String word1, String word2)
  145. {
  146. char *pWord1, *pWord2;
  147. if (m_nWordNumber < m_nStructNumber) {
  148. pWord1 = _com_util::ConvertBSTRToString(word1);
  149. pWord2 = _com_util::ConvertBSTRToString(word2);
  150. if (strlen(pWord1) > MaxWordLength)
  151. *(pWord1+MaxWordLength-1) = '';
  152. if (strlen(pWord2) > MaxWordLength)
  153. *(pWord2+MaxWordLength-1) = '';
  154. strcpy(m_Data[m_nWordNumber].wordForLang1, pWord1);
  155. strcpy(m_Data[m_nWordNumber].wordForLang2, pWord2);
  156. m_nWordNumber ++ ;
  157. delete pWord1;
  158. delete pWord2;
  159. return TRUE;
  160. }
  161. return FALSE;
  162. }
  163. void CDictionary::DeleteWord(String word)
  164. {
  165. char *pWord = _com_util::ConvertBSTRToString(word);
  166. char *pUpperWord = strupr(pWord);
  167. for (int i = 0; i < m_nWordNumber; i++)
  168. {
  169. char *tmpWord = strupr(m_Data[i].wordForLang1);
  170. if (strcmp(tmpWord, pWord) == 0) {
  171. for(int j = i + 1; j < m_nWordNumber; j++) {
  172. strcpy( m_Data[j].wordForLang1, m_Data[j + 1].wordForLang1);
  173. strcpy( m_Data[j].wordForLang2, m_Data[j + 1].wordForLang2);
  174. }
  175. m_nWordNumber ++ ;
  176. break;
  177. }
  178. }
  179. delete pWord;
  180. }
  181. BOOL CDictionary::LookupWord(String word, String *resultWord)
  182. {
  183. char *pWord = _com_util::ConvertBSTRToString(word);
  184. char *pUpperWord = strupr(pWord);
  185. for (int i = 0; i < m_nWordNumber; i++)
  186. {
  187. char *tmpWord = strupr(m_Data[i].wordForLang1);
  188. if (strcmp(tmpWord, pWord) == 0) {
  189. *resultWord = _com_util::ConvertStringToBSTR(m_Data[i].wordForLang2);
  190. delete pWord;
  191. return TRUE;
  192. }
  193. }
  194. *resultWord = NULL;
  195. delete pWord;
  196. return FALSE;
  197. }
  198. BOOL CDictionary::RestoreLibrary(String filename)
  199. {
  200. char *pFileName = _com_util::ConvertBSTRToString(filename);
  201. FILE *fp;
  202. if( (fp = fopen( pFileName, "wt" )) == NULL ) {
  203. printf("Open dictionary file : %s failed.n", pFileName);
  204. delete pFileName;
  205. return FALSE;
  206. }
  207. char LineBuffer[128];
  208. sprintf(LineBuffer, "%dn", m_nWordNumber);
  209. if (fputs(LineBuffer, fp) == EOF) {
  210. printf("Write TotalNumber failed!n");
  211. fclose(fp);
  212. delete pFileName;
  213. return FALSE; 
  214. }
  215. for(int i = 0; i < m_nWordNumber; i ++ ) {
  216. if (fputs(m_Data[i].wordForLang1, fp) == EOF) {
  217. printf("Write the first string failed!n");
  218. fclose(fp);
  219. delete pFileName;
  220. return FALSE; 
  221. }
  222. fputs("n", fp);
  223. if (fputs(m_Data[i].wordForLang2, fp) == EOF) {
  224. printf("Write the first string failed!n");
  225. fclose(fp);
  226. delete pFileName;
  227. return FALSE; 
  228. }
  229. fputs("n", fp);
  230. }
  231. fclose(fp);
  232. delete pFileName;
  233. return TRUE;
  234. }
  235. void CDictionary::FreeLibrary()
  236. {
  237. Initialize();
  238. }
  239. BOOL CDictionary::CheckWord (String word, String *resultWord)
  240. {
  241. char *pWord = _com_util::ConvertBSTRToString(word);
  242. char *pUpperWord = strupr(pWord);
  243. char *pMinMaxWord, *pMaxMinWord;
  244. int  nMinIndex = -1, nMaxIndex = -1;
  245. pMinMaxWord = pMaxMinWord = NULL;
  246. for (int i = 0; i < m_nWordNumber; i++)
  247. {
  248. char *tmpWord = strupr(m_Data[i].wordForLang1);
  249. if (strcmp(tmpWord, pWord) == 0) {
  250. delete pWord;
  251. return TRUE;
  252. } else if (strcmp(tmpWord, pWord) < 0) {
  253. if ((pMinMaxWord == NULL) || (strcmp(tmpWord, pMinMaxWord) > 0)) 
  254. {
  255. pMinMaxWord = tmpWord;
  256. nMinIndex = i;
  257. }
  258. } else {
  259. if ((pMaxMinWord == NULL) || (strcmp(tmpWord, pMaxMinWord) < 0)) 
  260. {
  261. pMaxMinWord = tmpWord;
  262. nMaxIndex = i;
  263. }
  264. }
  265. }
  266. *resultWord = NULL;
  267. if (nMinIndex != -1)
  268. *resultWord = _com_util::ConvertStringToBSTR(m_Data[nMinIndex].wordForLang1);
  269. else if (nMaxIndex != -1)
  270. *resultWord = _com_util::ConvertStringToBSTR(m_Data[nMaxIndex].wordForLang1);
  271. delete pWord;
  272. return FALSE;
  273. }