X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e8da6b7cef55cc0fa4a02938919fc790836d380d..f244aef2825dbea130f7950ada91ce5325efb203:/src/xml/xml.cpp diff --git a/src/xml/xml.cpp b/src/xml/xml.cpp index 23c01e477e..16ced8c8f6 100644 --- a/src/xml/xml.cpp +++ b/src/xml/xml.cpp @@ -40,7 +40,7 @@ IMPLEMENT_CLASS(wxXmlDocument, wxObject) // a private utility used by wxXML -static bool wxIsWhiteOnly(const wxChar *buf); +static bool wxIsWhiteOnly(const wxString& buf); //----------------------------------------------------------------------------- @@ -418,13 +418,9 @@ bool wxXmlDocument::Save(const wxString& filename, int indentstep) const // converts Expat-produced string in UTF-8 into wxString using the specified // conv or keep in UTF-8 if conv is NULL static wxString CharToString(wxMBConv *conv, - const char *s, size_t len = wxString::npos) + const char *s, size_t len = wxString::npos) { -#if wxUSE_UNICODE - wxUnusedVar(conv); - - return wxString(s, wxConvUTF8, len); -#else // !wxUSE_UNICODE +#if !wxUSE_UNICODE if ( conv ) { // there can be no embedded NULs in this string so we don't need the @@ -434,19 +430,22 @@ static wxString CharToString(wxMBConv *conv, return wxString(wbuf, *conv); } - else // already in UTF-8, no conversion needed - { - return wxString(s, len != wxString::npos ? len : strlen(s)); - } -#endif // wxUSE_UNICODE/!wxUSE_UNICODE + // else: the string is wanted in UTF-8 +#endif // !wxUSE_UNICODE + + wxUnusedVar(conv); + return wxString::FromUTF8(s, len); } // returns true if the given string contains only whitespaces -bool wxIsWhiteOnly(const wxChar *buf) +bool wxIsWhiteOnly(const wxString& buf) { - for (const wxChar *c = buf; *c != wxT('\0'); c++) - if (*c != wxT(' ') && *c != wxT('\t') && *c != wxT('\n') && *c != wxT('\r')) + for ( wxString::const_iterator i = buf.begin(); i != buf.end(); ++i ) + { + wxChar c = *i; + if ( c != wxT(' ') && c != wxT('\t') && c != wxT('\n') && c != wxT('\r')) return false; + } return true; } @@ -459,7 +458,6 @@ struct wxXmlParsingContext wxXmlNode *lastAsText; wxString encoding; wxString version; - bool bLastCdata; bool removeWhiteOnlyNodes; }; @@ -481,9 +479,7 @@ static void StartElementHnd(void *userData, const char *name, const char **atts) ctx->node = node; ctx->lastAsText = NULL; } -} -extern "C" { static void EndElementHnd(void *userData, const char* WXUNUSED(name)) { wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; @@ -491,9 +487,7 @@ static void EndElementHnd(void *userData, const char* WXUNUSED(name)) ctx->node = ctx->node->GetParent(); ctx->lastAsText = NULL; } -} -extern "C" { static void TextHnd(void *userData, const char *s, int len) { wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; @@ -501,15 +495,7 @@ static void TextHnd(void *userData, const char *s, int len) if (ctx->lastAsText) { - if ( ctx->bLastCdata ) - { - ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + - CharToString(NULL, s, len)); - } - else - { - ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + str); - } + ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + str); } else { @@ -524,30 +510,15 @@ static void TextHnd(void *userData, const char *s, int len) } } } -} -extern "C" { static void StartCdataHnd(void *userData) { wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - ctx->bLastCdata = true; - ctx->lastAsText = new wxXmlNode(wxXML_CDATA_SECTION_NODE, wxT("cdata"),wxT("")); ctx->node->AddChild(ctx->lastAsText); } -} - -extern "C" { -static void EndCdataHnd(void *userData) -{ - wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - - ctx->bLastCdata = false; -} -} -extern "C" { static void CommentHnd(void *userData, const char *data) { wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; @@ -562,9 +533,7 @@ static void CommentHnd(void *userData, const char *data) } ctx->lastAsText = NULL; } -} -extern "C" { static void DefaultHnd(void *userData, const char *s, int len) { // XML header: @@ -582,17 +551,14 @@ static void DefaultHnd(void *userData, const char *s, int len) ctx->version = buf.Mid(pos + 9).BeforeFirst(buf[(size_t)pos+8]); } } -} -extern "C" { static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData), const XML_Char *name, XML_Encoding *info) { // We must build conversion table for expat. The easiest way to do so // is to let wxCSConv convert as string containing all characters to // wide character representation: - wxString str(name, wxConvLibc); - wxCSConv conv(str); + wxCSConv conv(name); char mbBuf[2]; wchar_t wcBuf[10]; size_t i; @@ -616,7 +582,8 @@ static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData), return 1; } -} + +} // extern "C" bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int flags) { @@ -636,16 +603,15 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int fl ctx.encoding = wxT("UTF-8"); // default in absence of encoding="" ctx.conv = NULL; #if !wxUSE_UNICODE - if ( encoding != wxT("UTF-8") && encoding != wxT("utf-8") ) + if ( encoding.CmpNoCase(wxT("UTF-8")) != 0 ) ctx.conv = new wxCSConv(encoding); #endif ctx.removeWhiteOnlyNodes = (flags & wxXMLDOC_KEEP_WHITESPACE_NODES) == 0; - ctx.bLastCdata = false; XML_SetUserData(parser, (void*)&ctx); XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); XML_SetCharacterDataHandler(parser, TextHnd); - XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd ); + XML_SetStartCdataSectionHandler(parser, StartCdataHnd); XML_SetCommentHandler(parser, CommentHnd); XML_SetDefaultHandler(parser, DefaultHnd); XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); @@ -853,17 +819,23 @@ bool wxXmlDocument::Save(wxOutputStream& stream, int indentstep) const wxString s; - wxMBConv *convMem = NULL; + wxMBConv *convMem = NULL, + *convFile; #if wxUSE_UNICODE - wxMBConv *convFile = new wxCSConv(GetFileEncoding()); + convFile = new wxCSConv(GetFileEncoding()); + convMem = NULL; #else - wxMBConv *convFile = NULL; - if ( GetFileEncoding() != GetEncoding() ) + if ( GetFileEncoding().CmpNoCase(GetEncoding()) != 0 ) { convFile = new wxCSConv(GetFileEncoding()); convMem = new wxCSConv(GetEncoding()); } + else // file and in-memory encodings are the same, no conversion needed + { + convFile = + convMem = NULL; + } #endif s.Printf(wxT("\n"), @@ -873,10 +845,8 @@ bool wxXmlDocument::Save(wxOutputStream& stream, int indentstep) const OutputNode(stream, GetRoot(), 0, convMem, convFile, indentstep); OutputString(stream, wxT("\n")); - if ( convFile ) - delete convFile; - if ( convMem ) - delete convMem; + delete convFile; + delete convMem; return true; }