-
-
Notifications
You must be signed in to change notification settings - Fork 424
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
155 additions
and
33 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c | ||
index 8753607d4..500bca5c0 100644 | ||
--- a/core/src/xmake/engine.c | ||
+++ b/core/src/xmake/engine.c | ||
@@ -98,6 +98,11 @@ typedef struct __xm_engine_t | ||
#ifdef XM_EMBED_ENABLE | ||
// the temporary directory | ||
tb_char_t tmpdir[TB_PATH_MAXN]; | ||
+ | ||
+ // the embed files | ||
+ tb_byte_t const* embeddata[32]; | ||
+ tb_size_t embedsize[32]; | ||
+ tb_size_t embedcount; | ||
#endif | ||
|
||
}xm_engine_t; | ||
@@ -812,8 +817,15 @@ static tb_bool_t xm_engine_get_program_directory(xm_engine_t* engine, tb_char_t* | ||
do | ||
{ | ||
#ifdef XM_EMBED_ENABLE | ||
- // get it from the temporary directory | ||
- tb_strlcpy(path, engine->tmpdir, maxn); | ||
+ tb_size_t embedcount = engine->embedcount; | ||
+ if (embedcount) | ||
+ { | ||
+ tb_uint32_t crc32 = 0; | ||
+ for (tb_size_t i = 0; i < embedcount; i++) | ||
+ crc32 += tb_crc32_make(engine->embeddata[i], engine->embedsize[i], 0); | ||
+ tb_snprintf(path, maxn, "%s/%x", engine->tmpdir, crc32); | ||
+ } | ||
+ else tb_strlcpy(path, engine->tmpdir, maxn); | ||
ok = tb_true; | ||
break; | ||
#endif | ||
@@ -1189,14 +1201,8 @@ static tb_pointer_t xm_engine_lua_realloc(tb_pointer_t udata, tb_pointer_t data, | ||
#endif | ||
|
||
#ifdef XM_EMBED_ENABLE | ||
-static tb_bool_t xm_engine_extract_programfiles(xm_engine_t* engine, tb_char_t const* programdir) | ||
+static tb_bool_t xm_engine_extract_programfiles_impl(xm_engine_t* engine, tb_char_t const* programdir, tb_byte_t const* data, tb_size_t size) | ||
{ | ||
- tb_file_info_t info = {0}; | ||
- if (tb_file_info(programdir, &info)) return tb_true; | ||
- | ||
- tb_byte_t const* data = g_xmake_xmz_data; | ||
- tb_size_t size = sizeof(g_xmake_xmz_data); | ||
- | ||
// do decompress | ||
tb_bool_t ok = tb_false; | ||
LZ4F_errorCode_t code; | ||
@@ -1289,6 +1295,28 @@ static tb_bool_t xm_engine_extract_programfiles(xm_engine_t* engine, tb_char_t c | ||
tb_buffer_exit(&result); | ||
return ok; | ||
} | ||
+ | ||
+static tb_bool_t xm_engine_extract_programfiles(xm_engine_t* engine, tb_char_t const* programdir) | ||
+{ | ||
+ tb_file_info_t info = {0}; | ||
+ if (!tb_file_info(programdir, &info)) | ||
+ { | ||
+ tb_byte_t const* data = g_xmake_xmz_data; | ||
+ tb_size_t size = sizeof(g_xmake_xmz_data); | ||
+ if (!xm_engine_extract_programfiles_impl(engine, programdir, data, size)) | ||
+ return tb_false; | ||
+ | ||
+ tb_size_t embedcount = engine->embedcount; | ||
+ for (tb_size_t i = 0; i < embedcount; i++) | ||
+ { | ||
+ data = engine->embeddata[i]; | ||
+ size = engine->embedsize[i]; | ||
+ if (!xm_engine_extract_programfiles_impl(engine, programdir, data, size)) | ||
+ return tb_false; | ||
+ } | ||
+ } | ||
+ return tb_true; | ||
+} | ||
#endif | ||
|
||
/* ////////////////////////////////////////////////////////////////////////////////////// | ||
@@ -1560,6 +1588,18 @@ tb_void_t xm_engine_register(xm_engine_ref_t self, tb_char_t const* module, luaL | ||
xm_lua_register(engine->lua, tb_null, funcs); | ||
lua_rawset(engine->lua, -3); | ||
} | ||
+#ifdef XM_EMBED_ENABLE | ||
+tb_void_t xm_engine_add_embedfiles(xm_engine_ref_t self, tb_byte_t const* data, tb_size_t size) | ||
+{ | ||
+ // check | ||
+ xm_engine_t* engine = (xm_engine_t*)self; | ||
+ tb_assert_and_check_return(engine && engine->embedcount < tb_arrayn(engine->embedsize) && data && size); | ||
+ | ||
+ engine->embeddata[engine->embedcount] = data; | ||
+ engine->embedsize[engine->embedcount] = size; | ||
+ engine->embedcount++; | ||
+} | ||
+#endif | ||
tb_int_t xm_engine_run(tb_char_t const* name, tb_int_t argc, tb_char_t** argv, tb_char_t** taskargv, xm_engine_lni_initalizer_cb_t lni_initalizer) | ||
{ | ||
tb_int_t ok = -1; | ||
@@ -1575,3 +1615,4 @@ tb_int_t xm_engine_run(tb_char_t const* name, tb_int_t argc, tb_char_t** argv, t | ||
} | ||
return ok; | ||
} | ||
+ | ||
diff --git a/core/src/xmake/engine.h b/core/src/xmake/engine.h | ||
index cc5a533ca..901e3997e 100644 | ||
--- a/core/src/xmake/engine.h | ||
+++ b/core/src/xmake/engine.h | ||
@@ -79,6 +79,14 @@ tb_int_t xm_engine_main(xm_engine_ref_t engine, tb_int_t argc | ||
*/ | ||
tb_void_t xm_engine_register(xm_engine_ref_t engine, tb_char_t const* module, luaL_Reg const funcs[]); | ||
|
||
+/*! add the embed files | ||
+ * | ||
+ * @param name the engine name | ||
+ * @param data the embedfiles data | ||
+ * @param size the data size | ||
+ */ | ||
+tb_void_t xm_engine_add_embedfiles(xm_engine_ref_t engine, tb_byte_t const* data, tb_size_t size); | ||
+ | ||
/*! run main entry of the engine singleton | ||
* | ||
* @param name the engine name | ||
diff --git a/core/src/xmake/prefix.h b/core/src/xmake/prefix.h | ||
index 5d6fba582..3c5c0679f 100644 | ||
--- a/core/src/xmake/prefix.h | ||
+++ b/core/src/xmake/prefix.h | ||
@@ -117,14 +117,21 @@ static __tb_inline__ tb_pointer_t xm_lua_topointer(lua_State* lua, tb_int_t idx) | ||
static __tb_inline__ tb_void_t xm_lua_register(lua_State *lua, tb_char_t const* libname, luaL_Reg const* l) | ||
{ | ||
#if LUA_VERSION_NUM >= 504 | ||
- lua_getglobal(lua, libname); | ||
- if (lua_isnil(lua, -1)) | ||
+ if (libname) | ||
{ | ||
- lua_pop(lua, 1); | ||
- lua_newtable(lua); | ||
+ lua_getglobal(lua, libname); | ||
+ if (lua_isnil(lua, -1)) | ||
+ { | ||
+ lua_pop(lua, 1); | ||
+ lua_newtable(lua); | ||
+ } | ||
+ luaL_setfuncs(lua, l, 0); | ||
+ lua_setglobal(lua, libname); | ||
+ } | ||
+ else | ||
+ { | ||
+ luaL_setfuncs(lua, l, 0); | ||
} | ||
- luaL_setfuncs(lua, l, 0); | ||
- lua_setglobal(lua, libname); | ||
#else | ||
luaL_register(lua, libname, l); | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters