X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmisc%2Fsg_dir.cxx;h=95929229a57a6b01647351d42ef45c4f548f1f13;hb=e4e31be7d43569a92a5d9fa7e784381b66cbd95a;hp=9c5aa78a8f5b9ac5885f75f286a81f5bc0b7033d;hpb=bbd61977f14c30ce93a2bcf5a3551708d36a29c8;p=simgear.git diff --git a/simgear/misc/sg_dir.cxx b/simgear/misc/sg_dir.cxx index 9c5aa78a..95929229 100644 --- a/simgear/misc/sg_dir.cxx +++ b/simgear/misc/sg_dir.cxx @@ -29,8 +29,6 @@ # include #endif -#include - #include #include @@ -108,6 +106,8 @@ PathList Dir::children(int types, const std::string& nameFilter) const return result; } + int filterLen = nameFilter.size(); + while (true) { struct dirent* entry = readdir(dp); if (!entry) { @@ -115,29 +115,18 @@ PathList Dir::children(int types, const std::string& nameFilter) const } // skip hidden files (names beginning with '.') unless requested - if (!(types & INCLUDE_HIDDEN) && (entry->d_name[0] == '.')) { + if (!(types & INCLUDE_HIDDEN) && (entry->d_name[0] == '.') && + strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { continue; } - int type = entry->d_type; - if (type == DT_LNK) { - // find symlink target type using stat() - struct stat s; - if (stat(file(entry->d_name).c_str(), &s)) { - continue; // stat() failed - } - - if (S_ISDIR(s.st_mode)) { - type = DT_DIR; - } else if (S_ISREG(s.st_mode)) { - type = DT_REG; - } else { - // symlink to block/fifo/char file, ignore - continue; - } - } // of symlink look-through + SGPath f = file(entry->d_name); + if (!f.exists()) { + continue; // stat() failed + } - if (type == DT_DIR) { + if (f.isDir()) { + // directory handling if (!(types & TYPE_DIR)) { continue; } @@ -147,16 +136,24 @@ PathList Dir::children(int types, const std::string& nameFilter) const continue; } } - } else if (type == DT_REG) { + } else if (f.isFile()) { + // regular file handling if (!(types & TYPE_FILE)) { continue; } } else { - continue; // ignore char/block devices, fifos, etc + // block device /fifo/char file, ignore + continue; } - + if (!nameFilter.empty()) { - if (strstr(entry->d_name, nameFilter.c_str()) == NULL) { + int nameLen = strlen(entry->d_name); + if (nameLen < filterLen) { + continue; // name is shorter than the filter + } + + char* nameSuffix = entry->d_name + (nameLen - filterLen); + if (strcmp(nameSuffix, nameFilter.c_str())) { continue; } } @@ -172,23 +169,7 @@ PathList Dir::children(int types, const std::string& nameFilter) const bool Dir::exists() const { -#ifdef _WIN32 - struct _stat buf ; - - if (_stat (_path.c_str(), &buf ) < 0) { - return false; - } - - return ((S_IFDIR & buf.st_mode ) !=0); -#else - struct stat buf ; - - if (stat(_path.c_str(), &buf ) < 0) { - return false ; - } - - return ((S_ISDIR(buf.st_mode )) != 0); -#endif + return _path.isDir(); } SGPath Dir::file(const std::string& name) const