diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-07-13 16:56:44 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-07-13 16:56:44 -0300 |
| commit | a535ad6fee6b0a5fc795dc1dfe8737b63b3684d8 (patch) | |
| tree | 017e569be364aaef8d7c446359c479cf99ba6f48 | |
| parent | 4206d7ed6033764c81d97ccdc343f4defda516e6 (diff) | |
| download | lua-a535ad6fee6b0a5fc795dc1dfe8737b63b3684d8.tar.gz lua-a535ad6fee6b0a5fc795dc1dfe8737b63b3684d8.tar.bz2 lua-a535ad6fee6b0a5fc795dc1dfe8737b63b3684d8.zip | |
several small changes (mainly function names)
| -rw-r--r-- | lua.c | 143 |
1 files changed, 59 insertions, 84 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.c,v 1.128 2004/06/17 14:06:52 roberto Exp roberto $ | 2 | ** $Id: lua.c,v 1.129 2004/07/01 14:26:28 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 | */ |
| @@ -28,38 +28,23 @@ | |||
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | static lua_State *L = NULL; | 31 | static lua_State *globalL = NULL; |
| 32 | 32 | ||
| 33 | static const char *progname = PROGNAME; | 33 | static const char *progname = PROGNAME; |
| 34 | 34 | ||
| 35 | 35 | ||
| 36 | 36 | ||
| 37 | static const luaL_reg lualibs[] = { | 37 | static void lstop (lua_State *L, lua_Debug *ar) { |
| 38 | {"base", luaopen_base}, | ||
| 39 | {"table", luaopen_table}, | ||
| 40 | {"io", luaopen_io}, | ||
| 41 | {"string", luaopen_string}, | ||
| 42 | {"math", luaopen_math}, | ||
| 43 | {"debug", luaopen_debug}, | ||
| 44 | {"loadlib", luaopen_loadlib}, | ||
| 45 | /* add your libraries here */ | ||
| 46 | LUA_EXTRALIBS | ||
| 47 | {NULL, NULL} | ||
| 48 | }; | ||
| 49 | |||
| 50 | |||
| 51 | |||
| 52 | static void lstop (lua_State *l, lua_Debug *ar) { | ||
| 53 | (void)ar; /* unused arg. */ | 38 | (void)ar; /* unused arg. */ |
| 54 | lua_sethook(l, NULL, 0, 0); | 39 | lua_sethook(L, NULL, 0, 0); |
| 55 | luaL_error(l, "interrupted!"); | 40 | luaL_error(L, "interrupted!"); |
| 56 | } | 41 | } |
| 57 | 42 | ||
| 58 | 43 | ||
| 59 | static void laction (int i) { | 44 | static void laction (int i) { |
| 60 | signal(i, SIG_DFL); /* if another SIGINT happens before lstop, | 45 | signal(i, SIG_DFL); /* if another SIGINT happens before lstop, |
| 61 | terminate process (default action) */ | 46 | terminate process (default action) */ |
| 62 | lua_sethook(L, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); | 47 | lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); |
| 63 | } | 48 | } |
| 64 | 49 | ||
| 65 | 50 | ||
| @@ -83,7 +68,7 @@ static void l_message (const char *pname, const char *msg) { | |||
| 83 | } | 68 | } |
| 84 | 69 | ||
| 85 | 70 | ||
| 86 | static int report (int status) { | 71 | static int report (lua_State *L, int status) { |
| 87 | if (status && !lua_isnil(L, -1)) { | 72 | if (status && !lua_isnil(L, -1)) { |
| 88 | const char *msg = lua_tostring(L, -1); | 73 | const char *msg = lua_tostring(L, -1); |
| 89 | if (msg == NULL) msg = "(error object is not a string)"; | 74 | if (msg == NULL) msg = "(error object is not a string)"; |
| @@ -94,7 +79,7 @@ static int report (int status) { | |||
| 94 | } | 79 | } |
| 95 | 80 | ||
| 96 | 81 | ||
| 97 | static int lcall (int narg, int clear) { | 82 | static int docall (lua_State *L, int narg, int clear) { |
| 98 | int status; | 83 | int status; |
| 99 | int base = lua_gettop(L) - narg; /* function index */ | 84 | int base = lua_gettop(L) - narg; /* function index */ |
| 100 | lua_pushliteral(L, "_TRACEBACK"); | 85 | lua_pushliteral(L, "_TRACEBACK"); |
| @@ -113,7 +98,7 @@ static void print_version (void) { | |||
| 113 | } | 98 | } |
| 114 | 99 | ||
| 115 | 100 | ||
| 116 | static int getargs (char *argv[], int n) { | 101 | static int getargs (lua_State *L, char *argv[], int n) { |
| 117 | int i, narg; | 102 | int i, narg; |
| 118 | for (i=n+1; argv[i]; i++) { | 103 | for (i=n+1; argv[i]; i++) { |
| 119 | luaL_checkstack(L, 1, "too many arguments to script"); | 104 | luaL_checkstack(L, 1, "too many arguments to script"); |
| @@ -130,22 +115,22 @@ static int getargs (char *argv[], int n) { | |||
| 130 | } | 115 | } |
| 131 | 116 | ||
| 132 | 117 | ||
| 133 | static int file_input (const char *name) { | 118 | static int dofile (lua_State *L, const char *name) { |
| 134 | int status = luaL_loadfile(L, name) || lcall(0, 1); | 119 | int status = luaL_loadfile(L, name) || docall(L, 0, 1); |
| 135 | return report(status); | 120 | return report(L, status); |
| 136 | } | 121 | } |
| 137 | 122 | ||
| 138 | 123 | ||
| 139 | static int dostring (const char *s, const char *name) { | 124 | static int dostring (lua_State *L, const char *s, const char *name) { |
| 140 | int status = luaL_loadbuffer(L, s, strlen(s), name) || lcall(0, 1); | 125 | int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1); |
| 141 | return report(status); | 126 | return report(L, status); |
| 142 | } | 127 | } |
| 143 | 128 | ||
| 144 | 129 | ||
| 145 | static int load_file (const char *name) { | 130 | static int dolibrary (lua_State *L, const char *name) { |
| 146 | name = luaL_searchpath(L, name, NULL); | 131 | name = luaL_searchpath(L, name, NULL); |
| 147 | if (name == NULL) return report(1); | 132 | if (name == NULL) return report(L, 1); |
| 148 | else return file_input(name); | 133 | else return dofile(L, name); |
| 149 | } | 134 | } |
| 150 | 135 | ||
| 151 | 136 | ||
| @@ -163,7 +148,7 @@ static int load_file (const char *name) { | |||
| 163 | #endif | 148 | #endif |
| 164 | 149 | ||
| 165 | 150 | ||
| 166 | static int readline (lua_State *l, const char *prompt) { | 151 | static int readline (lua_State *L, const char *prompt) { |
| 167 | static char buffer[MAXINPUT]; | 152 | static char buffer[MAXINPUT]; |
| 168 | if (prompt) { | 153 | if (prompt) { |
| 169 | fputs(prompt, stdout); | 154 | fputs(prompt, stdout); |
| @@ -172,7 +157,7 @@ static int readline (lua_State *l, const char *prompt) { | |||
| 172 | if (fgets(buffer, sizeof(buffer), stdin) == NULL) | 157 | if (fgets(buffer, sizeof(buffer), stdin) == NULL) |
| 173 | return 0; /* read fails */ | 158 | return 0; /* read fails */ |
| 174 | else { | 159 | else { |
| 175 | lua_pushstring(l, buffer); | 160 | lua_pushstring(L, buffer); |
| 176 | return 1; | 161 | return 1; |
| 177 | } | 162 | } |
| 178 | } | 163 | } |
| @@ -180,7 +165,7 @@ static int readline (lua_State *l, const char *prompt) { | |||
| 180 | #endif | 165 | #endif |
| 181 | 166 | ||
| 182 | 167 | ||
| 183 | static const char *get_prompt (int firstline) { | 168 | static const char *get_prompt (lua_State *L, int firstline) { |
| 184 | const char *p = NULL; | 169 | const char *p = NULL; |
| 185 | lua_pushstring(L, firstline ? "_PROMPT" : "_PROMPT2"); | 170 | lua_pushstring(L, firstline ? "_PROMPT" : "_PROMPT2"); |
| 186 | lua_rawget(L, LUA_GLOBALSINDEX); | 171 | lua_rawget(L, LUA_GLOBALSINDEX); |
| @@ -191,7 +176,7 @@ static const char *get_prompt (int firstline) { | |||
| 191 | } | 176 | } |
| 192 | 177 | ||
| 193 | 178 | ||
| 194 | static int incomplete (int status) { | 179 | static int incomplete (lua_State *L, int status) { |
| 195 | if (status == LUA_ERRSYNTAX && | 180 | if (status == LUA_ERRSYNTAX && |
| 196 | strstr(lua_tostring(L, -1), "near `<eof>'") != NULL) { | 181 | strstr(lua_tostring(L, -1), "near `<eof>'") != NULL) { |
| 197 | lua_pop(L, 1); | 182 | lua_pop(L, 1); |
| @@ -202,10 +187,10 @@ static int incomplete (int status) { | |||
| 202 | } | 187 | } |
| 203 | 188 | ||
| 204 | 189 | ||
| 205 | static int load_string (void) { | 190 | static int loadline (lua_State *L) { |
| 206 | int status; | 191 | int status; |
| 207 | lua_settop(L, 0); | 192 | lua_settop(L, 0); |
| 208 | if (lua_readline(L, get_prompt(1)) == 0) /* no input? */ | 193 | if (lua_readline(L, get_prompt(L, 1)) == 0) /* no input? */ |
| 209 | return -1; | 194 | return -1; |
| 210 | if (lua_tostring(L, -1)[0] == '=') { /* line starts with `=' ? */ | 195 | if (lua_tostring(L, -1)[0] == '=') { /* line starts with `=' ? */ |
| 211 | lua_pushfstring(L, "return %s", lua_tostring(L, -1)+1);/* `=' -> `return' */ | 196 | lua_pushfstring(L, "return %s", lua_tostring(L, -1)+1);/* `=' -> `return' */ |
| @@ -213,8 +198,8 @@ static int load_string (void) { | |||
| 213 | } | 198 | } |
| 214 | for (;;) { /* repeat until gets a complete line */ | 199 | for (;;) { /* repeat until gets a complete line */ |
| 215 | status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin"); | 200 | status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin"); |
| 216 | if (!incomplete(status)) break; /* cannot try to add lines? */ | 201 | if (!incomplete(L, status)) break; /* cannot try to add lines? */ |
| 217 | if (lua_readline(L, get_prompt(0)) == 0) /* no more input? */ | 202 | if (lua_readline(L, get_prompt(L, 0)) == 0) /* no more input? */ |
| 218 | return -1; | 203 | return -1; |
| 219 | lua_concat(L, lua_gettop(L)); /* join lines */ | 204 | lua_concat(L, lua_gettop(L)); /* join lines */ |
| 220 | } | 205 | } |
| @@ -224,13 +209,14 @@ static int load_string (void) { | |||
| 224 | } | 209 | } |
| 225 | 210 | ||
| 226 | 211 | ||
| 227 | static void manual_input (void) { | 212 | static void dotty (lua_State *L) { |
| 228 | int status; | 213 | int status; |
| 229 | const char *oldprogname = progname; | 214 | const char *oldprogname = progname; |
| 230 | progname = NULL; | 215 | progname = NULL; |
| 231 | while ((status = load_string()) != -1) { | 216 | print_version(); |
| 232 | if (status == 0) status = lcall(0, 0); | 217 | while ((status = loadline(L)) != -1) { |
| 233 | report(status); | 218 | if (status == 0) status = docall(L, 0, 0); |
| 219 | report(L, status); | ||
| 234 | if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ | 220 | if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ |
| 235 | lua_getglobal(L, "print"); | 221 | lua_getglobal(L, "print"); |
| 236 | lua_insert(L, 1); | 222 | lua_insert(L, 1); |
| @@ -245,25 +231,23 @@ static void manual_input (void) { | |||
| 245 | } | 231 | } |
| 246 | 232 | ||
| 247 | 233 | ||
| 248 | static int checkvar (lua_State *l) { | 234 | static int checkvar (lua_State *L) { |
| 249 | const char *name = lua_tostring(l, 2); | 235 | const char *name = lua_tostring(L, 2); |
| 250 | if (name) | 236 | if (name) |
| 251 | luaL_error(l, "attempt to access undefined variable `%s'", name); | 237 | luaL_error(L, "attempt to access undefined variable `%s'", name); |
| 252 | return 0; | 238 | return 0; |
| 253 | } | 239 | } |
| 254 | 240 | ||
| 255 | 241 | ||
| 256 | #define clearinteractive(i) (*i &= 2) | 242 | #define clearinteractive(i) (*i &= 2) |
| 257 | 243 | ||
| 258 | static int handle_argv (char *argv[], int *interactive) { | 244 | static int handle_argv (lua_State *L, char *argv[], int *interactive) { |
| 259 | if (argv[1] == NULL) { /* no arguments? */ | 245 | if (argv[1] == NULL) { /* no arguments? */ |
| 260 | *interactive = 0; | 246 | *interactive = 0; |
| 261 | if (stdin_is_tty()) { | 247 | if (stdin_is_tty()) |
| 262 | print_version(); | 248 | dotty(L); |
| 263 | manual_input(); | ||
| 264 | } | ||
| 265 | else | 249 | else |
| 266 | file_input(NULL); /* executes stdin as a file */ | 250 | dofile(L, NULL); /* executes stdin as a file */ |
| 267 | } | 251 | } |
| 268 | else { /* other arguments; loop over them */ | 252 | else { /* other arguments; loop over them */ |
| 269 | int i; | 253 | int i; |
| @@ -280,7 +264,7 @@ static int handle_argv (char *argv[], int *interactive) { | |||
| 280 | } | 264 | } |
| 281 | case '\0': { | 265 | case '\0': { |
| 282 | clearinteractive(interactive); | 266 | clearinteractive(interactive); |
| 283 | file_input(NULL); /* executes stdin as a file */ | 267 | dofile(L, NULL); /* executes stdin as a file */ |
| 284 | break; | 268 | break; |
| 285 | } | 269 | } |
| 286 | case 'i': { | 270 | case 'i': { |
| @@ -307,7 +291,7 @@ static int handle_argv (char *argv[], int *interactive) { | |||
| 307 | print_usage(); | 291 | print_usage(); |
| 308 | return 1; | 292 | return 1; |
| 309 | } | 293 | } |
| 310 | if (dostring(chunk, "=<command line>") != 0) | 294 | if (dostring(L, chunk, "=<command line>") != 0) |
| 311 | return 1; | 295 | return 1; |
| 312 | break; | 296 | break; |
| 313 | } | 297 | } |
| @@ -318,7 +302,7 @@ static int handle_argv (char *argv[], int *interactive) { | |||
| 318 | print_usage(); | 302 | print_usage(); |
| 319 | return 1; | 303 | return 1; |
| 320 | } | 304 | } |
| 321 | if (load_file(filename)) | 305 | if (dolibrary(L, filename)) |
| 322 | return 1; /* stop if file fails */ | 306 | return 1; /* stop if file fails */ |
| 323 | break; | 307 | break; |
| 324 | } | 308 | } |
| @@ -331,39 +315,30 @@ static int handle_argv (char *argv[], int *interactive) { | |||
| 331 | } endloop: | 315 | } endloop: |
| 332 | if (argv[i] != NULL) { | 316 | if (argv[i] != NULL) { |
| 333 | const char *filename = argv[i]; | 317 | const char *filename = argv[i]; |
| 334 | int narg = getargs(argv, i); /* collect arguments */ | 318 | int narg = getargs(L, argv, i); /* collect arguments */ |
| 335 | int status; | 319 | int status; |
| 336 | lua_setglobal(L, "arg"); | 320 | lua_setglobal(L, "arg"); |
| 337 | clearinteractive(interactive); | 321 | clearinteractive(interactive); |
| 338 | status = luaL_loadfile(L, filename); | 322 | status = luaL_loadfile(L, filename); |
| 339 | lua_insert(L, -(narg+1)); | 323 | lua_insert(L, -(narg+1)); |
| 340 | if (status == 0) | 324 | if (status == 0) |
| 341 | status = lcall(narg, 0); | 325 | status = docall(L, narg, 0); |
| 342 | else | 326 | else |
| 343 | lua_pop(L, narg); | 327 | lua_pop(L, narg); |
| 344 | return report(status); | 328 | return report(L, status); |
| 345 | } | 329 | } |
| 346 | } | 330 | } |
| 347 | return 0; | 331 | return 0; |
| 348 | } | 332 | } |
| 349 | 333 | ||
| 350 | 334 | ||
| 351 | static void openstdlibs (lua_State *l) { | 335 | static int handle_luainit (lua_State *L) { |
| 352 | const luaL_reg *lib = lualibs; | ||
| 353 | for (; lib->func; lib++) { | ||
| 354 | lib->func(l); /* open library */ | ||
| 355 | lua_settop(l, 0); /* discard any results */ | ||
| 356 | } | ||
| 357 | } | ||
| 358 | |||
| 359 | |||
| 360 | static int handle_luainit (void) { | ||
| 361 | const char *init = getenv("LUA_INIT"); | 336 | const char *init = getenv("LUA_INIT"); |
| 362 | if (init == NULL) return 0; /* status OK */ | 337 | if (init == NULL) return 0; /* status OK */ |
| 363 | else if (init[0] == '@') | 338 | else if (init[0] == '@') |
| 364 | return file_input(init+1); | 339 | return dofile(L, init+1); |
| 365 | else | 340 | else |
| 366 | return dostring(init, "=LUA_INIT"); | 341 | return dostring(L, init, "=LUA_INIT"); |
| 367 | } | 342 | } |
| 368 | 343 | ||
| 369 | 344 | ||
| @@ -374,17 +349,17 @@ struct Smain { | |||
| 374 | }; | 349 | }; |
| 375 | 350 | ||
| 376 | 351 | ||
| 377 | static int pmain (lua_State *l) { | 352 | static int pmain (lua_State *L) { |
| 378 | struct Smain *s = (struct Smain *)lua_touserdata(l, 1); | 353 | struct Smain *s = (struct Smain *)lua_touserdata(L, 1); |
| 379 | int status; | 354 | int status; |
| 380 | int interactive = 1; | 355 | int interactive = 1; |
| 381 | if (s->argv[0] && s->argv[0][0]) progname = s->argv[0]; | 356 | if (s->argv[0] && s->argv[0][0]) progname = s->argv[0]; |
| 382 | L = l; | 357 | globalL = L; |
| 383 | lua_userinit(l); /* open libraries */ | 358 | lua_userinit(L); /* open libraries */ |
| 384 | status = handle_luainit(); | 359 | status = handle_luainit(L); |
| 385 | if (status == 0) { | 360 | if (status == 0) { |
| 386 | status = handle_argv(s->argv, &interactive); | 361 | status = handle_argv(L, s->argv, &interactive); |
| 387 | if (status == 0 && interactive) manual_input(); | 362 | if (status == 0 && interactive) dotty(L); |
| 388 | } | 363 | } |
| 389 | s->status = status; | 364 | s->status = status; |
| 390 | return 0; | 365 | return 0; |
| @@ -394,16 +369,16 @@ static int pmain (lua_State *l) { | |||
| 394 | int main (int argc, char *argv[]) { | 369 | int main (int argc, char *argv[]) { |
| 395 | int status; | 370 | int status; |
| 396 | struct Smain s; | 371 | struct Smain s; |
| 397 | lua_State *l = lua_open(); /* create state */ | 372 | lua_State *L = lua_open(); /* create state */ |
| 398 | if (l == NULL) { | 373 | if (L == NULL) { |
| 399 | l_message(argv[0], "cannot create state: not enough memory"); | 374 | l_message(argv[0], "cannot create state: not enough memory"); |
| 400 | return EXIT_FAILURE; | 375 | return EXIT_FAILURE; |
| 401 | } | 376 | } |
| 402 | s.argc = argc; | 377 | s.argc = argc; |
| 403 | s.argv = argv; | 378 | s.argv = argv; |
| 404 | status = lua_cpcall(l, &pmain, &s); | 379 | status = lua_cpcall(L, &pmain, &s); |
| 405 | report(status); | 380 | report(L, status); |
| 406 | lua_close(l); | 381 | lua_close(L); |
| 407 | return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; | 382 | return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; |
| 408 | } | 383 | } |
| 409 | 384 | ||
