XTPSyntaxEditLexClassSubObjT.h
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:18k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditLexClassSubObjT.h
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME SYNTAX EDIT LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. //////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTPSYNTAXEDITLEXCLASSSUBOBJT_H__)
  22. #define __XTPSYNTAXEDITLEXCLASSSUBOBJT_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. //#pragma warning(disable: 4097 4786)
  28. //#pragma warning(push)
  29. // #define DBG_AUTOMAT
  30. namespace XTPSyntaxEditLexAnalyser
  31. {
  32. //{{AFX_CODEJOCK_PRIVATE
  33. //===========================================================================
  34. class CXTPSyntaxEditLexNULL
  35. {
  36. public:
  37. LPCTSTR GetName() const {
  38. return NULL;
  39. };
  40. BOOL IsEmpty() const {
  41. return TRUE;
  42. }
  43. BOOL IfMy(LPCTSTR pcszElementName) {
  44. UNREFERENCED_PARAMETER(pcszElementName);
  45. return FALSE;
  46. }
  47. BOOL AddIfMy(LPCTSTR pcszElementName, const CXTPSyntaxEditLexVariantPtr& ptr)
  48. {
  49. UNREFERENCED_PARAMETER(pcszElementName);
  50. UNREFERENCED_PARAMETER(ptr);
  51. return FALSE;
  52. }
  53. BOOL AppendIfMy(LPCTSTR pcszElementName,
  54.  const CXTPSyntaxEditLexVariantPtrArray& ptrAr)
  55. {
  56. UNREFERENCED_PARAMETER(pcszElementName);
  57. UNREFERENCED_PARAMETER(ptrAr);
  58. return FALSE;
  59. }
  60. CXTPSyntaxEditLexVariantPtrArray* GetIfMy(LPCTSTR pcszElementName)
  61. {
  62. UNREFERENCED_PARAMETER(pcszElementName);
  63. return NULL;
  64. }
  65. void CopyFrom(CXTPSyntaxEditLexNULL& rSrc) {
  66. UNREFERENCED_PARAMETER(rSrc);
  67. };
  68. void RemoveAll() {};
  69. #ifdef _DEBUG
  70. void DumpOffset(CDumpContext& dc, LPCTSTR pcszOffset) {
  71. dc << pcszOffset;
  72. };
  73. #endif
  74. };
  75. //---------------------------------------------------------------------------
  76. template<class _TC0 = CXTPSyntaxEditLexNULL, class _TC1 = CXTPSyntaxEditLexNULL,
  77. class _TC2 = CXTPSyntaxEditLexNULL, class _TC3 = CXTPSyntaxEditLexNULL,
  78. class _TC4 = CXTPSyntaxEditLexNULL, class _TC5 = CXTPSyntaxEditLexNULL,
  79. class _TC6 = CXTPSyntaxEditLexNULL, class _TC7 = CXTPSyntaxEditLexNULL,
  80. class _TC8 = CXTPSyntaxEditLexNULL, class _TC9 = CXTPSyntaxEditLexNULL >
  81. class CXTPSyntaxEditLexObj_SpecCollT
  82. {
  83. public:
  84. typedef CXTPSyntaxEditLexObj_SpecCollT<_TC0, _TC1, _TC2, _TC3, _TC4,
  85.  _TC5, _TC6, _TC7, _TC8, _TC9> Tthis;
  86. typedef _TC0 _Type0; typedef _TC1 _Type1; typedef _TC2 _Type2;
  87. typedef _TC3 _Type3; typedef _TC4 _Type4; typedef _TC5 _Type5;
  88. typedef _TC6 _Type6; typedef _TC7 _Type7; typedef _TC8 _Type8;
  89. typedef _TC9 _Type9;
  90. CXTPSyntaxEditLexObj_SpecCollT()
  91. {
  92. m_bEmpty = TRUE;
  93. SetSubMembers();
  94. };
  95. virtual ~CXTPSyntaxEditLexObj_SpecCollT(){};
  96. protected:
  97. BOOL m_bEmpty;
  98. _TC0* m_p0; _TC1* m_p1; _TC2* m_p2; _TC3* m_p3; _TC4* m_p4;
  99. _TC5* m_p5; _TC6* m_p6; _TC7* m_p7; _TC8* m_p8; _TC9* m_p9;
  100. virtual void SetSubMember0(){m_p0 = NULL;};
  101. virtual void SetSubMember1(){m_p1 = NULL;};
  102. virtual void SetSubMember2(){m_p2 = NULL;};
  103. virtual void SetSubMember3(){m_p3 = NULL;};
  104. virtual void SetSubMember4(){m_p4 = NULL;};
  105. virtual void SetSubMember5(){m_p5 = NULL;};
  106. virtual void SetSubMember6(){m_p6 = NULL;};
  107. virtual void SetSubMember7(){m_p7 = NULL;};
  108. virtual void SetSubMember8(){m_p8 = NULL;};
  109. virtual void SetSubMember9(){m_p9 = NULL;};
  110. virtual void SetSubMembers()
  111. {
  112. SetSubMember0();
  113. SetSubMember1();
  114. SetSubMember2();
  115. SetSubMember3();
  116. SetSubMember4();
  117. SetSubMember5();
  118. SetSubMember6();
  119. SetSubMember7();
  120. SetSubMember8();
  121. SetSubMember9();
  122. };
  123. public:
  124. BOOL IsEmpty() const {
  125. return m_bEmpty;
  126. }
  127. BOOL IfMy(LPCTSTR pcszElementName)
  128. {
  129. if(     m_p0 && m_p0->IfMy(pcszElementName)) {}
  130. else if(m_p1 && m_p1->IfMy(pcszElementName))
  131. {}
  132. else if(m_p2 && m_p2->IfMy(pcszElementName))
  133. {}
  134. else if(m_p3 && m_p3->IfMy(pcszElementName))
  135. {}
  136. else if(m_p4 && m_p4->IfMy(pcszElementName))
  137. {}
  138. else if(m_p5 && m_p5->IfMy(pcszElementName))
  139. {}
  140. else if(m_p6 && m_p6->IfMy(pcszElementName))
  141. {}
  142. else if(m_p7 && m_p7->IfMy(pcszElementName))
  143. {}
  144. else if(m_p8 && m_p8->IfMy(pcszElementName))
  145. {}
  146. else if(m_p9 && m_p9->IfMy(pcszElementName))
  147. {}
  148. else
  149. {
  150. return FALSE;
  151. }
  152. return TRUE;
  153. }
  154. BOOL AddIfMy(LPCTSTR pcszElementName, const CXTPSyntaxEditLexVariantPtr& ptr)
  155. {
  156. if(     m_p0 && m_p0->AddIfMy(pcszElementName, ptr)) {}
  157. else if(m_p1 && m_p1->AddIfMy(pcszElementName, ptr))
  158. {}
  159. else if(m_p2 && m_p2->AddIfMy(pcszElementName, ptr))
  160. {}
  161. else if(m_p3 && m_p3->AddIfMy(pcszElementName, ptr))
  162. {}
  163. else if(m_p4 && m_p4->AddIfMy(pcszElementName, ptr))
  164. {}
  165. else if(m_p5 && m_p5->AddIfMy(pcszElementName, ptr))
  166. {}
  167. else if(m_p6 && m_p6->AddIfMy(pcszElementName, ptr))
  168. {}
  169. else if(m_p7 && m_p7->AddIfMy(pcszElementName, ptr))
  170. {}
  171. else if(m_p8 && m_p8->AddIfMy(pcszElementName, ptr))
  172. {}
  173. else if(m_p9 && m_p9->AddIfMy(pcszElementName, ptr))
  174. {}
  175. else
  176. {
  177. return FALSE;
  178. }
  179. m_bEmpty = FALSE;
  180. return TRUE;
  181. }
  182. BOOL AppendIfMy(LPCTSTR pcszElementName,
  183. const CXTPSyntaxEditLexVariantPtrArray& ptrAr)
  184. {
  185. if(     m_p0 && m_p0->AppendIfMy(pcszElementName, ptrAr)) {}
  186. else if(m_p1 && m_p1->AppendIfMy(pcszElementName, ptrAr))
  187. {}
  188. else if(m_p2 && m_p2->AppendIfMy(pcszElementName, ptrAr))
  189. {}
  190. else if(m_p3 && m_p3->AppendIfMy(pcszElementName, ptrAr))
  191. {}
  192. else if(m_p4 && m_p4->AppendIfMy(pcszElementName, ptrAr))
  193. {}
  194. else if(m_p5 && m_p5->AppendIfMy(pcszElementName, ptrAr))
  195. {}
  196. else if(m_p6 && m_p6->AppendIfMy(pcszElementName, ptrAr))
  197. {}
  198. else if(m_p7 && m_p7->AppendIfMy(pcszElementName, ptrAr))
  199. {}
  200. else if(m_p8 && m_p8->AppendIfMy(pcszElementName, ptrAr))
  201. {}
  202. else if(m_p9 && m_p9->AppendIfMy(pcszElementName, ptrAr))
  203. {}
  204. else
  205. {
  206. return FALSE;
  207. }
  208. m_bEmpty = FALSE;
  209. return TRUE;
  210. }
  211. CXTPSyntaxEditLexVariantPtrArray* GetIfMy(LPCTSTR pcszElementName)
  212. {
  213. CXTPSyntaxEditLexVariantPtrArray* pData = NULL;
  214. if (m_p0 ) { pData = m_p0->GetIfMy( pcszElementName); if (pData) return pData; }
  215. if (m_p1 ) { pData = m_p1->GetIfMy( pcszElementName); if (pData) return pData; }
  216. if (m_p2 ) { pData = m_p2->GetIfMy( pcszElementName); if (pData) return pData; }
  217. if (m_p3 ) { pData = m_p3->GetIfMy( pcszElementName); if (pData) return pData; }
  218. if (m_p4 ) { pData = m_p4->GetIfMy( pcszElementName); if (pData) return pData; }
  219. if (m_p5 ) { pData = m_p5->GetIfMy( pcszElementName); if (pData) return pData; }
  220. if (m_p6 ) { pData = m_p6->GetIfMy( pcszElementName); if (pData) return pData; }
  221. if (m_p7 ) { pData = m_p7->GetIfMy( pcszElementName); if (pData) return pData; }
  222. if (m_p8 ) { pData = m_p8->GetIfMy( pcszElementName); if (pData) return pData; }
  223. if (m_p9 ) { pData = m_p9->GetIfMy( pcszElementName); if (pData) return pData; }
  224. return NULL;
  225. }
  226. void CopyFrom(const Tthis& rSrc)
  227. {
  228. RemoveAll();
  229. //m_p0 ? m_p0->CopyFrom(*rSrc.m_p0):1;
  230. // just call without accessing to the data (and no virtual)
  231. // NULL->CopyFrom(NULL) - is OK
  232. m_p0->CopyFrom(*rSrc.m_p0);
  233. m_p1->CopyFrom(*rSrc.m_p1);
  234. m_p2->CopyFrom(*rSrc.m_p2);
  235. m_p3->CopyFrom(*rSrc.m_p3);
  236. m_p4->CopyFrom(*rSrc.m_p4);
  237. m_p5->CopyFrom(*rSrc.m_p5);
  238. m_p6->CopyFrom(*rSrc.m_p6);
  239. m_p7->CopyFrom(*rSrc.m_p7);
  240. m_p8->CopyFrom(*rSrc.m_p8);
  241. m_p9->CopyFrom(*rSrc.m_p9);
  242. m_bEmpty = m_p0->IsEmpty() && m_p1->IsEmpty() && m_p2->IsEmpty() &&
  243. m_p3->IsEmpty() && m_p4->IsEmpty() && m_p5->IsEmpty() &&
  244. m_p6->IsEmpty() && m_p7->IsEmpty() && m_p8->IsEmpty() &&
  245. m_p9->IsEmpty();
  246. }
  247. void RemoveAll()
  248. {
  249. m_p0->RemoveAll(); m_p1->RemoveAll(); m_p2->RemoveAll();
  250. m_p3->RemoveAll(); m_p4->RemoveAll(); m_p5->RemoveAll();
  251. m_p6->RemoveAll(); m_p7->RemoveAll(); m_p8->RemoveAll();
  252. m_p9->RemoveAll();
  253. m_bEmpty = TRUE;
  254. }
  255. #ifdef _DEBUG
  256. void DumpOffset(CDumpContext& dc, LPCTSTR pcszOffset)
  257. {
  258. m_p0->DumpOffset(dc, pcszOffset); m_p1->DumpOffset(dc, pcszOffset);
  259. m_p2->DumpOffset(dc, pcszOffset); m_p3->DumpOffset(dc, pcszOffset);
  260. m_p4->DumpOffset(dc, pcszOffset); m_p5->DumpOffset(dc, pcszOffset);
  261. m_p6->DumpOffset(dc, pcszOffset); m_p7->DumpOffset(dc, pcszOffset);
  262. m_p8->DumpOffset(dc, pcszOffset); m_p9->DumpOffset(dc, pcszOffset);
  263. }
  264. #endif
  265. };
  266. //===========================================================================
  267. template<LPCTSTR (* _FuncName)(void) >
  268. class CXTPSyntaxEditLexVariantPtrArrayExT : public CXTPSyntaxEditLexVariantPtrArray
  269. {
  270. public:
  271. CXTPSyntaxEditLexVariantPtrArrayExT() {};
  272. virtual ~CXTPSyntaxEditLexVariantPtrArrayExT(){};
  273. LPCTSTR GetName() const {
  274. return _FuncName();
  275. }
  276. BOOL IsEmpty() const {
  277. return GetSize() == 0;
  278. }
  279. BOOL IfMy(LPCTSTR pcszElementName)
  280. {
  281. int nCmpRes = _tcsicmp(GetName(), pcszElementName);
  282. return (nCmpRes == 0);
  283. }
  284. BOOL AddIfMy(LPCTSTR pcszElementName, const CXTPSyntaxEditLexVariantPtr& ptr)
  285. {
  286. if(IfMy(pcszElementName)) {
  287. Add(ptr);
  288. return TRUE;
  289. }
  290. return FALSE;
  291. }
  292. BOOL AppendIfMy(LPCTSTR pcszElementName, const CXTPSyntaxEditLexVariantPtrArray& ptrAr)
  293. {
  294. if(IfMy(pcszElementName)) {
  295. Append(ptrAr);
  296. return TRUE;
  297. }
  298. return FALSE;
  299. }
  300. CXTPSyntaxEditLexVariantPtrArray* GetIfMy(LPCTSTR pcszElementName)
  301. {
  302. if(IfMy(pcszElementName)) {
  303. return this;
  304. }
  305. return NULL;
  306. }
  307. void CopyFrom(const CXTPSyntaxEditLexVariantPtrArray& rSrc) {
  308. RemoveAll();
  309. Append(rSrc);
  310. }
  311. #ifdef _DEBUG
  312. void DumpOffset(CDumpContext& dc, LPCTSTR pcszOffset)
  313. {
  314. if(IsEmpty()) {
  315. return;
  316. }
  317. #if _MSC_VER > 1100
  318. int nCount = (int)GetSize();
  319. dc << pcszOffset;
  320. dc << GetName() << _T("[") << nCount << _T("]");
  321. for(int i = 0; i < nCount; i++)
  322. {
  323. if(i) {
  324. dc << _T(", ");
  325. }
  326. CXTPSyntaxEditLexVariantPtr ptrV = GetAt(i);
  327. if(ptrV) {
  328. ptrV->Dump(dc);
  329. }
  330. else
  331. {
  332. dc << _T("?<NULL>");
  333. }
  334. }
  335. dc << _T(" n");
  336. #else
  337. UNREFERENCED_PARAMETER(dc);
  338. UNREFERENCED_PARAMETER(pcszOffset);
  339. #endif
  340. }
  341. #endif
  342. };
  343. //===========================================================================
  344. //}}AFX_CODEJOCK_PRIVATE
  345. class CXTPSyntaxEditLexAutomatWordsMap;
  346. class _XTP_EXT_CLASS LA_CHAR_NODE
  347. {
  348. friend class CXTPSyntaxEditLexAutomatWordsMap;
  349. friend class CXTPSyntaxEditLexAutomatMemMan;
  350. public:
  351. //----------------------------------------------------------------
  352. enum NodeFlags {
  353. nfSubWordEnd = 0x0001,
  354. };
  355. //----------------------------------------------------------------
  356. WORD                    wChar;
  357. WORD                    wFlags;
  358. CXTPSyntaxEditLexAutomatWordsMap* pNextMap;
  359. protected:
  360. LA_CHAR_NODE*           pNextNode;
  361. void Clear();
  362. public:
  363. LA_CHAR_NODE();
  364. virtual ~LA_CHAR_NODE();
  365. const LA_CHAR_NODE& operator = (const LA_CHAR_NODE& rSrc);
  366. //void Clear();
  367. };
  368. typedef LA_CHAR_NODE* PLA_CHAR_NODE;
  369. class _XTP_EXT_CLASS CXTPSyntaxEditLexAutomatWordsMap : public CXTPCmdTarget
  370. {
  371. friend class CXTPSyntaxEditLexAutomatMemMan;
  372. public:
  373. CXTPSyntaxEditLexAutomatWordsMap(UINT uHashTableSize = 17);
  374. virtual ~CXTPSyntaxEditLexAutomatWordsMap();
  375. void RemoveAll();
  376. void AddWord(CString strWord, UINT uHashTableSize);
  377. BOOL FindWord(BOOL bMinWord, LPCTSTR pcszBuffer, CString& rstrWord, int nBufSize,
  378.   BOOL bConvertToLowerCase, BOOL bIgnoreCaseDyn) const;
  379. void InitMap(UINT uHashTableSize);
  380. UINT GetHashTableSize();
  381. static UINT AFX_CDECL DivideHTSize(UINT uHashTableSize, UINT uMin = 1);
  382. protected:
  383. static UINT AFX_CDECL PrimeAdjustU_50(UINT uNumber);
  384. BOOL _FindWord(LPCTSTR pcszBuffer, CString& rstrWord, int nBufSize,
  385. WORD wEndFlags, BOOL bConvertToLowerCase,
  386. BOOL bTryToChangeCaseDyn, BOOL bChangeCase = FALSE) const;
  387. WORD _GetChar(LPCTSTR pcszStr, int& rnCharLen) const;
  388. WORD _ChangeCase(WORD wChar) const;
  389. WORD _MakeLower(WORD wChar) const;
  390. void Clear() {
  391. RemoveAll();
  392. };
  393. virtual void OnFinalRelease();
  394. CXTPSyntaxEditLexAutomatWordsMap* pNextFreeObj;
  395. PLA_CHAR_NODE*          m_pHashTable;
  396. UINT                    m_uHashTableSize;
  397. const LA_CHAR_NODE* Lookup(WORD wChar) const;
  398. const LA_CHAR_NODE* SetAt(const LA_CHAR_NODE& newNode);
  399. private:
  400. };
  401. XTP_DEFINE_SMART_PTR_INTERNAL(CXTPSyntaxEditLexAutomatWordsMap)
  402. class _XTP_EXT_CLASS CXTPSyntaxEditLexTagsAutomat
  403. {
  404. public:
  405. CXTPSyntaxEditLexTagsAutomat();
  406. virtual ~CXTPSyntaxEditLexTagsAutomat();
  407. void AddTagsList(CXTPSyntaxEditLexVariantPtrArray* pArTags, BOOL bConvertToLowerCase);
  408. BOOL IsEmpty();
  409. void RemoveAll();
  410. void CopyFrom(const CXTPSyntaxEditLexTagsAutomat& rSrc);
  411. BOOL FindMinWord(LPCTSTR pcszBuffer, CString& rstrWord, int nBufSize,
  412.  BOOL bConvertToLowerCase, BOOL bIgnoreCaseDyn);
  413. BOOL FindMaxWord(LPCTSTR pcszBuffer, CString& rstrWord, int nBufSize,
  414.  BOOL bConvertToLowerCase, BOOL bIgnoreCaseDyn);
  415. protected:
  416. void _AddWords(CXTPSyntaxEditLexAutomatWordsMapPtr& rPtrMap, CStringArray& arTags, BOOL bConvertToLowerCase);
  417. UINT _CalcHashTableSize(int nCount);
  418. BOOL _FindWord(BOOL bMinWord, LPCTSTR pcszBuffer, CString& rstrWord, int nBufSize,
  419. BOOL bConvertToLowerCase, BOOL bIgnoreCaseDyn);
  420. public:
  421. CXTPSyntaxEditLexAutomatWordsMapPtr m_ptrWordsMap;
  422. CXTPSyntaxEditLexAutomatWordsMapPtr m_ptrWordsMap_not;
  423. private:
  424. };
  425. class _XTP_EXT_CLASS CXTPSyntaxEditLexAutomatMemMan : public CXTPCmdTarget
  426. {
  427. public:
  428. CXTPSyntaxEditLexAutomatMemMan();
  429. virtual ~CXTPSyntaxEditLexAutomatMemMan();
  430. CXTPSyntaxEditLexAutomatWordsMap* NewMap(UINT uHashTableSize);
  431. LA_CHAR_NODE*           NewNode();
  432. PLA_CHAR_NODE*          NewHashTable(UINT uSize);
  433. void FreeObject(CXTPSyntaxEditLexAutomatWordsMap* pObj);
  434. void FreeObject(LA_CHAR_NODE* pObj);
  435. void FreeObject(PLA_CHAR_NODE* pObj);
  436. DWORD Lock();
  437. DWORD Unlok();
  438. #ifdef _DEBUG
  439. void Dump(CDumpContext& dc) const;
  440. #endif
  441. UINT m_uAllocatedMaps;
  442. UINT m_uUsedMaps;
  443. UINT m_uAllocatedNodes;
  444. UINT m_uUsedNodes;
  445. UINT m_uAllocatedTables;
  446. UINT m_uUsedTables;
  447. UINT m_uAllocatedTablesBytes;
  448. UINT m_uUsedTablesBytes;
  449. // END DEBUG -----------------------------------
  450. protected:
  451. LONG    m_lLockCount;
  452. void    FreeAll();
  453. struct LA_HASH_TABLE
  454. {
  455. friend class CXTPSyntaxEditLexAutomatMemMan;
  456. UINT            uSize;
  457. //protected:
  458. LA_HASH_TABLE*  pNextFreeObj;
  459. void Clear() {
  460. PLA_CHAR_NODE* pData = GetData();
  461. ::ZeroMemory(pData, uSize*sizeof(PLA_CHAR_NODE*));
  462. }
  463. PLA_CHAR_NODE* GetData() {
  464. return (PLA_CHAR_NODE*) ( ((byte*)this) + GetHeaderSizeB() );
  465. }
  466. static UINT GetHeaderSizeB() {
  467. UINT uHeader = sizeof(LA_HASH_TABLE);
  468. return uHeader;
  469. }
  470. static UINT GetHeaderSize() {
  471. UINT uHeader = GetHeaderSizeB();
  472. UINT uHeader2 = uHeader / sizeof(PLA_CHAR_NODE);
  473. uHeader2 += (uHeader % sizeof(PLA_CHAR_NODE)) ? 1 : 0;
  474. return uHeader2;
  475. }
  476. static LA_HASH_TABLE* GetHeader(PLA_CHAR_NODE* pData) {
  477. return (LA_HASH_TABLE*) ( ((byte*)pData) - GetHeaderSizeB() );
  478. }
  479. };
  480. CXTPSyntaxEditLexAutomatWordsMap* m_pFreeMaps;
  481. LA_CHAR_NODE*   m_pFreeNodes;
  482. LA_HASH_TABLE*  m_pFreeTables;
  483. CList<CXTPSyntaxEditLexAutomatWordsMap*, CXTPSyntaxEditLexAutomatWordsMap*> m_allocatedMaps;
  484. CList<LA_CHAR_NODE*, LA_CHAR_NODE*>         m_allocatedNodes;
  485. CList<PLA_CHAR_NODE*, PLA_CHAR_NODE*>       m_allocatedTables;
  486. };
  487. ////////////////////////////////////////////////////////////////////////////
  488. template<LPCTSTR (* _FuncName)(void) >
  489. class CXTPSyntaxEditLexVariantPtrArrayExAutomatT : public CXTPSyntaxEditLexVariantPtrArrayExT<_FuncName>
  490. {
  491. public:
  492. typedef CXTPSyntaxEditLexVariantPtrArrayExT<_FuncName> TBase;
  493. typedef CXTPSyntaxEditLexVariantPtrArrayExAutomatT<_FuncName> Tthis;
  494. CXTPSyntaxEditLexVariantPtrArrayExAutomatT() {
  495. #ifdef _DEBUG
  496. m_bAutomatWasBuilt = FALSE;
  497. #endif
  498. };
  499. virtual ~CXTPSyntaxEditLexVariantPtrArrayExAutomatT(){};
  500. void BuildAutomat(BOOL bConvertToLowerCase = FALSE)
  501. {
  502. m_automat.RemoveAll();
  503. m_automat.AddTagsList(this, bConvertToLowerCase);
  504. #ifdef _DEBUG
  505. m_bAutomatWasBuilt = TRUE;
  506. #endif
  507. }
  508. void CopyFrom(const Tthis& rSrc) {
  509. TBase::CopyFrom(rSrc);
  510. m_automat.CopyFrom(rSrc.m_automat);
  511. #ifdef _DEBUG
  512. m_bAutomatWasBuilt = rSrc.m_bAutomatWasBuilt;
  513. #endif
  514. }
  515. BOOL FindMinWord(LPCTSTR pcszBuffer, CString& rstrWord, int nBufSize,
  516. BOOL bConvertToLowerCase = FALSE, BOOL bIgnoreCaseDyn = FALSE)
  517. {
  518. ASSERT(m_bAutomatWasBuilt);
  519. return m_automat.FindMinWord(pcszBuffer, rstrWord, nBufSize,
  520. bConvertToLowerCase, bIgnoreCaseDyn);
  521. }
  522. BOOL FindMaxWord(LPCTSTR pcszBuffer, CString& rstrWord, int nBufSize,
  523. BOOL bConvertToLowerCase = FALSE, BOOL bIgnoreCaseDyn = FALSE)
  524. {
  525. ASSERT(m_bAutomatWasBuilt);
  526. return m_automat.FindMaxWord(pcszBuffer, rstrWord, nBufSize,
  527. bConvertToLowerCase, bIgnoreCaseDyn);
  528. }
  529. protected:
  530. CXTPSyntaxEditLexTagsAutomat    m_automat;
  531. #ifdef _DEBUG
  532. BOOL m_bAutomatWasBuilt;
  533. #endif
  534. };
  535. }
  536. ////////////////////////////////////////////////////////////////////////////
  537. //#pragma warning(pop)
  538. #endif // !defined(__XTPSYNTAXEDITLEXCLASSSUBOBJT_H__)