From 960448b6acca5dfa472d8000e1889e58fcc7b789 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Mon, 10 Aug 2015 15:46:13 +1000 Subject: [PATCH] posix: add dir wrapper --- Makefile.am | 2 ++ posix/dir.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++ posix/dir.hpp | 66 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 posix/dir.cpp create mode 100644 posix/dir.hpp diff --git a/Makefile.am b/Makefile.am index 08d080ed..6f1ed575 100644 --- a/Makefile.am +++ b/Makefile.am @@ -261,6 +261,8 @@ UTIL_FILES += \ backtrace_execinfo.cpp \ io_posix.cpp \ io_posix.hpp \ + posix/dir.hpp \ + posix/dir.cpp \ time_posix.cpp endif diff --git a/posix/dir.cpp b/posix/dir.cpp new file mode 100644 index 00000000..81f39993 --- /dev/null +++ b/posix/dir.cpp @@ -0,0 +1,88 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright 2015 Danny Robson + */ + +#include "dir.hpp" + +#include "../except.hpp" + +using util::posix::dir; + + +/////////////////////////////////////////////////////////////////////////////// +//struct entry { +//public: +// entry (dirent *_handle, DIR *_parent): m_handle (_handle), m_parent (_parent) { ; } +// +// const char* name (void) const { return m_handle->d_name; } +// +// entry& operator++ (void) { +// dirent *next = readdir (m_parent); +// assert (!next || next != m_handle); +// m_handle = next; +// return *this; +// } +// +// entry& operator* (void) { return *this; } +// const entry& operator* (void) const; +// bool operator!= (entry rhs) const { return m_handle != rhs.m_handle || m_parent != rhs.m_parent; } +// +// struct dirent *m_handle; +// DIR *m_parent; +//}; + + +/////////////////////////////////////////////////////////////////////////////// +dir::dir (const char *path): + m_handle (opendir (path)) +{ + if (!m_handle) + errno_error::throw_code (); +} + + +//----------------------------------------------------------------------------- +dir::~dir () +{ + errno_error::try_code (closedir (m_handle)); +} + + +/////////////////////////////////////////////////////////////////////////////// +dir::operator DIR* (void) +{ + return m_handle; +} + + +/////////////////////////////////////////////////////////////////////////////// +void +dir::scan(std::function cb) +{ + rewind (); + + for (dirent *cursor; errno = 0, cursor = readdir (m_handle); ) + cb (cursor->d_name); + + errno_error::try_code (); +} + + +/////////////////////////////////////////////////////////////////////////////// +void +dir::rewind (void) +{ + rewinddir (m_handle); +} diff --git a/posix/dir.hpp b/posix/dir.hpp new file mode 100644 index 00000000..a9db1c18 --- /dev/null +++ b/posix/dir.hpp @@ -0,0 +1,66 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright 2015 Danny Robson + */ + +#ifndef __UTIL_POSIX_DIR_HPP +#define __UTIL_POSIX_DIR_HPP + +#include +#include + +#include + +namespace util { namespace posix { + //struct entry { + //public: + // entry (dirent *_handle, DIR *_parent): m_handle (_handle), m_parent (_parent) { ; } + + // const char* name (void) const { return m_handle->d_name; } + + // entry& operator++ (void) { + // dirent *next = readdir (m_parent); + // assert (!next || next != m_handle); + // m_handle = next; + // return *this; + // } + + // entry& operator* (void) { return *this; } + // const entry& operator* (void) const; + // bool operator!= (entry rhs) const { return m_handle != rhs.m_handle || m_parent != rhs.m_parent; } + + // struct dirent *m_handle; + // DIR *m_parent; + //}; + + struct dir { + public: + dir (const char *path); + ~dir (); + + operator DIR* (void); + + void scan (std::function); + + //entry begin (void) { rewind (); return { readdir (m_handle), m_handle }; } + //entry end (void) { return { nullptr, m_handle }; } + + void rewind (void); + + private: + DIR *m_handle; + }; +} } + +#endif