diff --git a/src/buffer.c b/src/buffer.c index ae00ef2..e411daf 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -9,7 +9,7 @@ * Internal function prototypes \*=========================================================================*/ static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b); -static int recvline(p_buffer buf, luaL_Buffer *b); +static int recvline(p_buffer buf, luaL_Buffer *b, int chop); static int recvall(p_buffer buf, luaL_Buffer *b); static int buffer_get(p_buffer buf, const char **data, size_t *count); static void buffer_skip(p_buffer buf, size_t count); @@ -118,7 +118,10 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) { if (*p == '*') p++; /* skip optional '*' (for compatibility) */ switch (*p) { case 'l': /* line */ - err = recvline(buf, &b); + err = recvline(buf, &b, 1); + break; + case 'L': /* line with \n */ + err = recvline(buf, &b, 0); break; case 'a': /* all */ err = recvall(buf, &b); @@ -227,7 +230,7 @@ static int recvall(p_buffer buf, luaL_Buffer *b) { * Reads a line terminated by a CR LF pair or just by a LF. The CR and LF * are not returned by the function and are discarded from the buffer \*-------------------------------------------------------------------------*/ -static int recvline(p_buffer buf, luaL_Buffer *b) { +static int recvline(p_buffer buf, luaL_Buffer *b, int chop) { int err = IO_DONE; while (err == IO_DONE) { size_t count, pos; const char *data; @@ -239,6 +242,8 @@ static int recvline(p_buffer buf, luaL_Buffer *b) { pos++; } if (pos < count) { /* found '\n' */ + if (!chop) + luaL_addchar(b, '\n'); buffer_skip(buf, pos+1); /* skip '\n' too */ break; /* we are done */ } else /* reached the end of the buffer */