|
1 | 1 | /*
|
2 |
| -** $Id: loadlib.c,v 1.129 2016/12/04 20:17:24 roberto Exp $ |
| 2 | +** $Id: loadlib.c,v 1.130 2017/01/12 17:14:26 roberto Exp $ |
3 | 3 | ** Dynamic library loader for Lua
|
4 | 4 | ** See Copyright Notice in lua.h
|
5 | 5 | **
|
@@ -64,6 +64,9 @@ static const int CLIBS = 0;
|
64 | 64 | #define LIB_FAIL "open"
|
65 | 65 |
|
66 | 66 |
|
| 67 | +#define setprogdir(L) ((void)0) |
| 68 | + |
| 69 | + |
67 | 70 | /*
|
68 | 71 | ** system-dependent functions
|
69 | 72 | */
|
@@ -155,6 +158,30 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
|
155 | 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 | 185 | static void pusherror (lua_State *L) {
|
159 | 186 | int error = GetLastError();
|
160 | 187 | char buffer[128];
|
@@ -223,6 +250,67 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
|
223 | 250 | #endif /* } */
|
224 | 251 |
|
225 | 252 |
|
| 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 | + |
226 | 314 | /*
|
227 | 315 | ** return registry.CLIBS[path]
|
228 | 316 | */
|
@@ -680,10 +768,9 @@ LUAMOD_API int luaopen_package (lua_State *L) {
|
680 | 768 | createclibstable(L);
|
681 | 769 | luaL_newlib(L, pk_funcs); /* create 'package' table */
|
682 | 770 | createsearcherstable(L);
|
683 |
| - lua_pushstring(L, LUA_PATH_DEFAULT); |
684 |
| - lua_setfield(L, -2, "path"); /* package.path = default path */ |
685 |
| - lua_pushstring(L, LUA_CPATH_DEFAULT); |
686 |
| - lua_setfield(L, -2, "cpath"); /* package.cpath = default cpath */ |
| 771 | + /* set paths */ |
| 772 | + setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT); |
| 773 | + setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT); |
687 | 774 | /* store config information */
|
688 | 775 | lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n"
|
689 | 776 | LUA_EXEC_DIR "\n" LUA_IGMARK "\n");
|
|
0 commit comments