aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lauxlib.c19
-rw-r--r--lbaselib.c35
-rw-r--r--lua.c9
-rw-r--r--luaconf.h6
4 files changed, 38 insertions, 31 deletions
diff --git a/lauxlib.c b/lauxlib.c
index 83bae2e4..8cfe594b 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lauxlib.c,v 1.121 2004/07/13 20:11:32 roberto Exp roberto $ 2** $Id: lauxlib.c,v 1.122 2004/08/13 19:52:53 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -341,17 +341,6 @@ LUALIB_API int luaL_getn (lua_State *L, int t) {
341/* }====================================================== */ 341/* }====================================================== */
342 342
343 343
344static const char *getpath (lua_State *L) {
345 const char *path;
346 lua_getglobal(L, LUA_PATH); /* try global variable */
347 path = lua_tostring(L, -1);
348 if (path) return path;
349 path = getenv(LUA_PATH); /* else try environment variable */
350 if (path) return path;
351 return LUA_PATH_DEFAULT; /* else use default */
352}
353
354
355static const char *pushnexttemplate (lua_State *L, const char *path) { 344static const char *pushnexttemplate (lua_State *L, const char *path) {
356 const char *l; 345 const char *l;
357 if (*path == '\0') return NULL; /* no more templates */ 346 if (*path == '\0') return NULL; /* no more templates */
@@ -383,10 +372,7 @@ static const char *luaL_gsub (lua_State *L, const char *s,
383LUALIB_API const char *luaL_searchpath (lua_State *L, const char *name, 372LUALIB_API const char *luaL_searchpath (lua_State *L, const char *name,
384 const char *path) { 373 const char *path) {
385 FILE *f; 374 FILE *f;
386 const char *p; 375 const char *p = path;
387 if (path == NULL) path = getpath(L);
388 else lua_pushnil(L); /* to balance item pushed by `getpath' */
389 p = path;
390 for (;;) { 376 for (;;) {
391 const char *fname; 377 const char *fname;
392 if ((p = pushnexttemplate(L, p)) == NULL) { 378 if ((p = pushnexttemplate(L, p)) == NULL) {
@@ -398,7 +384,6 @@ LUALIB_API const char *luaL_searchpath (lua_State *L, const char *name,
398 f = fopen(fname, "r"); /* try to read it */ 384 f = fopen(fname, "r"); /* try to read it */
399 if (f) { 385 if (f) {
400 fclose(f); 386 fclose(f);
401 lua_remove(L, -2); /* remove path */
402 return fname; 387 return fname;
403 } 388 }
404 lua_pop(L, 1); /* remove file name */ 389 lua_pop(L, 1); /* remove file name */
diff --git a/lbaselib.c b/lbaselib.c
index 7bed0bb5..522516c0 100644
--- a/lbaselib.c
+++ b/lbaselib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbaselib.c,v 1.154 2004/07/09 18:23:17 roberto Exp roberto $ 2** $Id: lbaselib.c,v 1.155 2004/08/30 15:28:32 roberto Exp roberto $
3** Basic library 3** Basic library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -452,6 +452,19 @@ static int luaB_newproxy (lua_State *L) {
452*/ 452*/
453 453
454 454
455static const char *getpath (lua_State *L) {
456 /* try first `LUA_PATH' for compatibility */
457 lua_getfield(L, LUA_GLOBALSINDEX, "LUA_PATH");
458 if (!lua_isstring(L, -1)) {
459 lua_pop(L, 1);
460 lua_getfield(L, LUA_GLOBALSINDEX, "_PATH");
461 }
462 if (!lua_isstring(L, -1))
463 luaL_error(L, "global _PATH must be a string");
464 return lua_tostring(L, -1);
465}
466
467
455static int luaB_require (lua_State *L) { 468static int luaB_require (lua_State *L) {
456 const char *name = luaL_checkstring(L, 1); 469 const char *name = luaL_checkstring(L, 1);
457 const char *fname; 470 const char *fname;
@@ -461,7 +474,7 @@ static int luaB_require (lua_State *L) {
461 /* else must load it; first mark it as loaded */ 474 /* else must load it; first mark it as loaded */
462 lua_pushboolean(L, 1); 475 lua_pushboolean(L, 1);
463 lua_setfield(L, lua_upvalueindex(1), name); /* _LOADED[name] = true */ 476 lua_setfield(L, lua_upvalueindex(1), name); /* _LOADED[name] = true */
464 fname = luaL_searchpath(L, name, NULL); 477 fname = luaL_searchpath(L, name, getpath(L));
465 if (fname == NULL || luaL_loadfile(L, fname) != 0) 478 if (fname == NULL || luaL_loadfile(L, fname) != 0)
466 return luaL_error(L, "error loading package `%s' (%s)", name, 479 return luaL_error(L, "error loading package `%s' (%s)", name,
467 lua_tostring(L, -1)); 480 lua_tostring(L, -1));
@@ -622,10 +635,11 @@ static void auxopen (lua_State *L, const char *name,
622 635
623 636
624static void base_open (lua_State *L) { 637static void base_open (lua_State *L) {
638 const char *path;
625 lua_pushvalue(L, LUA_GLOBALSINDEX); 639 lua_pushvalue(L, LUA_GLOBALSINDEX);
626 luaL_openlib(L, NULL, base_funcs, 0); /* open lib into global table */ 640 luaL_openlib(L, NULL, base_funcs, 0); /* open lib into global table */
627 lua_pushliteral(L, LUA_VERSION); 641 lua_pushliteral(L, LUA_VERSION);
628 lua_setfield(L, -2, "_VERSION"); /* set global _VERSION */ 642 lua_setfield(L, LUA_GLOBALSINDEX, "_VERSION"); /* set global _VERSION */
629 /* `ipairs' and `pairs' need auxiliary functions as upvalues */ 643 /* `ipairs' and `pairs' need auxiliary functions as upvalues */
630 auxopen(L, "ipairs", luaB_ipairs, ipairsaux); 644 auxopen(L, "ipairs", luaB_ipairs, ipairsaux);
631 auxopen(L, "pairs", luaB_pairs, luaB_next); 645 auxopen(L, "pairs", luaB_pairs, luaB_next);
@@ -636,16 +650,21 @@ static void base_open (lua_State *L) {
636 lua_pushliteral(L, "kv"); 650 lua_pushliteral(L, "kv");
637 lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */ 651 lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */
638 lua_pushcclosure(L, luaB_newproxy, 1); 652 lua_pushcclosure(L, luaB_newproxy, 1);
639 lua_setfield(L, -2, "newproxy"); /* set global `newproxy' */ 653 lua_setfield(L, LUA_GLOBALSINDEX, "newproxy"); /* set global `newproxy' */
640 /* `require' needs a table to keep loaded chunks */ 654 /* `require' needs a table to keep loaded chunks */
641 lua_newtable(L); 655 lua_newtable(L);
642 lua_pushvalue(L, -1); 656 lua_pushvalue(L, -1);
643 lua_setglobal(L, REQTAB); 657 lua_setglobal(L, "_LOADED");
644 lua_pushcclosure(L, luaB_require, 1); 658 lua_pushcclosure(L, luaB_require, 1);
645 lua_setfield(L, -2, "require"); 659 lua_setfield(L, LUA_GLOBALSINDEX, "require");
646 /* set global _G */ 660 /* set global _G */
647 lua_pushvalue(L, -1); 661 lua_pushvalue(L, LUA_GLOBALSINDEX);
648 lua_setfield(L, -2, "_G"); 662 lua_setfield(L, LUA_GLOBALSINDEX, "_G");
663 /* set global _PATH */
664 path = getenv(LUA_PATH);
665 if (path == NULL) path = LUA_PATH_DEFAULT;
666 lua_pushstring(L, path);
667 lua_setfield(L, LUA_GLOBALSINDEX, "_PATH");
649} 668}
650 669
651 670
diff --git a/lua.c b/lua.c
index a8c289e5..88ad392e 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.130 2004/07/13 19:56:44 roberto Exp roberto $ 2** $Id: lua.c,v 1.131 2004/08/26 14:19:55 roberto Exp roberto $
3** Lua stand-alone interpreter 3** Lua stand-alone interpreter
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -127,7 +127,12 @@ static int dostring (lua_State *L, const char *s, const char *name) {
127 127
128 128
129static int dolibrary (lua_State *L, const char *name) { 129static int dolibrary (lua_State *L, const char *name) {
130 name = luaL_searchpath(L, name, NULL); 130 lua_getfield(L, LUA_GLOBALSINDEX, "_PATH");
131 if (!lua_isstring(L, -1)) {
132 l_message(progname, "global _PATH must be a string");
133 return 1;
134 }
135 name = luaL_searchpath(L, name, lua_tostring(L, -1));
131 if (name == NULL) return report(L, 1); 136 if (name == NULL) return report(L, 1);
132 else return dofile(L, name); 137 else return dofile(L, name);
133} 138}
diff --git a/luaconf.h b/luaconf.h
index 5636beaf..a9f0cff7 100644
--- a/luaconf.h
+++ b/luaconf.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: luaconf.h,v 1.9 2004/07/09 14:29:29 roberto Exp roberto $ 2** $Id: luaconf.h,v 1.10 2004/08/30 13:44:04 roberto Exp roberto $
3** Configuration file for Lua 3** Configuration file for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -271,10 +271,8 @@
271 271
272 272
273/* `assert' options */ 273/* `assert' options */
274/* name of global that holds table with loaded packages */
275#define REQTAB "_LOADED"
276 274
277/* name of global that holds the search path for packages */ 275/* environment variable that holds the search path for packages */
278#define LUA_PATH "LUA_PATH" 276#define LUA_PATH "LUA_PATH"
279 277
280/* separator of templates in a path */ 278/* separator of templates in a path */