elua lib: add APIs for include path management
authorDaniel Kolesa <d.kolesa@samsung.com>
Fri, 10 Apr 2015 11:02:08 +0000 (12:02 +0100)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 6 May 2015 14:05:19 +0000 (15:05 +0100)
src/lib/elua/Elua.h
src/lib/elua/elua.c
src/lib/elua/elua_private.h

index a05b824..f70af32 100644 (file)
@@ -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
 
index ae5da0e..9019fef 100644 (file)
@@ -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;
+}
index 722d3f2..aa00cd3 100644 (file)
@@ -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;