[Scummvm-cvs-logs] SF.net SVN: scummvm: [21527] scummvm/trunk/common

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sat Apr 1 09:37:03 CEST 2006


Revision: 21527
Author:   fingolfin
Date:     2006-04-01 09:36:43 -0800 (Sat, 01 Apr 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21527&view=rev

Log Message:
-----------
Simplified the File::addDefaultDirectory(Recursive) code; avoid scanning directory multiple times

Modified Paths:
--------------
    scummvm/trunk/common/file.cpp
    scummvm/trunk/common/file.h
Modified: scummvm/trunk/common/file.cpp
===================================================================
--- scummvm/trunk/common/file.cpp	2006-04-01 12:47:09 UTC (rev 21526)
+++ scummvm/trunk/common/file.cpp	2006-04-01 17:36:43 UTC (rev 21527)
@@ -32,11 +32,12 @@
 namespace Common {
 
 typedef HashMap<String, String> FilesMap;
+typedef HashMap<String, int> StringIntMap;
 
 // The following two objects could be turned into static members of class
 // File. However, then we would be forced to #include hashmap in file.h
 // which seems to be a high price just for a simple beautification...
-static StringList _defaultDirectories;
+static StringIntMap _defaultDirectories;
 static FilesMap _filesMap;
 
 
@@ -114,55 +115,33 @@
 }
 
 void File::addDefaultDirectory(const String &directory) {
-	String lfn;
+	addDefaultDirectoryRecursive(directory, 1);
+}
 
-	FilesystemNode dir(directory.c_str());
-
-	if (!dir.isDirectory())
+void File::addDefaultDirectoryRecursive(const String &directory, int level) {
+	if (level <= 0)
 		return;
 
-	_defaultDirectories.push_back(directory);
-
-	FSList fslist(dir.listDir(FilesystemNode::kListFilesOnly));
-	
-	for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
-		lfn = file->displayName();
-		lfn.toLowercase();
-		if (!_filesMap.contains(lfn))
-			_filesMap[lfn] = file->path();
-	}
-}
-
-void File::addDefaultDirectoryRecursive(const String &directory, int level, int baseLen) {
-	if (level > 4)
+	// Do not add directories multiple times, unless this time they are added
+	// with a bigger depth.
+	if (_defaultDirectories.contains(directory) && _defaultDirectories[directory] >= level)
 		return;
 
-	String lfn;
-
 	FilesystemNode dir(directory.c_str());
 
+	// ... and abort if this isn't a directory!
 	if (!dir.isDirectory())
 		return;
 
-	_defaultDirectories.push_back(directory);
+	_defaultDirectories[directory] = level;
 
-	if (baseLen == 0) {
-		baseLen = directory.size();
-		if (directory.lastChar() != '/'
-#if defined(__MORPHOS__) || defined(__amigaos4__)
-					&& directory.lastChar() != ':'
-#endif
-					&& directory.lastChar() != '\\')
-			baseLen++;
-	}
-
 	FSList fslist(dir.listDir(FilesystemNode::kListAllNoRoot));
 	
 	for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
 		if (file->isDirectory()) {
-			addDefaultDirectoryRecursive(file->path(), level + 1, baseLen);
+			addDefaultDirectoryRecursive(file->path(), level - 1);
 		} else {
-			lfn = String(file->path().c_str() + baseLen);
+			String lfn = file->displayName();
 			lfn.toLowercase();
 			if (!_filesMap.contains(lfn))
 				_filesMap[lfn] = file->path();
@@ -234,10 +213,10 @@
 		_handle = fopen(_filesMap[fname].c_str(), modeStr);
 	} else {
 
-		StringList::const_iterator x;
+		StringIntMap::const_iterator x;
 		// Try all default directories
 		for (x = _defaultDirectories.begin(); _handle == NULL && x != _defaultDirectories.end(); ++x) {
-			_handle = fopenNoCase(filename, x->c_str(), modeStr);
+			_handle = fopenNoCase(filename, x->_key.c_str(), modeStr);
 		}
 		// Last resort: try the current directory
 		if (_handle == NULL)

Modified: scummvm/trunk/common/file.h
===================================================================
--- scummvm/trunk/common/file.h	2006-04-01 12:47:09 UTC (rev 21526)
+++ scummvm/trunk/common/file.h	2006-04-01 17:36:43 UTC (rev 21527)
@@ -51,7 +51,7 @@
 	};
 
 	static void addDefaultDirectory(const String &directory);
-	static void addDefaultDirectoryRecursive(const String &directory, int level = 0, int baseLen = 0);
+	static void addDefaultDirectoryRecursive(const String &directory, int level = 4);
 	static void resetDefaultDirectories();
 
 	File();


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list