From 4fe7567d90f0c0cce6dbdfa556d47243da866ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Tue, 21 Aug 2007 16:10:28 +0000 Subject: [PATCH] use wxVector instead of homegrown growing array in wxHtmlTagsCache git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48300 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/html/htmltag.h | 13 ++++---- src/html/htmltag.cpp | 65 +++++++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/include/wx/html/htmltag.h b/include/wx/html/htmltag.h index d429d74f70..58d1005465 100644 --- a/include/wx/html/htmltag.h +++ b/include/wx/html/htmltag.h @@ -25,21 +25,22 @@ class WXDLLIMPEXP_FWD_HTML wxHtmlEntitiesParser; // - internal wxHTML class, do not use! //----------------------------------------------------------------------------- -struct wxHtmlCacheItem; +class wxHtmlTagsCacheData; class WXDLLIMPEXP_HTML wxHtmlTagsCache : public wxObject { DECLARE_DYNAMIC_CLASS(wxHtmlTagsCache) private: - wxHtmlCacheItem *m_Cache; - int m_CacheSize; - int m_CachePos; + wxHtmlTagsCacheData *m_Cache; + size_t m_CachePos; + + wxHtmlTagsCacheData& Cache() { return *m_Cache; } public: - wxHtmlTagsCache() : wxObject() {m_CacheSize = 0; m_Cache = NULL;} + wxHtmlTagsCache() {m_Cache = NULL;} wxHtmlTagsCache(const wxString& source); - virtual ~wxHtmlTagsCache() {free(m_Cache);} + virtual ~wxHtmlTagsCache(); // Finds parameters for tag starting at at and fills the variables void QueryTag(int at, int* end1, int* end2); diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index 05b9c77a25..a468b0b00c 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -23,6 +23,8 @@ #endif #include "wx/html/htmlpars.h" +#include "wx/vector.h" + #include // for vsscanf #include @@ -47,11 +49,13 @@ struct wxHtmlCacheItem wxChar *Name; }; +// NB: this is an empty class and not typedef because of forward declaration +class wxHtmlTagsCacheData : public wxVector +{ +}; IMPLEMENT_CLASS(wxHtmlTagsCache,wxObject) -#define CACHE_INCREMENT 64 - bool wxIsCDATAElement(const wxChar *tag) { return (wxStrcmp(tag, _T("SCRIPT")) == 0) || @@ -60,14 +64,13 @@ bool wxIsCDATAElement(const wxChar *tag) wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) { + m_Cache = new wxHtmlTagsCacheData; + m_CachePos = 0; + const wxChar *src = source.c_str(); int lng = source.length(); wxChar tagBuffer[256]; - m_Cache = NULL; - m_CacheSize = 0; - m_CachePos = 0; - for ( int pos = 0; pos < lng; pos++ ) { if (src[pos] == wxT('<')) // tag found: @@ -80,11 +83,11 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) continue; } - if (m_CacheSize % CACHE_INCREMENT == 0) - m_Cache = (wxHtmlCacheItem*) realloc(m_Cache, (m_CacheSize + CACHE_INCREMENT) * sizeof(wxHtmlCacheItem)); - int tg = m_CacheSize++; + size_t tg = Cache().size(); + Cache().push_back(wxHtmlCacheItem()); + int stpos = pos++; - m_Cache[tg].Key = stpos; + Cache()[tg].Key = stpos; int i; for ( i = 0; @@ -96,26 +99,26 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) } tagBuffer[i] = _T('\0'); - m_Cache[tg].Name = new wxChar[i+1]; - memcpy(m_Cache[tg].Name, tagBuffer, (i+1)*sizeof(wxChar)); + Cache()[tg].Name = new wxChar[i+1]; + memcpy(Cache()[tg].Name, tagBuffer, (i+1)*sizeof(wxChar)); while (pos < lng && src[pos] != wxT('>')) pos++; if (src[stpos+1] == wxT('/')) // ending tag: { - m_Cache[tg].End1 = m_Cache[tg].End2 = -2; + Cache()[tg].End1 = Cache()[tg].End2 = -2; // find matching begin tag: for (i = tg; i >= 0; i--) - if ((m_Cache[i].End1 == -1) && (wxStrcmp(m_Cache[i].Name, tagBuffer+1) == 0)) + if ((Cache()[i].End1 == -1) && (wxStrcmp(Cache()[i].Name, tagBuffer+1) == 0)) { - m_Cache[i].End1 = stpos; - m_Cache[i].End2 = pos + 1; + Cache()[i].End1 = stpos; + Cache()[i].End2 = pos + 1; break; } } else { - m_Cache[tg].End1 = m_Cache[tg].End2 = -1; + Cache()[tg].End1 = Cache()[tg].End2 = -1; if (wxIsCDATAElement(tagBuffer)) { @@ -179,22 +182,30 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) } // ok, we're done, now we'll free .Name members of cache - we don't need it anymore: - for (int i = 0; i < m_CacheSize; i++) + for ( wxHtmlTagsCacheData::iterator i = Cache().begin(); + i != Cache().end(); ++i ) { - delete[] m_Cache[i].Name; - m_Cache[i].Name = NULL; + delete[] i->Name; + i->Name = NULL; } } +wxHtmlTagsCache::~wxHtmlTagsCache() +{ + delete m_Cache; +} + void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2) { - if (m_Cache == NULL) return; - if (m_Cache[m_CachePos].Key != at) + if (Cache().empty()) + return; + + if (Cache()[m_CachePos].Key != at) { - int delta = (at < m_Cache[m_CachePos].Key) ? -1 : 1; + int delta = (at < Cache()[m_CachePos].Key) ? -1 : 1; do { - if ( m_CachePos < 0 || m_CachePos == m_CacheSize ) + if ( m_CachePos < 0 || m_CachePos == Cache().size() ) { // something is very wrong with HTML, give up by returning an // impossibly large value which is going to be ignored by the @@ -206,10 +217,10 @@ void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2) m_CachePos += delta; } - while (m_Cache[m_CachePos].Key != at); + while (Cache()[m_CachePos].Key != at); } - *end1 = m_Cache[m_CachePos].End1; - *end2 = m_Cache[m_CachePos].End2; + *end1 = Cache()[m_CachePos].End1; + *end2 = Cache()[m_CachePos].End2; }