aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/lua.c b/lua.c
index b725944e..cc698d0b 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.28 1999/12/06 11:41:28 roberto Exp roberto $ 2** $Id: lua.c,v 1.29 1999/12/20 13:03: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*/
@@ -74,7 +74,7 @@ static void print_message (void) {
74" -q interactive mode without prompt\n" 74" -q interactive mode without prompt\n"
75" -i interactive mode with prompt\n" 75" -i interactive mode with prompt\n"
76" - execute stdin as a file\n" 76" - execute stdin as a file\n"
77" -- start arguments for table `arg'\n" 77" -f name dofile `name' with following arguments in table `arg'\n"
78" a=b set global `a' with string `b'\n" 78" a=b set global `a' with string `b'\n"
79" name dofile `name'\n\n"); 79" name dofile `name'\n\n");
80} 80}
@@ -96,27 +96,34 @@ static void assign (char *arg) {
96 96
97static void getargs (int argc, char *argv[]) { 97static void getargs (int argc, char *argv[]) {
98 lua_beginblock(); { 98 lua_beginblock(); {
99 int i, j; 99 int i;
100 lua_Object args = lua_createtable(); 100 lua_Object args = lua_createtable();
101 lua_pushobject(args); 101 lua_pushobject(args);
102 lua_setglobal("arg"); 102 lua_setglobal("arg");
103 for (i=0; i<argc; i++) 103 for (i=0; i<argc; i++) {
104 if (strcmp(argv[i], "--") == 0) break; 104 /* arg[i] = argv[i] */
105 for (j = 0; j<argc; j++) { 105 lua_pushobject(args); lua_pushnumber(i);
106 /* arg[j-i] = argv[j] */ 106 lua_pushstring(argv[i]); lua_settable();
107 lua_pushobject(args); lua_pushnumber(j-i);
108 lua_pushstring(argv[j]); lua_settable();
109 } 107 }
110 /* arg.n = maximum index in table `arg' */ 108 /* arg.n = maximum index in table `arg' */
111 lua_pushobject(args); lua_pushstring("n"); 109 lua_pushobject(args); lua_pushstring("n");
112 lua_pushnumber(argc-(i+1)); lua_settable(); 110 lua_pushnumber(argc-1); lua_settable();
113 /* arg.nn = minimum index in table `arg' */
114 lua_pushobject(args); lua_pushstring("nn");
115 lua_pushnumber(-i); lua_settable();
116 } lua_endblock(); 111 } lua_endblock();
117} 112}
118 113
119 114
115static void file_input (char **argv, int arg) {
116 int result = ldo(lua_dofile, argv[arg]);
117 if (result) {
118 if (result == 2) {
119 fprintf(stderr, "lua: cannot execute file ");
120 perror(argv[arg]);
121 }
122 exit(1);
123 }
124}
125
126
120static void manual_input (int prompt) { 127static void manual_input (int prompt) {
121 int cont = 1; 128 int cont = 1;
122 while (cont) { 129 while (cont) {
@@ -157,7 +164,6 @@ int main (int argc, char *argv[]) {
157 int i; 164 int i;
158 lua_state = lua_newstate("stack", 1024, "builtin", 1, NULL); 165 lua_state = lua_newstate("stack", 1024, "builtin", 1, NULL);
159 lua_userinit(); 166 lua_userinit();
160 getargs(argc, argv);
161 if (argc < 2) { /* no arguments? */ 167 if (argc < 2) { /* no arguments? */
162 if (isatty(0)) { 168 if (isatty(0)) {
163 printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT); 169 printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT);
@@ -187,11 +193,24 @@ int main (int argc, char *argv[]) {
187 break; 193 break;
188 case 'e': 194 case 'e':
189 i++; 195 i++;
196 if (i>=argc) {
197 print_message();
198 exit(1);
199 }
190 if (ldo(lua_dostring, argv[i]) != 0) { 200 if (ldo(lua_dostring, argv[i]) != 0) {
191 fprintf(stderr, "lua: error running argument `%s'\n", argv[i]); 201 fprintf(stderr, "lua: error running argument `%s'\n", argv[i]);
192 return 1; 202 exit(1);
193 } 203 }
194 break; 204 break;
205 case 'f':
206 i++;
207 if (i>=argc) {
208 print_message();
209 exit(1);
210 }
211 getargs(argc-i, argv+i); /* collect following arguments */
212 file_input(argv, i);
213 return 0; /* stop running arguments */
195 case '-': 214 case '-':
196 i = argc; /* end loop */ 215 i = argc; /* end loop */
197 break; 216 break;
@@ -202,16 +221,8 @@ int main (int argc, char *argv[]) {
202 } 221 }
203 else if (strchr(argv[i], '=')) 222 else if (strchr(argv[i], '='))
204 assign(argv[i]); 223 assign(argv[i]);
205 else { 224 else
206 int result = ldo(lua_dofile, argv[i]); 225 file_input(argv, i);
207 if (result) {
208 if (result == 2) {
209 fprintf(stderr, "lua: cannot execute file ");
210 perror(argv[i]);
211 }
212 exit(1);
213 }
214 }
215 } 226 }
216#ifdef DEBUG 227#ifdef DEBUG
217 lua_close(); 228 lua_close();