From: Daniel Kolesa Date: Fri, 10 Apr 2015 11:02:08 +0000 (+0100) Subject: elua lib: add APIs for include path management X-Git-Tag: v1.15.0-alpha1~752^2~64 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6be9b662fbad73d76690daea3631e0d37c0ae896;p=platform%2Fupstream%2Fefl.git elua lib: add APIs for include path management --- diff --git a/src/lib/elua/Elua.h b/src/lib/elua/Elua.h index a05b82433c..f70af321d0 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 ae5da0e012..9019fef565 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 722d3f2b20..aa00cd300f 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;