diff options
-rw-r--r-- | liolib.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: $ | 2 | ** $Id: liolib.c,v 1.1 1997/09/16 19:25:59 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 | */ |
@@ -42,6 +42,7 @@ int pclose(); | |||
42 | 42 | ||
43 | 43 | ||
44 | int lua_tagio; | 44 | int lua_tagio; |
45 | static int closedtag; | ||
45 | 46 | ||
46 | 47 | ||
47 | static void pushresult (int i) | 48 | static void pushresult (int i) |
@@ -59,8 +60,12 @@ static void pushresult (int i) | |||
59 | static FILE *getfile (char *name) | 60 | static FILE *getfile (char *name) |
60 | { | 61 | { |
61 | lua_Object f = lua_getglobal(name); | 62 | lua_Object f = lua_getglobal(name); |
62 | if (!lua_isuserdata(f) || lua_tag(f) != lua_tagio) | 63 | if (!lua_isuserdata(f) || lua_tag(f) != lua_tagio) { |
63 | luaL_verror("global variable %s is not a file handle", name); | 64 | if (lua_tag(f) == closedtag) |
65 | luaL_verror("file %s has been closed", name); | ||
66 | else | ||
67 | luaL_verror("global variable %s is not a file handle", name); | ||
68 | } | ||
64 | return lua_getuserdata(f); | 69 | return lua_getuserdata(f); |
65 | } | 70 | } |
66 | 71 | ||
@@ -71,6 +76,8 @@ static void closefile (char *name) | |||
71 | if (f == stdin || f == stdout) return; | 76 | if (f == stdin || f == stdout) return; |
72 | if (pclose(f) == -1) | 77 | if (pclose(f) == -1) |
73 | fclose(f); | 78 | fclose(f); |
79 | lua_pushobject(lua_getglobal(name)); | ||
80 | lua_settag(closedtag); | ||
74 | } | 81 | } |
75 | 82 | ||
76 | 83 | ||
@@ -348,6 +355,7 @@ static struct luaL_reg iolib[] = { | |||
348 | void lua_iolibopen (void) | 355 | void lua_iolibopen (void) |
349 | { | 356 | { |
350 | lua_tagio = lua_newtag(); | 357 | lua_tagio = lua_newtag(); |
358 | closedtag = lua_newtag(); | ||
351 | setfile(stdin, "_INPUT"); | 359 | setfile(stdin, "_INPUT"); |
352 | setfile(stdout, "_OUTPUT"); | 360 | setfile(stdout, "_OUTPUT"); |
353 | setfile(stdin, "_STDIN"); | 361 | setfile(stdin, "_STDIN"); |