+ Cache()[tg].type = wxHtmlCacheItem::Type_NoMatchingEndingTag;
+
+ if (wxIsCDATAElement(tagBuffer))
+ {
+ // store the orig pos in case we are missing the closing
+ // tag (see below)
+ const wxString::const_iterator old_pos = pos;
+ bool foundCloseTag = false;
+
+ // find next matching tag
+ int tag_len = wxStrlen(tagBuffer);
+ while (pos < end)
+ {
+ // find the ending tag
+ while (pos + 1 < end &&
+ (*pos != '<' || *(pos+1) != '/'))
+ ++pos;
+ if (*pos == '<')
+ ++pos;
+
+ // see if it matches
+ int match_pos = 0;
+ while (pos < end && match_pos < tag_len )
+ {
+ wxChar c = *pos;
+ if ( c == '>' || c == '<' )
+ break;
+
+ // cast to wxChar needed to suppress warning in
+ // Unicode build
+ if ((wxChar)wxToupper(c) == tagBuffer[match_pos])
+ {
+ ++match_pos;
+ }
+ else if (c == wxT(' ') || c == wxT('\n') ||
+ c == wxT('\r') || c == wxT('\t'))
+ {
+ // need to skip over these
+ }
+ else
+ {
+ match_pos = 0;
+ }
+ ++pos;
+ }
+
+ // found a match
+ if (match_pos == tag_len)
+ {
+ pos = pos - tag_len - 3;
+ foundCloseTag = true;
+ break;
+ }
+ 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;
+ }
+ }