From 38aa2226587a47cefefbb7dbf03a9d0568682c63 Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Sun, 19 Oct 2014 17:39:53 -0300 Subject: rstream: Initialize 'rstream' field in RBuffer class This field is used in a conditional jump, so this initialization is fixing a bug. --- src/nvim/os/rstream.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/nvim/os/rstream.c b/src/nvim/os/rstream.c index 3e5a99acd1..139f7359d8 100644 --- a/src/nvim/os/rstream.c +++ b/src/nvim/os/rstream.c @@ -47,6 +47,7 @@ RBuffer *rbuffer_new(size_t capacity) rv->data = xmalloc(capacity); rv->capacity = capacity; rv->rpos = rv->wpos = 0; + rv->rstream = NULL; return rv; } -- cgit From 72ae4e8a9331f71a2d59e8f793f0d77dbc1f51de Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Sun, 19 Oct 2014 17:45:43 -0300 Subject: rstream: Add rbuffer_read_ptr/rbuffer_write_ptr functions rbuffer_data was renamed to rbuffer_read_ptr, and it represents the next read position in a RBuffer instance. Similarly, rbuffer_write_ptr was added to represent the next write position. Also, rbuffer_data was being used for writing(in alloc_cb), replace that by rbuffer_write_ptr. --- src/nvim/os/input.c | 6 +++--- src/nvim/os/rstream.c | 24 ++++++++++++++++-------- 2 files changed, 19 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c index 71b590ceaa..a18d735ce6 100644 --- a/src/nvim/os/input.c +++ b/src/nvim/os/input.c @@ -152,7 +152,7 @@ String input_buffer_save(void) { size_t inbuf_size = rbuffer_pending(input_buffer); String rv = { - .data = xmemdup(rbuffer_data(input_buffer), inbuf_size), + .data = xmemdup(rbuffer_read_ptr(input_buffer), inbuf_size), .size = inbuf_size }; rbuffer_consumed(input_buffer, inbuf_size); @@ -242,7 +242,7 @@ static void convert_input(void) bool convert = input_conv.vc_type != CONV_NONE; // Set unconverted data/length - char *data = rbuffer_data(read_buffer); + char *data = rbuffer_read_ptr(read_buffer); size_t data_length = rbuffer_pending(read_buffer); size_t converted_length = data_length; @@ -270,7 +270,7 @@ static void convert_input(void) return; } - char *inbuf = rbuffer_data(input_buffer); + char *inbuf = rbuffer_read_ptr(input_buffer); size_t count = rbuffer_pending(input_buffer), consume_count = 0; for (int i = count - 1; i >= 0; i--) { diff --git a/src/nvim/os/rstream.c b/src/nvim/os/rstream.c index 139f7359d8..8f1c30de50 100644 --- a/src/nvim/os/rstream.c +++ b/src/nvim/os/rstream.c @@ -54,8 +54,9 @@ RBuffer *rbuffer_new(size_t capacity) /// Advances `rbuffer` read pointers to consume data. If the associated /// RStream had stopped because the buffer was full, this will restart it. /// -/// This is called automatically by rbuffer_read, but when using `rbuffer_data` -/// directly, this needs to called after the data was consumed. +/// This is called automatically by rbuffer_read, but when using +/// `rbuffer_read_ptr` directly, this needs to called after the data was +/// consumed. void rbuffer_consumed(RBuffer *rbuffer, size_t count) { rbuffer->rpos += count; @@ -105,7 +106,7 @@ size_t rbuffer_read(RBuffer *rbuffer, char *buffer, size_t count) } if (read_count > 0) { - memcpy(buffer, rbuffer_data(rbuffer), read_count); + memcpy(buffer, rbuffer_read_ptr(rbuffer), read_count); rbuffer_consumed(rbuffer, read_count); } @@ -127,7 +128,7 @@ size_t rbuffer_write(RBuffer *rbuffer, char *buffer, size_t count) } if (write_count > 0) { - memcpy(rbuffer_data(rbuffer), buffer, write_count); + memcpy(rbuffer_write_ptr(rbuffer), buffer, write_count); rbuffer_produced(rbuffer, write_count); } @@ -136,11 +137,18 @@ size_t rbuffer_write(RBuffer *rbuffer, char *buffer, size_t count) /// Returns a pointer to a raw buffer containing the first byte available for /// reading. -char *rbuffer_data(RBuffer *rbuffer) +char *rbuffer_read_ptr(RBuffer *rbuffer) { return rbuffer->data + rbuffer->rpos; } +/// Returns a pointer to a raw buffer containing the first byte available for +/// write. +char *rbuffer_write_ptr(RBuffer *rbuffer) +{ + return rbuffer->data + rbuffer->wpos; +} + /// Returns the number of bytes ready for consumption in `rbuffer` /// /// @param rbuffer The `RBuffer` instance @@ -337,7 +345,7 @@ static void alloc_cb(uv_handle_t *handle, size_t suggested, uv_buf_t *buf) RStream *rstream = handle_get_rstream(handle); buf->len = rbuffer_available(rstream->buffer); - buf->base = rbuffer_data(rstream->buffer); + buf->base = rbuffer_write_ptr(rstream->buffer); } // Callback invoked by libuv after it copies the data into the buffer provided @@ -375,8 +383,8 @@ static void fread_idle_cb(uv_idle_t *handle) uv_fs_t req; RStream *rstream = handle_get_rstream((uv_handle_t *)handle); - rstream->uvbuf.len = rstream->buffer->capacity - rstream->buffer->wpos; - rstream->uvbuf.base = rstream->buffer->data + rstream->buffer->wpos; + rstream->uvbuf.len = rbuffer_available(rstream->buffer); + rstream->uvbuf.base = rbuffer_write_ptr(rstream->buffer); // the offset argument to uv_fs_read is int64_t, could someone really try // to read more than 9 quintillion (9e18) bytes? -- cgit