src/buffer.c

changeset 290
d5d6ab809ad3
parent 270
3d80d425543b
     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 +}

mercurial