From 7d309480dd783112aad8c4761921c4d45ec70327 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 30 Aug 2004 15:35:14 -0300 Subject: new way to handle _PATH (old LUA_PATH) --- lbaselib.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'lbaselib.c') diff --git a/lbaselib.c b/lbaselib.c index 7bed0bb5..522516c0 100644 --- a/lbaselib.c +++ b/lbaselib.c @@ -1,5 +1,5 @@ /* -** $Id: lbaselib.c,v 1.154 2004/07/09 18:23:17 roberto Exp roberto $ +** $Id: lbaselib.c,v 1.155 2004/08/30 15:28:32 roberto Exp roberto $ ** Basic library ** See Copyright Notice in lua.h */ @@ -452,6 +452,19 @@ static int luaB_newproxy (lua_State *L) { */ +static const char *getpath (lua_State *L) { + /* try first `LUA_PATH' for compatibility */ + lua_getfield(L, LUA_GLOBALSINDEX, "LUA_PATH"); + if (!lua_isstring(L, -1)) { + lua_pop(L, 1); + lua_getfield(L, LUA_GLOBALSINDEX, "_PATH"); + } + if (!lua_isstring(L, -1)) + luaL_error(L, "global _PATH must be a string"); + return lua_tostring(L, -1); +} + + static int luaB_require (lua_State *L) { const char *name = luaL_checkstring(L, 1); const char *fname; @@ -461,7 +474,7 @@ static int luaB_require (lua_State *L) { /* else must load it; first mark it as loaded */ lua_pushboolean(L, 1); lua_setfield(L, lua_upvalueindex(1), name); /* _LOADED[name] = true */ - fname = luaL_searchpath(L, name, NULL); + fname = luaL_searchpath(L, name, getpath(L)); if (fname == NULL || luaL_loadfile(L, fname) != 0) return luaL_error(L, "error loading package `%s' (%s)", name, lua_tostring(L, -1)); @@ -622,10 +635,11 @@ static void auxopen (lua_State *L, const char *name, static void base_open (lua_State *L) { + const char *path; lua_pushvalue(L, LUA_GLOBALSINDEX); luaL_openlib(L, NULL, base_funcs, 0); /* open lib into global table */ lua_pushliteral(L, LUA_VERSION); - lua_setfield(L, -2, "_VERSION"); /* set global _VERSION */ + lua_setfield(L, LUA_GLOBALSINDEX, "_VERSION"); /* set global _VERSION */ /* `ipairs' and `pairs' need auxiliary functions as upvalues */ auxopen(L, "ipairs", luaB_ipairs, ipairsaux); auxopen(L, "pairs", luaB_pairs, luaB_next); @@ -636,16 +650,21 @@ static void base_open (lua_State *L) { lua_pushliteral(L, "kv"); lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */ lua_pushcclosure(L, luaB_newproxy, 1); - lua_setfield(L, -2, "newproxy"); /* set global `newproxy' */ + lua_setfield(L, LUA_GLOBALSINDEX, "newproxy"); /* set global `newproxy' */ /* `require' needs a table to keep loaded chunks */ lua_newtable(L); lua_pushvalue(L, -1); - lua_setglobal(L, REQTAB); + lua_setglobal(L, "_LOADED"); lua_pushcclosure(L, luaB_require, 1); - lua_setfield(L, -2, "require"); + lua_setfield(L, LUA_GLOBALSINDEX, "require"); /* set global _G */ - lua_pushvalue(L, -1); - lua_setfield(L, -2, "_G"); + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setfield(L, LUA_GLOBALSINDEX, "_G"); + /* set global _PATH */ + path = getenv(LUA_PATH); + if (path == NULL) path = LUA_PATH_DEFAULT; + lua_pushstring(L, path); + lua_setfield(L, LUA_GLOBALSINDEX, "_PATH"); } -- cgit v1.2.3-55-g6feb