From 6be9b662fbad73d76690daea3631e0d37c0ae896 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 10 Apr 2015 12:02:08 +0100 Subject: [PATCH] elua lib: add APIs for include path management --- src/lib/elua/Elua.h | 3 +++ src/lib/elua/elua.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- src/lib/elua/elua_private.h | 2 ++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/lib/elua/Elua.h b/src/lib/elua/Elua.h index a05b824..f70af32 100644 --- a/src/lib/elua/Elua.h +++ b/src/lib/elua/Elua.h @@ -78,6 +78,8 @@ EAPI Eina_Stringshare *elua_state_core_dir_get(const Elua_State *es); EAPI Eina_Stringshare *elua_state_mod_dir_get(const Elua_State *es); EAPI Eina_Stringshare *elua_state_apps_dir_get(const Elua_State *es); +EAPI void elua_state_include_path_add(Elua_State *es, const char *path); + EAPI lua_State *elua_state_lua_state_get(const Elua_State *es); EAPI int elua_report_error(const Elua_State *es, const char *pname, int status); @@ -89,6 +91,7 @@ EAPI void elua_io_register(const Elua_State *es); EAPI int elua_io_popen(lua_State *L); EAPI int elua_module_init(lua_State *L); +EAPI int elua_module_system_init(lua_State *L); #endif diff --git a/src/lib/elua/elua.c b/src/lib/elua/elua.c index ae5da0e..9019fef 100644 --- a/src/lib/elua/elua.c +++ b/src/lib/elua/elua.c @@ -80,10 +80,10 @@ elua_state_new(void) EAPI void elua_state_free(Elua_State *es) { + void *data; if (!es) return; if (es->luastate) { - void *data; EINA_LIST_FREE(es->cmods, data) { lua_rawgeti(es->luastate, LUA_REGISTRYINDEX, (size_t)data); @@ -93,6 +93,8 @@ elua_state_free(Elua_State *es) } else if (es->cmods) eina_list_free(es->cmods); + EINA_LIST_FREE(es->lincs, data) + eina_stringshare_del(data); eina_stringshare_del(es->coredir); eina_stringshare_del(es->moddir); eina_stringshare_del(es->appsdir); @@ -168,6 +170,15 @@ elua_state_apps_dir_get(const Elua_State *es) return es->moddir; } +EAPI void +elua_state_include_path_add(Elua_State *es, const char *path) +{ + EINA_SAFETY_ON_NULL_RETURN(es); + EINA_SAFETY_ON_NULL_RETURN(path); + EINA_SAFETY_ON_FALSE_RETURN(path[0]); + es->lincs = eina_list_append(es->lincs, eina_stringshare_add(path)); +} + EAPI lua_State * elua_state_lua_state_get(const Elua_State *es) { @@ -278,3 +289,35 @@ elua_module_init(lua_State *L) } return 0; } + +EAPI int +elua_module_system_init(lua_State *L) +{ + Elua_State *es = elua_state_from_lua_get(L); + const char *corepath = es->coredir; + const char *modpath = es->moddir; + const char *appspath = es->appsdir; + Eina_Stringshare *data = NULL; + int n = 3; + if (!corepath || !modpath || !appspath) + return 0; + lua_pushvalue(L, 1); + es->requireref = luaL_ref(L, LUA_REGISTRYINDEX); + lua_pushvalue(L, 2); + es->apploadref = luaL_ref(L, LUA_REGISTRYINDEX); + lua_pushfstring(L, "%s/?.lua;", corepath); + EINA_LIST_FREE(es->lincs, data) + { + lua_pushfstring(L, "%s/?.lua;", data); + eina_stringshare_del(data); + ++n; + } + lua_pushfstring(L, "%s/?.eo.lua;", modpath); + lua_pushfstring(L, "%s/?.lua;", modpath); + lua_pushvalue(L, 3); + lua_concat(L, n + 1); + lua_pushfstring(L, "%s/?.lua;", appspath); + lua_pushvalue(L, 4); + lua_concat(L, 2); + return 2; +} diff --git a/src/lib/elua/elua_private.h b/src/lib/elua/elua_private.h index 722d3f2..aa00cd3 100644 --- a/src/lib/elua/elua_private.h +++ b/src/lib/elua/elua_private.h @@ -34,6 +34,8 @@ struct _Elua_State Eina_Stringshare *moddir; Eina_Stringshare *appsdir; Eina_List *cmods; + Eina_List *lincs; + int requireref, apploadref; }; extern int _elua_log_dom; -- 2.7.4