aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-06-26 14:08:52 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-06-26 14:08:52 -0300
commit10200585a7d634b9d8688ecf8afab5b203619508 (patch)
tree92e4ccd304b7ed7889fbb2b1b335a917fd77e246
parentc94f11d783f617af701429bb9ebfc7fc96d6a2d9 (diff)
downloadlua-10200585a7d634b9d8688ecf8afab5b203619508.tar.gz
lua-10200585a7d634b9d8688ecf8afab5b203619508.tar.bz2
lua-10200585a7d634b9d8688ecf8afab5b203619508.zip
var-arguments to the script come from 'arg' table (not from original
'argv' array)
-rw-r--r--lua.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/lua.c b/lua.c
index 7a1cdb90..e2dc836f 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.210 2014/02/26 15:27:56 roberto Exp roberto $ 2** $Id: lua.c,v 1.211 2014/06/05 20:42:06 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*/
@@ -417,25 +417,31 @@ static void doREPL (lua_State *L) {
417 417
418 418
419/* 419/*
420** Push on the stack 'n' strings from 'argv' 420** Push on the stack the contents of table 'arg' from 1 to #arg
421*/ 421*/
422static void pushargs (lua_State *L, char **argv, int n) { 422static int pushargs (lua_State *L) {
423 int i; 423 int i, n;
424 lua_getglobal(L, "arg");
425 if (!lua_istable(L, -1))
426 luaL_error(L, "'arg' is not a table");
427 n = (int)luaL_len(L, -1);
424 luaL_checkstack(L, n + 3, "too many arguments to script"); 428 luaL_checkstack(L, n + 3, "too many arguments to script");
425 for (i = 1; i < n; i++) /* skip 0 (the script name) */ 429 for (i = 1; i <= n; i++)
426 lua_pushstring(L, argv[i]); 430 lua_rawgeti(L, -i, i);
431 lua_remove(L, -i); /* remove table from the stack */
432 return n;
427} 433}
428 434
429 435
430static int handle_script (lua_State *L, char **argv, int n) { 436static int handle_script (lua_State *L, char **argv) {
431 int status; 437 int status;
432 const char *fname = argv[0]; 438 const char *fname = argv[0];
433 if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0) 439 if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0)
434 fname = NULL; /* stdin */ 440 fname = NULL; /* stdin */
435 status = luaL_loadfile(L, fname); 441 status = luaL_loadfile(L, fname);
436 if (status == LUA_OK) { 442 if (status == LUA_OK) {
437 pushargs(L, argv, n); /* push arguments to script */ 443 int n = pushargs(L); /* push arguments to script */
438 status = docall(L, n - 1, LUA_MULTRET); 444 status = docall(L, n, LUA_MULTRET);
439 } 445 }
440 return report(L, status); 446 return report(L, status);
441} 447}
@@ -570,7 +576,7 @@ static int pmain (lua_State *L) {
570 if (!runargs(L, argv, script)) /* execute arguments -e and -l */ 576 if (!runargs(L, argv, script)) /* execute arguments -e and -l */
571 return 0; /* something failed */ 577 return 0; /* something failed */
572 if (script < argc && /* execute main script (if there is one) */ 578 if (script < argc && /* execute main script (if there is one) */
573 handle_script(L, argv + script, argc - script) != LUA_OK) 579 handle_script(L, argv + script) != LUA_OK)
574 return 0; 580 return 0;
575 if (args & has_i) /* -i option? */ 581 if (args & has_i) /* -i option? */
576 doREPL(L); /* do read-eval-print loop */ 582 doREPL(L); /* do read-eval-print loop */