]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/utilsunx.cpp
Applied patch from Bo, WIP
[wxWidgets.git] / src / unix / utilsunx.cpp
index 88e0e5101f82f58a7b1387532024c2f85c14a293..429cf3e2f3c13824af43b45c0d6427747a7dd659 100644 (file)
 
 #include "wx/utils.h"
 
 
 #include "wx/utils.h"
 
+#define USE_PUTENV (!defined(HAVE_SETENV) && defined(HAVE_PUTENV))
+
 #ifndef WX_PRECOMP
     #include "wx/string.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/app.h"
     #include "wx/wxcrtvararg.h"
 #ifndef WX_PRECOMP
     #include "wx/string.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/app.h"
     #include "wx/wxcrtvararg.h"
+    #if USE_PUTENV
+        #include "wx/module.h"
+        #include "wx/hashmap.h"
+    #endif
 #endif
 
 #include "wx/apptrait.h"
 #endif
 
 #include "wx/apptrait.h"
@@ -897,16 +903,12 @@ bool wxGetUserName(wxChar *buf, int sz)
 
 bool wxIsPlatform64Bit()
 {
 
 bool wxIsPlatform64Bit()
 {
-    wxString machine = wxGetCommandOutput(wxT("uname -m"));
-
-    // NOTE: these tests are not 100% reliable!
-    return machine.Contains(wxT("AMD64")) ||
-           machine.Contains(wxT("IA64")) ||
-           machine.Contains(wxT("x64")) ||
-           machine.Contains(wxT("X64")) ||
-           machine.Contains(wxT("alpha")) ||
-           machine.Contains(wxT("hppa64")) ||
-           machine.Contains(wxT("ppc64"));
+    const wxString machine = wxGetCommandOutput(wxT("uname -m"));
+
+    // the test for "64" is obviously not 100% reliable but seems to work fine
+    // in practice
+    return machine.Contains(wxT("64")) ||
+                machine.Contains(wxT("alpha"));
 }
 
 // these functions are in mac/utils.cpp for wxMac
 }
 
 // these functions are in mac/utils.cpp for wxMac
@@ -1049,6 +1051,35 @@ bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspace
 // env vars
 // ----------------------------------------------------------------------------
 
 // env vars
 // ----------------------------------------------------------------------------
 
+#if USE_PUTENV
+
+WX_DECLARE_STRING_HASH_MAP(char *, wxEnvVars);
+
+static wxEnvVars gs_envVars;
+
+class wxSetEnvModule : public wxModule
+{
+public:
+    virtual bool OnInit() { return true; }
+    virtual void OnExit()
+    {
+        for ( wxEnvVars::const_iterator i = gs_envVars.begin();
+              i != gs_envVars.end();
+              ++i )
+        {
+            free(i->second);
+        }
+
+        gs_envVars.clear();
+    }
+
+    DECLARE_DYNAMIC_CLASS(wxSetEnvModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxSetEnvModule, wxModule)
+
+#endif // USE_PUTENV
+
 bool wxGetEnv(const wxString& var, wxString *value)
 {
     // wxGetenv is defined as getenv()
 bool wxGetEnv(const wxString& var, wxString *value)
 {
     // wxGetenv is defined as getenv()
@@ -1067,6 +1098,18 @@ bool wxGetEnv(const wxString& var, wxString *value)
 static bool wxDoSetEnv(const wxString& variable, const char *value)
 {
 #if defined(HAVE_SETENV)
 static bool wxDoSetEnv(const wxString& variable, const char *value)
 {
 #if defined(HAVE_SETENV)
+    if ( !value )
+    {
+#ifdef HAVE_UNSETENV
+        // don't test unsetenv() return value: it's void on some systems (at
+        // least Darwin)
+        unsetenv(variable.mb_str());
+        return true;
+#else
+        value = ""; // we can't pass NULL to setenv()
+#endif
+    }
+
     return setenv(variable.mb_str(), value, 1 /* overwrite */) == 0;
 #elif defined(HAVE_PUTENV)
     wxString s = variable;
     return setenv(variable.mb_str(), value, 1 /* overwrite */) == 0;
 #elif defined(HAVE_PUTENV)
     wxString s = variable;
@@ -1076,10 +1119,21 @@ static bool wxDoSetEnv(const wxString& variable, const char *value)
     // transform to ANSI
     const wxWX2MBbuf p = s.mb_str();
 
     // transform to ANSI
     const wxWX2MBbuf p = s.mb_str();
 
-    // the string will be free()d by libc
     char *buf = (char *)malloc(strlen(p) + 1);
     strcpy(buf, p);
 
     char *buf = (char *)malloc(strlen(p) + 1);
     strcpy(buf, p);
 
+    // store the string to free() it later
+    wxEnvVars::iterator i = gs_envVars.find(variable);
+    if ( i != gs_envVars.end() )
+    {
+        free(i->second);
+        i->second = buf;
+    }
+    else // this variable hadn't been set before
+    {
+        gs_envVars[variable] = buf;
+    }
+
     return putenv(buf) == 0;
 #else // no way to set an env var
     return false;
     return putenv(buf) == 0;
 #else // no way to set an env var
     return false;