From 6af005ec20323defd2a5ead01e2d389462884d04 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 22 Dec 2000 15:32:28 -0200 Subject: bug: when `read' fails it must return nil (and not no value) --- liolib.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'liolib.c') diff --git a/liolib.c b/liolib.c index 6cb555af..354dc849 100644 --- a/liolib.c +++ b/liolib.c @@ -1,5 +1,5 @@ /* -** $Id: liolib.c,v 1.94 2000/12/18 13:42:19 roberto Exp roberto $ +** $Id: liolib.c,v 1.95 2000/12/22 16:57:13 roberto Exp roberto $ ** Standard I/O (and system) library ** See Copyright Notice in lua.h */ @@ -318,6 +318,7 @@ static int io_read (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); int lastarg = lua_gettop(L) - 1; int firstarg = 1; + int success; FILE *f = gethandle(L, ctrl, firstarg); int n; if (f) firstarg++; @@ -330,8 +331,8 @@ static int io_read (lua_State *L) { } else /* ensure stack space for all results and for auxlib's buffer */ luaL_checkstack(L, lastarg-firstarg+1+LUA_MINSTACK, "too many arguments"); - for (n = firstarg; n<=lastarg; n++) { - int success; + success = 1; + for (n = firstarg; n<=lastarg && success; n++) { if (lua_isnumber(L, n)) success = read_chars(L, f, (size_t)lua_tonumber(L, n)); else { @@ -343,8 +344,8 @@ static int io_read (lua_State *L) { else { switch (p[1]) { case 'n': /* number */ - if (!read_number(L, f)) goto endloop; /* read fails */ - continue; /* number is already pushed; avoid the "pushstring" */ + success = read_number(L, f); + break; case 'l': /* line */ success = read_line(L, f); break; @@ -361,11 +362,11 @@ static int io_read (lua_State *L) { } } } - if (!success) { - lua_pop(L, 1); /* remove last result */ - break; /* read fails */ - } - } endloop: + } + if (!success) { + lua_pop(L, 1); /* remove last result */ + lua_pushnil(L); /* push nil instead */ + } return n - firstarg; } -- cgit v1.2.3-55-g6feb