diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2015-07-01 09:27:42 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-07-01 09:27:42 -0300 |
commit | b656a954cfec0379a5bb2f7f5d1f28cbc03324df (patch) | |
tree | c8d6f5631df1e8eb69022cae647f6e0436254830 /src/nvim/os/shell.c | |
parent | bfadf5a28b550bf99101c17244d5ea1b926e40c3 (diff) | |
parent | 0ef80b9c2b922280c3ba2c0a8638f23ae57d6618 (diff) | |
download | rneovim-b656a954cfec0379a5bb2f7f5d1f28cbc03324df.tar.gz rneovim-b656a954cfec0379a5bb2f7f5d1f28cbc03324df.tar.bz2 rneovim-b656a954cfec0379a5bb2f7f5d1f28cbc03324df.zip |
Merge PR #2650 'Data structure improvements'
Diffstat (limited to 'src/nvim/os/shell.c')
-rw-r--r-- | src/nvim/os/shell.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index 2de3b1aeed..48174533a6 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -283,25 +283,28 @@ static void dynamic_buffer_ensure(DynamicBuffer *buf, size_t desired) buf->data = xrealloc(buf->data, buf->cap); } -static void system_data_cb(RStream *rstream, void *data, bool eof) +static void system_data_cb(RStream *rstream, RBuffer *buf, void *data, bool eof) { Job *job = data; - DynamicBuffer *buf = job_data(job); + DynamicBuffer *dbuf = job_data(job); - size_t nread = rstream_pending(rstream); - - dynamic_buffer_ensure(buf, buf->len + nread + 1); - rstream_read(rstream, buf->data + buf->len, nread); - - buf->len += nread; + size_t nread = buf->size; + dynamic_buffer_ensure(dbuf, dbuf->len + nread + 1); + rbuffer_read(buf, dbuf->data + dbuf->len, nread); + dbuf->len += nread; } -static void out_data_cb(RStream *rstream, void *data, bool eof) +static void out_data_cb(RStream *rstream, RBuffer *buf, void *data, bool eof) { - RBuffer *rbuffer = rstream_buffer(rstream); - size_t written = write_output(rbuffer_read_ptr(rbuffer), - rbuffer_pending(rbuffer), false, eof); - rbuffer_consumed(rbuffer, written); + RBUFFER_UNTIL_EMPTY(buf, ptr, len) { + size_t written = write_output(ptr, len, false, + eof && len <= rbuffer_size(buf)); + if (written) { + rbuffer_consumed(buf, written); + } else { + break; + } + } } /// Parses a command string into a sequence of words, taking quotes into |