diff --git a/src/cat/LuaScriptInterface.cpp b/src/cat/LuaScriptInterface.cpp index 625c68412..dda8d9570 100644 --- a/src/cat/LuaScriptInterface.cpp +++ b/src/cat/LuaScriptInterface.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "Config.h" #include "Format.h" #include "LuaLuna.h" @@ -38,12 +39,15 @@ #include "LuaSlider.h" #include "LuaProgressBar.h" +extern "C" +{ #ifdef WIN #include -#else -#include #endif +#include +#include #include +} GameModel * luacon_model; Simulation * luacon_sim; @@ -93,6 +97,7 @@ LuaScriptInterface::LuaScriptInterface(GameController * c, GameModel * m): initElementsAPI(); initVirtualMachineAPI(); initGraphicsAPI(); + initFileSystemAPI(); //Old TPT API int i = 0, j; @@ -1350,6 +1355,252 @@ int LuaScriptInterface::graphics_fillRect(lua_State * l) return 0; } +void LuaScriptInterface::initFileSystemAPI() +{ + //Methods + struct luaL_reg fileSystemAPIMethods [] = { + {"list", fileSystem_list}, + {"exists", fileSystem_exists}, + {"isFile", fileSystem_isFile}, + {"isDirectory", fileSystem_isDirectory}, + {"makeDirectory", fileSystem_makeDirectory}, + {"removeDirectory", fileSystem_removeDirectory}, + {"removeFile", fileSystem_removeFile}, + {"move", fileSystem_move}, + {"copy", fileSystem_copy}, + {NULL, NULL} + }; + luaL_register(l, "fileSystem", fileSystemAPIMethods); + + //elem shortcut + lua_getglobal(l, "fileSystem"); + lua_setglobal(l, "fs"); + + int fileSystemAPI = lua_gettop(l); +} + +int LuaScriptInterface::fileSystem_list(lua_State * l) +{ + const char * directoryName = lua_tostring(l, 1); + + int index = 1; + lua_newtable(l); + + DIR * directory; + struct dirent * entry; + + directory = opendir(directoryName); + if (directory != NULL) + { + while (entry = readdir(directory)) + { + if(strncmp(entry->d_name, "..", 3) && strncmp(entry->d_name, ".", 2)) + { + lua_pushstring(l, entry->d_name); + lua_rawseti(l, -2, index++); + } + } + closedir(directory); + } + else + { + lua_pushnil(l); + } + + return 1; +} + +int LuaScriptInterface::fileSystem_exists(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + + bool exists = false; +#ifdef WIN + struct _stat s; + if(_stat(filename, &s) == 0) +#else + struct stat s; + if(stat(filename, &s) == 0) +#endif + { + if(s.st_mode & S_IFDIR) + { + exists = true; + } + else if(s.st_mode & S_IFREG) + { + exists = true; + } + else + { + exists = true; + } + } + else + { + exists = false; + } + + lua_pushboolean(l, exists); + return 1; +} + +int LuaScriptInterface::fileSystem_isFile(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + + bool exists = false; +#ifdef WIN + struct _stat s; + if(_stat(filename, &s) == 0) +#else + struct stat s; + if(stat(filename, &s) == 0) +#endif + { + if(s.st_mode & S_IFDIR) + { + exists = true; + } + else if(s.st_mode & S_IFREG) + { + exists = false; + } + else + { + exists = false; + } + } + else + { + exists = false; + } + + lua_pushboolean(l, exists); + return 1; +} + +int LuaScriptInterface::fileSystem_isDirectory(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + + bool exists = false; +#ifdef WIN + struct _stat s; + if(_stat(filename, &s) == 0) +#else + struct stat s; + if(stat(filename, &s) == 0) +#endif + { + if(s.st_mode & S_IFDIR) + { + exists = false; + } + else if(s.st_mode & S_IFREG) + { + exists = true; + } + else + { + exists = false; + } + } + else + { + exists = false; + } + + lua_pushboolean(l, exists); + return 1; +} + +int LuaScriptInterface::fileSystem_makeDirectory(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + + int ret = 0; +#ifdef WIN + ret = _mkdir(filename); +#else + ret = mkdir(filename, 0755); +#endif + lua_pushboolean(l, ret == 0); + return 1; +} + +int LuaScriptInterface::fileSystem_removeDirectory(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + + int ret = 0; +#ifdef WIN + ret = _rmdir(filename); +#else + ret = rmdir(filename); +#endif + lua_pushboolean(l, ret == 0); + return 1; +} + +int LuaScriptInterface::fileSystem_removeFile(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + + int ret = 0; +#ifdef WIN + ret = _unlink(filename); +#else + ret = unlink(filename); +#endif + lua_pushboolean(l, ret == 0); + return 1; +} + +int LuaScriptInterface::fileSystem_move(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + const char * newFilename = lua_tostring(l, 2); + int ret = 0; + + ret = rename(filename, newFilename); + + lua_pushboolean(l, ret == 0); + return 1; +} + +int LuaScriptInterface::fileSystem_copy(lua_State * l) +{ + const char * filename = lua_tostring(l, 1); + const char * newFilename = lua_tostring(l, 2); + int ret = 0; + + try + { + std::ifstream source(filename, std::ios::binary); + std::ofstream dest(newFilename, std::ios::binary); + source.exceptions(std::ifstream::failbit | std::ifstream::badbit); + dest.exceptions(std::ifstream::failbit | std::ifstream::badbit); + + std::istreambuf_iterator begin_source(source); + std::istreambuf_iterator end_source; + std::ostreambuf_iterator begin_dest(dest); + std::copy(begin_source, end_source, begin_dest); + + source.close(); + dest.close(); + + ret = 0; + } + catch (std::exception & e) + { + ret = 1; + } + + lua_pushboolean(l, ret == 0); + return 1; +} + bool LuaScriptInterface::OnBrushChanged(int brushType, int rx, int ry) { diff --git a/src/cat/LuaScriptInterface.h b/src/cat/LuaScriptInterface.h index 2def100c8..bf7d27749 100644 --- a/src/cat/LuaScriptInterface.h +++ b/src/cat/LuaScriptInterface.h @@ -64,6 +64,7 @@ class LuaScriptInterface: public CommandInterface static int renderer_renderModes(lua_State * l); static int renderer_displayModes(lua_State * l); static int renderer_colourMode(lua_State * l); + static int renderer_decorations(lua_State * l); //Elements static pim::VirtualMachine * updateVirtualMachines[PT_NUM]; @@ -93,6 +94,17 @@ class LuaScriptInterface: public CommandInterface static int graphics_drawRect(lua_State * l); static int graphics_fillRect(lua_State * l); + void initFileSystemAPI(); + static int fileSystem_list(lua_State * l); + static int fileSystem_exists(lua_State * l); + static int fileSystem_isFile(lua_State * l); + static int fileSystem_isDirectory(lua_State * l); + static int fileSystem_makeDirectory(lua_State * l); + static int fileSystem_removeDirectory(lua_State * l); + static int fileSystem_removeFile(lua_State * l); + static int fileSystem_move(lua_State * l); + static int fileSystem_copy(lua_State * l); + public: ui::Window * Window; lua_State *l;