Example #1
0
int main(int argc, char **argv)
{
    entry *l = NULL, *e;
    entry e1, e2, e3;
    int i = 0, v[3];
    e1.i = 1;
    e2.i = 2;
    e3.i = 3;

    entry_add(&l, &e1);
    assert(l == &e1);
    assert(l->next == l);
    assert(l->prev == l);

    entry_add(&l, &e2);
    assert(l == &e1);
    assert(l->next == &e2);
    assert(l->prev == &e2);

    entry_add(&l, &e3);
    assert(l == &e1);
    assert(l->next == &e2);
    assert(l->prev == &e3);

    entry_rem(&l, l);
    assert(l == &e2);
    assert(l->next == &e3);
    assert(l->prev == &e3);
    assert(entry_next(&l, l) == &e3);
    assert(entry_prev(&l, l) == NULL);
    assert(entry_next(&l, &e3) == NULL);
    assert(entry_prev(&l, &e3) == &e2);

    for (e = l; e != NULL; e = entry_next(&l, e))
        v[i++] = e->i;
    assert(v[0] == 2);
    assert(v[1] == 3);

    entry_rem(&l, &e3);
    assert(l == &e2);
    entry_rem(&l, l);
    assert(l == NULL);
}
Example #2
0
File: hfile.c Project: pipul/lab
int32_t block_size(block_t *l)
{
	entry_t *e;
	int32_t bsize;

	if (!l)
		return(-1);
	bsize = sizeof(uint64_t);
	for (e = block_head(l); e != NULL; e = entry_next(e))
		bsize = bsize + entry_size(e);
	return(bsize);
}
Example #3
0
File: hfile.c Project: pipul/lab
entry_t *block_tail(block_t *l)
{
	entry_t *e;
	
	e = l->_head;
	while (e->forward[0]) {
		e = entry_next(e);
	}
	if (e == l->_head)
		return(NULL);
	return(e);
}
Example #4
0
File: hfile.c Project: pipul/lab
int32_t block_swap(int32_t fd, int32_t offset, block_t *l)
{
	int32_t len;
	int32_t size;
	uint64_t magic;
	entry_t *o;
	int8_t *buffer, *ptr;

	if (fd < 0 || offset < 0 || !l)
		return(-1);
	if (-1 == fcntl(fd,F_SETFL,O_APPEND))
		return(-1);
	size = block_size(l);
	if ((buffer = malloc(size)) == NULL)
		return(-1);
	else
		ptr = buffer + sizeof(uint64_t);
	
	for (o = block_head(l); o != NULL; o = entry_next(o)) {
		len = sdslen(o->key);
		memcpy(ptr,&len,sizeof(int32_t)); 
		ptr = ptr + sizeof(int32_t);
		memcpy(ptr,o->key,len);
		ptr = ptr + len;
		
		len = sdslen(o->value);
		memcpy(ptr,&len,sizeof(int32_t));
		ptr = ptr + sizeof(int32_t);
		memcpy(ptr,o->value,len);
		ptr = ptr + len;
	}

	ptr = buffer + sizeof(uint64_t);
	*(uint64_t *)buffer = crc32_encode(ptr,size - sizeof(uint64_t));

	if (size != write(fd,buffer,size))
		__ERROR_LOG(W_ERROR);
	free(buffer);
	return(size);

W_ERROR:
	free(buffer);
	return(-1);
}