diff --git a/library/Core.cpp b/library/Core.cpp index 0099d2cc0..6ffeea7b4 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -45,6 +45,7 @@ using namespace std; #include "PluginManager.h" #include "ModuleFactory.h" #include "modules/EventManager.h" +#include "modules/Filesystem.h" #include "modules/Gui.h" #include "modules/World.h" #include "modules/Graphic.h" @@ -252,7 +253,7 @@ static std::string getScriptHelp(std::string path, std::string helpprefix) static void listScripts(PluginManager *plug_mgr, std::map &pset, std::string path, bool all, std::string prefix = "") { std::vector files; - getdir(path, files); + Filesystem::listdir(path, files); for (size_t i = 0; i < files.size(); i++) { diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 37ee2252e..56264ebbf 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1991,6 +1991,26 @@ static const LuaWrapper::FunctionReg dfhack_filesystem_module[] = { {NULL, NULL} }; +static int filesystem_listdir(lua_State *L) +{ + luaL_checktype(L,1,LUA_TSTRING); + std::string dir=lua_tostring(L,1); + std::vector files; + DFHack::Filesystem::listdir(dir, files); + lua_newtable(L); + for(int i=0;i files; - DFHack::getdir(dir,files); - lua_newtable(L); - for(int i=0;i filez; - getdir(path, filez); + Filesystem::listdir(path, filez); for(size_t i = 0; i < filez.size();i++) { if(hasEnding(filez[i],searchstr)) @@ -757,7 +758,7 @@ Plugin *PluginManager::getPluginByCommand(const std::string &command) if (iter != belongs.end()) return iter->second; else - return NULL; + return NULL; } // FIXME: handle name collisions... diff --git a/library/Types.cpp b/library/Types.cpp index 80d629934..5067c32ae 100644 --- a/library/Types.cpp +++ b/library/Types.cpp @@ -28,6 +28,8 @@ distribution. #include "Error.h" #include "Types.h" +#include "modules/Filesystem.h" + #ifndef LINUX_BUILD #include #include "wdirent.h" @@ -47,17 +49,7 @@ distribution. int DFHack::getdir(std::string dir, std::vector &files) { - DIR *dp; - struct dirent *dirp; - if((dp = opendir(dir.c_str())) == NULL) - { - return errno; - } - while ((dirp = readdir(dp)) != NULL) { - files.push_back(std::string(dirp->d_name)); - } - closedir(dp); - return 0; + return DFHack::Filesystem::listdir(dir, files); } bool DFHack::hasEnding (std::string const &fullString, std::string const &ending) diff --git a/library/include/Types.h b/library/include/Types.h index 6b175d180..157b23a0e 100644 --- a/library/include/Types.h +++ b/library/include/Types.h @@ -121,4 +121,4 @@ namespace DFHack DFHACK_EXPORT df::specific_ref *findRef(std::vector &vec, df::specific_ref_type type); DFHACK_EXPORT bool removeRef(std::vector &vec, df::specific_ref_type type, void *ptr); -}// namespace DFHack \ No newline at end of file +}// namespace DFHack diff --git a/library/include/modules/Filesystem.h b/library/include/modules/Filesystem.h index 0e996e7e2..8cfe77fe7 100644 --- a/library/include/modules/Filesystem.h +++ b/library/include/modules/Filesystem.h @@ -47,6 +47,7 @@ SOFTWARE. #pragma once #include "Export.h" +#include #ifndef _WIN32 #ifndef _AIX @@ -80,6 +81,7 @@ SOFTWARE. #include #endif #include + #include "wdirent.h" #else #include #include @@ -157,5 +159,6 @@ namespace DFHack { DFHACK_EXPORT int64_t atime (std::string path); DFHACK_EXPORT int64_t ctime (std::string path); DFHACK_EXPORT int64_t mtime (std::string path); + DFHACK_EXPORT int listdir (std::string dir, std::vector &files); } } diff --git a/library/modules/Filesystem.cpp b/library/modules/Filesystem.cpp index 5b4a049e9..492bc7036 100644 --- a/library/modules/Filesystem.cpp +++ b/library/modules/Filesystem.cpp @@ -124,7 +124,7 @@ bool Filesystem::stat (std::string path, STAT_STRUCT &info) bool Filesystem::exists (std::string path) { STAT_STRUCT info; - return (bool)Filesystem::stat(path.c_str(), info); + return (bool)Filesystem::stat(path, info); } _filetype Filesystem::filetype (std::string path) @@ -148,7 +148,7 @@ bool Filesystem::isdir (std::string path) int64_t Filesystem::attr (std::string path) \ { \ STAT_STRUCT info; \ - if (!Filesystem::stat(path.c_str(), info)) \ + if (!Filesystem::stat(path, info)) \ return -1; \ return (int64_t)info.st_##attr; \ } @@ -158,3 +158,19 @@ DEFINE_STAT_TIME_WRAPPER(ctime); DEFINE_STAT_TIME_WRAPPER(mtime); #undef DEFINE_STAT_TIME_WRAPPER + +int Filesystem::listdir (std::string dir, std::vector &files) +{ + DIR *dp; + struct dirent *dirp; + if((dp = opendir(dir.c_str())) == NULL) + { + return errno; + } + while ((dirp = readdir(dp)) != NULL) { + files.push_back(std::string(dirp->d_name)); + } + closedir(dp); + return 0; +} +