+// ----------------------------------------------------------------------------
+// Environment
+// ----------------------------------------------------------------------------
+
+#ifdef __WXOSX__
+#if wxOSX_USE_COCOA_OR_CARBON
+ #include <crt_externs.h>
+#endif
+#endif
+
+bool wxGetEnvMap(wxEnvVariableHashMap *map)
+{
+ wxCHECK_MSG( map, false, wxS("output pointer can't be NULL") );
+
+#if defined(__VISUALC__)
+ wxChar **env = _tenviron;
+#elif defined(__VMS)
+ // Now this routine wil give false for OpenVMS
+ // TODO : should we do something with logicals?
+ char **env=NULL;
+#elif defined(__WXOSX__)
+#if wxOSX_USE_COCOA_OR_CARBON
+ // Under Mac shared libraries don't have access to the global environ
+ // variable so use this Mac-specific function instead as advised by
+ // environ(7) under Darwin
+ char ***penv = _NSGetEnviron();
+ if ( !penv )
+ return false;
+ char **env = *penv;
+#else
+ char **env=NULL;
+ // todo translate NSProcessInfo environment into map
+#endif
+#else // non-MSVC non-Mac
+ // Not sure if other compilers have _tenviron so use the (more standard)
+ // ANSI version only for them.
+#ifdef __BSD__
+ // POSIX, but not in an include file
+ extern char **environ;
+#endif
+ char **env = environ;
+#endif
+
+ if ( env )
+ {
+ wxString name,
+ value;
+ while ( *env )
+ {
+ const wxString var(*env);
+
+ name = var.BeforeFirst(wxS('='), &value);
+
+ (*map)[name] = value;
+
+ env++;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+