Mercurial > vim
diff src/channel.c @ 10249:920c73a27dda v8.0.0022
commit https://github.com/vim/vim/commit/ec68a99464055029c01082762517e97245ddae0c
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Oct 3 21:37:41 2016 +0200
patch 8.0.0022
Problem: If a channel in NL mode is missing the NL at the end the remaining
characters are dropped.
Solution: When the channel is closed use the remaining text. (Ozaki Kiichi)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 03 Oct 2016 21:45:04 +0200 |
parents | 175b1116f96a |
children | a92c4abb8c1f |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -2355,8 +2355,9 @@ may_invoke_callback(channel_T *channel, typval_T *listtv = NULL; typval_T argv[CH_JSON_MAX_ARGS]; int seq_nr = -1; - ch_mode_T ch_mode = channel->ch_part[part].ch_mode; - cbq_T *cbhead = &channel->ch_part[part].ch_cb_head; + chanpart_T *ch_part = &channel->ch_part[part]; + ch_mode_T ch_mode = ch_part->ch_mode; + cbq_T *cbhead = &ch_part->ch_cb_head; cbq_T *cbitem; char_u *callback = NULL; partial_T *partial = NULL; @@ -2376,10 +2377,10 @@ may_invoke_callback(channel_T *channel, callback = cbitem->cq_callback; partial = cbitem->cq_partial; } - else if (channel->ch_part[part].ch_callback != NULL) + else if (ch_part->ch_callback != NULL) { - callback = channel->ch_part[part].ch_callback; - partial = channel->ch_part[part].ch_partial; + callback = ch_part->ch_callback; + partial = ch_part->ch_partial; } else { @@ -2387,11 +2388,11 @@ may_invoke_callback(channel_T *channel, partial = channel->ch_partial; } - buffer = channel->ch_part[part].ch_bufref.br_buf; - if (buffer != NULL && !bufref_valid(&channel->ch_part[part].ch_bufref)) + buffer = ch_part->ch_bufref.br_buf; + if (buffer != NULL && !bufref_valid(&ch_part->ch_bufref)) { /* buffer was wiped out */ - channel->ch_part[part].ch_bufref.br_buf = NULL; + ch_part->ch_bufref.br_buf = NULL; buffer = NULL; } @@ -2452,7 +2453,7 @@ may_invoke_callback(channel_T *channel, if (ch_mode == MODE_NL) { - char_u *nl; + char_u *nl = NULL; char_u *buf; readq_T *node; @@ -2465,10 +2466,25 @@ may_invoke_callback(channel_T *channel, if (nl != NULL) break; if (channel_collapse(channel, part, TRUE) == FAIL) + { + if (ch_part->ch_fd == INVALID_FD && node->rq_buflen > 0) + break; return FALSE; /* incomplete message */ + } } buf = node->rq_buffer; + if (nl == NULL) + { + /* Flush remaining message that is missing a NL. */ + buf = vim_realloc(buf, node->rq_buflen + 1); + if (buf == NULL) + return FALSE; + node->rq_buffer = buf; + nl = buf + node->rq_buflen++; + *nl = NUL; + } + /* Convert NUL to NL, the internal representation. */ for (p = buf; p < nl && p < buf + node->rq_buflen; ++p) if (*p == NUL)