X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2eaf6433f2e266c48f4ac3822a975c692255b88d..ad653fa23069c5d9378247084f03c9a718c3ad62:/src/common/imagxpm.cpp diff --git a/src/common/imagxpm.cpp b/src/common/imagxpm.cpp index 7d02ebe372..17ec2b9143 100644 --- a/src/common/imagxpm.cpp +++ b/src/common/imagxpm.cpp @@ -80,6 +80,7 @@ license is as follows: #include "wx/imagxpm.h" #include "wx/wfstream.h" #include "wx/xpmdecod.h" +#include "wx/filename.h" IMPLEMENT_DYNAMIC_CLASS(wxXPMHandler,wxImageHandler) @@ -96,12 +97,51 @@ bool wxXPMHandler::LoadFile(wxImage *image, wxXPMDecoder decoder; wxImage img = decoder.ReadFile(stream); - if ( !img.Ok() ) + if ( !img.IsOk() ) return false; *image = img; return true; } +namespace +{ + +// Make the given string a valid C identifier. +// +// All invalid characters are simply replaced by underscores and underscore is +// also prepended in the beginning if the initial character is not alphabetic. +void +MakeValidCIdent(wxString* str) +{ + const wxChar chUnderscore = wxT('_'); + + for ( wxString::iterator it = str->begin(); it != str->end(); ++it ) + { + const wxChar ch = *it; + if ( wxIsdigit(ch) ) + { + if ( it == str->begin() ) + { + // Identifiers can't start with a digit. + str->insert(0, chUnderscore); // prepend underscore + it = str->begin(); // restart as string changed + continue; + } + } + else if ( !wxIsalpha(ch) && ch != chUnderscore ) + { + // Not a valid character in C identifiers. + *it = chUnderscore; + } + } + + // Double underscores are not allowed in normal C identifiers and are + // useless anyhow. + str->Replace(wxT("__"), wxT("_")); +} + +} // anonymous namespace + bool wxXPMHandler::SaveFile(wxImage * image, wxOutputStream& stream, bool WXUNUSED(verbose)) { @@ -123,15 +163,15 @@ bool wxXPMHandler::SaveFile(wxImage * image, wxString sName; if ( image->HasOption(wxIMAGE_OPTION_FILENAME) ) { - wxSplitPath(image->GetOption(wxIMAGE_OPTION_FILENAME), - NULL, &sName, NULL); + sName = wxFileName(image->GetOption(wxIMAGE_OPTION_FILENAME)).GetName(); + MakeValidCIdent(&sName); sName << wxT("_xpm"); } if ( !sName.empty() ) - sName = wxString(wxT("/* XPM */\nstatic char *")) + sName; + sName = wxString(wxT("/* XPM */\nstatic const char *")) + sName; else - sName = wxT("/* XPM */\nstatic char *xpm_data"); + sName = wxT("/* XPM */\nstatic const char *xpm_data"); stream.Write( (const char*) sName.ToAscii(), sName.Len() ); char tmpbuf[200]; @@ -217,6 +257,7 @@ bool wxXPMHandler::DoCanRead(wxInputStream& stream) { wxXPMDecoder decoder; return decoder.CanRead(stream); + // it's ok to modify the stream position here } #endif // wxUSE_STREAMS