use wxVector<T> instead of homegrown growing array in wxHtmlTagsCache
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48300 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -25,21 +25,22 @@ class WXDLLIMPEXP_FWD_HTML wxHtmlEntitiesParser;
|
|||||||
// - internal wxHTML class, do not use!
|
// - internal wxHTML class, do not use!
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
struct wxHtmlCacheItem;
|
class wxHtmlTagsCacheData;
|
||||||
|
|
||||||
class WXDLLIMPEXP_HTML wxHtmlTagsCache : public wxObject
|
class WXDLLIMPEXP_HTML wxHtmlTagsCache : public wxObject
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS(wxHtmlTagsCache)
|
DECLARE_DYNAMIC_CLASS(wxHtmlTagsCache)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxHtmlCacheItem *m_Cache;
|
wxHtmlTagsCacheData *m_Cache;
|
||||||
int m_CacheSize;
|
size_t m_CachePos;
|
||||||
int m_CachePos;
|
|
||||||
|
wxHtmlTagsCacheData& Cache() { return *m_Cache; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
wxHtmlTagsCache() : wxObject() {m_CacheSize = 0; m_Cache = NULL;}
|
wxHtmlTagsCache() {m_Cache = NULL;}
|
||||||
wxHtmlTagsCache(const wxString& source);
|
wxHtmlTagsCache(const wxString& source);
|
||||||
virtual ~wxHtmlTagsCache() {free(m_Cache);}
|
virtual ~wxHtmlTagsCache();
|
||||||
|
|
||||||
// Finds parameters for tag starting at at and fills the variables
|
// Finds parameters for tag starting at at and fills the variables
|
||||||
void QueryTag(int at, int* end1, int* end2);
|
void QueryTag(int at, int* end1, int* end2);
|
||||||
|
@@ -23,6 +23,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/html/htmlpars.h"
|
#include "wx/html/htmlpars.h"
|
||||||
|
#include "wx/vector.h"
|
||||||
|
|
||||||
#include <stdio.h> // for vsscanf
|
#include <stdio.h> // for vsscanf
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
@@ -47,11 +49,13 @@ struct wxHtmlCacheItem
|
|||||||
wxChar *Name;
|
wxChar *Name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// NB: this is an empty class and not typedef because of forward declaration
|
||||||
|
class wxHtmlTagsCacheData : public wxVector<wxHtmlCacheItem>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
IMPLEMENT_CLASS(wxHtmlTagsCache,wxObject)
|
IMPLEMENT_CLASS(wxHtmlTagsCache,wxObject)
|
||||||
|
|
||||||
#define CACHE_INCREMENT 64
|
|
||||||
|
|
||||||
bool wxIsCDATAElement(const wxChar *tag)
|
bool wxIsCDATAElement(const wxChar *tag)
|
||||||
{
|
{
|
||||||
return (wxStrcmp(tag, _T("SCRIPT")) == 0) ||
|
return (wxStrcmp(tag, _T("SCRIPT")) == 0) ||
|
||||||
@@ -60,14 +64,13 @@ bool wxIsCDATAElement(const wxChar *tag)
|
|||||||
|
|
||||||
wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
||||||
{
|
{
|
||||||
|
m_Cache = new wxHtmlTagsCacheData;
|
||||||
|
m_CachePos = 0;
|
||||||
|
|
||||||
const wxChar *src = source.c_str();
|
const wxChar *src = source.c_str();
|
||||||
int lng = source.length();
|
int lng = source.length();
|
||||||
wxChar tagBuffer[256];
|
wxChar tagBuffer[256];
|
||||||
|
|
||||||
m_Cache = NULL;
|
|
||||||
m_CacheSize = 0;
|
|
||||||
m_CachePos = 0;
|
|
||||||
|
|
||||||
for ( int pos = 0; pos < lng; pos++ )
|
for ( int pos = 0; pos < lng; pos++ )
|
||||||
{
|
{
|
||||||
if (src[pos] == wxT('<')) // tag found:
|
if (src[pos] == wxT('<')) // tag found:
|
||||||
@@ -80,11 +83,11 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_CacheSize % CACHE_INCREMENT == 0)
|
size_t tg = Cache().size();
|
||||||
m_Cache = (wxHtmlCacheItem*) realloc(m_Cache, (m_CacheSize + CACHE_INCREMENT) * sizeof(wxHtmlCacheItem));
|
Cache().push_back(wxHtmlCacheItem());
|
||||||
int tg = m_CacheSize++;
|
|
||||||
int stpos = pos++;
|
int stpos = pos++;
|
||||||
m_Cache[tg].Key = stpos;
|
Cache()[tg].Key = stpos;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for ( i = 0;
|
for ( i = 0;
|
||||||
@@ -96,26 +99,26 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
|||||||
}
|
}
|
||||||
tagBuffer[i] = _T('\0');
|
tagBuffer[i] = _T('\0');
|
||||||
|
|
||||||
m_Cache[tg].Name = new wxChar[i+1];
|
Cache()[tg].Name = new wxChar[i+1];
|
||||||
memcpy(m_Cache[tg].Name, tagBuffer, (i+1)*sizeof(wxChar));
|
memcpy(Cache()[tg].Name, tagBuffer, (i+1)*sizeof(wxChar));
|
||||||
|
|
||||||
while (pos < lng && src[pos] != wxT('>')) pos++;
|
while (pos < lng && src[pos] != wxT('>')) pos++;
|
||||||
|
|
||||||
if (src[stpos+1] == wxT('/')) // ending tag:
|
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:
|
// find matching begin tag:
|
||||||
for (i = tg; i >= 0; i--)
|
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;
|
Cache()[i].End1 = stpos;
|
||||||
m_Cache[i].End2 = pos + 1;
|
Cache()[i].End2 = pos + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Cache[tg].End1 = m_Cache[tg].End2 = -1;
|
Cache()[tg].End1 = Cache()[tg].End2 = -1;
|
||||||
|
|
||||||
if (wxIsCDATAElement(tagBuffer))
|
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:
|
// 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;
|
delete[] i->Name;
|
||||||
m_Cache[i].Name = NULL;
|
i->Name = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxHtmlTagsCache::~wxHtmlTagsCache()
|
||||||
|
{
|
||||||
|
delete m_Cache;
|
||||||
|
}
|
||||||
|
|
||||||
void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2)
|
void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2)
|
||||||
{
|
{
|
||||||
if (m_Cache == NULL) return;
|
if (Cache().empty())
|
||||||
if (m_Cache[m_CachePos].Key != at)
|
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
|
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
|
// something is very wrong with HTML, give up by returning an
|
||||||
// impossibly large value which is going to be ignored by the
|
// 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;
|
m_CachePos += delta;
|
||||||
}
|
}
|
||||||
while (m_Cache[m_CachePos].Key != at);
|
while (Cache()[m_CachePos].Key != at);
|
||||||
}
|
}
|
||||||
*end1 = m_Cache[m_CachePos].End1;
|
*end1 = Cache()[m_CachePos].End1;
|
||||||
*end2 = m_Cache[m_CachePos].End2;
|
*end2 = Cache()[m_CachePos].End2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user