diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-01-12 15:14:26 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-01-12 15:14:26 -0200 |
commit | 94c1b3a8eef6778cf995b906d77c0c066c6d55f3 (patch) | |
tree | 1b7cd3a0d95a655d9e5016046e56063ab548aeba /loadlib.c | |
parent | 08199ade4ace6addd63148df4c596d6b61def8cd (diff) | |
download | lua-94c1b3a8eef6778cf995b906d77c0c066c6d55f3.tar.gz lua-94c1b3a8eef6778cf995b906d77c0c066c6d55f3.tar.bz2 lua-94c1b3a8eef6778cf995b906d77c0c066c6d55f3.zip |
Handling of LUA_PATH/LUA_CPATH moved back to 'package' library
to avoid incompatibilites with previous releases
Diffstat (limited to 'loadlib.c')
-rw-r--r-- | loadlib.c | 97 |
1 files changed, 92 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: loadlib.c,v 1.128 2016/07/18 17:55:59 roberto Exp roberto $ | 2 | ** $Id: loadlib.c,v 1.129 2016/12/04 20:17:24 roberto Exp roberto $ |
3 | ** Dynamic library loader for Lua | 3 | ** Dynamic library loader for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | ** | 5 | ** |
@@ -64,6 +64,9 @@ static const int CLIBS = 0; | |||
64 | #define LIB_FAIL "open" | 64 | #define LIB_FAIL "open" |
65 | 65 | ||
66 | 66 | ||
67 | #define setprogdir(L) ((void)0) | ||
68 | |||
69 | |||
67 | /* | 70 | /* |
68 | ** system-dependent functions | 71 | ** system-dependent functions |
69 | */ | 72 | */ |
@@ -155,6 +158,30 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { | |||
155 | #endif | 158 | #endif |
156 | 159 | ||
157 | 160 | ||
161 | #undef setprogdir | ||
162 | |||
163 | |||
164 | /* | ||
165 | ** Replace in the path (on the top of the stack) any occurrence | ||
166 | ** of LUA_EXEC_DIR with the executable's path. | ||
167 | */ | ||
168 | static void setprogdir (lua_State *L) { | ||
169 | char buff[MAX_PATH + 1]; | ||
170 | char *lb; | ||
171 | DWORD nsize = sizeof(buff)/sizeof(char); | ||
172 | DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */ | ||
173 | if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) | ||
174 | luaL_error(L, "unable to get ModuleFileName"); | ||
175 | else { | ||
176 | *lb = '\0'; /* cut name on the last '\\' to get the path */ | ||
177 | luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff); | ||
178 | lua_remove(L, -2); /* remove original string */ | ||
179 | } | ||
180 | } | ||
181 | |||
182 | |||
183 | |||
184 | |||
158 | static void pusherror (lua_State *L) { | 185 | static void pusherror (lua_State *L) { |
159 | int error = GetLastError(); | 186 | int error = GetLastError(); |
160 | char buffer[128]; | 187 | char buffer[128]; |
@@ -224,6 +251,67 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { | |||
224 | 251 | ||
225 | 252 | ||
226 | /* | 253 | /* |
254 | ** {================================================================== | ||
255 | ** Set Paths | ||
256 | ** =================================================================== | ||
257 | */ | ||
258 | |||
259 | /* | ||
260 | ** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment | ||
261 | ** variables that Lua check to set its paths. | ||
262 | */ | ||
263 | #if !defined(LUA_PATH_VAR) | ||
264 | #define LUA_PATH_VAR "LUA_PATH" | ||
265 | #endif | ||
266 | |||
267 | #if !defined(LUA_CPATH_VAR) | ||
268 | #define LUA_CPATH_VAR "LUA_CPATH" | ||
269 | #endif | ||
270 | |||
271 | |||
272 | #define AUXMARK "\1" /* auxiliary mark */ | ||
273 | |||
274 | |||
275 | /* | ||
276 | ** return registry.LUA_NOENV as a boolean | ||
277 | */ | ||
278 | static int noenv (lua_State *L) { | ||
279 | int b; | ||
280 | lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); | ||
281 | b = lua_toboolean(L, -1); | ||
282 | lua_pop(L, 1); /* remove value */ | ||
283 | return b; | ||
284 | } | ||
285 | |||
286 | |||
287 | /* | ||
288 | ** Set a path | ||
289 | */ | ||
290 | static void setpath (lua_State *L, const char *fieldname, | ||
291 | const char *envname, | ||
292 | const char *dft) { | ||
293 | const char *nver = lua_pushfstring(L, "%s%s", envname, LUA_VERSUFFIX); | ||
294 | const char *path = getenv(nver); /* use versioned name */ | ||
295 | if (path == NULL) /* no environment variable? */ | ||
296 | path = getenv(envname); /* try unversioned name */ | ||
297 | if (path == NULL || noenv(L)) /* no environment variable? */ | ||
298 | lua_pushstring(L, dft); /* use default */ | ||
299 | else { | ||
300 | /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ | ||
301 | path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP, | ||
302 | LUA_PATH_SEP AUXMARK LUA_PATH_SEP); | ||
303 | luaL_gsub(L, path, AUXMARK, dft); | ||
304 | lua_remove(L, -2); /* remove result from 1st 'gsub' */ | ||
305 | } | ||
306 | setprogdir(L); | ||
307 | lua_setfield(L, -3, fieldname); /* package[fieldname] = path value */ | ||
308 | lua_pop(L, 1); /* pop versioned variable name */ | ||
309 | } | ||
310 | |||
311 | /* }================================================================== */ | ||
312 | |||
313 | |||
314 | /* | ||
227 | ** return registry.CLIBS[path] | 315 | ** return registry.CLIBS[path] |
228 | */ | 316 | */ |
229 | static void *checkclib (lua_State *L, const char *path) { | 317 | static void *checkclib (lua_State *L, const char *path) { |
@@ -680,10 +768,9 @@ LUAMOD_API int luaopen_package (lua_State *L) { | |||
680 | createclibstable(L); | 768 | createclibstable(L); |
681 | luaL_newlib(L, pk_funcs); /* create 'package' table */ | 769 | luaL_newlib(L, pk_funcs); /* create 'package' table */ |
682 | createsearcherstable(L); | 770 | createsearcherstable(L); |
683 | lua_pushstring(L, LUA_PATH_DEFAULT); | 771 | /* set paths */ |
684 | lua_setfield(L, -2, "path"); /* package.path = default path */ | 772 | setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT); |
685 | lua_pushstring(L, LUA_CPATH_DEFAULT); | 773 | setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT); |
686 | lua_setfield(L, -2, "cpath"); /* package.cpath = default cpath */ | ||
687 | /* store config information */ | 774 | /* store config information */ |
688 | lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" | 775 | lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" |
689 | LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); | 776 | LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); |