diff options
Diffstat (limited to 'Libraries/LibCore/CDirIterator.cpp')
-rw-r--r-- | Libraries/LibCore/CDirIterator.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/Libraries/LibCore/CDirIterator.cpp b/Libraries/LibCore/CDirIterator.cpp new file mode 100644 index 0000000000..d76d52970d --- /dev/null +++ b/Libraries/LibCore/CDirIterator.cpp @@ -0,0 +1,67 @@ +#include "CDirIterator.h" +#include <cerrno> + +CDirIterator::CDirIterator(const StringView& path, Flags flags) + : m_flags(flags) +{ + m_dir = opendir(path.characters()); + if (m_dir == nullptr) { + m_error = errno; + } +} + +CDirIterator::~CDirIterator() +{ + if (m_dir != nullptr) { + closedir(m_dir); + m_dir = nullptr; + } +} + +bool CDirIterator::advance_next() +{ + if (m_dir == nullptr) + return false; + + bool keep_advancing = true; + while (keep_advancing) { + errno = 0; + auto* de = readdir(m_dir); + if (de) { + m_next = de->d_name; + } else { + m_error = errno; + m_next = String(); + } + + if (m_next.is_null()) { + keep_advancing = false; + } else if (m_flags & Flags::SkipDots) { + if (m_next.length() < 1 || m_next[0] != '.') { + keep_advancing = false; + } + } else { + keep_advancing = false; + } + } + + return m_next.length() > 0; +} + +bool CDirIterator::has_next() +{ + if (!m_next.is_null()) + return true; + + return advance_next(); +} + +String CDirIterator::next_path() +{ + if (m_next.is_null()) + advance_next(); + + auto tmp = m_next; + m_next = String(); + return tmp; +} |