From b7567b667367180b75fbb60f7a73b75e5e89889e Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 30 Oct 1997 18:29:09 -0200 Subject: [PATCH] "read" & "write" may receive a file handler as first argument --- liolib.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/liolib.c b/liolib.c index ad32d073..c32a548d 100644 --- a/liolib.c +++ b/liolib.c @@ -1,5 +1,5 @@ /* -** $Id: liolib.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ +** $Id: liolib.c,v 1.2 1997/09/23 14:12:44 roberto Exp roberto $ ** Standard I/O (and system) library ** See Copyright Notice in lua.h */ @@ -56,20 +56,37 @@ static void pushresult (int i) } +static int ishandler (lua_Object f) +{ + if (lua_isuserdata(f)) { + if (lua_tag(f) == closedtag) + lua_error("trying to access a closed file"); + return lua_tag(f) == lua_tagio; + } + else return 0; +} static FILE *getfile (char *name) { lua_Object f = lua_getglobal(name); - if (!lua_isuserdata(f) || lua_tag(f) != lua_tagio) { - if (lua_tag(f) == closedtag) - luaL_verror("file %s has been closed", name); - else + if (!ishandler(f)) luaL_verror("global variable %s is not a file handle", name); - } return lua_getuserdata(f); } +static FILE *getfileparam (char *name, int *arg) +{ + lua_Object f = lua_getparam(*arg); + if (ishandler(f)) { + (*arg)++; + return lua_getuserdata(f); + } + else + return getfile(name); +} + + static void closefile (char *name) { FILE *f = getfile(name); @@ -154,9 +171,10 @@ static void io_appendto (void) static void io_read (void) { - FILE *f = getfile("_INPUT"); + int arg = 1; + FILE *f = getfileparam("_INPUT", &arg); char *buff; - char *p = luaL_opt_string(1, "[^\n]*{\n}"); + char *p = luaL_opt_string(arg, "[^\n]*{\n}"); int inskip = 0; /* to control {skips} */ int c = NEED_OTHER; luaI_emptybuff(); @@ -204,8 +222,8 @@ static void io_read (void) static void io_write (void) { - FILE *f = getfile("_OUTPUT"); int arg = 1; + FILE *f = getfileparam("_OUTPUT", &arg); int status = 1; char *s; while ((s = luaL_opt_string(arg++, NULL)) != NULL)