diff options
| -rw-r--r-- | linit.c | 3 | ||||
| -rw-r--r-- | liolib.c | 290 | ||||
| -rw-r--r-- | lualib.h | 6 |
3 files changed, 49 insertions, 250 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: linit.c,v 1.6 2000/08/09 14:50:13 roberto Exp roberto $ | 2 | ** $Id: linit.c,v 1.7 2004/07/09 14:29:29 roberto Exp roberto $ |
| 3 | ** Initialization of libraries for lua.c | 3 | ** Initialization of libraries for lua.c |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -18,6 +18,7 @@ static const luaL_reg lualibs[] = { | |||
| 18 | {"", luaopen_base}, | 18 | {"", luaopen_base}, |
| 19 | {LUA_TABLIBNAME, luaopen_table}, | 19 | {LUA_TABLIBNAME, luaopen_table}, |
| 20 | {LUA_IOLIBNAME, luaopen_io}, | 20 | {LUA_IOLIBNAME, luaopen_io}, |
| 21 | {LUA_OSLIBNAME, luaopen_os}, | ||
| 21 | {LUA_STRLIBNAME, luaopen_string}, | 22 | {LUA_STRLIBNAME, luaopen_string}, |
| 22 | {LUA_MATHLIBNAME, luaopen_math}, | 23 | {LUA_MATHLIBNAME, luaopen_math}, |
| 23 | {LUA_DBLIBNAME, luaopen_debug}, | 24 | {LUA_DBLIBNAME, luaopen_debug}, |
| @@ -1,16 +1,14 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: liolib.c,v 2.52 2004/05/28 18:32:51 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 2.53 2004/05/28 18:35:05 roberto Exp roberto $ |
| 3 | ** Standard I/O (and system) library | 3 | ** Standard I/O (and system) library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | #include <errno.h> | 8 | #include <errno.h> |
| 9 | #include <locale.h> | ||
| 10 | #include <stdio.h> | 9 | #include <stdio.h> |
| 11 | #include <stdlib.h> | 10 | #include <stdlib.h> |
| 12 | #include <string.h> | 11 | #include <string.h> |
| 13 | #include <time.h> | ||
| 14 | 12 | ||
| 15 | #define liolib_c | 13 | #define liolib_c |
| 16 | #define LUA_LIB | 14 | #define LUA_LIB |
| @@ -22,18 +20,13 @@ | |||
| 22 | 20 | ||
| 23 | 21 | ||
| 24 | 22 | ||
| 25 | |||
| 26 | /* | ||
| 27 | ** {====================================================== | ||
| 28 | ** FILE Operations | ||
| 29 | ** ======================================================= | ||
| 30 | */ | ||
| 31 | |||
| 32 | |||
| 33 | #define IO_INPUT 1 | 23 | #define IO_INPUT 1 |
| 34 | #define IO_OUTPUT 2 | 24 | #define IO_OUTPUT 2 |
| 35 | 25 | ||
| 36 | 26 | ||
| 27 | static const char *const fnames[] = {"input", "output"}; | ||
| 28 | |||
| 29 | |||
| 37 | static int pushresult (lua_State *L, int i, const char *filename) { | 30 | static int pushresult (lua_State *L, int i, const char *filename) { |
| 38 | if (i) { | 31 | if (i) { |
| 39 | lua_pushboolean(L, 1); | 32 | lua_pushboolean(L, 1); |
| @@ -51,9 +44,9 @@ static int pushresult (lua_State *L, int i, const char *filename) { | |||
| 51 | } | 44 | } |
| 52 | 45 | ||
| 53 | 46 | ||
| 54 | static FILE **topfile (lua_State *L, int findex) { | 47 | static FILE **topfile (lua_State *L) { |
| 55 | FILE **f = (FILE **)luaL_checkudata(L, findex, LUA_FILEHANDLE); | 48 | FILE **f = (FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE); |
| 56 | if (f == NULL) luaL_argerror(L, findex, "bad file"); | 49 | if (f == NULL) luaL_argerror(L, 1, "bad file"); |
| 57 | return f; | 50 | return f; |
| 58 | } | 51 | } |
| 59 | 52 | ||
| @@ -69,8 +62,8 @@ static int io_type (lua_State *L) { | |||
| 69 | } | 62 | } |
| 70 | 63 | ||
| 71 | 64 | ||
| 72 | static FILE *tofile (lua_State *L, int findex) { | 65 | static FILE *tofile (lua_State *L) { |
| 73 | FILE **f = topfile(L, findex); | 66 | FILE **f = topfile(L); |
| 74 | if (*f == NULL) | 67 | if (*f == NULL) |
| 75 | luaL_error(L, "attempt to use a closed file"); | 68 | luaL_error(L, "attempt to use a closed file"); |
| 76 | return *f; | 69 | return *f; |
| @@ -93,7 +86,7 @@ static FILE **newfile (lua_State *L) { | |||
| 93 | 86 | ||
| 94 | 87 | ||
| 95 | static int aux_close (lua_State *L) { | 88 | static int aux_close (lua_State *L) { |
| 96 | FILE *f = tofile(L, 1); | 89 | FILE *f = tofile(L); |
| 97 | if (f == stdin || f == stdout || f == stderr) | 90 | if (f == stdin || f == stdout || f == stderr) |
| 98 | return 0; /* file cannot be closed */ | 91 | return 0; /* file cannot be closed */ |
| 99 | else { | 92 | else { |
| @@ -113,7 +106,7 @@ static int io_close (lua_State *L) { | |||
| 113 | 106 | ||
| 114 | 107 | ||
| 115 | static int io_gc (lua_State *L) { | 108 | static int io_gc (lua_State *L) { |
| 116 | FILE **f = topfile(L, 1); | 109 | FILE **f = topfile(L); |
| 117 | if (*f != NULL) /* ignore closed files */ | 110 | if (*f != NULL) /* ignore closed files */ |
| 118 | aux_close(L); | 111 | aux_close(L); |
| 119 | return 0; | 112 | return 0; |
| @@ -121,8 +114,8 @@ static int io_gc (lua_State *L) { | |||
| 121 | 114 | ||
| 122 | 115 | ||
| 123 | static int io_tostring (lua_State *L) { | 116 | static int io_tostring (lua_State *L) { |
| 124 | char buff[4*sizeof(void *) + 2]; /* enough space for a `%p' */ | 117 | char buff[4*sizeof(void *) + 8]; /* enough space for a `%p' */ |
| 125 | FILE **f = topfile(L, 1); | 118 | FILE **f = topfile(L); |
| 126 | if (*f == NULL) | 119 | if (*f == NULL) |
| 127 | strcpy(buff, "closed"); | 120 | strcpy(buff, "closed"); |
| 128 | else | 121 | else |
| @@ -148,9 +141,14 @@ static int io_tmpfile (lua_State *L) { | |||
| 148 | } | 141 | } |
| 149 | 142 | ||
| 150 | 143 | ||
| 151 | static FILE *getiofile (lua_State *L, int f) { | 144 | static FILE *getiofile (lua_State *L, int findex) { |
| 152 | lua_rawgeti(L, lua_upvalueindex(1), f); | 145 | FILE *f; |
| 153 | return tofile(L, -1); | 146 | lua_rawgeti(L, lua_upvalueindex(1), findex); |
| 147 | lua_assert(luaL_checkudata(L, -1, LUA_FILEHANDLE)); | ||
| 148 | f = *(FILE **)lua_touserdata(L, -1); | ||
| 149 | if (f == NULL) | ||
| 150 | luaL_error(L, "standard %s file is closed", fnames[findex - 1]); | ||
| 151 | return f; | ||
| 154 | } | 152 | } |
| 155 | 153 | ||
| 156 | 154 | ||
| @@ -166,9 +164,10 @@ static int g_iofile (lua_State *L, int f, const char *mode) { | |||
| 166 | } | 164 | } |
| 167 | } | 165 | } |
| 168 | else { | 166 | else { |
| 169 | tofile(L, 1); /* check that it's a valid file handle */ | 167 | tofile(L); /* check that it's a valid file handle */ |
| 170 | lua_pushvalue(L, 1); | 168 | lua_pushvalue(L, 1); |
| 171 | } | 169 | } |
| 170 | lua_assert(luaL_checkudata(L, -1, LUA_FILEHANDLE)); | ||
| 172 | lua_rawseti(L, lua_upvalueindex(1), f); | 171 | lua_rawseti(L, lua_upvalueindex(1), f); |
| 173 | } | 172 | } |
| 174 | /* return current value */ | 173 | /* return current value */ |
| @@ -199,7 +198,7 @@ static void aux_lines (lua_State *L, int idx, int close) { | |||
| 199 | 198 | ||
| 200 | 199 | ||
| 201 | static int f_lines (lua_State *L) { | 200 | static int f_lines (lua_State *L) { |
| 202 | tofile(L, 1); /* check that it's a valid file handle */ | 201 | tofile(L); /* check that it's a valid file handle */ |
| 203 | aux_lines(L, 1, 0); | 202 | aux_lines(L, 1, 0); |
| 204 | return 1; | 203 | return 1; |
| 205 | } | 204 | } |
| @@ -339,7 +338,7 @@ static int io_read (lua_State *L) { | |||
| 339 | 338 | ||
| 340 | 339 | ||
| 341 | static int f_read (lua_State *L) { | 340 | static int f_read (lua_State *L) { |
| 342 | return g_read(L, tofile(L, 1), 2); | 341 | return g_read(L, tofile(L), 2); |
| 343 | } | 342 | } |
| 344 | 343 | ||
| 345 | 344 | ||
| @@ -386,14 +385,14 @@ static int io_write (lua_State *L) { | |||
| 386 | 385 | ||
| 387 | 386 | ||
| 388 | static int f_write (lua_State *L) { | 387 | static int f_write (lua_State *L) { |
| 389 | return g_write(L, tofile(L, 1), 2); | 388 | return g_write(L, tofile(L), 2); |
| 390 | } | 389 | } |
| 391 | 390 | ||
| 392 | 391 | ||
| 393 | static int f_seek (lua_State *L) { | 392 | static int f_seek (lua_State *L) { |
| 394 | static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; | 393 | static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; |
| 395 | static const char *const modenames[] = {"set", "cur", "end", NULL}; | 394 | static const char *const modenames[] = {"set", "cur", "end", NULL}; |
| 396 | FILE *f = tofile(L, 1); | 395 | FILE *f = tofile(L); |
| 397 | int op = luaL_findstring(luaL_optstring(L, 2, "cur"), modenames); | 396 | int op = luaL_findstring(luaL_optstring(L, 2, "cur"), modenames); |
| 398 | lua_Integer offset = luaL_optinteger(L, 3, 0); | 397 | lua_Integer offset = luaL_optinteger(L, 3, 0); |
| 399 | luaL_argcheck(L, op != -1, 2, "invalid mode"); | 398 | luaL_argcheck(L, op != -1, 2, "invalid mode"); |
| @@ -410,7 +409,7 @@ static int f_seek (lua_State *L) { | |||
| 410 | static int f_setvbuf (lua_State *L) { | 409 | static int f_setvbuf (lua_State *L) { |
| 411 | static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; | 410 | static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; |
| 412 | static const char *const modenames[] = {"no", "full", "line", NULL}; | 411 | static const char *const modenames[] = {"no", "full", "line", NULL}; |
| 413 | FILE *f = tofile(L, 1); | 412 | FILE *f = tofile(L); |
| 414 | int op = luaL_findstring(luaL_checkstring(L, 2), modenames); | 413 | int op = luaL_findstring(luaL_checkstring(L, 2), modenames); |
| 415 | luaL_argcheck(L, op != -1, 2, "invalid mode"); | 414 | luaL_argcheck(L, op != -1, 2, "invalid mode"); |
| 416 | return pushresult(L, setvbuf(f, NULL, mode[op], 0) == 0, NULL); | 415 | return pushresult(L, setvbuf(f, NULL, mode[op], 0) == 0, NULL); |
| @@ -424,7 +423,7 @@ static int io_flush (lua_State *L) { | |||
| 424 | 423 | ||
| 425 | 424 | ||
| 426 | static int f_flush (lua_State *L) { | 425 | static int f_flush (lua_State *L) { |
| 427 | return pushresult(L, fflush(tofile(L, 1)) == 0, NULL); | 426 | return pushresult(L, fflush(tofile(L)) == 0, NULL); |
| 428 | } | 427 | } |
| 429 | 428 | ||
| 430 | 429 | ||
| @@ -459,238 +458,35 @@ static const luaL_reg flib[] = { | |||
| 459 | 458 | ||
| 460 | static void createmeta (lua_State *L) { | 459 | static void createmeta (lua_State *L) { |
| 461 | luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ | 460 | luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ |
| 462 | /* create (and set) default files */ | ||
| 463 | *newfile(L) = stdin; | ||
| 464 | lua_rawseti(L, -2, IO_INPUT); | ||
| 465 | *newfile(L) = stdout; | ||
| 466 | lua_rawseti(L, -2, IO_OUTPUT); | ||
| 467 | /* file methods */ | ||
| 468 | lua_pushvalue(L, -1); /* push metatable */ | 461 | lua_pushvalue(L, -1); /* push metatable */ |
| 469 | lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ | 462 | lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ |
| 470 | luaL_openlib(L, NULL, flib, 0); | 463 | luaL_openlib(L, NULL, flib, 0); /* file methods */ |
| 471 | } | ||
| 472 | |||
| 473 | /* }====================================================== */ | ||
| 474 | |||
| 475 | |||
| 476 | /* | ||
| 477 | ** {====================================================== | ||
| 478 | ** Other O.S. Operations | ||
| 479 | ** ======================================================= | ||
| 480 | */ | ||
| 481 | |||
| 482 | static int io_execute (lua_State *L) { | ||
| 483 | lua_pushinteger(L, system(luaL_checkstring(L, 1))); | ||
| 484 | return 1; | ||
| 485 | } | ||
| 486 | |||
| 487 | |||
| 488 | static int io_remove (lua_State *L) { | ||
| 489 | const char *filename = luaL_checkstring(L, 1); | ||
| 490 | return pushresult(L, remove(filename) == 0, filename); | ||
| 491 | } | ||
| 492 | |||
| 493 | |||
| 494 | static int io_rename (lua_State *L) { | ||
| 495 | const char *fromname = luaL_checkstring(L, 1); | ||
| 496 | const char *toname = luaL_checkstring(L, 2); | ||
| 497 | return pushresult(L, rename(fromname, toname) == 0, fromname); | ||
| 498 | } | ||
| 499 | |||
| 500 | |||
| 501 | static int io_tmpname (lua_State *L) { | ||
| 502 | #if !USE_TMPNAME | ||
| 503 | luaL_error(L, "`tmpname' not supported"); | ||
| 504 | return 0; | ||
| 505 | #else | ||
| 506 | char buff[L_tmpnam]; | ||
| 507 | if (tmpnam(buff) != buff) | ||
| 508 | return luaL_error(L, "unable to generate a unique filename in `tmpname'"); | ||
| 509 | lua_pushstring(L, buff); | ||
| 510 | return 1; | ||
| 511 | #endif | ||
| 512 | } | 464 | } |
| 513 | 465 | ||
| 514 | 466 | ||
| 515 | static int io_getenv (lua_State *L) { | 467 | static void createupval (lua_State *L) { |
| 516 | lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ | 468 | lua_newtable(L); |
| 517 | return 1; | 469 | /* create (and set) default files */ |
| 518 | } | 470 | *newfile(L) = stdin; |
| 519 | 471 | lua_rawseti(L, -2, IO_INPUT); | |
| 520 | 472 | *newfile(L) = stdout; | |
| 521 | static int io_clock (lua_State *L) { | 473 | lua_rawseti(L, -2, IO_OUTPUT); |
| 522 | lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); | ||
| 523 | return 1; | ||
| 524 | } | ||
| 525 | |||
| 526 | |||
| 527 | /* | ||
| 528 | ** {====================================================== | ||
| 529 | ** Time/Date operations | ||
| 530 | ** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, | ||
| 531 | ** wday=%w+1, yday=%j, isdst=? } | ||
| 532 | ** ======================================================= | ||
| 533 | */ | ||
| 534 | |||
| 535 | static void setfield (lua_State *L, const char *key, int value) { | ||
| 536 | lua_pushstring(L, key); | ||
| 537 | lua_pushinteger(L, value); | ||
| 538 | lua_rawset(L, -3); | ||
| 539 | } | ||
| 540 | |||
| 541 | static void setboolfield (lua_State *L, const char *key, int value) { | ||
| 542 | lua_pushstring(L, key); | ||
| 543 | lua_pushboolean(L, value); | ||
| 544 | lua_rawset(L, -3); | ||
| 545 | } | ||
| 546 | |||
| 547 | static int getboolfield (lua_State *L, const char *key) { | ||
| 548 | int res; | ||
| 549 | lua_getfield(L, -1, key); | ||
| 550 | res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); | ||
| 551 | lua_pop(L, 1); | ||
| 552 | return res; | ||
| 553 | } | ||
| 554 | |||
| 555 | |||
| 556 | static int getfield (lua_State *L, const char *key, int d) { | ||
| 557 | int res; | ||
| 558 | lua_getfield(L, -1, key); | ||
| 559 | if (lua_isnumber(L, -1)) | ||
| 560 | res = (int)lua_tointeger(L, -1); | ||
| 561 | else { | ||
| 562 | if (d < 0) | ||
| 563 | return luaL_error(L, "field `%s' missing in date table", key); | ||
| 564 | res = d; | ||
| 565 | } | ||
| 566 | lua_pop(L, 1); | ||
| 567 | return res; | ||
| 568 | } | ||
| 569 | |||
| 570 | |||
| 571 | static int io_date (lua_State *L) { | ||
| 572 | const char *s = luaL_optstring(L, 1, "%c"); | ||
| 573 | lua_Number n = luaL_optnumber(L, 2, -1); | ||
| 574 | time_t t = (n == -1) ? time(NULL) : (time_t)n; | ||
| 575 | struct tm *stm; | ||
| 576 | if (*s == '!') { /* UTC? */ | ||
| 577 | stm = gmtime(&t); | ||
| 578 | s++; /* skip `!' */ | ||
| 579 | } | ||
| 580 | else | ||
| 581 | stm = localtime(&t); | ||
| 582 | if (stm == NULL) /* invalid date? */ | ||
| 583 | lua_pushnil(L); | ||
| 584 | else if (strcmp(s, "*t") == 0) { | ||
| 585 | lua_createtable(L, 0, 9); /* 9 = number of fields */ | ||
| 586 | setfield(L, "sec", stm->tm_sec); | ||
| 587 | setfield(L, "min", stm->tm_min); | ||
| 588 | setfield(L, "hour", stm->tm_hour); | ||
| 589 | setfield(L, "day", stm->tm_mday); | ||
| 590 | setfield(L, "month", stm->tm_mon+1); | ||
| 591 | setfield(L, "year", stm->tm_year+1900); | ||
| 592 | setfield(L, "wday", stm->tm_wday+1); | ||
| 593 | setfield(L, "yday", stm->tm_yday+1); | ||
| 594 | setboolfield(L, "isdst", stm->tm_isdst); | ||
| 595 | } | ||
| 596 | else { | ||
| 597 | char b[256]; | ||
| 598 | if (strftime(b, sizeof(b), s, stm)) | ||
| 599 | lua_pushstring(L, b); | ||
| 600 | else | ||
| 601 | return luaL_error(L, "`date' format too long"); | ||
| 602 | } | ||
| 603 | return 1; | ||
| 604 | } | ||
| 605 | |||
| 606 | |||
| 607 | static int io_time (lua_State *L) { | ||
| 608 | if (lua_isnoneornil(L, 1)) /* called without args? */ | ||
| 609 | lua_pushnumber(L, time(NULL)); /* return current time */ | ||
| 610 | else { | ||
| 611 | time_t t; | ||
| 612 | struct tm ts; | ||
| 613 | luaL_checktype(L, 1, LUA_TTABLE); | ||
| 614 | lua_settop(L, 1); /* make sure table is at the top */ | ||
| 615 | ts.tm_sec = getfield(L, "sec", 0); | ||
| 616 | ts.tm_min = getfield(L, "min", 0); | ||
| 617 | ts.tm_hour = getfield(L, "hour", 12); | ||
| 618 | ts.tm_mday = getfield(L, "day", -1); | ||
| 619 | ts.tm_mon = getfield(L, "month", -1) - 1; | ||
| 620 | ts.tm_year = getfield(L, "year", -1) - 1900; | ||
| 621 | ts.tm_isdst = getboolfield(L, "isdst"); | ||
| 622 | t = mktime(&ts); | ||
| 623 | if (t == (time_t)(-1)) | ||
| 624 | lua_pushnil(L); | ||
| 625 | else | ||
| 626 | lua_pushnumber(L, t); | ||
| 627 | } | ||
| 628 | return 1; | ||
| 629 | } | ||
| 630 | |||
| 631 | |||
| 632 | static int io_difftime (lua_State *L) { | ||
| 633 | lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), | ||
| 634 | (time_t)(luaL_optnumber(L, 2, 0)))); | ||
| 635 | return 1; | ||
| 636 | } | ||
| 637 | |||
| 638 | /* }====================================================== */ | ||
| 639 | |||
| 640 | |||
| 641 | static int io_setloc (lua_State *L) { | ||
| 642 | static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, | ||
| 643 | LC_NUMERIC, LC_TIME}; | ||
| 644 | static const char *const catnames[] = {"all", "collate", "ctype", "monetary", | ||
| 645 | "numeric", "time", NULL}; | ||
| 646 | const char *l = lua_tostring(L, 1); | ||
| 647 | int op = luaL_findstring(luaL_optstring(L, 2, "all"), catnames); | ||
| 648 | luaL_argcheck(L, l || lua_isnoneornil(L, 1), 1, "string expected"); | ||
| 649 | luaL_argcheck(L, op != -1, 2, "invalid option"); | ||
| 650 | lua_pushstring(L, setlocale(cat[op], l)); | ||
| 651 | return 1; | ||
| 652 | } | ||
| 653 | |||
| 654 | |||
| 655 | static int io_exit (lua_State *L) { | ||
| 656 | exit(luaL_optint(L, 1, EXIT_SUCCESS)); | ||
| 657 | return 0; /* to avoid warnings */ | ||
| 658 | } | 474 | } |
| 659 | 475 | ||
| 660 | static const luaL_reg syslib[] = { | ||
| 661 | {"clock", io_clock}, | ||
| 662 | {"date", io_date}, | ||
| 663 | {"difftime", io_difftime}, | ||
| 664 | {"execute", io_execute}, | ||
| 665 | {"exit", io_exit}, | ||
| 666 | {"getenv", io_getenv}, | ||
| 667 | {"remove", io_remove}, | ||
| 668 | {"rename", io_rename}, | ||
| 669 | {"setlocale", io_setloc}, | ||
| 670 | {"time", io_time}, | ||
| 671 | {"tmpname", io_tmpname}, | ||
| 672 | {NULL, NULL} | ||
| 673 | }; | ||
| 674 | |||
| 675 | /* }====================================================== */ | ||
| 676 | |||
| 677 | 476 | ||
| 678 | 477 | ||
| 679 | LUALIB_API int luaopen_io (lua_State *L) { | 478 | LUALIB_API int luaopen_io (lua_State *L) { |
| 680 | luaL_openlib(L, LUA_OSLIBNAME, syslib, 0); | ||
| 681 | createmeta(L); | 479 | createmeta(L); |
| 480 | createupval(L); | ||
| 682 | lua_pushvalue(L, -1); | 481 | lua_pushvalue(L, -1); |
| 683 | luaL_openlib(L, LUA_IOLIBNAME, iolib, 1); | 482 | luaL_openlib(L, LUA_IOLIBNAME, iolib, 1); |
| 684 | /* put predefined file handles into `io' table */ | 483 | /* put predefined file handles into `io' table */ |
| 685 | lua_pushliteral(L, "stdin"); | 484 | lua_rawgeti(L, -2, IO_INPUT); /* get current input from metatable */ |
| 686 | lua_rawgeti(L, 2, IO_INPUT); | 485 | lua_setfield(L, -2, "stdin"); /* io.stdin = metatable[IO_INPUT] */ |
| 687 | lua_rawset(L, 3); | 486 | lua_rawgeti(L, -2, IO_OUTPUT); /* get current output from metatable */ |
| 688 | lua_pushliteral(L, "stdout"); | 487 | lua_setfield(L, -2, "stdout"); /* io.stdout = metatable[IO_OUTPUT] */ |
| 689 | lua_rawgeti(L, 2, IO_OUTPUT); | ||
| 690 | lua_rawset(L, 3); | ||
| 691 | lua_pushliteral(L, "stderr"); | ||
| 692 | *newfile(L) = stderr; | 488 | *newfile(L) = stderr; |
| 693 | lua_rawset(L, 3); | 489 | lua_setfield(L, -2, "stderr"); /* io.stderr = newfile(stderr) */ |
| 694 | return 1; | 490 | return 1; |
| 695 | } | 491 | } |
| 696 | 492 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lualib.h,v 1.30 2004/05/28 18:35:05 roberto Exp roberto $ | 2 | ** $Id: lualib.h,v 1.31 2004/07/09 14:29:29 roberto Exp roberto $ |
| 3 | ** Lua standard libraries | 3 | ** Lua standard libraries |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -22,9 +22,11 @@ LUALIB_API int luaopen_base (lua_State *L); | |||
| 22 | LUALIB_API int luaopen_table (lua_State *L); | 22 | LUALIB_API int luaopen_table (lua_State *L); |
| 23 | 23 | ||
| 24 | #define LUA_IOLIBNAME "io" | 24 | #define LUA_IOLIBNAME "io" |
| 25 | #define LUA_OSLIBNAME "os" | ||
| 26 | LUALIB_API int luaopen_io (lua_State *L); | 25 | LUALIB_API int luaopen_io (lua_State *L); |
| 27 | 26 | ||
| 27 | #define LUA_OSLIBNAME "os" | ||
| 28 | LUALIB_API int luaopen_os (lua_State *L); | ||
| 29 | |||
| 28 | #define LUA_STRLIBNAME "string" | 30 | #define LUA_STRLIBNAME "string" |
| 29 | LUALIB_API int luaopen_string (lua_State *L); | 31 | LUALIB_API int luaopen_string (lua_State *L); |
| 30 | 32 | ||
