diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 528eae496c..18d4cea151 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -23,6 +23,7 @@ #include "SpecialFiles.h" #include "EnumHelper.h" #include "PrefsManager.h" +#include "XmlFileUtil.h" ThemeManager* THEME = NULL; // global object accessable from anywhere in the program @@ -258,39 +259,6 @@ bool ThemeManager::DoesLanguageExist( const RString &sLanguage ) return false; } -/* Move nodes from pFrom into pTo which don't already exist in pTo. For - * efficiency, nodes will be moved, not copied, so pFrom will be modified. - * On return, the contents of pFrom will be undefined and should be deleted. */ -static void MergeIniUnder( XNode *pFrom, XNode *pTo ) -{ - /* Iterate over each section in pFrom. */ - XNodes::iterator it = pFrom->m_childs.begin(); - while( it != pFrom->m_childs.end() ) - { - XNodes::iterator next = it; - ++next; - - /* If this node doesn't exist in pTo, just move the whole node. */ - XNode *pChildNode = pTo->GetChild( it->first ); - XNode *pSectionNode = it->second; - if( pChildNode == NULL ) - { - pFrom->RemoveChild( pSectionNode, false ); // don't delete - pTo->AppendChild( pSectionNode ); - } - else - { - FOREACHM( RString, XNodeValue *, pSectionNode->m_attrs, it2 ) - { - /* Don't overwrite existing nodes. */ - pChildNode->AppendAttrFrom( it2->first, it2->second->Copy(), false ); - } - } - - it = next; - } -} - void ThemeManager::LoadThemeMetrics( deque &theme, const RString &sThemeName_, const RString &sLanguage_ ) { if( g_pLoadedThemeData == NULL ) @@ -343,8 +311,8 @@ void ThemeManager::LoadThemeMetrics( deque &theme, const RString &sThemeN * need to load the derived theme first, to find out the name of the fallback * theme. Avoid having to load IniFile twice, merging the fallback theme * into the derived theme that we've already loaded. */ - MergeIniUnder( &iniMetrics, &g_pLoadedThemeData->iniMetrics ); - MergeIniUnder( &iniStrings, &g_pLoadedThemeData->iniStrings ); + XmlFileUtil::MergeIniUnder( &iniMetrics, &g_pLoadedThemeData->iniMetrics ); + XmlFileUtil::MergeIniUnder( &iniStrings, &g_pLoadedThemeData->iniStrings ); if( sFallback.empty() ) break; diff --git a/stepmania/src/XmlFileUtil.cpp b/stepmania/src/XmlFileUtil.cpp index 4afdc0d863..9b1b7c1b15 100644 --- a/stepmania/src/XmlFileUtil.cpp +++ b/stepmania/src/XmlFileUtil.cpp @@ -733,6 +733,39 @@ XNode *XmlFileUtil::XNodeFromTable( lua_State *L ) return XNodeFromTableRecursive( L, "Layer", ProcessedTables ); } +/* Move nodes from pFrom into pTo which don't already exist in pTo. For + * efficiency, nodes will be moved, not copied, so pFrom will be modified. + * On return, the contents of pFrom will be undefined and should be deleted. */ +void XmlFileUtil::MergeIniUnder( XNode *pFrom, XNode *pTo ) +{ + /* Iterate over each section in pFrom. */ + XNodes::iterator it = pFrom->m_childs.begin(); + while( it != pFrom->m_childs.end() ) + { + XNodes::iterator next = it; + ++next; + + /* If this node doesn't exist in pTo, just move the whole node. */ + XNode *pChildNode = pTo->GetChild( it->first ); + XNode *pSectionNode = it->second; + if( pChildNode == NULL ) + { + pFrom->RemoveChild( pSectionNode, false ); // don't delete + pTo->AppendChild( pSectionNode ); + } + else + { + FOREACHM( RString, XNodeValue *, pSectionNode->m_attrs, it2 ) + { + /* Don't overwrite existing nodes. */ + pChildNode->AppendAttrFrom( it2->first, it2->second->Copy(), false ); + } + } + + it = next; + } +} + /* * (c) 2001-2006 Chris Danford, Glenn Maynard * All rights reserved. diff --git a/stepmania/src/XmlFileUtil.h b/stepmania/src/XmlFileUtil.h index b10f71bf0d..231a597bf2 100644 --- a/stepmania/src/XmlFileUtil.h +++ b/stepmania/src/XmlFileUtil.h @@ -21,6 +21,8 @@ namespace XmlFileUtil void CompileXNodeTree( XNode *pNode, const RString &sFile ); XNode *XNodeFromTable( lua_State *L ); + + void MergeIniUnder( XNode *pFrom, XNode *pTo ); } #endif