diff options
Diffstat (limited to 'lib/lua/src/LuaLib/ldirlib.c')
| -rw-r--r-- | lib/lua/src/LuaLib/ldirlib.c | 111 | 
1 files changed, 0 insertions, 111 deletions
| diff --git a/lib/lua/src/LuaLib/ldirlib.c b/lib/lua/src/LuaLib/ldirlib.c deleted file mode 100644 index 3b14bdc..0000000 --- a/lib/lua/src/LuaLib/ldirlib.c +++ /dev/null @@ -1,111 +0,0 @@ -#include <stdlib.h> -#include <string.h> -#include <dirent.h> -#include <errno.h> -#include <sys/stat.h> - -#define ldirlib_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - -/* forward declaration for the iterator function */ -static int dir_iter (lua_State *L); - -static int l_dir (lua_State *L) { -    const char *path = luaL_checkstring(L, 1); -    char * d_path, * p; -    DIR **d; - -    /* create a userdatum to store a DIR address */ -    p = (char *) lua_newuserdata(L, sizeof(DIR *) + strlen(path) + 1); -    d = (DIR **) p; -    d_path = p + sizeof(DIR *); - -    strcpy(d_path, path); - -    /* set its metatable */ -    luaL_getmetatable(L, "LuaBook.dir"); -    lua_setmetatable(L, -2); - -    /* try to open the given directory */ -    *d = opendir(path); -    if (*d == NULL)  /* error opening the directory? */ -    luaL_error(L, "cannot open %s: %s", path, -                                        strerror(errno)); - -    /* creates and returns the iterator function -        (its sole upvalue, the directory userdatum, -        is already on the stack top */ -    lua_pushcclosure(L, dir_iter, 1); -    return 1; -} - -static int dir_iter (lua_State *L) { -    char * p = (char *) lua_touserdata(L, lua_upvalueindex(1)); -    DIR * d = *(DIR **) p; -    char * path = p + sizeof(DIR *); -    char * fullpath; -    struct dirent *entry; -#ifdef _WIN32 -    struct _stat file_stat; -#else -    struct stat file_stat; -#endif -    if ((entry = readdir(d)) != NULL) { -	lua_newtable(L); -	lua_pushstring(L, "name"); -	lua_pushstring(L, entry->d_name); -	lua_settable(L, -3); -	fullpath = (char *) malloc(strlen(path) + strlen(entry->d_name) + 2); -	sprintf(fullpath, "%s/%s", path, entry->d_name); -#ifdef _WIN32 -	_stat(fullpath, &file_stat); -#else -	stat(fullpath, &file_stat); -#endif -	free(fullpath); -	lua_pushstring(L, "type"); -	lua_pushnumber(L, (S_IFREG & file_stat.st_mode) ? 2 : ((S_IFDIR & file_stat.st_mode) ? 1 : 0)); -	lua_settable(L, -3); - -	return 1; -    } -    else return 0;  /* no more values to return */ -} - -static int dir_gc (lua_State *L) { -    DIR *d = *(DIR **)lua_touserdata(L, 1); -    if (d) closedir(d); -    return 0; -} - -static const luaL_reg dirlib[] = { -  {NULL, NULL} -}; - -int luaopen_dir (lua_State *L) { -    luaL_openlib(L, LUA_DIRLIBNAME, dirlib, 0); -    luaL_newmetatable(L, "LuaBook.dir"); - -    /* set its __gc field */ -    lua_pushstring(L, "__gc"); -    lua_pushcfunction(L, dir_gc); -    lua_settable(L, -3); - -    /* register the `dir' function */ -    lua_pushcfunction(L, l_dir); -    lua_setglobal(L, "dir"); - -    lua_pushnumber(L, 1); -    lua_setglobal(L, "FLAG_DIR"); - -    lua_pushnumber(L, 2); -    lua_setglobal(L, "FLAG_FILE"); - -    lua_pop(L, 1); - -    return 0; -} | 
