void HTMLDecode(wxString& s)
{
wxString sRet;
for(size_t i = 0; i < s.length(); ++i)
{
if(s.c_str()[i] == wxT('&'))
{
if(s.length() - i >= 7)
{
if(s.c_str()[i] == wxT('&') &&
s.c_str()[i+1] == wxT('#') &&
wxIsdigit(s.c_str()[i+2]) &&
wxIsdigit(s.c_str()[i+3]) &&
wxIsdigit(s.c_str()[i+4]) &&
s.c_str()[i+5] == wxT(';'))
{
sRet += (wxChar) ((s.c_str()[i+2] - wxT('0')) * 100) +
((s.c_str()[i+3] - wxT('0')) * 10) +
((s.c_str()[i+4] - wxT('0')) );
i += 6;
continue;
}
}
if(s.length() - i >= 6)
{
if(wxTmemcmp(&s.c_str()[i], wxT("'"), 6) == 0)
{
sRet += wxT(''');
i += 5;
continue;
}
if(wxTmemcmp(&s.c_str()[i], wxT(" "), 6) == 0)
{
sRet += wxT(' ');
i += 5;
continue;
}
if(wxTmemcmp(&s.c_str()[i], wxT("""), 6) == 0)
{
sRet += wxT('"');
i += 5;
continue;
}
}
if(s.length() - i >= 5 && wxTmemcmp(&s.c_str()[i], wxT("&"), 5) == 0)
{
sRet += wxT('&');
i += 4; //todo: We should re-scan like this:
// wxTmemmove((wxChar*)&s.c_str()[i+1],
// (wxChar*)&s.c_str()[i+5],
// s.length() - (i+5) );
// s.c_str()[i+5]
// i -= 1;
continue;
}
if(s.length() - i >= 4)
{
if(wxTmemcmp(&s.c_str()[i], wxT("<"), 4) == 0)
{
sRet += wxT('<');
i += 3;
continue;
}
if(wxTmemcmp(&s.c_str()[i], wxT(">"), 4) == 0)
{
sRet += wxT('>');
i += 3;
continue;
}
}
}
sRet += s[i];
}
s = sRet;
}
{
wxString sRet;
for(size_t i = 0; i < s.length(); ++i)
{
if(s.c_str()[i] == wxT('&'))
{
if(s.length() - i >= 7)
{
if(s.c_str()[i] == wxT('&') &&
s.c_str()[i+1] == wxT('#') &&
wxIsdigit(s.c_str()[i+2]) &&
wxIsdigit(s.c_str()[i+3]) &&
wxIsdigit(s.c_str()[i+4]) &&
s.c_str()[i+5] == wxT(';'))
{
sRet += (wxChar) ((s.c_str()[i+2] - wxT('0')) * 100) +
((s.c_str()[i+3] - wxT('0')) * 10) +
((s.c_str()[i+4] - wxT('0')) );
i += 6;
continue;
}
}
if(s.length() - i >= 6)
{
if(wxTmemcmp(&s.c_str()[i], wxT("'"), 6) == 0)
{
sRet += wxT(''');
i += 5;
continue;
}
if(wxTmemcmp(&s.c_str()[i], wxT(" "), 6) == 0)
{
sRet += wxT(' ');
i += 5;
continue;
}
if(wxTmemcmp(&s.c_str()[i], wxT("""), 6) == 0)
{
sRet += wxT('"');
i += 5;
continue;
}
}
if(s.length() - i >= 5 && wxTmemcmp(&s.c_str()[i], wxT("&"), 5) == 0)
{
sRet += wxT('&');
i += 4; //todo: We should re-scan like this:
// wxTmemmove((wxChar*)&s.c_str()[i+1],
// (wxChar*)&s.c_str()[i+5],
// s.length() - (i+5) );
// s.c_str()[i+5]
// i -= 1;
continue;
}
if(s.length() - i >= 4)
{
if(wxTmemcmp(&s.c_str()[i], wxT("<"), 4) == 0)
{
sRet += wxT('<');
i += 3;
continue;
}
if(wxTmemcmp(&s.c_str()[i], wxT(">"), 4) == 0)
{
sRet += wxT('>');
i += 3;
continue;
}
}
}
sRet += s[i];
}
s = sRet;
}
No comments are included for this article. Submit a comment with your feedback/suggestions.
Click to View Printer Friendly Version