[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