Receive line with ending

This commit is contained in:
mbartlett21 2020-01-17 12:17:32 +10:00 committed by GitHub
parent c27c23074c
commit b0470f4a0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,7 +9,7 @@
* Internal function prototypes * Internal function prototypes
\*=========================================================================*/ \*=========================================================================*/
static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b); 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 recvall(p_buffer buf, luaL_Buffer *b);
static int buffer_get(p_buffer buf, const char **data, size_t *count); static int buffer_get(p_buffer buf, const char **data, size_t *count);
static void buffer_skip(p_buffer buf, 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) */ if (*p == '*') p++; /* skip optional '*' (for compatibility) */
switch (*p) { switch (*p) {
case 'l': /* line */ case 'l': /* line */
err = recvline(buf, &b); err = recvline(buf, &b, 1);
break;
case 'L': /* line with \n */
err = recvline(buf, &b, 0);
break; break;
case 'a': /* all */ case 'a': /* all */
err = recvall(buf, &b); 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 * 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 * 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; int err = IO_DONE;
while (err == IO_DONE) { while (err == IO_DONE) {
size_t count, pos; const char *data; size_t count, pos; const char *data;
@ -239,6 +242,8 @@ static int recvline(p_buffer buf, luaL_Buffer *b) {
pos++; pos++;
} }
if (pos < count) { /* found '\n' */ if (pos < count) { /* found '\n' */
if (!chop)
luaL_addchar(b, '\n');
buffer_skip(buf, pos+1); /* skip '\n' too */ buffer_skip(buf, pos+1); /* skip '\n' too */
break; /* we are done */ break; /* we are done */
} else /* reached the end of the buffer */ } else /* reached the end of the buffer */