ext/say_buffer_slice.c in ray-0.2.0 vs ext/say_buffer_slice.c in ray-0.2.1

- old
+ new

@@ -11,33 +11,32 @@ #define say_make_range(begin, size) ((say_range){begin, size}) typedef struct { say_buffer *buf; - mo_list *ranges; + mo_list ranges; } say_global_buffer; static mo_array *say_global_buffers = NULL; static void say_global_buffer_free(say_global_buffer *buf) { say_buffer_free(buf->buf); - if (buf->ranges) mo_list_free(buf->ranges); + mo_list_release(&buf->ranges); } static say_global_buffer *say_global_buffer_create(mo_array *bufs, size_t vtype, size_t size) { say_global_buffer buffer; - buffer.buf = say_buffer_create(vtype, SAY_STREAM, size); - buffer.ranges = NULL; + buffer.buf = say_buffer_create(vtype, SAY_STREAM, size); + mo_list_init(&buffer.ranges, sizeof(say_range)); mo_array_push(bufs, &buffer); return mo_array_at(bufs, bufs->size - 1); } - static void say_global_buffer_array_alloc(mo_array *ary) { mo_array_init(ary, sizeof(say_global_buffer)); ary->release = (say_destructor)say_global_buffer_free; } @@ -45,58 +44,57 @@ mo_array_release(ary); } static size_t say_global_buffer_prepend(say_global_buffer *buf, size_t n) { say_range range = say_make_range(0, n); - buf->ranges = mo_list_prepend(buf->ranges, &range); + mo_list_prepend(&buf->ranges, buf->ranges.head, &range); return 0; } -static size_t say_global_buffer_insert(mo_list *list, size_t n) { - say_range *previous = mo_list_data_ptr(list, say_range); +static size_t say_global_buffer_insert(mo_list *list, mo_list_it *it, + size_t n) { + say_range *previous = mo_list_it_data_ptr(it, say_range); say_range range = say_make_range(previous->loc + previous->size, n); - mo_list_insert(list, &range); + mo_list_insert(list, it, &range); return range.loc; } static size_t say_global_buffer_find(say_global_buffer *buf, size_t n) { /* Buffer too small for this object */ if (n > say_buffer_get_size(buf->buf)) return SAY_MAX_SIZE; - if (!buf->ranges) { - buf->ranges = mo_list_create(sizeof(say_range)); - say_range *range = mo_list_data_ptr(buf->ranges, say_range); - *range = say_make_range(0, n); + if (!buf->ranges.head) { + return say_global_buffer_prepend(buf, n); } - say_range *first = mo_list_data_ptr(buf->ranges, say_range); + say_range *first = mo_list_it_data_ptr(buf->ranges.head, say_range); /* There's room at the begin of the buffer */ if (first->loc >= n) - return say_global_buffer_prepend(buf, 0); + return say_global_buffer_prepend(buf, n); - mo_list *it = buf->ranges; + mo_list_it *it = buf->ranges.head; for (; it->next; it = it->next) { /* stop before last element */ - say_range *current = mo_list_data_ptr(it, say_range); - say_range *next = mo_list_data_ptr(it->next, say_range); + say_range *current = mo_list_it_data_ptr(it, say_range); + say_range *next = mo_list_it_data_ptr(it->next, say_range); size_t begin = current->loc + current->size; size_t end = next->loc; /* There's enough room between those two elements */ if (end - begin >= n) - return say_global_buffer_insert(it, n); + return say_global_buffer_insert(&buf->ranges, it, n); } - say_range *last = mo_list_data_ptr(it, say_range); + say_range *last = mo_list_it_data_ptr(it, say_range); /* There's enough room at the end of the buffer */ if ((last->loc + last->size + n) < say_buffer_get_size(buf->buf)) { - return say_global_buffer_insert(it, n); + return say_global_buffer_insert(&buf->ranges, it, n); } /* Not enough room here */ return SAY_MAX_SIZE; } @@ -104,26 +102,22 @@ static void say_global_buffer_delete_at(say_global_buffer *buf, size_t loc, size_t range_size) { if (!buf) return; - for (mo_list *it = buf->ranges; it; it = it->next) { - say_range *range = mo_list_data_ptr(it, say_range); + for (mo_list_it *it = buf->ranges.head; it; it = it->next) { + say_range *range = mo_list_it_data_ptr(it, say_range); if (range->loc == loc && range->size == range_size) { - mo_list *next = it->next; - mo_list_delete(it); - - if (it == buf->ranges) buf->ranges = next; - + mo_list_delete(&buf->ranges, it); return; } } } static void say_global_buffer_reduce_size(say_global_buffer *buf, size_t loc, size_t old_size, size_t size) { - for (mo_list *it = buf->ranges; it; it = it->next) { - say_range *range = mo_list_data_ptr(it, say_range); + for (mo_list_it *it = buf->ranges.head; it; it = it->next) { + say_range *range = mo_list_it_data_ptr(it, say_range); if (range->loc == loc && range->size == size) { range->size = size; return; } }