wxLogError(_("error: %s"), !err.empty() ? (const wxChar*)err.c_str() : "")
 
 - wxCtime() and wxAsctime() return char*; this is incompatible with Unicode
-  build in wxWidgets 2.8 that returned wchar_t*. 
+  build in wxWidgets 2.8 that returned wchar_t*.
 
 - DigitalMars compiler has a bug that prevents it from using
   wxUniChar::operator bool in conditions and it erroneously reports type
   This can be worked around by explicitly casting to bool:
      for ( wxString::const_iterator p = s.begin(); (bool)*p; ++p )
 
+- virtual wxHtmlParser::AddText() takes wxString, not wxChar*, argument now.
+
 Deprecated methods and their replacements
 -----------------------------------------
 
 
 
 \membersection{wxHtmlParser::AddText}\label{wxhtmlparseraddword}
 
-\func{virtual void}{AddWord}{\param{const char* }{txt}}
+\func{virtual void}{AddWord}{\param{const wxString\& }{txt}}
 
 Must be overwritten in derived class.
 
 
 
     // Adds text to the output.
     // This is called from Parse() and must be overriden in derived classes.
-    // txt is not guaranteed to be only one word. It is largest continuous part of text
-    // (= not broken by tags)
-    // NOTE : using char* because of speed improvements
-    virtual void AddText(const wxChar* txt) = 0;
+    // txt is not guaranteed to be only one word. It is largest continuous part
+    // of text (= not broken by tags)
+    virtual void AddText(const wxString& txt) = 0;
 
     // Adds tag and proceeds it. Parse() may (and usually is) called from this method.
     // This is called from Parse() and may be overriden.
 
     virtual wxFont* CreateCurrentFont();
 
 protected:
-    virtual void AddText(const wxChar* txt);
+    virtual void AddText(const wxString& txt);
 
 private:
     void DoAddText(wxChar *temp, int& templen, wxChar nbsp);
 
     wxObject* GetProduct() { return NULL; }
 
 protected:
-    virtual void AddText(const wxChar* WXUNUSED(txt)) {}
+    virtual void AddText(const wxString& WXUNUSED(txt)) {}
 
     DECLARE_NO_COPY_CLASS(HP_Parser)
 };
 
     wxObject* GetProduct() { return NULL; }
 
 protected:
-    virtual void AddText(const wxChar* WXUNUSED(txt)) {}
+    virtual void AddText(const wxString& WXUNUSED(txt)) {}
 
     DECLARE_NO_COPY_CLASS(wxMetaTagParser)
 };
 
     return GetFS()->OpenFile(myurl, flags);
 }
 
-void wxHtmlWinParser::AddText(const wxChar* txt)
+void wxHtmlWinParser::AddText(const wxString& txt)
 {
-    size_t i = 0,
-           x,
-           lng = wxStrlen(txt);
     register wxChar d;
     int templen = 0;
     wxChar nbsp = GetEntitiesParser()->GetCharForCode(160 /* nbsp */);
 
+    size_t lng = txt.length();
     if (lng+1 > m_tmpStrBufSize)
     {
         delete[] m_tmpStrBuf;
     }
     wxChar *temp = m_tmpStrBuf;
 
+    wxString::const_iterator i = txt.begin();
+    wxString::const_iterator end = txt.end();
+
     if (m_tmpLastWasSpace)
     {
-        while ((i < lng) &&
-               ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) || (txt[i] == wxT(' ')) ||
-                (txt[i] == wxT('\t')))) i++;
+        while ( (i < end) &&
+                (*i == wxT('\n') || *i == wxT('\r') || *i == wxT(' ') ||
+                 *i == wxT('\t')) )
+        {
+            ++i;
+        }
     }
 
-    while (i < lng)
+    while (i < end)
     {
-        x = 0;
-        d = temp[templen++] = txt[i];
+        size_t x = 0;
+        d = temp[templen++] = *i;
         if ((d == wxT('\n')) || (d == wxT('\r')) || (d == wxT(' ')) || (d == wxT('\t')))
         {
-            i++, x++;
-            while ((i < lng) && ((txt[i] == wxT('\n')) || (txt[i] == wxT('\r')) ||
-                                 (txt[i] == wxT(' ')) || (txt[i] == wxT('\t')))) i++, x++;
+            ++i, ++x;
+            while ( (i < end) &&
+                    (*i == wxT('\n') || *i == wxT('\r') ||
+                     *i == wxT(' ')) || *i == wxT('\t') )
+            {
+                ++i;
+                ++x;
+            }
         }
-        else i++;
+        else
+            ++i;
 
         if (x)
         {