예제 #1
0
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();
}