X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c801d85f158c4cba50b588807daabdcbd0ed3853..63fec618dcf7313de03a6912b9e0d3f5c5c6535a:/src/common/config.cpp?ds=sidebyside diff --git a/src/common/config.cpp b/src/common/config.cpp index ddb5a9d716..d2cc81d6c1 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -2,19 +2,23 @@ // Name: config.cpp // Purpose: implementation of wxConfig class // Author: Vadim Zeitlin -// Modified by: +// Modified by: // Created: 07.04.98 // RCS-ID: $Id$ -// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net +// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net // Vadim Zeitlin // Licence: wxWindows license /////////////////////////////////////////////////////////////////////////////// // ============================================================================ -// headers +// declarations // ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- #ifdef __GNUG__ -#pragma implementation "app.h" + #pragma implementation "config.h" #endif #include "wx/wxprec.h" @@ -23,15 +27,26 @@ #pragma hdrstop #endif //__BORLANDC__ -#include -#include +#ifndef WX_PRECOMP + #include + #include +#endif //WX_PRECOMP + +#include #include #include #include #include - +#include #include -#include + +#include // for isalnum() + +// ---------------------------------------------------------------------------- +// global and class static variables +// ---------------------------------------------------------------------------- + +wxConfig *wxConfig::ms_pConfig = NULL; // ============================================================================ // implementation @@ -44,6 +59,65 @@ wxConfig::~wxConfig() { } +wxConfig *wxConfig::Set(wxConfig *pConfig) +{ + wxConfig *pOld = ms_pConfig; + ms_pConfig = pConfig; + return pOld; +} + +void wxConfig::Create() +{ + ms_pConfig = wxTheApp->CreateConfig(); +} + +const char *wxConfig::Read(const char *szKey, const char *szDefault) const +{ + static char s_szBuf[1024]; + wxString s; + Read(&s, szKey, szDefault); + strncpy(s_szBuf, s, WXSIZEOF(s_szBuf)); + + return s_szBuf; +} + +// ---------------------------------------------------------------------------- +// Config::PathChanger +// ---------------------------------------------------------------------------- + +wxConfig::PathChanger::PathChanger(const wxConfig *pContainer, + const wxString& strEntry) +{ + m_pContainer = (wxConfig *)pContainer; + wxString strPath = strEntry.Before(APPCONF_PATH_SEPARATOR); + + // special case of "/keyname" when there is nothing before "/" + if ( strPath.IsEmpty() && strEntry[0] == APPCONF_PATH_SEPARATOR ) + strPath = APPCONF_PATH_SEPARATOR; + + if ( !strPath.IsEmpty() ) { + // do change the path + m_bChanged = TRUE; + m_strName = strEntry.Right(APPCONF_PATH_SEPARATOR); + m_strOldPath = m_pContainer->GetPath(); + m_strOldPath += APPCONF_PATH_SEPARATOR; + m_pContainer->SetPath(strPath); + } + else { + // it's a name only, without path - nothing to do + m_bChanged = FALSE; + m_strName = strEntry; + } +} + +wxConfig::PathChanger::~PathChanger() +{ + // only restore path if it was changed + if ( m_bChanged ) { + m_pContainer->SetPath(m_strOldPath); + } +} + // ---------------------------------------------------------------------------- // static & global functions // ---------------------------------------------------------------------------- @@ -51,18 +125,19 @@ wxConfig::~wxConfig() // understands both Unix and Windows (but only under Windows) environment // variables expansion: i.e. $var, $(var) and ${var} are always understood // and in addition under Windows %var% is also. -wxString ExpandEnvVars(const wxString& str) +wxString wxExpandEnvVars(const wxString& str) { wxString strResult; + strResult.Alloc(str.Len()); // don't change the values the enum elements: they must be equal // to the matching [closing] delimiter. enum Bracket - { - Bracket_None, - Bracket_Normal = ')', + { + Bracket_None, + Bracket_Normal = ')', Bracket_Curly = '}', -#ifdef __WINDOWS__ +#ifdef __WXMSW__ Bracket_Windows = '%' // yeah, Windows people are a bit strange ;-) #endif }; @@ -70,13 +145,13 @@ wxString ExpandEnvVars(const wxString& str) uint m; for ( uint n = 0; n < str.Len(); n++ ) { switch ( str[n] ) { -#ifdef __WINDOWS__ +#ifdef __WXMSW__ case '%': #endif //WINDOWS case '$': { Bracket bracket; - #ifdef __WINDOWS__ + #ifdef __WXMSW__ if ( str[n] == '%' ) bracket = Bracket_Windows; else @@ -86,8 +161,8 @@ wxString ExpandEnvVars(const wxString& str) } else { switch ( str[n + 1] ) { - case '(': - bracket = Bracket_Normal; + case '(': + bracket = Bracket_Normal; n++; // skip the bracket break; @@ -114,7 +189,7 @@ wxString ExpandEnvVars(const wxString& str) } else { // variable doesn't exist => don't change anything - #ifdef __WINDOWS__ + #ifdef __WXMSW__ if ( bracket != Bracket_Windows ) #endif if ( bracket != Bracket_None ) @@ -125,7 +200,7 @@ wxString ExpandEnvVars(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(_("missing '%c' at position %d in '%s'."), (char)bracket, m + 1, str.c_str()); } else { @@ -140,10 +215,6 @@ wxString ExpandEnvVars(const wxString& str) } break; - case '\\': - n++; - // fall through - default: strResult += str[n]; } @@ -151,3 +222,42 @@ wxString ExpandEnvVars(const wxString& str) return strResult; } + +// this function is used to properly interpret '..' in path +void wxSplitPath(wxArrayString& aParts, const char *sz) +{ + aParts.Empty(); + + wxString strCurrent; + const char *pc = sz; + for ( ;; ) { + if ( *pc == '\0' || *pc == APPCONF_PATH_SEPARATOR ) { + if ( strCurrent == "." ) { + // ignore + } + else if ( strCurrent == ".." ) { + // go up one level + if ( aParts.IsEmpty() ) + wxLogWarning(_("'%s' has extra '..', ignored."), sz); + else + aParts.Remove(aParts.Count() - 1); + + strCurrent.Empty(); + } + else if ( !strCurrent.IsEmpty() ) { + aParts.Add(strCurrent); + strCurrent.Empty(); + } + //else: + // could log an error here, but we prefer to ignore extra '/' + + if ( *pc == '\0' ) + return; + } + else + strCurrent += *pc; + + pc++; + } +} +