summaryrefslogtreecommitdiff
path: root/epan/wslua/wslua_util.c
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2006-10-12 17:00:11 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2006-10-12 17:00:11 +0000
commit02a2382a36646539f06085a0b23015584f66cda3 (patch)
tree948e49860d0f1a0f7c7d378ed5a9aa7a6bf82af6 /epan/wslua/wslua_util.c
parent44318bc1f1b5580eb399b393445b54b61103cf38 (diff)
downloadwireshark-02a2382a36646539f06085a0b23015584f66cda3.tar.gz
- add persconffile(opt_str)
- add datafile_path(opt_str) - add Dir class -- a Directory Iterator svn path=/trunk/; revision=19507
Diffstat (limited to 'epan/wslua/wslua_util.c')
-rw-r--r--epan/wslua/wslua_util.c152
1 files changed, 149 insertions, 3 deletions
diff --git a/epan/wslua/wslua_util.c b/epan/wslua/wslua_util.c
index 85a876c6f3..7b426fd150 100644
--- a/epan/wslua/wslua_util.c
+++ b/epan/wslua/wslua_util.c
@@ -149,11 +149,9 @@ WSLUA_FUNCTION wslua_loadfile(lua_State* L) {
const char *given_fname = luaL_checkstring(L, WSLUA_ARG_loadfile_FILENAME);
const char* filename;
- if (!given_fname) WSLUA_ARG_ERROR(loadfile,FILENAME,"must be a string");
-
filename = get_actual_filename(given_fname);
- if (!filename) WSLUA_ARG_ERROR(loadfile,FILENAME,"file does not exist");
+ if (!filename) WSLUA_ARG_ERROR(loadfile,FILENAME,"file does not exist");
if (luaL_loadfile(L, filename) == 0) {
return 1;
@@ -181,3 +179,151 @@ WSLUA_FUNCTION wslua_dofile(lua_State* L) {
lua_call(L, 0, LUA_MULTRET);
return lua_gettop(L) - n;
}
+
+
+WSLUA_FUNCTION wslua_persconffile_path(lua_State* L) {
+#define WSLUA_OPTARG_persconffile_path_FILENAME 1
+ const char *fname = luaL_optstring(L, WSLUA_OPTARG_persconffile_path_FILENAME,"");
+ const char* filename = get_persconffile_path(fname,FALSE);
+
+ lua_pushstring(L,filename);
+ return 1;
+}
+
+WSLUA_FUNCTION wslua_datafile_path(lua_State* L) {
+#define WSLUA_OPTARG_datafile_path_FILENAME 1
+ const char *fname = luaL_optstring(L, WSLUA_OPTARG_datafile_path_FILENAME,"");
+ const char* filename = get_datafile_path(fname);
+
+ lua_pushstring(L,filename);
+ return 1;
+}
+
+
+WSLUA_CLASS_DEFINE(Dir,NOP,NOP); /* A Directory */
+
+WSLUA_CONSTRUCTOR wslua_Dir_open(lua_State* L) {
+#define WSLUA_ARG_Dir_open_PATHNAME 1
+#define WSLUA_OPTARG_Dir_open_EXTENSION 2
+
+ const char* dirname = luaL_checkstring(L,WSLUA_ARG_Dir_open_PATHNAME);
+ const char* extension = luaL_optstring(L,WSLUA_OPTARG_Dir_open_EXTENSION,NULL);
+ Dir dir;
+
+ if (!dirname) WSLUA_ARG_ERROR(Dir_open,PATHNAME,"must be a string");
+ if (!test_for_directory(dirname)) WSLUA_ARG_ERROR(Dir_open,PATHNAME,"must be a directory");
+
+ dir = g_malloc(sizeof(struct _wslua_dir));
+ dir->dir = OPENDIR_OP(dirname);
+ dir->ext = extension ? g_strdup(extension) : NULL;
+#if GLIB_MAJOR_VERSION >= 2
+ dir->dummy = g_malloc(sizeof(GError *));
+ *(dir->dummy) = NULL;
+#endif
+
+ if (dir->dir == NULL) {
+#if GLIB_MAJOR_VERSION >= 2
+ g_free(dir->dummy);
+#endif
+ g_free(dir);
+
+ WSLUA_ARG_ERROR(Dir_open,PATHNAME,"could not open directory");
+ return 0;
+ }
+
+ pushDir(L,dir);
+ return 1;
+}
+
+WSLUA_METAMETHOD wslua_Dir__call(lua_State* L) {
+#define WSLUA_ARG_Dir__call_DIR 1
+ Dir dir = checkDir(L,1);
+ const FILE_T* file;
+ const gchar* filename;
+ const char* ext;
+
+ if (!dir)
+ WSLUA_ARG_ERROR(Dir__call,DIR,"must be a Dir");
+
+ if (!dir->dir) {
+ return 0;
+ }
+
+ if ( ! ( file = DIRGETNEXT_OP(dir->dir ) )) {
+ CLOSEDIR_OP(dir->dir);
+ dir->dir = NULL;
+ return 0;
+ }
+
+
+ if ( ! dir->ext ) {
+ filename = GETFNAME_OP(file);
+ lua_pushstring(L,filename);
+ return 1;
+ }
+
+ do {
+ filename = GETFNAME_OP(file);
+
+ /* XXX strstr returns ptr to first match,
+ this fails ext=".xxx" filename="aaa.xxxz.xxx" */
+ if ( ( ext = strstr(filename,dir->ext)) && g_str_equal(ext,dir->ext) ) {
+ lua_pushstring(L,filename);
+ return 1;
+ }
+ } while(( file = DIRGETNEXT_OP(dir->dir) ));
+
+ CLOSEDIR_OP(dir->dir);
+ dir->dir = NULL;
+ return 0;
+}
+
+WSLUA_METHOD wslua_Dir_close(lua_State* L) {
+#define WSLUA_ARG_Dir_close_DIR 1
+ Dir dir = checkDir(L,1);
+
+ if (dir->dir) {
+ CLOSEDIR_OP(dir->dir);
+ dir->dir = NULL;
+ }
+
+ return 0;
+}
+
+WSLUA_METAMETHOD wslua_Dir__gc(lua_State* L) {
+#define WSLUA_ARG_Dir__gc_DIR 1
+ Dir dir = checkDir(L,1);
+
+ if (dir->dir) {
+ CLOSEDIR_OP(dir->dir);
+ }
+
+#if GLIB_MAJOR_VERSION >= 2
+ g_free(dir->dummy);
+#endif
+
+ if (dir->ext) g_free(dir->ext);
+
+ g_free(dir);
+
+ return 0;
+}
+
+static const luaL_reg Dir_methods[] = {
+ {"open", wslua_Dir_open},
+ {"close", wslua_Dir_close},
+ {0, 0}
+};
+
+static const luaL_reg Dir_meta[] = {
+ {"__call", wslua_Dir__call},
+ {"__gc", wslua_Dir__gc},
+ {0, 0}
+};
+
+int Dir_register(lua_State* L) {
+
+ WSLUA_REGISTER_CLASS(Dir);
+
+ return 1;
+}