Ensure that names of saved XPMs are valid C identifiers.
The name of the XPM should be based on the file name but can't always be exactly equal to it as it's possible (and relatively common, e.g. "foo-24.xpm") to have characters forbidden in identifiers to appear in the file names. Ensure that we use a valid C identifier here. Closes #13905. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -103,6 +103,45 @@ bool wxXPMHandler::LoadFile(wxImage *image,
|
|||||||
return true;
|
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,
|
bool wxXPMHandler::SaveFile(wxImage * image,
|
||||||
wxOutputStream& stream, bool WXUNUSED(verbose))
|
wxOutputStream& stream, bool WXUNUSED(verbose))
|
||||||
{
|
{
|
||||||
@@ -124,8 +163,8 @@ bool wxXPMHandler::SaveFile(wxImage * image,
|
|||||||
wxString sName;
|
wxString sName;
|
||||||
if ( image->HasOption(wxIMAGE_OPTION_FILENAME) )
|
if ( image->HasOption(wxIMAGE_OPTION_FILENAME) )
|
||||||
{
|
{
|
||||||
wxFileName::SplitPath(image->GetOption(wxIMAGE_OPTION_FILENAME),
|
sName = wxFileName(image->GetOption(wxIMAGE_OPTION_FILENAME)).GetName();
|
||||||
NULL, &sName, NULL);
|
MakeValidCIdent(&sName);
|
||||||
sName << wxT("_xpm");
|
sName << wxT("_xpm");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user