]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/config.cpp
* Fixed two memory leaks.
[wxWidgets.git] / src / common / config.cpp
index 4447719209077a0cbde7c56621054434159bafe8..2eb6facd54442274d7c63172e61e5fc996b05a1d 100644 (file)
@@ -18,7 +18,7 @@
 // headers
 // ----------------------------------------------------------------------------
 #ifdef __GNUG__
-  #pragma implementation "config.h"
+  #pragma implementation "confbase.h"
 #endif
 
 #include  "wx/wxprec.h"
 #include  <wx/file.h>
 #include  <wx/log.h>
 #include  <wx/textfile.h>
-#include  <wx/config.h>
+#include  <wx/confbase.h>
 
 // we must include (one of) these files for wxConfigBase::Create
-#if defined(__MSWIN__) && defined(wxCONFIG_WIN32_NATIVE)
+#if defined(__WXMSW__) && defined(wxCONFIG_WIN32_NATIVE)
   #ifdef __WIN32__
     #include  <wx/msw/regconf.h>
   #else  //WIN16
@@ -56,7 +56,8 @@
 // global and class static variables
 // ----------------------------------------------------------------------------
 
-wxConfigBase *wxConfigBase::ms_pConfig = NULL;
+wxConfigBase *wxConfigBase::ms_pConfig     = NULL;
+bool          wxConfigBase::ms_bAutoCreate = TRUE;
 
 // ============================================================================
 // implementation
@@ -75,17 +76,21 @@ wxConfigBase *wxConfigBase::Set(wxConfigBase *pConfig)
 
 wxConfigBase *wxConfigBase::Create()
 {
-  return ms_pConfig =
-  #if defined(__MSWIN__) && defined(wxCONFIG_WIN32_NATIVE)
-    #ifdef __WIN32__
-      new wxRegConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
-    #else  //WIN16
-      #error "Sorry, no wxIniConfig yet..."
-      //new wxIniConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
+  if ( ms_bAutoCreate && ms_pConfig == NULL ) {
+    ms_pConfig =
+    #if defined(__WXMSW__) && defined(wxCONFIG_WIN32_NATIVE)
+      #ifdef __WIN32__
+        new wxRegConfig(wxTheApp->GetVendorName() + '\\' 
+                        + wxTheApp->GetAppName());
+      #else  //WIN16
+        new wxIniConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
+      #endif
+    #else // either we're under Unix or wish to use files even under Windows
+      new wxFileConfig(wxTheApp->GetAppName());
     #endif
-  #else // either we're under Unix or wish to use files even under Windows
-    new wxFileConfig(wxTheApp->GetAppName());
-  #endif
+  }
+
+  return ms_pConfig;
 }
 
 const char *wxConfigBase::Read(const char *szKey, const char *szDefault) const
@@ -109,7 +114,7 @@ wxConfigBase::PathChanger::PathChanger(const wxConfigBase *pContainer,
   wxString strPath = strEntry.Before(wxCONFIG_PATH_SEPARATOR);
 
   // special case of "/keyname" when there is nothing before "/"
-  if ( strPath.IsEmpty() && strEntry[0] == wxCONFIG_PATH_SEPARATOR )
+  if ( strPath.IsEmpty() && ((!strEntry.IsEmpty()) && strEntry[0] == wxCONFIG_PATH_SEPARATOR ))
     strPath = wxCONFIG_PATH_SEPARATOR;
 
   if ( !strPath.IsEmpty() ) {
@@ -159,8 +164,8 @@ wxString wxExpandEnvVars(const wxString& str)
 #endif
   };
 
-  uint m;
-  for ( uint n = 0; n < str.Len(); n++ ) {
+  size_t m;
+  for ( size_t n = 0; n < str.Len(); n++ ) {
     switch ( str[n] ) {
 #ifdef  __WXMSW__
       case '%':
@@ -217,11 +222,12 @@ wxString wxExpandEnvVars(const wxString& str)
           // check the closing bracket
           if ( bracket != Bracket_None ) {
             if ( m == str.Len() || str[m] != (char)bracket ) {
-              wxLogWarning(_("missing '%c' at position %d in '%s'."),
+              wxLogWarning(_("Environment variables expansion failed: "
+                             "missing '%c' at position %d in '%s'."),
                            (char)bracket, m + 1, str.c_str());
             }
             else {
-              // skip closing bracket
+              // skip closing bracket unless the variables wasn't expanded
               if ( pszValue == NULL )
                 strResult << (char)bracket;
               m++;
@@ -232,6 +238,15 @@ wxString wxExpandEnvVars(const wxString& str)
         }
         break;
 
+      case '\\':
+        // backslash can be used to suppress special meaning of % and $
+        if ( n != str.Len() && (str[n + 1] == '%' || str[n + 1] == '$') ) {
+          strResult += str[++n];
+
+          break;
+        }
+        //else: fall through
+
       default:
         strResult += str[n];
     }