diff options
| -rw-r--r-- | liolib.c | 19 |
1 files changed, 9 insertions, 10 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: liolib.c,v 2.75 2006/09/18 14:03:18 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 2.76 2007/04/19 20:22:32 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 | */ |
| @@ -51,15 +51,14 @@ static void fileerror (lua_State *L, int arg, const char *filename) { | |||
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | 53 | ||
| 54 | #define topfile(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) | 54 | #define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) |
| 55 | 55 | ||
| 56 | 56 | ||
| 57 | static int io_type (lua_State *L) { | 57 | static int io_type (lua_State *L) { |
| 58 | void *ud; | 58 | void *ud; |
| 59 | luaL_checkany(L, 1); | 59 | luaL_checkany(L, 1); |
| 60 | ud = lua_touserdata(L, 1); | 60 | ud = luaL_testudata(L, 1, LUA_FILEHANDLE); |
| 61 | lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); | 61 | if (ud == NULL) |
| 62 | if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1)) | ||
| 63 | lua_pushnil(L); /* not a file */ | 62 | lua_pushnil(L); /* not a file */ |
| 64 | else if (*((FILE **)ud) == NULL) | 63 | else if (*((FILE **)ud) == NULL) |
| 65 | lua_pushliteral(L, "closed file"); | 64 | lua_pushliteral(L, "closed file"); |
| @@ -70,7 +69,7 @@ static int io_type (lua_State *L) { | |||
| 70 | 69 | ||
| 71 | 70 | ||
| 72 | static FILE *tofile (lua_State *L) { | 71 | static FILE *tofile (lua_State *L) { |
| 73 | FILE **f = topfile(L); | 72 | FILE **f = tofilep(L); |
| 74 | if (*f == NULL) | 73 | if (*f == NULL) |
| 75 | luaL_error(L, "attempt to use a closed file"); | 74 | luaL_error(L, "attempt to use a closed file"); |
| 76 | return *f; | 75 | return *f; |
| @@ -106,7 +105,7 @@ static int io_noclose (lua_State *L) { | |||
| 106 | ** function to close 'popen' files | 105 | ** function to close 'popen' files |
| 107 | */ | 106 | */ |
| 108 | static int io_pclose (lua_State *L) { | 107 | static int io_pclose (lua_State *L) { |
| 109 | FILE **p = topfile(L); | 108 | FILE **p = tofilep(L); |
| 110 | int ok = lua_pclose(L, *p); | 109 | int ok = lua_pclose(L, *p); |
| 111 | *p = NULL; | 110 | *p = NULL; |
| 112 | return pushresult(L, ok, NULL); | 111 | return pushresult(L, ok, NULL); |
| @@ -117,7 +116,7 @@ static int io_pclose (lua_State *L) { | |||
| 117 | ** function to close regular files | 116 | ** function to close regular files |
| 118 | */ | 117 | */ |
| 119 | static int io_fclose (lua_State *L) { | 118 | static int io_fclose (lua_State *L) { |
| 120 | FILE **p = topfile(L); | 119 | FILE **p = tofilep(L); |
| 121 | int ok = (fclose(*p) == 0); | 120 | int ok = (fclose(*p) == 0); |
| 122 | *p = NULL; | 121 | *p = NULL; |
| 123 | return pushresult(L, ok, NULL); | 122 | return pushresult(L, ok, NULL); |
| @@ -140,7 +139,7 @@ static int io_close (lua_State *L) { | |||
| 140 | 139 | ||
| 141 | 140 | ||
| 142 | static int io_gc (lua_State *L) { | 141 | static int io_gc (lua_State *L) { |
| 143 | FILE *f = *topfile(L); | 142 | FILE *f = *tofilep(L); |
| 144 | /* ignore closed files */ | 143 | /* ignore closed files */ |
| 145 | if (f != NULL) | 144 | if (f != NULL) |
| 146 | aux_close(L); | 145 | aux_close(L); |
| @@ -149,7 +148,7 @@ static int io_gc (lua_State *L) { | |||
| 149 | 148 | ||
| 150 | 149 | ||
| 151 | static int io_tostring (lua_State *L) { | 150 | static int io_tostring (lua_State *L) { |
| 152 | FILE *f = *topfile(L); | 151 | FILE *f = *tofilep(L); |
| 153 | if (f == NULL) | 152 | if (f == NULL) |
| 154 | lua_pushliteral(L, "file (closed)"); | 153 | lua_pushliteral(L, "file (closed)"); |
| 155 | else | 154 | else |
