X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4d223b670407f32abd3ca962ec08fdc0da2df3f8..1be06faf7318abf88a35b299b90ceb2a49c0353b:/src/html/htmltag.cpp diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index 9f36d68957..577728d50a 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -2,6 +2,7 @@ // Name: htmltag.cpp // Purpose: wxHtmlTag class (represents single tag) // Author: Vaclav Slavik +// RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik // Licence: wxWindows Licence ///////////////////////////////////////////////////////////////////////////// @@ -11,7 +12,7 @@ #pragma implementation #endif -#include +#include "wx/wxprec.h" #include "wx/defs.h" #if wxUSE_HTML @@ -21,10 +22,11 @@ #endif #ifndef WXPRECOMP -#include +#include "wx/wx.h" #endif -#include +#include "wx/html/htmltag.h" +#include // for vsscanf #include @@ -40,10 +42,10 @@ IMPLEMENT_CLASS(wxHtmlTagsCache,wxObject) wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) { - const char *src = source.c_str(); + const wxChar *src = source.c_str(); int i, tg, pos, stpos; int lng = source.Length(); - char dummy[256]; + wxChar dummy[256]; m_Cache = NULL; m_CacheSize = 0; @@ -51,28 +53,31 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) pos = 0; while (pos < lng) { - if (src[pos] == '<') { // tag found: + 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] != '>') && (src[pos] != ' ')) { + 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] >= 'a') && (dummy[i] <= 'z')) dummy[i] -= ('a' - 'A'); + if ((dummy[i] >= wxT('a')) && (dummy[i] <= wxT('z'))) dummy[i] -= (wxT('a') - wxT('A')); i++; } dummy[i] = 0; - m_Cache[tg].Name = (char*) malloc(i+1); - memcpy(m_Cache[tg].Name, dummy, i+1); + m_Cache[tg].Name = new wxChar[i+1]; + memcpy(m_Cache[tg].Name, dummy, (i+1)*sizeof(wxChar)); - while (src[pos] != '>') pos++; + while (pos < lng && src[pos] != wxT('>')) pos++; - if (src[stpos+1] == '/') { // 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) && (strcmp(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; @@ -88,7 +93,7 @@ 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++) { - free(m_Cache[i].Name); + delete[] m_Cache[i].Name; m_Cache[i].Name = NULL; } } @@ -126,7 +131,9 @@ wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCac if (source[i] == '/') {m_Ending = TRUE; i++;} else m_Ending = FALSE; - while ((i < end_pos) && ((c = source[i++]) != ' ') && (c != '>')) { + 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; } @@ -134,11 +141,16 @@ wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCac if (source[i-1] != '>') 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 == '"') { while ((i < end_pos) && ((c = source[i++]) != '"')) m_Params += c; m_Params += c; } + else if (c == '\'') { + while ((i < end_pos) && ((c = source[i++]) != '\'')) m_Params += c; + m_Params += c; + } } m_Begin = i; @@ -151,8 +163,8 @@ wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCac bool wxHtmlTag::HasParam(const wxString& par) const { - const char *st = m_Params, *p = par; - const char *st2, *p2; + const wxChar *st = m_Params, *p = par; + const wxChar *st2, *p2; if (*st == 0) return FALSE; if (*p == 0) return FALSE; @@ -180,9 +192,10 @@ bool wxHtmlTag::HasParam(const wxString& par) const wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const { - const char *st = m_Params, *p = par; - const char *st2, *p2; + const wxChar *st = m_Params, *p = par; + const wxChar *st2, *p2; bool comma; + char comma_char; if (*st == 0) return ""; if (*p == 0) return ""; @@ -191,13 +204,23 @@ wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const wxString fnd = ""; st2++; // '=' character comma = FALSE; - if (!with_commas && (*(st2) == '"')) {st2++; comma = TRUE;} + 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 (*st2 == '"') comma = !comma; + if (comma && *st2 == comma_char) comma = FALSE; else if ((*st2 == ' ') && (!comma)) break; fnd += (*(st2++)); } - if (!with_commas && (*(st2-1) == '"')) fnd.RemoveLast(); + if (!with_commas && (*(st2-1) == comma_char)) fnd.RemoveLast(); return fnd; } if (*st2 == 0) return ""; @@ -211,6 +234,10 @@ wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const st2++; while (*st2 != '"') st2++; } + else if (*st2 == '\'') { + st2++; + while (*st2 != '\'') st2++; + } st2++; } } @@ -219,31 +246,10 @@ wxString wxHtmlTag::GetParam(const wxString& par, bool with_commas) const -void wxHtmlTag::ScanParam(const wxString& par, char *format, ...) const +int wxHtmlTag::ScanParam(const wxString& par, wxChar *format, void *param) const { - va_list argptr; wxString parval = GetParam(par); - - va_start(argptr, format); - -//#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(__VISUALC__) -#ifndef HAVE_VSSCANF - sscanf((const char*)parval, format, va_arg(argptr, void *)); -#else - vsscanf((const char*)parval, format, argptr); -#endif - -/* - --- vsscanf is not defined under Cygwin or Mingw32 or M$ Visual C++ environment - if this module doesn't compile with your compiler, - modify the def statement and let me know. Thanks... - - So far wxHtml functions are scanning only _one_ value - so I workarounded this by supposing that there is only - one ...-parameter -*/ - - va_end(argptr); + return wxSscanf((const wxChar*)parval, format, param); } #endif