X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8703bc01c28e0397764cd28b915caf17a28020ad..fa28826dd3836d6d50c92ca8de1e97dd4c8cf3bc:/src/html/htmltag.cpp diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index 361aaa971a..98a1ff4fba 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -4,14 +4,9 @@ // Author: Vaclav Slavik // RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik -// Licence: wxWindows Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "htmltag.h" -#endif - #include "wx/wxprec.h" #include "wx/defs.h" @@ -90,7 +85,7 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) src[pos] != wxT('>') && !wxIsspace(src[pos]); i++, pos++ ) { - tagBuffer[i] = wxToupper(src[pos]); + tagBuffer[i] = (wxChar)wxToupper(src[pos]); } tagBuffer[i] = _T('\0'); @@ -117,6 +112,11 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) if (wxIsCDATAElement(tagBuffer)) { + // store the orig pos in case we are missing the closing + // tag (see below) + wxInt32 old_pos = pos; + bool foundCloseTag = false; + // find next matching tag int tag_len = wxStrlen(tagBuffer); while (pos < lng) @@ -127,7 +127,7 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) ++pos; if (src[pos] == '<') ++pos; - + // see if it matches int match_pos = 0; while (pos < lng && match_pos < tag_len && src[pos] != '>' && src[pos] != '<') { @@ -135,7 +135,7 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) // Unicode build if ((wxChar)wxToupper(src[pos]) == tagBuffer[match_pos]) { ++match_pos; - } + } else if (src[pos] == wxT(' ') || src[pos] == wxT('\n') || src[pos] == wxT('\r') || src[pos] == wxT('\t')) { // need to skip over these @@ -147,16 +147,25 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) } // found a match - if (match_pos == tag_len) { - // These 2 lines commented: - //pos = pos - tag_len - 3; pos is not used outside of while loop - //stpos = pos; Value is local to while loop, no need to set it + if (match_pos == tag_len) + { + pos = pos - tag_len - 3; + foundCloseTag = true; break; } - else { + else // keep looking for the closing tag + { ++pos; } } + if (!foundCloseTag) + { + // we didn't find closing tag; this means the markup + // is incorrect and the best thing we can do is to + // ignore the unclosed tag and continue parsing as if + // it didn't exist: + pos = old_pos; + } } } } @@ -180,6 +189,16 @@ void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2) int delta = (at < m_Cache[m_CachePos].Key) ? -1 : 1; do { + if ( m_CachePos < 0 || m_CachePos == m_CacheSize ) + { + // something is very wrong with HTML, give up by returning an + // impossibly large value which is going to be ignored by the + // caller + *end1 = + *end2 = INT_MAX; + return; + } + m_CachePos += delta; } while (m_Cache[m_CachePos].Key != at); @@ -341,12 +360,12 @@ wxHtmlTag::wxHtmlTag(wxHtmlTag *parent, } #undef IS_WHITE - } - m_Begin = i; + } + m_Begin = i; - cache->QueryTag(pos, &m_End1, &m_End2); - if (m_End1 > end_pos) m_End1 = end_pos; - if (m_End2 > end_pos) m_End2 = end_pos; + cache->QueryTag(pos, &m_End1, &m_End2); + if (m_End1 > end_pos) m_End1 = end_pos; + if (m_End2 > end_pos) m_End2 = end_pos; } wxHtmlTag::~wxHtmlTag() @@ -394,7 +413,7 @@ bool wxHtmlTag::GetParamAsColour(const wxString& par, wxColour *clr) const { wxString str = GetParam(par); - if (str.IsEmpty()) return false; + if (str.empty()) return false; if (str.GetChar(0) == wxT('#')) { unsigned long tmp; @@ -444,7 +463,7 @@ bool wxHtmlTag::GetParamAsInt(const wxString& par, int *clr) const wxString wxHtmlTag::GetAllParams() const { - // VS: this function is for backward compatiblity only, + // VS: this function is for backward compatibility only, // never used by wxHTML wxString s; size_t cnt = m_ParamNames.GetCount();