/* arch-tag: 8a24a95d-6799-499d-aa58-74813ce9b4ef */ #include #include #include #include #include "resizeable_buf.h" const rb_t rb_blank = RB_BLANK; static void rb_makesize(rb_t *rb, size_t sz, bool preserve) { assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); if(sz > rb->size) { if(!rb->size) rb->size = 2; while (sz > rb->size) rb->size*=2; if(preserve) rb->buf = realloc(rb->buf, rb->size); else { free(rb->buf); rb->buf = malloc(rb->size); } } assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); } void rb_resize(rb_t *rb, size_t len, bool preserve) { rb_makesize(rb, len, preserve); rb->len = len; assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); } void rb_resize_zero(rb_t *rb, size_t len, bool preserve) { rb_makesize(rb, len, preserve); if(len > rb->len) memset(RB_PTR(rb) + rb->len, 0, len - rb->len); rb->len = len; assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); } void rb_append(rb_t *rb, void *data, size_t len) { rb_makesize(rb, len + rb->len, true); memcpy((char *)rb->buf + rb->len, data, len); rb->len += len; assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); } void rb_set(rb_t *rb, void *data, size_t len) { rb_makesize(rb, len, false); memcpy(rb->buf, data, len); rb->len = len; assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); } void rbs_set(rb_t *rb, char *str) { rb_set(rb, str, strlen(str)); } void rbs_append(rb_t *rb, char *str) { rb_append(rb, str, strlen(str)); } void rb_extract(rb_t *rb, rb_t *rb2, unsigned loc, size_t len) { rb_set(rb, (char *)RB_PTR(rb2) + loc, len); } void rb_insert_space(rb_t *rb, unsigned loc, size_t len) { assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); assert(loc <= rb->len); rb_makesize(rb, rb->len + len, true); memmove((char *)rb->buf + loc + len, (char *)rb->buf + loc , rb->len - loc); //memcpy((char *)rb->buf + loc, data, len); rb->len += len; assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); } void rb_insert(rb_t *rb, unsigned loc, char *data, size_t len) { rb_insert_space(rb,loc,len); memcpy((char *)rb->buf + loc, data, len); } void rb_delete(rb_t *rb, unsigned loc, size_t len) { assert(loc <= rb->len); assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); memmove((char *)rb->buf + loc, (char *)rb->buf + loc + len, rb->len - (loc + len)); rb->len -= len; assert(rb->len <= rb->size); assert((rb->buf && rb->size) || (!rb->buf && !rb->size)); } void rb_stringize(rb_t *rb) { rb_makesize(rb, rb->len + 1, true); ((char *)rb->buf)[rb->len] = '\0'; } void fifo_append(fifo_t *fifo, void *data, size_t len) { if (!fifo->offset || len < fifo->rb.size - fifo->rb.len) { rb_append(&fifo->rb, data, len); } else { memmove(fifo->rb.buf, fifo->rb.buf + fifo->offset, FIFO_LEN(*fifo)); fifo->rb.len -= fifo->offset; fifo->offset = 0; rb_append(&fifo->rb, data, len); } }