123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- 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
|