diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-12-07 15:12:52 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-12-07 15:12:52 -0300 |
commit | d738c8d18bcc5651109b3a46103d6aa983772e68 (patch) | |
tree | e66f2f38d7cc1600da3ea19b134c7c21636a3870 /linit.c | |
parent | 0270c204c235a495ce4702ac3891eb30752d0c8d (diff) | |
download | lua-d738c8d18bcc5651109b3a46103d6aa983772e68.tar.gz lua-d738c8d18bcc5651109b3a46103d6aa983772e68.tar.bz2 lua-d738c8d18bcc5651109b3a46103d6aa983772e68.zip |
New function 'luaL_openselectedlibs'
Makes it easier to start Lua with only some standard libraries.
Diffstat (limited to 'linit.c')
-rw-r--r-- | linit.c | 51 |
1 files changed, 25 insertions, 26 deletions
@@ -8,21 +8,6 @@ | |||
8 | #define linit_c | 8 | #define linit_c |
9 | #define LUA_LIB | 9 | #define LUA_LIB |
10 | 10 | ||
11 | /* | ||
12 | ** If you embed Lua in your program and need to open the standard | ||
13 | ** libraries, call luaL_openlibs in your program. If you need a | ||
14 | ** different set of libraries, copy this file to your project and edit | ||
15 | ** it to suit your needs. | ||
16 | ** | ||
17 | ** You can also *preload* libraries, so that a later 'require' can | ||
18 | ** open the library, which is already linked to the application. | ||
19 | ** For that, do the following code: | ||
20 | ** | ||
21 | ** luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); | ||
22 | ** lua_pushcfunction(L, luaopen_modname); | ||
23 | ** lua_setfield(L, -2, modname); | ||
24 | ** lua_pop(L, 1); // remove PRELOAD table | ||
25 | */ | ||
26 | 11 | ||
27 | #include "lprefix.h" | 12 | #include "lprefix.h" |
28 | 13 | ||
@@ -36,30 +21,44 @@ | |||
36 | 21 | ||
37 | 22 | ||
38 | /* | 23 | /* |
39 | ** these libs are loaded by lua.c and are readily available to any Lua | 24 | ** Standard Libraries |
40 | ** program | ||
41 | */ | 25 | */ |
42 | static const luaL_Reg loadedlibs[] = { | 26 | static const luaL_Reg stdlibs[] = { |
43 | {LUA_GNAME, luaopen_base}, | 27 | {LUA_GNAME, luaopen_base}, |
44 | {LUA_LOADLIBNAME, luaopen_package}, | 28 | {LUA_LOADLIBNAME, luaopen_package}, |
29 | |||
45 | {LUA_COLIBNAME, luaopen_coroutine}, | 30 | {LUA_COLIBNAME, luaopen_coroutine}, |
46 | {LUA_TABLIBNAME, luaopen_table}, | 31 | {LUA_DBLIBNAME, luaopen_debug}, |
47 | {LUA_IOLIBNAME, luaopen_io}, | 32 | {LUA_IOLIBNAME, luaopen_io}, |
33 | {LUA_MATHLIBNAME, luaopen_math}, | ||
48 | {LUA_OSLIBNAME, luaopen_os}, | 34 | {LUA_OSLIBNAME, luaopen_os}, |
49 | {LUA_STRLIBNAME, luaopen_string}, | 35 | {LUA_STRLIBNAME, luaopen_string}, |
50 | {LUA_MATHLIBNAME, luaopen_math}, | 36 | {LUA_TABLIBNAME, luaopen_table}, |
51 | {LUA_UTF8LIBNAME, luaopen_utf8}, | 37 | {LUA_UTF8LIBNAME, luaopen_utf8}, |
52 | {LUA_DBLIBNAME, luaopen_debug}, | 38 | |
53 | {NULL, NULL} | 39 | {NULL, NULL} |
54 | }; | 40 | }; |
55 | 41 | ||
56 | 42 | ||
57 | LUALIB_API void luaL_openlibs (lua_State *L) { | 43 | /* |
44 | ** require selected standard libraries and add the others to the | ||
45 | ** preload table. | ||
46 | */ | ||
47 | LUALIB_API void luaL_openselectedlibs (lua_State *L, int what) { | ||
48 | int mask = 1; | ||
58 | const luaL_Reg *lib; | 49 | const luaL_Reg *lib; |
59 | /* "require" functions from 'loadedlibs' and set results to global table */ | 50 | luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); |
60 | for (lib = loadedlibs; lib->func; lib++) { | 51 | for (lib = stdlibs; lib->func; (lib++, mask <<= 1)) { |
61 | luaL_requiref(L, lib->name, lib->func, 1); | 52 | if (what & mask) { /* selected? */ |
62 | lua_pop(L, 1); /* remove lib */ | 53 | luaL_requiref(L, lib->name, lib->func, 1); /* require library */ |
54 | lua_pop(L, 1); /* remove result from the stack */ | ||
55 | } | ||
56 | else { /* add library to PRELOAD table */ | ||
57 | lua_pushcfunction(L, lib->func); | ||
58 | lua_setfield(L, -2, lib->name); | ||
59 | } | ||
63 | } | 60 | } |
61 | lua_assert((mask >> 1) == LUA_UTF8LIBK); | ||
62 | lua_pop(L, 1); // remove PRELOAD table | ||
64 | } | 63 | } |
65 | 64 | ||