diff --git a/stella/src/emucore/Console.cxx b/stella/src/emucore/Console.cxx index f5ecc1bfe..5de905997 100644 --- a/stella/src/emucore/Console.cxx +++ b/stella/src/emucore/Console.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Console.cxx,v 1.2 2002-01-08 17:11:32 stephena Exp $ +// $Id: Console.cxx,v 1.3 2002-01-16 02:14:25 stephena Exp $ //============================================================================ #include @@ -49,15 +49,12 @@ Console::Console(const uInt8* image, uInt32 size, const char* filename, myMediaSource = 0; mySwitches = 0; mySystem = 0; - myProperties = defaultProperties(); // Get the MD5 message-digest for the ROM image string md5 = MD5(image, size); // Search for the properties based on MD5 - const Properties* properties = propertiesSet.getMD5(md5); - if(properties) - myProperties = properties; + propertiesSet.getMD5(md5, myProperties); // TODO: At some point I belive we'll need to set the properties' // MD5 value so the user will be able to edit it. diff --git a/stella/src/emucore/DefProps.cxx b/stella/src/emucore/DefProps.cxx index 009e1ea01..2d567ddb2 100644 --- a/stella/src/emucore/DefProps.cxx +++ b/stella/src/emucore/DefProps.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: DefProps.cxx,v 1.1.1.1 2001-12-27 19:54:21 bwmott Exp $ +// $Id: DefProps.cxx,v 1.2 2002-01-16 02:14:25 stephena Exp $ //============================================================================ #include "DefProps.hxx" @@ -23,7 +23,6 @@ using a sed script */ static const char* theScript[] = { - #include "DefProps.def" 0 }; diff --git a/stella/src/emucore/PropsSet.cxx b/stella/src/emucore/PropsSet.cxx index 7e0e02f28..2f91f0fc2 100644 --- a/stella/src/emucore/PropsSet.cxx +++ b/stella/src/emucore/PropsSet.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: PropsSet.cxx,v 1.2 2002-01-08 17:11:32 stephena Exp $ +// $Id: PropsSet.cxx,v 1.3 2002-01-16 02:14:25 stephena Exp $ //============================================================================ #include @@ -25,47 +25,86 @@ PropertiesSet::PropertiesSet() { root = 0; mySize = 0; + useMemList = true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PropertiesSet::~PropertiesSet() { deleteNode(root); + proStream.close(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Properties* PropertiesSet::getMD5(string md5) +void PropertiesSet::getMD5(string md5, Properties &properties) { - // Make sure tree isn't empty - if(root == 0) - return 0; - - // Else, do a BST search for the node with the given md5 - TreeNode *current = root; bool found = false; - while(current) + if(useMemList) { - string currentMd5 = current->props->get("Cartridge.MD5"); - - if(currentMd5 == md5) + // Make sure tree isn't empty + if(root == 0) { - found = true; - break; + properties = defProps; + return; } + + // Else, do a BST search for the node with the given md5 + TreeNode *current = root; + + while(current) + { + string currentMd5 = current->props->get("Cartridge.MD5"); + + if(currentMd5 == md5) + { + found = true; + break; + } + else + { + if(md5 < currentMd5) + current = current->left; + else + current = current->right; + } + } + + if(found) + properties = *(current->props); else - { - if(md5 < currentMd5) - current = current->left; - else - current = current->right; - } + properties = defProps; } - - if(found) - return current->props; else - return 0; + { + // Loop reading properties until required properties found + for(;;) + { + // Make sure the stream is still good or we're done + if(!proStream) + { + break; + } + + // Get the property list associated with this profile + Properties currentProperties(defProps); + currentProperties.load(proStream); + + // If the stream is still good then insert the properties + if(proStream) + { + string currentMd5 = currentProperties.get("Cartridge.MD5"); + + if(currentMd5 == md5) + { + properties = currentProperties; + return; + } + } + } + + properties = defProps; + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -113,25 +152,33 @@ void PropertiesSet::deleteNode(TreeNode *node) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void PropertiesSet::load(istream& in, const Properties* defaults) +void PropertiesSet::load(string filename, const Properties* defaults, bool useList) { - // Loop reading properties - for(;;) + useMemList = useList; + defProps = defaults; + + proStream.open(filename.c_str()); + + if(useMemList) { - // Make sure the stream is still good or we're done - if(!in) + // Loop reading properties + for(;;) { - break; - } + // Make sure the stream is still good or we're done + if(!proStream) + { + break; + } - // Get the property list associated with this profile - Properties properties(defaults); - properties.load(in); + // Get the property list associated with this profile + Properties properties(defProps); + properties.load(proStream); - // If the stream is still good then insert the properties - if(in) - { - insert(properties); + // If the stream is still good then insert the properties + if(proStream) + { + insert(properties); + } } } } diff --git a/stella/src/emucore/PropsSet.hxx b/stella/src/emucore/PropsSet.hxx index 32941b85e..2e5d635f2 100644 --- a/stella/src/emucore/PropsSet.hxx +++ b/stella/src/emucore/PropsSet.hxx @@ -13,12 +13,13 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: PropsSet.hxx,v 1.2 2002-01-08 17:11:32 stephena Exp $ +// $Id: PropsSet.hxx,v 1.3 2002-01-16 02:14:25 stephena Exp $ //============================================================================ #ifndef PROPERTIESSET_HXX #define PROPERTIESSET_HXX +#include #include #include "bspf.hxx" @@ -54,19 +55,21 @@ class PropertiesSet Get the property from the set with the given MD5. @param md5 The md5 of the property to get - @return The property with the given MD5, or 0 if not found + @param properties The property with the given MD5, or + the default property if not found */ - Properties* getMD5(string md5); + void getMD5(string md5, Properties& properties); /** - Load properties from the specified input stream. Use the given + Load properties from the specified file. Use the given defaults properties as the defaults for any properties loaded. - @param in The input stream to use + @param string The input file to use @param defaults The default properties to use + @param useList Flag to indicate storing properties in memory (default true) */ - void load(istream& in, const Properties* defaults); - + void load(string filename, const Properties* defaults, bool useList = true); + /** Save properties to the specified output stream @@ -130,5 +133,14 @@ class PropertiesSet // The size of the properties bst (i.e. the number of properties in it) uInt32 mySize; + + // Whether to construct an in-memory list or rescan the file each time + bool useMemList; + + // The file stream for the stella.pro file + ifstream proStream; + + // The default properties set + const Properties* defProps; }; #endif diff --git a/stella/src/ui/dos/mainDOS.cxx b/stella/src/ui/dos/mainDOS.cxx index 9faf69902..fc3de4d56 100644 --- a/stella/src/ui/dos/mainDOS.cxx +++ b/stella/src/ui/dos/mainDOS.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: mainDOS.cxx,v 1.2 2002-01-10 20:03:05 stephena Exp $ +// $Id: mainDOS.cxx,v 1.3 2002-01-16 02:14:25 stephena Exp $ //============================================================================ #include @@ -600,8 +600,7 @@ void usage() } /** - Setup the properties set by loading builtin defaults and then a - set of user specific ones from the file $HOME/.stella.pro + Setup the properties set by loading from the file stella.pro @param set The properties set to setup */ @@ -610,24 +609,8 @@ void setupProperties(PropertiesSet& set) // Try to load the file stella.pro file string filename = "stella.pro"; - // See if we can open the file - ifstream stream(filename.c_str()); - if(stream) - { - // File was opened so load properties from it - set.load(stream, &Console::defaultProperties()); - } - else - { - // Couldn't open the file so use the builtin properties file - strstream builtin; - for(const char** p = defaultPropertiesFile(); *p != 0; ++p) - { - builtin << *p << endl; - } - - set.load(builtin, &Console::defaultProperties()); - } + // File was opened so load properties from it + set.load(filename, &Console::defaultProperties(), false); } /** diff --git a/stella/src/ui/sdl/mainSDL.cxx b/stella/src/ui/sdl/mainSDL.cxx index a931e01d4..053c2c869 100644 --- a/stella/src/ui/sdl/mainSDL.cxx +++ b/stella/src/ui/sdl/mainSDL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: mainSDL.cxx,v 1.2 2002-01-10 19:53:33 stephena Exp $ +// $Id: mainSDL.cxx,v 1.3 2002-01-16 02:14:25 stephena Exp $ //============================================================================ #include @@ -1144,8 +1144,7 @@ void usage() /** Setup the properties set by first checking for a user file ".stella.pro", - then a system-wide file "/etc/stella.pro", or finally a default - properties set. + then a system-wide file "/etc/stella.pro". @param set The properties set to setup */ @@ -1153,25 +1152,15 @@ void setupProperties(PropertiesSet& set) { string homePropertiesFile = getenv("HOME"); homePropertiesFile += "/.stella.pro"; + string systemPropertiesFile = "/etc/stella.pro"; if(access(homePropertiesFile.c_str(), R_OK) == 0) { - ifstream homeStream(homePropertiesFile.c_str()); - set.load(homeStream, &Console::defaultProperties()); + set.load(homePropertiesFile, &Console::defaultProperties(), false); } - else if(access("/etc/stella.pro", R_OK) == 0) + else if(access(systemPropertiesFile.c_str(), R_OK) == 0) { - ifstream systemStream("/etc/stella.pro"); - set.load(systemStream, &Console::defaultProperties()); - } - else - { - strstream builtin; - for(const char** p = defaultPropertiesFile(); *p != 0; ++p) - { - builtin << *p << endl; - } - set.load(builtin, &Console::defaultProperties()); + set.load(systemPropertiesFile, &Console::defaultProperties(), false); } } diff --git a/stella/src/ui/win32/MainDlg.cxx b/stella/src/ui/win32/MainDlg.cxx index 91ad0fb48..fb9543e1e 100644 --- a/stella/src/ui/win32/MainDlg.cxx +++ b/stella/src/ui/win32/MainDlg.cxx @@ -709,55 +709,31 @@ DWORD CMainDlg::ReadRomData( // search through the properties set for this MD5 PropertiesSet& propertiesSet = m_stella.GetPropertiesSet(); + Properties properties; + propertiesSet.getMD5(md5, properties); - uInt32 setSize = propertiesSet.size(); - - for (uInt32 i = 0; i < setSize; ++i) + if ( ! pListData->m_strManufacturer.Set( + properties.get("Cartridge.Manufacturer").c_str() ) ) { - if (propertiesSet.get(i).get("Cartridge.MD5") == md5) - { - // got it! - break; - } + return ERROR_NOT_ENOUGH_MEMORY; } - - if (i != setSize) + + if ( ! pListData->m_strName.Set( + properties.get("Cartridge.Name").c_str() ) ) { - const Properties& properties = propertiesSet.get(i); - - if ( ! pListData->m_strManufacturer.Set( - properties.get("Cartridge.Manufacturer").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! pListData->m_strName.Set( - properties.get("Cartridge.Name").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if (! pListData->m_strRarity.Set( - properties.get("Cartridge.Rarity").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! pListData->m_strNote.Set( - properties.get("Cartridge.Note").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } + return ERROR_NOT_ENOUGH_MEMORY; } - else - { - // - // Any output here should be appended to the emucore\stella.pro file - // - TRACE( "\"Cartridge.MD5\" \"%s\"\n\"Cartridge.Name\" \"%s\"\n\"\"\n", - md5.c_str(), - pListData->GetTextForColumn( CListData::FILENAME_COLUMN ) ); + if (! pListData->m_strRarity.Set( + properties.get("Cartridge.Rarity").c_str() ) ) + { + return ERROR_NOT_ENOUGH_MEMORY; + } + + if ( ! pListData->m_strNote.Set( + properties.get("Cartridge.Note").c_str() ) ) + { + return ERROR_NOT_ENOUGH_MEMORY; } } diff --git a/stella/src/ui/win32/StellaXMain.cxx b/stella/src/ui/win32/StellaXMain.cxx index e17598738..28a402856 100644 --- a/stella/src/ui/win32/StellaXMain.cxx +++ b/stella/src/ui/win32/StellaXMain.cxx @@ -78,7 +78,7 @@ DWORD CStellaXMain::Initialize( return ERROR_SUCCESS; } - m_pPropertiesSet = new PropertiesSet("Cartridge.Name"); + m_pPropertiesSet = new PropertiesSet(); if ( m_pPropertiesSet == NULL ) { return ERROR_NOT_ENOUGH_MEMORY; @@ -89,12 +89,13 @@ DWORD CStellaXMain::Initialize( string filename( "stella.pro" ); - // See if we can open the file + // See if we can open the file and load properties from it ifstream stream(filename.c_str()); if(stream) { // File was opened so load properties from it - m_pPropertiesSet->load(stream, &Console::defaultProperties()); + stream.close(); + m_pPropertiesSet->load(filename, &Console::defaultProperties()); } else { @@ -115,24 +116,6 @@ DWORD CStellaXMain::Initialize( m_pPropertiesSet->insert( properties ); } -#else - // @@ REVIEW: This is REALLY SLOW! - - // Couldn't open the file so use the builtin properties file - strstream builtin; - for(const char** p = defaultPropertiesFile(); *p != 0; ++p) - { - builtin << *p << endl; - } - -#ifdef _DEBUG - DWORD dwStartTick = ::GetTickCount(); -#endif - m_pPropertiesSet->load( builtin, &Console::defaultProperties() ); -#ifdef _DEBUG - TRACE( "Elapsed ticks for load = %ld", ::GetTickCount()-dwStartTick ); -#endif - #endif } diff --git a/stella/src/ui/x11/mainX11.cxx b/stella/src/ui/x11/mainX11.cxx index 7fcee6282..acfd450a8 100644 --- a/stella/src/ui/x11/mainX11.cxx +++ b/stella/src/ui/x11/mainX11.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: mainX11.cxx,v 1.3 2002-01-10 19:22:58 stephena Exp $ +// $Id: mainX11.cxx,v 1.4 2002-01-16 02:14:25 stephena Exp $ //============================================================================ #include @@ -1116,8 +1116,7 @@ void usage() /** Setup the properties set by first checking for a user file ".stella.pro", - then a system-wide file "/etc/stella.pro", or finally a default - properties set. + then a system-wide file "/etc/stella.pro". @param set The properties set to setup */ @@ -1125,25 +1124,15 @@ void setupProperties(PropertiesSet& set) { string homePropertiesFile = getenv("HOME"); homePropertiesFile += "/.stella.pro"; + string systemPropertiesFile = "/etc/stella.pro"; if(access(homePropertiesFile.c_str(), R_OK) == 0) { - ifstream homeStream(homePropertiesFile.c_str()); - set.load(homeStream, &Console::defaultProperties()); + set.load(homePropertiesFile, &Console::defaultProperties(), false); } - else if(access("/etc/stella.pro", R_OK) == 0) + else if(access(systemPropertiesFile.c_str(), R_OK) == 0) { - ifstream systemStream("/etc/stella.pro"); - set.load(systemStream, &Console::defaultProperties()); - } - else - { - strstream builtin; - for(const char** p = defaultPropertiesFile(); *p != 0; ++p) - { - builtin << *p << endl; - } - set.load(builtin, &Console::defaultProperties()); + set.load(systemPropertiesFile, &Console::defaultProperties(), false); } }