X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8faef7ccbc4b4e192da06de7e1a2a7f1dff7ec91..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/common/imagxpm.cpp diff --git a/src/common/imagxpm.cpp b/src/common/imagxpm.cpp index 2850e770e6..17ec2b9143 100644 --- a/src/common/imagxpm.cpp +++ b/src/common/imagxpm.cpp @@ -97,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)) { @@ -124,8 +163,8 @@ bool wxXPMHandler::SaveFile(wxImage * image, wxString sName; if ( image->HasOption(wxIMAGE_OPTION_FILENAME) ) { - wxFileName::SplitPath(image->GetOption(wxIMAGE_OPTION_FILENAME), - NULL, &sName, NULL); + sName = wxFileName(image->GetOption(wxIMAGE_OPTION_FILENAME)).GetName(); + MakeValidCIdent(&sName); sName << wxT("_xpm"); }