X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/66a77a748e5c8002f3f9ebd66f5457aca5aabad8..53a240f02bd45da218f46a43db81207a100f83ec:/src/html/htmltag.cpp diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index 386bb98a59..6fc8e6cca3 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -12,7 +12,7 @@ #pragma implementation #endif -#include +#include "wx/wxprec.h" #include "wx/defs.h" #if wxUSE_HTML @@ -22,7 +22,7 @@ #endif #ifndef WXPRECOMP -#include +#include "wx/wx.h" #endif #include "wx/html/htmltag.h" @@ -52,14 +52,20 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) m_CachePos = 0; pos = 0; - while (pos < lng) { - if (src[pos] == wxT('<')) { // tag found: + while (pos < lng) + { + if (src[pos] == wxT('<')) // tag found: + { if (m_CacheSize % CACHE_INCREMENT == 0) m_Cache = (sCacheItem*) realloc(m_Cache, (m_CacheSize + CACHE_INCREMENT) * sizeof(sCacheItem)); tg = m_CacheSize++; m_Cache[tg].Key = stpos = pos++; dummy[0] = 0; i = 0; - while ((src[pos] != wxT('>')) && (src[pos] != wxT(' '))) { + while (pos < lng && + src[pos] != wxT('>') && + src[pos] != wxT(' ') && src[pos] != wxT('\r') && + src[pos] != wxT('\n') && src[pos] != wxT('\t')) + { dummy[i] = src[pos++]; if ((dummy[i] >= wxT('a')) && (dummy[i] <= wxT('z'))) dummy[i] -= (wxT('a') - wxT('A')); i++; @@ -68,19 +74,22 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) m_Cache[tg].Name = new wxChar[i+1]; memcpy(m_Cache[tg].Name, dummy, (i+1)*sizeof(wxChar)); - while (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; // find matching begin tag: for (i = tg; i >= 0; i--) - if ((m_Cache[i].End1 == -1) && (wxStrcmp(m_Cache[i].Name, dummy+1) == 0)) { + if ((m_Cache[i].End1 == -1) && (wxStrcmp(m_Cache[i].Name, dummy+1) == 0)) + { m_Cache[i].End1 = stpos; m_Cache[i].End2 = pos + 1; break; } } - else { + else + { m_Cache[tg].End1 = m_Cache[tg].End2 = -1; } } @@ -89,7 +98,8 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) } // ok, we're done, now we'll free .Name members of cache - we don't need it anymore: - for (i = 0; i < m_CacheSize; i++) { + for (i = 0; i < m_CacheSize; i++) + { delete[] m_Cache[i].Name; m_Cache[i].Name = NULL; } @@ -100,7 +110,8 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2) { if (m_Cache == NULL) return; - if (m_Cache[m_CachePos].Key != at) { + if (m_Cache[m_CachePos].Key != at) + { int delta = (at < m_Cache[m_CachePos].Key) ? -1 : 1; do {m_CachePos += delta;} while (m_Cache[m_CachePos].Key != at); } @@ -125,30 +136,54 @@ wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCac // fill-in name, params and begin pos: m_Name = m_Params = wxEmptyString; i = pos+1; - if (source[i] == '/') {m_Ending = TRUE; i++;} + if (source[i] == '/') { m_Ending = TRUE; i++; } else m_Ending = FALSE; - while ((i < end_pos) && ((c = source[i++]) != ' ') && (c != '>')) { + // find tag's name and convert it to uppercase: + while ((i < end_pos) && + ((c = source[i++]) != ' ' && c != '\r' && c != '\n' && c != '\t' && + c != '>')) + { if ((c >= 'a') && (c <= 'z')) c -= ('a' - 'A'); m_Name += c; } + // if the tag has parameters, read them and "normalize" them, + // i.e. convert to uppercase, replace whitespaces by spaces and + // remove whitespaces around '=': if (source[i-1] != '>') - while ((i < end_pos) && ((c = source[i++]) != '>')) { + while ((i < end_pos) && ((c = source[i++]) != '>')) + { if ((c >= 'a') && (c <= 'z')) c -= ('a' - 'A'); + if (c == '\r' || c == '\n' || c == '\t') c = ' '; // make future parsing a bit simpler m_Params += c; - if (c == '"') { + if (c == '"') + { + // remove spaces around the '=' character: + if (m_Params.Length() > 1 && + m_Params[m_Params.Length()-2] == ' ') + { + m_Params.RemoveLast(); + while (m_Params.Length() > 0 && m_Params.Last() == ' ') + m_Params.RemoveLast(); + m_Params += '"'; + } + while ((i < end_pos) && (source[i++] == ' ')) {} + if (i < end_pos) i--; + + // ...and copy the value to m_Params: while ((i < end_pos) && ((c = source[i++]) != '"')) m_Params += c; m_Params += c; } - else if (c == '\'') { + else if (c == '\'') + { while ((i < end_pos) && ((c = source[i++]) != '\'')) m_Params += c; m_Params += c; } } m_Begin = i; - cache -> QueryTag(pos, &m_End1, &m_End2); + 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; } @@ -162,16 +197,20 @@ bool wxHtmlTag::HasParam(const wxString& par) const if (*st == 0) return FALSE; if (*p == 0) return FALSE; - for (st2 = st, p2 = p; ; st2++) { + for (st2 = st, p2 = p; ; st2++) + { if (*p2 == 0) return TRUE; if (*st2 == 0) return FALSE; if (*p2 != *st2) p2 = p; if (*p2 == *st2) p2++; if (*st2 == ' ') p2 = p; - else if (*st2 == '=') { + else if (*st2 == '=') + { p2 = p; - while (*st2 != ' ') { - if (*st2 == '"') { + while (*st2 != ' ') + { + if (*st2 == '"') + { st2++; while (*st2 != '"') st2++; } @@ -193,23 +232,29 @@ wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const if (*st == 0) return ""; if (*p == 0) return ""; - for (st2 = st, p2 = p; ; st2++) { - if (*p2 == 0) { // found + for (st2 = st, p2 = p; ; st2++) + { + if (*p2 == 0) // found + { wxString fnd = ""; st2++; // '=' character comma = FALSE; - comma_char = '\0'; - if (!with_commas && (*(st2) == '"')) { - st2++; - comma = TRUE; - comma_char = '"'; - } - else if (!with_commas && (*(st2) == '\'')) { - st2++; - comma = TRUE; - comma_char = '\''; - } - while (*st2 != 0) { + comma_char = '\0'; + if (!with_commas && (*(st2) == '"')) + { + st2++; + comma = TRUE; + comma_char = '"'; + } + else if (!with_commas && (*(st2) == '\'')) + { + st2++; + comma = TRUE; + comma_char = '\''; + } + + while (*st2 != 0) + { if (comma && *st2 == comma_char) comma = FALSE; else if ((*st2 == ' ') && (!comma)) break; fnd += (*(st2++)); @@ -221,14 +266,18 @@ wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const if (*p2 != *st2) p2 = p; if (*p2 == *st2) p2++; if (*st2 == ' ') p2 = p; - else if (*st2 == '=') { + else if (*st2 == '=') + { p2 = p; - while (*st2 != ' ') { - if (*st2 == '"') { + while (*st2 != ' ') + { + if (*st2 == '"') + { st2++; while (*st2 != '"') st2++; } - else if (*st2 == '\'') { + else if (*st2 == '\'') + { st2++; while (*st2 != '\'') st2++; }