summaryrefslogtreecommitdiff
path: root/src/libutil/FileUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil/FileUtils.cpp')
-rw-r--r--src/libutil/FileUtils.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/libutil/FileUtils.cpp b/src/libutil/FileUtils.cpp
new file mode 100644
index 0000000..64b1bb1
--- /dev/null
+++ b/src/libutil/FileUtils.cpp
@@ -0,0 +1,79 @@
+#include "util/FileUtils.hpp"
+
+#ifndef _WIN32
+#include <sys/types.h>
+#include <dirent.h>
+#include <limits.h>
+#else
+#define WIN32_MEAN_AND_LEAN
+#include <windows.h>
+#endif
+
+#include <sstream>
+#include <stdexcept>
+#include <cstring>
+#include <cerrno>
+
+using namespace std;
+
+#ifndef _WIN32
+static vector<string> directory_entries_unix( const string &dir, bool absolute, bool recursive )
+{
+ vector<string> files;
+
+ DIR *d = opendir( dir.c_str( ) );
+ if( d == NULL ) {
+ ostringstream ss;
+ ss << "opendir failed with '" << dir << "': " << strerror( errno );
+ throw runtime_error( ss.str( ) );
+ }
+
+ struct dirent *entry = readdir( d );
+ while( entry != NULL ) {
+ if( entry->d_type == DT_DIR ) {
+ if( strcmp( entry->d_name, "." ) == 0 ||
+ strcmp( entry->d_name, ".." ) == 0 ) {
+ entry = readdir( d );
+ continue;
+ }
+ if( recursive ) {
+ ostringstream ss;
+ ss << dir << "/" << entry->d_name;
+ vector<string> subfiles = directory_entries_unix( ss.str( ), absolute, recursive );
+ files.insert( files.end( ), subfiles.begin( ), subfiles.end( ) );
+ }
+ } else if( entry->d_type == DT_REG ) {
+ if( absolute ) {
+ ostringstream ss;
+ ss << dir << "/" << entry->d_name;
+ files.push_back( ss.str( ) );
+ } else {
+ files.push_back( string( entry->d_name ) );
+ }
+ }
+ entry = readdir( d );
+ }
+
+ closedir( d );
+
+ return files;
+}
+#endif
+
+#ifdef _WIN32
+static vector<string> directory_entries_win32( const string &/*dir*/, bool /*absolute*/, bool /* recursive */ )
+{
+ vector<string> files;
+
+ return files;
+}
+#endif
+
+UTIL_DLL_VISIBLE vector<string> directory_entries( const string &dir, bool absolute, bool recursive )
+{
+#ifdef _WIN32
+ return directory_entries_win32( dir, absolute, recursive );
+#else
+ return directory_entries_unix( dir, absolute, recursive );
+#endif
+}