X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bd365871aadca528e03f3b6bb8382a1fdf5f1817..f363cee882672e147340240cf0bb194a68e37833:/src/common/imagxpm.cpp diff --git a/src/common/imagxpm.cpp b/src/common/imagxpm.cpp index 3f1caeaf46..d8b5bb2c69 100644 --- a/src/common/imagxpm.cpp +++ b/src/common/imagxpm.cpp @@ -2,7 +2,6 @@ // Name: src/common/imagxpm.cpp // Purpose: wxXPMHandler // Author: Vaclav Slavik, Robert Roebling -// RCS-ID: $Id$ // Copyright: (c) 2001 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -97,12 +96,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 +162,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"); } @@ -218,6 +256,7 @@ bool wxXPMHandler::DoCanRead(wxInputStream& stream) { wxXPMDecoder decoder; return decoder.CanRead(stream); + // it's ok to modify the stream position here } #endif // wxUSE_STREAMS