#include "wx/imagxpm.h"
#include "wx/wfstream.h"
#include "wx/xpmdecod.h"
+#include "wx/filename.h"
IMPLEMENT_DYNAMIC_CLASS(wxXPMHandler,wxImageHandler)
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))
{
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");
}
{
wxXPMDecoder decoder;
return decoder.CanRead(stream);
+ // it's ok to modify the stream position here
}
#endif // wxUSE_STREAMS