void dmp_range_splice( dmp_pool *pool, dmp_range *onto, dmp_pos pos, dmp_range *from) { dmp_node *tail; dmp_range_normalize(pool, from); tail = dmp_node_at(pool, from->end); if (pos == -1) { dmp_node *after = dmp_node_at(pool, onto->end); tail->next = after->next; after->next = from->start; onto->end = from->end; } else if (pos == 0) { tail->next = onto->start; onto->start = from->start; } else { dmp_node *after = dmp_node_at(pool, pos); tail->next = after->next; after->next = from->start; } }
void test_ranges_0(void) { dmp_pool pool, *p = &pool; dmp_range range, *r = ⦥ uint32_t used; assert(dmp_pool_alloc(p, 4) == 0); assert(dmp_range_init(p, r, 0, "", 0, 0) > 0); assert(r->start > 0); assert(r->start == r->end); assert(dmp_range_len(p, r) == 1); assert(dmp_range_insert(p, r, -1, 0, "ab", 0, 2) > 0); assert(r->start != r->end); assert(dmp_range_len(p, r) == 2); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(dmp_range_len(p, r) == 3); assert(dmp_range_insert(p, r, -1, 0, "cd", 0, 2) > 0); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(dmp_range_insert(p, r, -1, 0, "ef", 0, 2) > 0); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(r->start != r->end); assert(dmp_range_len(p, r) == 7); progress(); used = p->pool_used; dmp_range_normalize(p, r); assert(dmp_range_len(p, r) == 3); assert(strcmp(dmp_node_at(p, r->start)->text, "ab") == 0); assert(strcmp(dmp_node_at(p, r->end)->text, "ef") == 0); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(p->pool_used == used); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(p->pool_used == used); assert(dmp_range_insert(p, r, -1, 0, "", 0, 0) > 0); assert(p->pool_used == used + 1); progress(); }