From 9fbd8b8d614746f8d1567f0ec525c29b88da8690 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 18 Jul 1998 21:15:37 +0000 Subject: [PATCH 1/1] several bugs fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@302 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/fileconf.cpp | 128 ++++++++++++++++++++++++---------------- src/common/string.cpp | 17 ++++-- 2 files changed, 89 insertions(+), 56 deletions(-) diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index a3f3df3f2c..d4a7cf6152 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -48,6 +48,11 @@ #include #include +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- +#define CONST_CAST ((wxFileConfig *)this)-> + // ---------------------------------------------------------------------------- // global functions declarations // ---------------------------------------------------------------------------- @@ -143,8 +148,6 @@ void wxFileConfig::Init() m_linesHead = m_linesTail = NULL; - m_bExpandEnvVars = TRUE; - m_strPath.Empty(); } @@ -204,14 +207,18 @@ void wxFileConfig::Parse(wxTextFile& file, bool bLocal) { const char *pStart; const char *pEnd; + wxString strLine; + + uint nLineCount = file.GetLineCount(); + for ( uint n = 0; n < nLineCount; n++ ) { + strLine = file[n]; - for ( uint n = 0; n < file.GetLineCount(); n++ ) { // add the line to linked list if ( bLocal ) - LineListAppend(file[n]); + LineListAppend(strLine); // skip leading spaces - for ( pStart = file[n]; isspace(*pStart); pStart++ ) + for ( pStart = strLine; isspace(*pStart); pStart++ ) ; // skip blank/comment lines @@ -317,12 +324,7 @@ void wxFileConfig::Parse(wxTextFile& file, bool bLocal) while ( isspace(*pEnd) ) pEnd++; - wxString strValue; - if (m_bExpandEnvVars) - strValue = ExpandEnvVars(FilterIn(pEnd)); - else - strValue = FilterIn(pEnd); - pEntry->SetValue(strValue, FALSE); + pEntry->SetValue(FilterIn(pEnd), FALSE /* read from file */); } } } @@ -349,13 +351,13 @@ void wxFileConfig::SetPath(const wxString& strPath) if ( strPath[0] == APPCONF_PATH_SEPARATOR ) { // absolute path - SplitPath(aParts, strPath); + wxSplitPath(aParts, strPath); } else { // relative path, combine with current one wxString strFullPath = m_strPath; strFullPath << APPCONF_PATH_SEPARATOR << strPath; - SplitPath(aParts, strFullPath); + wxSplitPath(aParts, strFullPath); } // change current group @@ -411,6 +413,38 @@ bool wxFileConfig::GetNextEntry (wxString& str, long& lIndex) return FALSE; } +uint wxFileConfig::GetNumberOfEntries(bool bRecursive) const +{ + uint n = m_pCurrentGroup->Entries().Count(); + if ( bRecursive ) { + ConfigGroup *pOldCurrentGroup = m_pCurrentGroup; + uint nSubgroups = m_pCurrentGroup->Groups().Count(); + for ( uint nGroup = 0; nGroup < nSubgroups; nGroup++ ) { + CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; + n += GetNumberOfEntries(TRUE); + CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + } + } + + return n; +} + +uint wxFileConfig::GetNumberOfGroups(bool bRecursive) const +{ + uint n = m_pCurrentGroup->Groups().Count(); + if ( bRecursive ) { + ConfigGroup *pOldCurrentGroup = m_pCurrentGroup; + uint nSubgroups = m_pCurrentGroup->Groups().Count(); + for ( uint nGroup = 0; nGroup < nSubgroups; nGroup++ ) { + CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; + n += GetNumberOfGroups(TRUE); + CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + } + } + + return n; +} + // ---------------------------------------------------------------------------- // tests for existence // ---------------------------------------------------------------------------- @@ -435,15 +469,6 @@ bool wxFileConfig::HasEntry(const wxString& strName) const // read/write values // ---------------------------------------------------------------------------- -const char *wxFileConfig::Read(const char *szKey, - const char *szDefault) const -{ - PathChanger path(this, szKey); - - ConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); - return pEntry == NULL ? szDefault : pEntry->Value().c_str(); -} - bool wxFileConfig::Read(wxString *pstr, const char *szKey, const char *szDefault) const @@ -452,15 +477,24 @@ bool wxFileConfig::Read(wxString *pstr, ConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); if (pEntry == NULL) { - *pstr = szDefault; + *pstr = ExpandEnvVars(szDefault); return FALSE; } else { - *pstr = pEntry->Value(); + *pstr = ExpandEnvVars(pEntry->Value()); return TRUE; } } +const char *wxFileConfig::Read(const char *szKey, + const char *szDefault) const +{ + static wxString s_str; + Read(&s_str, szKey, szDefault); + + return s_str.c_str(); +} + bool wxFileConfig::Read(long *pl, const char *szKey, long lDefault) const { wxString str; @@ -773,9 +807,9 @@ wxFileConfig::ConfigGroup::FindEntry(const char *szName) const res = Stricmp(pEntry->Name(), szName); #endif - if ( res < 0 ) + if ( res > 0 ) hi = i; - else if ( res > 0 ) + else if ( res < 0 ) lo = i + 1; else return pEntry; @@ -803,9 +837,9 @@ wxFileConfig::ConfigGroup::FindSubgroup(const char *szName) const res = Stricmp(pGroup->Name(), szName); #endif - if ( res < 0 ) + if ( res > 0 ) hi = i; - else if ( res > 0 ) + else if ( res < 0 ) lo = i + 1; else return pGroup; @@ -848,54 +882,44 @@ wxFileConfig::ConfigGroup::AddSubgroup(const wxString& strName) bool wxFileConfig::ConfigGroup::DeleteSubgroup(const char *szName) { - uint n, nCount = m_aSubgroups.Count(); - for ( n = 0; n < nCount; n++ ) { - if ( m_aSubgroups[n]->Name().IsSameAs(szName, APPCONF_CASE_SENSITIVE) ) - break; - } - - if ( n == nCount ) - return FALSE; + ConfigGroup *pGroup = FindSubgroup(szName); + wxCHECK( pGroup != NULL, FALSE ); // deleting non existing group? - nCount = m_aEntries.Count(); - for ( n = 0; n < nCount; n++ ) { - LineList *pLine = m_aEntries[n]->GetLine(); + // delete all entries + uint nCount = pGroup->m_aEntries.Count(); + for ( uint nEntry = 0; nEntry < nCount; nEntry++ ) { + LineList *pLine = pGroup->m_aEntries[nEntry]->GetLine(); if ( pLine != NULL ) m_pConfig->LineListRemove(pLine); } - ConfigGroup *pGroup = m_aSubgroups[n]; LineList *pLine = pGroup->m_pLine; if ( pLine != NULL ) m_pConfig->LineListRemove(pLine); - delete pGroup; SetDirty(); - m_aSubgroups.Remove(n); + m_aSubgroups.Remove(pGroup); + delete pGroup; + return TRUE; } bool wxFileConfig::ConfigGroup::DeleteEntry(const char *szName) { - uint n, nCount = m_aEntries.Count(); - for ( n = 0; n < nCount; n++ ) { - if ( m_aEntries[n]->Name().IsSameAs(szName, APPCONF_CASE_SENSITIVE) ) - break; - } - - if ( n == nCount ) + ConfigEntry *pEntry = FindEntry(szName); + if ( pEntry == NULL ) return FALSE; - ConfigEntry *pEntry = m_aEntries[n]; LineList *pLine = pEntry->GetLine(); if ( pLine != NULL ) m_pConfig->LineListRemove(pLine); - delete pEntry; SetDirty(); - m_aEntries.Remove(n); + m_aEntries.Remove(pEntry); + delete pEntry; + return TRUE; } diff --git a/src/common/string.cpp b/src/common/string.cpp index c2246e4991..a185a8ec26 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -282,13 +282,22 @@ void wxString::Alloc(uint nLen) { wxStringData *pData = GetStringData(); if ( pData->nAllocLength <= nLen ) { - if ( pData->IsEmpty() ) - AllocBuffer(nLen); + if ( pData->IsEmpty() ) { + nLen += EXTRA_ALLOC; + + wxStringData* pData = (wxStringData*) + malloc(sizeof(wxStringData) + (nLen + 1)*sizeof(char)); + pData->nRefs = 1; + pData->nDataLength = 0; + pData->nAllocLength = nLen; + m_pchData = pData->data(); // data starts after wxStringData + m_pchData[0u] = '\0'; + } else if ( pData->IsShared() ) { pData->Unlock(); // memory not freed because shared - uint nLen = pData->nDataLength; + uint nOldLen = pData->nDataLength; AllocBuffer(nLen); - memcpy(m_pchData, pData->data(), nLen*sizeof(char)); + memcpy(m_pchData, pData->data(), nOldLen*sizeof(char)); } else { nLen += EXTRA_ALLOC; -- 2.47.2