1.1 --- a/src/buffer.c Wed May 09 15:04:15 2018 +0200 1.2 +++ b/src/buffer.c Wed May 09 20:15:10 2018 +0200 1.3 @@ -237,6 +237,61 @@ 1.4 } 1.5 } 1.6 1.7 -size_t ucx_buffer_puts(UcxBuffer *buffer, char *str) { 1.8 +size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str) { 1.9 return ucx_buffer_write((const void*)str, 1, strlen(str), buffer); 1.10 } 1.11 + 1.12 +int ucx_buffer_shift_left(UcxBuffer* buffer, size_t shift) { 1.13 + if (shift >= buffer->size) { 1.14 + buffer->pos = buffer->size = 0; 1.15 + } else { 1.16 + memmove(buffer->space, buffer->space + shift, buffer->size - shift); 1.17 + buffer->size -= shift; 1.18 + 1.19 + if (buffer->pos >= shift) { 1.20 + buffer->pos -= shift; 1.21 + } else { 1.22 + buffer->pos = 0; 1.23 + } 1.24 + } 1.25 + return 0; 1.26 +} 1.27 + 1.28 +int ucx_buffer_shift_right(UcxBuffer* buffer, size_t shift) { 1.29 + size_t req_capacity = buffer->size + shift; 1.30 + size_t movebytes; 1.31 + 1.32 + // auto extend buffer, if required and enabled 1.33 + if (buffer->capacity < req_capacity) { 1.34 + if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) { 1.35 + if (ucx_buffer_extend(buffer, req_capacity - buffer->capacity)) { 1.36 + return 1; 1.37 + } 1.38 + movebytes = buffer->size; 1.39 + } else { 1.40 + movebytes = buffer->capacity - shift; 1.41 + } 1.42 + } else { 1.43 + movebytes = buffer->size; 1.44 + } 1.45 + 1.46 + memmove(buffer->space + shift, buffer->space, movebytes); 1.47 + buffer->size = shift+movebytes; 1.48 + 1.49 + buffer->pos += shift; 1.50 + if (buffer->pos > buffer->size) { 1.51 + buffer->pos = buffer->size; 1.52 + } 1.53 + 1.54 + return 0; 1.55 +} 1.56 + 1.57 +int ucx_buffer_shift(UcxBuffer* buffer, off_t shift) { 1.58 + if (shift < 0) { 1.59 + return ucx_buffer_shift_left(buffer, (size_t) (-shift)); 1.60 + } else if (shift > 0) { 1.61 + return ucx_buffer_shift_right(buffer, (size_t) shift); 1.62 + } else { 1.63 + return 0; 1.64 + } 1.65 +}