diff options
| author | Max Horn | 2006-04-01 17:36:43 +0000 |
|---|---|---|
| committer | Max Horn | 2006-04-01 17:36:43 +0000 |
| commit | 9ed2d26db58169f139c115e28d335717c565cce7 (patch) | |
| tree | b75d90ec1f54245ce3c6eafd1ee11eaf3bdb7c6d /common | |
| parent | 0bb6d640647761ecd86eab6d1984dfb96b2e3a30 (diff) | |
| download | scummvm-rg350-9ed2d26db58169f139c115e28d335717c565cce7.tar.gz scummvm-rg350-9ed2d26db58169f139c115e28d335717c565cce7.tar.bz2 scummvm-rg350-9ed2d26db58169f139c115e28d335717c565cce7.zip | |
Simplified the File::addDefaultDirectory(Recursive) code; avoid scanning directory multiple times
svn-id: r21527
Diffstat (limited to 'common')
| -rw-r--r-- | common/file.cpp | 51 | ||||
| -rw-r--r-- | common/file.h | 2 |
2 files changed, 16 insertions, 37 deletions
diff --git a/common/file.cpp b/common/file.cpp index b1ef8f4bec..4c9a9dd92f 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -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 @@ static FILE *fopenNoCase(const char *filename, const char *directory, const char } void File::addDefaultDirectory(const String &directory) { - String lfn; - - FilesystemNode dir(directory.c_str()); - - if (!dir.isDirectory()) - 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(); - } + addDefaultDirectoryRecursive(directory, 1); } -void File::addDefaultDirectoryRecursive(const String &directory, int level, int baseLen) { - if (level > 4) +void File::addDefaultDirectoryRecursive(const String &directory, int level) { + if (level <= 0) return; - String lfn; + // Do not add directories multiple times, unless this time they are added + // with a bigger depth. + if (_defaultDirectories.contains(directory) && _defaultDirectories[directory] >= level) + return; FilesystemNode dir(directory.c_str()); + // ... and abort if this isn't a directory! if (!dir.isDirectory()) return; - _defaultDirectories.push_back(directory); - - if (baseLen == 0) { - baseLen = directory.size(); - if (directory.lastChar() != '/' -#if defined(__MORPHOS__) || defined(__amigaos4__) - && directory.lastChar() != ':' -#endif - && directory.lastChar() != '\\') - baseLen++; - } + _defaultDirectories[directory] = level; 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 @@ bool File::open(const char *filename, AccessMode mode, const char *directory) { _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) diff --git a/common/file.h b/common/file.h index 939cd3cdc5..567292c440 100644 --- a/common/file.h +++ b/common/file.h @@ -51,7 +51,7 @@ public: }; 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(); |
