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); }
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); }
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); }
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); }