]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagxpm.cpp
Disable wxUSE_ENH_METAFILE for wxGTK builds.
[wxWidgets.git] / src / common / imagxpm.cpp
index 7d02ebe3724c7c7d9a85ecc54e1203964fc70052..17ec2b91434b7363a4e6345df6a459a545588fdc 100644 (file)
@@ -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