From e238efc5367a8d88757dd84df0683e1d8d9f9211 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy <roberto@inf.puc-rio.br> Date: Wed, 9 Aug 2000 16:16:57 -0300 Subject: default now is multi-state --- lua.c | 205 +++++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 128 insertions(+), 77 deletions(-) (limited to 'lua.c') diff --git a/lua.c b/lua.c index a97530d6..2d363585 100644 --- a/lua.c +++ b/lua.c @@ -1,5 +1,5 @@ /* -** $Id: lua.c,v 1.42 2000/06/30 19:17:08 roberto Exp roberto $ +** $Id: lua.c,v 1.43 2000/08/04 19:38:35 roberto Exp roberto $ ** Lua stand-alone interpreter ** See Copyright Notice in lua.h */ @@ -10,11 +10,15 @@ #include <stdlib.h> #include <string.h> +#define LUA_SINGLESTATE + #include "lua.h" #include "luadebug.h" #include "lualib.h" +lua_State *lua_state = NULL; + #ifndef PROMPT #define PROMPT "> " @@ -26,6 +30,16 @@ static int isatty (int x) { return x==0; } /* assume stdin is a tty */ #endif + +/* +** global options +*/ +struct Options { + int toclose; + int stacksize; +}; + + typedef void (*handler)(int); /* type for signal actions */ static void laction (int i); @@ -35,6 +49,19 @@ static lua_Hook old_linehook = NULL; static lua_Hook old_callhook = NULL; +#ifdef USERINIT +extern void USERINIT (void); +#else +#define USERINIT userinit +void userinit (void) { + lua_iolibopen(); + lua_strlibopen(); + lua_mathlibopen(); + lua_dblibopen(); +} +#endif + + static handler lreset (void) { return signal(SIGINT, laction); } @@ -75,7 +102,6 @@ static void print_message (void) { "usage: lua [options]. Available options are:\n" " - execute stdin as a file\n" " -c close lua when exiting\n" - " -d turn debug on\n" " -e stat execute string `stat'\n" " -f name execute file `name' with remaining arguments in table `arg'\n" " -i enter interactive mode with prompt\n" @@ -122,17 +148,20 @@ static void l_getargs (void) { } -static void file_input (const char *argv) { +static int file_input (const char *argv) { int result = ldo(lua_dofile, argv); if (result) { if (result == LUA_ERRFILE) { fprintf(stderr, "lua: cannot execute file "); perror(argv); } - exit(1); + return EXIT_FAILURE; } + else + return EXIT_SUCCESS; } + /* maximum length of an input string */ #ifndef MAXINPUT #define MAXINPUT BUFSIZ @@ -175,92 +204,114 @@ static void manual_input (int version, int prompt) { } -int main (int argc, char *argv[]) { - int toclose = 0; - int status = EXIT_SUCCESS; - int i = 1; - int stacksize = 0; - if (i < argc && argv[1][0] == '-' && argv[1][1] == 's') { - stacksize = atoi(&argv[1][2]); - if (stacksize == 0) { - fprintf(stderr, "lua: invalid stack size ('%s')\n", &argv[1][2]); - exit(EXIT_FAILURE); - } - i++; - } - lua_state = lua_newstate(stacksize, 1); - lua_userinit(); - lua_pushuserdata(argv); - lua_pushcclosure(l_getargs, 1); - lua_setglobal("getargs"); - if (i >= argc) { /* no other arguments? */ +static int handle_argv (char *argv[], struct Options *opt) { + if (opt->stacksize > 0) argv++; /* skip option `-s' (if present) */ + if (*argv == NULL) { /* no more arguments? */ if (isatty(0)) { manual_input(1, 1); } else ldo(lua_dofile, NULL); /* executes stdin as a file */ } - else for (; i<argc; i++) { - if (argv[i][0] == '-') { /* option? */ - switch (argv[i][1]) { - case 0: - ldo(lua_dofile, NULL); /* executes stdin as a file */ - break; - case 'i': - manual_input(0, 1); - break; - case 'q': - manual_input(0, 0); - break; - case 'd': - lua_setdebug(lua_state, 1); - if (i+1 >= argc) { /* last argument? */ - manual_input(1, 1); + else { /* other arguments; loop over them */ + int i; + for (i = 0; argv[i] != NULL; i++) { + if (argv[i][0] != '-') { /* not an option? */ + if (strchr(argv[i], '=')) + assign(argv[i]); + else + if (file_input(argv[i]) != EXIT_SUCCESS) + return EXIT_FAILURE; /* stop if file fails */ + } + else switch (argv[i][1]) { /* option */ + case 0: { + ldo(lua_dofile, NULL); /* executes stdin as a file */ + break; } - break; - case 'c': - toclose = 1; - break; - case 'v': - print_version(); - break; - case 'e': - i++; - if (i >= argc) { - print_message(); - status = EXIT_FAILURE; goto endloop; + case 'i': { + manual_input(0, 1); + break; + } + case 'q': { + manual_input(0, 0); + break; } - if (ldo(lua_dostring, argv[i]) != 0) { - fprintf(stderr, "lua: error running argument `%s'\n", argv[i]); - status = EXIT_FAILURE; goto endloop; + case 'c': { + opt->toclose = 1; + break; } - break; - case 'f': - i++; - if (i >= argc) { + case 'v': { + print_version(); + break; + } + case 'e': { + i++; + if (argv[i] == NULL) { + print_message(); + return EXIT_FAILURE; + } + if (ldo(lua_dostring, argv[i]) != 0) { + fprintf(stderr, "lua: error running argument `%s'\n", argv[i]); + return EXIT_FAILURE; + } + break; + } + case 'f': { + i++; + if (argv[i] == NULL) { + print_message(); + return EXIT_FAILURE; + } + lua_pushobject(getargs(argv+i)); /* collect remaining arguments */ + lua_setglobal("arg"); + return file_input(argv[i]); /* stop scanning arguments */ + } + case 's': { + fprintf(stderr, "lua: stack size (`-s') must be the first option\n"); + return EXIT_FAILURE; + } + default: { print_message(); - status = EXIT_FAILURE; goto endloop; + return EXIT_FAILURE; } - lua_pushobject(getargs(argv+i)); /* collect remaining arguments */ - lua_setglobal("arg"); - file_input(argv[i]); - goto endloop; /* stop scanning arguments */ - break; - case 's': - fprintf(stderr, "lua: stack size (`-s') must be the first option\n"); - status = EXIT_FAILURE; goto endloop; - default: - print_message(); - status = EXIT_FAILURE; goto endloop; - } + } } - else if (strchr(argv[i], '=')) - assign(argv[i]); - else - file_input(argv[i]); } - endloop: - if (toclose) + return EXIT_SUCCESS; +} + + +static void getstacksize (int argc, char *argv[], struct Options *opt) { + if (argc >= 2 && argv[1][0] == '-' && argv[1][1] == 's') { + int stacksize = atoi(&argv[1][2]); + if (stacksize == 0) { + fprintf(stderr, "lua: invalid stack size ('%s')\n", &argv[1][2]); + exit(EXIT_FAILURE); + } + opt->stacksize = stacksize; + } + else + opt->stacksize = 0; /* no stack size */ +} + + +static void register_getargs (char *argv[]) { + lua_pushuserdata(argv); + lua_pushcclosure(l_getargs, 1); + lua_setglobal("getargs"); +} + + +int main (int argc, char *argv[]) { + struct Options opt; + int status; + opt.toclose = 0; + getstacksize(argc, argv, &opt); /* handle option `-s' */ + lua_state = lua_newstate(opt.stacksize, 1); /* create state */ + USERINIT(); /* open libraries */ + register_getargs(argv); /* create `getargs' function */ + status = handle_argv(argv+1, &opt); + if (opt.toclose) lua_close(); return status; } -- cgit v1.2.3-55-g6feb