summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2016-07-18 14:55:59 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2016-07-18 14:55:59 -0300
commitde3fd8ab83763960433283a07d32e7a6bb986ea8 (patch)
tree50b522bf8019527322aa0d400788e82d9049f470
parent788109a3de05462f19c5c05033581c1eab9e9283 (diff)
downloadlua-de3fd8ab83763960433283a07d32e7a6bb986ea8.tar.gz
lua-de3fd8ab83763960433283a07d32e7a6bb986ea8.tar.bz2
lua-de3fd8ab83763960433283a07d32e7a6bb986ea8.zip
Handling of LUA_PATH/LUA_CPATH moved from package library to stand
alone interpreter (so that 'lua.c' concentrates all handling of environment variables)
-rw-r--r--loadlib.c94
-rw-r--r--lua.c96
-rw-r--r--luaconf.h14
3 files changed, 109 insertions, 95 deletions
diff --git a/loadlib.c b/loadlib.c
index 7a9b011f..24910351 100644
--- a/loadlib.c
+++ b/loadlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: loadlib.c,v 1.126 2015/02/16 13:14:33 roberto Exp roberto $ 2** $Id: loadlib.c,v 1.127 2015/11/23 11:30:45 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**
@@ -25,40 +25,9 @@
25 25
26 26
27/* 27/*
28** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
29** variables that Lua check to set its paths.
30*/
31#if !defined(LUA_PATH_VAR)
32#define LUA_PATH_VAR "LUA_PATH"
33#endif
34
35#if !defined(LUA_CPATH_VAR)
36#define LUA_CPATH_VAR "LUA_CPATH"
37#endif
38
39#define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
40
41#define LUA_PATHVARVERSION LUA_PATH_VAR LUA_PATHSUFFIX
42#define LUA_CPATHVARVERSION LUA_CPATH_VAR LUA_PATHSUFFIX
43
44/*
45** LUA_PATH_SEP is the character that separates templates in a path.
46** LUA_PATH_MARK is the string that marks the substitution points in a
47** template.
48** LUA_EXEC_DIR in a Windows path is replaced by the executable's
49** directory.
50** LUA_IGMARK is a mark to ignore all before it when building the 28** LUA_IGMARK is a mark to ignore all before it when building the
51** luaopen_ function name. 29** luaopen_ function name.
52*/ 30*/
53#if !defined (LUA_PATH_SEP)
54#define LUA_PATH_SEP ";"
55#endif
56#if !defined (LUA_PATH_MARK)
57#define LUA_PATH_MARK "?"
58#endif
59#if !defined (LUA_EXEC_DIR)
60#define LUA_EXEC_DIR "!"
61#endif
62#if !defined (LUA_IGMARK) 31#if !defined (LUA_IGMARK)
63#define LUA_IGMARK "-" 32#define LUA_IGMARK "-"
64#endif 33#endif
@@ -94,8 +63,6 @@ static const int CLIBS = 0;
94 63
95#define LIB_FAIL "open" 64#define LIB_FAIL "open"
96 65
97#define setprogdir(L) ((void)0)
98
99 66
100/* 67/*
101** system-dependent functions 68** system-dependent functions
@@ -179,7 +146,6 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
179 146
180#include <windows.h> 147#include <windows.h>
181 148
182#undef setprogdir
183 149
184/* 150/*
185** optional flags for LoadLibraryEx 151** optional flags for LoadLibraryEx
@@ -189,21 +155,6 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
189#endif 155#endif
190 156
191 157
192static void setprogdir (lua_State *L) {
193 char buff[MAX_PATH + 1];
194 char *lb;
195 DWORD nsize = sizeof(buff)/sizeof(char);
196 DWORD n = GetModuleFileNameA(NULL, buff, nsize);
197 if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
198 luaL_error(L, "unable to get ModuleFileName");
199 else {
200 *lb = '\0';
201 luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff);
202 lua_remove(L, -2); /* remove original string */
203 }
204}
205
206
207static void pusherror (lua_State *L) { 158static void pusherror (lua_State *L) {
208 int error = GetLastError(); 159 int error = GetLastError();
209 char buffer[128]; 160 char buffer[128];
@@ -666,41 +617,6 @@ static int ll_seeall (lua_State *L) {
666 617
667 618
668 619
669/* auxiliary mark (for internal use) */
670#define AUXMARK "\1"
671
672
673/*
674** return registry.LUA_NOENV as a boolean
675*/
676static int noenv (lua_State *L) {
677 int b;
678 lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
679 b = lua_toboolean(L, -1);
680 lua_pop(L, 1); /* remove value */
681 return b;
682}
683
684
685static void setpath (lua_State *L, const char *fieldname, const char *envname1,
686 const char *envname2, const char *def) {
687 const char *path = getenv(envname1);
688 if (path == NULL) /* no environment variable? */
689 path = getenv(envname2); /* try alternative name */
690 if (path == NULL || noenv(L)) /* no environment variable? */
691 lua_pushstring(L, def); /* use default */
692 else {
693 /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
694 path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
695 LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
696 luaL_gsub(L, path, AUXMARK, def);
697 lua_remove(L, -2);
698 }
699 setprogdir(L);
700 lua_setfield(L, -2, fieldname);
701}
702
703
704static const luaL_Reg pk_funcs[] = { 620static const luaL_Reg pk_funcs[] = {
705 {"loadlib", ll_loadlib}, 621 {"loadlib", ll_loadlib},
706 {"searchpath", ll_searchpath}, 622 {"searchpath", ll_searchpath},
@@ -764,10 +680,10 @@ LUAMOD_API int luaopen_package (lua_State *L) {
764 createclibstable(L); 680 createclibstable(L);
765 luaL_newlib(L, pk_funcs); /* create 'package' table */ 681 luaL_newlib(L, pk_funcs); /* create 'package' table */
766 createsearcherstable(L); 682 createsearcherstable(L);
767 /* set field 'path' */ 683 lua_pushstring(L, LUA_PATH_DEFAULT);
768 setpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, LUA_PATH_DEFAULT); 684 lua_setfield(L, -2, "path"); /* package.path = default path */
769 /* set field 'cpath' */ 685 lua_pushstring(L, LUA_CPATH_DEFAULT);
770 setpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, LUA_CPATH_DEFAULT); 686 lua_setfield(L, -2, "cpath"); /* package.cpath = default cpath */
771 /* store config information */ 687 /* store config information */
772 lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" 688 lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n"
773 LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); 689 LUA_EXEC_DIR "\n" LUA_IGMARK "\n");
diff --git a/lua.c b/lua.c
index 898c6869..8bd470ae 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.225 2015/03/30 15:42:59 roberto Exp roberto $ 2** $Id: lua.c,v 1.226 2015/08/14 19:11:20 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*/
@@ -55,6 +55,8 @@
55#elif defined(LUA_USE_WINDOWS) /* }{ */ 55#elif defined(LUA_USE_WINDOWS) /* }{ */
56 56
57#include <io.h> 57#include <io.h>
58#include <windows.h>
59
58#define lua_stdin_is_tty() _isatty(_fileno(stdin)) 60#define lua_stdin_is_tty() _isatty(_fileno(stdin))
59 61
60#else /* }{ */ 62#else /* }{ */
@@ -529,6 +531,91 @@ static int runargs (lua_State *L, char **argv, int n) {
529} 531}
530 532
531 533
534
535/*
536** {==================================================================
537** Set Paths
538** ===================================================================
539*/
540
541/*
542** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
543** variables that Lua check to set its paths.
544*/
545#if !defined(LUA_PATH_VAR)
546#define LUA_PATH_VAR "LUA_PATH"
547#endif
548
549#if !defined(LUA_CPATH_VAR)
550#define LUA_CPATH_VAR "LUA_CPATH"
551#endif
552
553#define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
554
555#define LUA_PATHVARVERSION LUA_PATH_VAR LUA_PATHSUFFIX
556#define LUA_CPATHVARVERSION LUA_CPATH_VAR LUA_PATHSUFFIX
557
558
559#define AUXMARK "\1" /* auxiliary mark */
560
561
562#if defined(LUA_USE_WINDOWS)
563
564
565/*
566** Replace in the path (on the top of the stack) any occurrence
567** of LUA_EXEC_DIR with the executable's path.
568*/
569static void setprogdir (lua_State *L) {
570 char buff[MAX_PATH + 1];
571 char *lb;
572 DWORD nsize = sizeof(buff)/sizeof(char);
573 DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */
574 if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
575 luaL_error(L, "unable to get ModuleFileName");
576 else {
577 *lb = '\0'; /* cut name on the last '\\' to get the path */
578 luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff);
579 lua_remove(L, -2); /* remove original string */
580 }
581}
582
583#else
584
585#define setprogdir(L) ((void)0)
586
587#endif
588
589/*
590** Change a path according to corresponding environment variables
591*/
592static void chgpath (lua_State *L, const char *fieldname,
593 const char *envname1,
594 const char *envname2,
595 int noenv) {
596 const char *path = getenv(envname1);
597 lua_getglobal(L, LUA_LOADLIBNAME); /* get 'package' table */
598 lua_getfield(L, -1, fieldname); /* get original path */
599 if (path == NULL) /* no environment variable? */
600 path = getenv(envname2); /* try alternative name */
601 if (path == NULL || noenv) /* no environment variable? */
602 lua_pushvalue(L, -1); /* use original value */
603 else {
604 const char *def = lua_tostring(L, -1); /* default path */
605 /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
606 path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
607 LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
608 luaL_gsub(L, path, AUXMARK, def);
609 lua_remove(L, -2); /* remove result from 1st 'gsub' */
610 }
611 setprogdir(L);
612 lua_setfield(L, -3, fieldname); /* set path value */
613 lua_pop(L, 2); /* pop 'package' table and original path */
614}
615
616/* }================================================================== */
617
618
532static int handle_luainit (lua_State *L) { 619static int handle_luainit (lua_State *L) {
533 const char *name = "=" LUA_INITVARVERSION; 620 const char *name = "=" LUA_INITVARVERSION;
534 const char *init = getenv(name + 1); 621 const char *init = getenv(name + 1);
@@ -561,11 +648,10 @@ static int pmain (lua_State *L) {
561 } 648 }
562 if (args & has_v) /* option '-v'? */ 649 if (args & has_v) /* option '-v'? */
563 print_version(); 650 print_version();
564 if (args & has_E) { /* option '-E'? */
565 lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */
566 lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
567 }
568 luaL_openlibs(L); /* open standard libraries */ 651 luaL_openlibs(L); /* open standard libraries */
652 /* change paths according to env variables */
653 chgpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, (args & has_E));
654 chgpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, (args & has_E));
569 createargtable(L, argv, argc, script); /* create table 'arg' */ 655 createargtable(L, argv, argc, script); /* create table 'arg' */
570 if (!(args & has_E)) { /* no option '-E'? */ 656 if (!(args & has_E)) { /* no option '-E'? */
571 if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ 657 if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */
diff --git a/luaconf.h b/luaconf.h
index fa1fcd4d..2992c911 100644
--- a/luaconf.h
+++ b/luaconf.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: luaconf.h,v 1.254 2015/10/21 18:17:40 roberto Exp roberto $ 2** $Id: luaconf.h,v 1.255 2016/05/01 20:06:09 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*/
@@ -159,6 +159,18 @@
159*/ 159*/
160 160
161/* 161/*
162** LUA_PATH_SEP is the character that separates templates in a path.
163** LUA_PATH_MARK is the string that marks the substitution points in a
164** template.
165** LUA_EXEC_DIR in a Windows path is replaced by the executable's
166** directory.
167*/
168#define LUA_PATH_SEP ";"
169#define LUA_PATH_MARK "?"
170#define LUA_EXEC_DIR "!"
171
172
173/*
162@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for 174@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for
163** Lua libraries. 175** Lua libraries.
164@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for 176@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for