From e7f56241ece880d7a7f614f313f2f3c6c7bb691a Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sat, 25 Apr 2015 00:16:10 -0300 Subject: [PATCH] Removed the callback argument from love.filesystem.getDirectoryItems (resolves issue #877.) Cleaned up the getDirectoryItems ccde to no longer call Lua API functions from Filesystem.cpp (now it's all in wrap_Filesystem.cpp.) --- src/modules/filesystem/Filesystem.h | 3 +-- src/modules/filesystem/physfs/Filesystem.cpp | 26 ++------------------ src/modules/filesystem/physfs/Filesystem.h | 2 +- src/modules/filesystem/wrap_Filesystem.cpp | 16 +++++++++++- 4 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/modules/filesystem/Filesystem.h b/src/modules/filesystem/Filesystem.h index a58f8300b..b49b549c1 100644 --- a/src/modules/filesystem/Filesystem.h +++ b/src/modules/filesystem/Filesystem.h @@ -23,7 +23,6 @@ // LOVE #include "common/config.h" -#include "common/runtime.h" #include "common/Module.h" #include "common/int.h" #include "FileData.h" @@ -208,7 +207,7 @@ public: * This "native" method returns a table of all * files in a given directory. **/ - virtual int getDirectoryItems(lua_State *L) = 0; + virtual void getDirectoryItems(const char *dir, std::vector &items) = 0; /** * Gets the last modification time of a file, in seconds diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp index c5625a116..c253ba6f1 100644 --- a/src/modules/filesystem/physfs/Filesystem.cpp +++ b/src/modules/filesystem/physfs/Filesystem.cpp @@ -545,36 +545,14 @@ void Filesystem::append(const char *filename, const void *data, int64 size) cons throw love::Exception("Data could not be written."); } -int Filesystem::getDirectoryItems(lua_State *L) +void Filesystem::getDirectoryItems(const char *dir, std::vector &items) { - const char *dir = luaL_checkstring(L, 1); - bool hascallback = !lua_isnoneornil(L, 2); - - if (hascallback) - luaL_checktype(L, 2, LUA_TFUNCTION); - char **rc = PHYSFS_enumerateFiles(dir); - int index = 1; - - lua_newtable(L); for (char **i = rc; *i != 0; i++) - { - if (hascallback) - { - lua_pushvalue(L, 2); - lua_pushstring(L, *i); - lua_call(L, 1, 0); - } - - lua_pushstring(L, *i); - lua_rawseti(L, -2, index); - index++; - } + items.push_back(*i); PHYSFS_freeList(rc); - - return 1; } int64 Filesystem::getLastModified(const char *filename) const diff --git a/src/modules/filesystem/physfs/Filesystem.h b/src/modules/filesystem/physfs/Filesystem.h index 2ea2032ee..d3cd96653 100644 --- a/src/modules/filesystem/physfs/Filesystem.h +++ b/src/modules/filesystem/physfs/Filesystem.h @@ -86,7 +86,7 @@ public: void write(const char *filename, const void *data, int64 size) const; void append(const char *filename, const void *data, int64 size) const; - int getDirectoryItems(lua_State *L); + void getDirectoryItems(const char *dir, std::vector &items); int64 getLastModified(const char *filename) const; int64 getSize(const char *filename) const; diff --git a/src/modules/filesystem/wrap_Filesystem.cpp b/src/modules/filesystem/wrap_Filesystem.cpp index 71d6be9f2..6424979db 100644 --- a/src/modules/filesystem/wrap_Filesystem.cpp +++ b/src/modules/filesystem/wrap_Filesystem.cpp @@ -408,7 +408,21 @@ int w_append(lua_State *L) int w_getDirectoryItems(lua_State *L) { - return instance()->getDirectoryItems(L); + const char *dir = luaL_checkstring(L, 1); + std::vector items; + + instance()->getDirectoryItems(dir, items); + + lua_createtable(L, (int) items.size(), 0); + + for (int i = 0; i < (int) items.size(); i++) + { + lua_pushstring(L, items[i].c_str()); + lua_rawseti(L, -2, i + 1); + } + + // Return the table. + return 1; } int w_lines(lua_State *L)