aboutsummaryrefslogtreecommitdiff
path: root/lua.c
diff options
context:
space:
mode:
Diffstat (limited to 'lua.c')
-rw-r--r--lua.c50
1 files changed, 26 insertions, 24 deletions
diff --git a/lua.c b/lua.c
index e0f56fc0..38419c14 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.162 2006/09/11 14:07:24 roberto Exp roberto $ 2** $Id: lua.c,v 1.163 2006/09/18 14:03:18 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*/
@@ -63,7 +63,7 @@ static void l_message (const char *pname, const char *msg) {
63 63
64 64
65static int report (lua_State *L, int status) { 65static int report (lua_State *L, int status) {
66 if (status && !lua_isnil(L, -1)) { 66 if (status != LUA_OK && !lua_isnil(L, -1)) {
67 const char *msg = lua_tostring(L, -1); 67 const char *msg = lua_tostring(L, -1);
68 if (msg == NULL) msg = "(error object is not a string)"; 68 if (msg == NULL) msg = "(error object is not a string)";
69 l_message(progname, msg); 69 l_message(progname, msg);
@@ -101,7 +101,7 @@ static int docall (lua_State *L, int narg, int clear) {
101 signal(SIGINT, SIG_DFL); 101 signal(SIGINT, SIG_DFL);
102 lua_remove(L, base); /* remove traceback function */ 102 lua_remove(L, base); /* remove traceback function */
103 /* force a complete garbage collection in case of errors */ 103 /* force a complete garbage collection in case of errors */
104 if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0); 104 if (status != LUA_OK) lua_gc(L, LUA_GCCOLLECT, 0);
105 return status; 105 return status;
106} 106}
107 107
@@ -130,13 +130,15 @@ static int getargs (lua_State *L, char **argv, int n) {
130 130
131 131
132static int dofile (lua_State *L, const char *name) { 132static int dofile (lua_State *L, const char *name) {
133 int status = luaL_loadfile(L, name) || docall(L, 0, 1); 133 int status = luaL_loadfile(L, name);
134 if (status == LUA_OK) status = docall(L, 0, 1);
134 return report(L, status); 135 return report(L, status);
135} 136}
136 137
137 138
138static int dostring (lua_State *L, const char *s, const char *name) { 139static int dostring (lua_State *L, const char *s, const char *name) {
139 int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1); 140 int status = luaL_loadbuffer(L, s, strlen(s), name);
141 if (status == LUA_OK) status = docall(L, 0, 1);
140 return report(L, status); 142 return report(L, status);
141} 143}
142 144
@@ -218,12 +220,12 @@ static void dotty (lua_State *L) {
218 const char *oldprogname = progname; 220 const char *oldprogname = progname;
219 progname = NULL; 221 progname = NULL;
220 while ((status = loadline(L)) != -1) { 222 while ((status = loadline(L)) != -1) {
221 if (status == 0) status = docall(L, 0, 0); 223 if (status == LUA_OK) status = docall(L, 0, 0);
222 report(L, status); 224 report(L, status);
223 if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ 225 if (status == LUA_OK && lua_gettop(L) > 0) { /* any result to print? */
224 lua_getglobal(L, "print"); 226 lua_getglobal(L, "print");
225 lua_insert(L, 1); 227 lua_insert(L, 1);
226 if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) 228 if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != LUA_OK)
227 l_message(progname, lua_pushfstring(L, 229 l_message(progname, lua_pushfstring(L,
228 "error calling " LUA_QL("print") " (%s)", 230 "error calling " LUA_QL("print") " (%s)",
229 lua_tostring(L, -1))); 231 lua_tostring(L, -1)));
@@ -246,7 +248,7 @@ static int handle_script (lua_State *L, char **argv, int n) {
246 fname = NULL; /* stdin */ 248 fname = NULL; /* stdin */
247 status = luaL_loadfile(L, fname); 249 status = luaL_loadfile(L, fname);
248 lua_insert(L, -(narg+1)); 250 lua_insert(L, -(narg+1));
249 if (status == 0) 251 if (status == LUA_OK)
250 status = docall(L, narg, 0); 252 status = docall(L, narg, 0);
251 else 253 else
252 lua_pop(L, narg); 254 lua_pop(L, narg);
@@ -301,28 +303,28 @@ static int runargs (lua_State *L, char **argv, int n) {
301 const char *chunk = argv[i] + 2; 303 const char *chunk = argv[i] + 2;
302 if (*chunk == '\0') chunk = argv[++i]; 304 if (*chunk == '\0') chunk = argv[++i];
303 lua_assert(chunk != NULL); 305 lua_assert(chunk != NULL);
304 if (dostring(L, chunk, "=(command line)") != 0) 306 if (dostring(L, chunk, "=(command line)") != LUA_OK)
305 return 1; 307 return 0;
306 break; 308 break;
307 } 309 }
308 case 'l': { 310 case 'l': {
309 const char *filename = argv[i] + 2; 311 const char *filename = argv[i] + 2;
310 if (*filename == '\0') filename = argv[++i]; 312 if (*filename == '\0') filename = argv[++i];
311 lua_assert(filename != NULL); 313 lua_assert(filename != NULL);
312 if (dolibrary(L, filename)) 314 if (dolibrary(L, filename) != LUA_OK)
313 return 1; /* stop if file fails */ 315 return 0; /* stop if file fails */
314 break; 316 break;
315 } 317 }
316 default: break; 318 default: break;
317 } 319 }
318 } 320 }
319 return 0; 321 return 1;
320} 322}
321 323
322 324
323static int handle_luainit (lua_State *L) { 325static int handle_luainit (lua_State *L) {
324 const char *init = getenv(LUA_INIT); 326 const char *init = getenv(LUA_INIT);
325 if (init == NULL) return 0; /* status OK */ 327 if (init == NULL) return LUA_OK;
326 else if (init[0] == '@') 328 else if (init[0] == '@')
327 return dofile(L, init+1); 329 return dofile(L, init+1);
328 else 330 else
@@ -333,7 +335,7 @@ static int handle_luainit (lua_State *L) {
333struct Smain { 335struct Smain {
334 int argc; 336 int argc;
335 char **argv; 337 char **argv;
336 int status; 338 int ok;
337}; 339};
338 340
339 341
@@ -347,20 +349,20 @@ static int pmain (lua_State *L) {
347 lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */ 349 lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */
348 luaL_openlibs(L); /* open libraries */ 350 luaL_openlibs(L); /* open libraries */
349 lua_gc(L, LUA_GCRESTART, 0); 351 lua_gc(L, LUA_GCRESTART, 0);
350 s->status = handle_luainit(L); 352 s->ok = (handle_luainit(L) == LUA_OK);
351 if (s->status != 0) return 0; 353 if (!s->ok) return 0;
352 script = collectargs(argv, &has_i, &has_v, &has_e); 354 script = collectargs(argv, &has_i, &has_v, &has_e);
353 if (script < 0) { /* invalid args? */ 355 if (script < 0) { /* invalid args? */
354 print_usage(); 356 print_usage();
355 s->status = 1; 357 s->ok = 0;
356 return 0; 358 return 0;
357 } 359 }
358 if (has_v) print_version(); 360 if (has_v) print_version();
359 s->status = runargs(L, argv, (script > 0) ? script : s->argc); 361 s->ok = runargs(L, argv, (script > 0) ? script : s->argc);
360 if (s->status != 0) return 0; 362 if (!s->ok) return 0;
361 if (script) 363 if (script)
362 s->status = handle_script(L, argv, script); 364 s->ok = (handle_script(L, argv, script) == LUA_OK);
363 if (s->status != 0) return 0; 365 if (!s->ok) return 0;
364 if (has_i) 366 if (has_i)
365 dotty(L); 367 dotty(L);
366 else if (script == 0 && !has_e && !has_v) { 368 else if (script == 0 && !has_e && !has_v) {
@@ -387,6 +389,6 @@ int main (int argc, char **argv) {
387 status = lua_cpcall(L, &pmain, &s); 389 status = lua_cpcall(L, &pmain, &s);
388 report(L, status); 390 report(L, status);
389 lua_close(L); 391 lua_close(L);
390 return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; 392 return (s.ok && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
391} 393}
392 394