some of the licenses, he/she can delete appropriate line.
Warning, if you delete all lines, you are not allowed to
distribute source code and/or binaries utilizing code.
-
+
See files COPYING and README for details.
*******************************************************************/
* File: keyvalpb.c
*/
KVPB_DPTRTYPE kvpb_sum_t *kvpb_get_psum(kvpb_block_t *kvpb_block,
- KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size)
+ KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size)
#else
KVPB_DPTRTYPE kvpb_sum_t *__kvpb_get_psum(
- KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size)
+ KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size)
#endif
{
KVPB_DPTRTYPE kvpb_sum_t *psum;
psum=kvpb_psum_align(kvpb_block,(KVPB_DPTRTYPE kvpb_sum_t*)(base+size)-1);
while((KVPB_DPTRTYPE uint8_t*)psum>=base) {
- if (*kvpb_psum_valid_loc(kvpb_block,psum)!=0)
+ if (*kvpb_psum_valid_loc(kvpb_block,psum)!=0)
return psum;
psum=kvpb_psum_align(kvpb_block,psum-1);
}
KVPB_DPTRTYPE uint8_t *p;
KVPB_LOCALDATA int ret=-1;
KVPB_LOCALDATA kvpb_sum_t sum;
-
+
kvpb_block->flags&=~KVPB_DESC_USE2ND;
-
+
p=kvpb_region_base(kvpb_block,0);
kvpb_block->psum1=kvpb_get_psum(kvpb_block,p,kvpb_block->size);
if (kvpb_block->psum1) {
if(ret>=0)
ret=0;
}
-
+
if(ret){
if(!mode) {
kvpb_block->flags|=KVPB_DESC_RO;
kvpb_block->flags&=~KVPB_DESC_RO;
}
}
- kvpb_block_flush(kvpb_block);
+ kvpb_block_flush(kvpb_block);
if(ret>=0) kvpb_block->flags|=KVPB_DESC_VALID;
return ret;
}
}
while(*kvpb_keyid_valid(kvpb_block,key)==KVPB_KEYID_INVALID) {
key=kvpb_next(kvpb_block,key);
- if (!key)
+ if (!key)
return NULL;
}
return key->size!=KVPB_EMPTY?key:NULL;
* Return Value: Operation cannot be finished.
* File: keyvalpb.c
*/
-int kvpb_compact_region(kvpb_block_t *kvpb_block, uint8_t mode, kvpb_keyid_t keyid)
+int kvpb_compact_region(kvpb_block_t *kvpb_block, uint8_t mode, kvpb_keyid_t keyid)
#else
-int __kvpb_compact_region(uint8_t mode, kvpb_keyid_t keyid)
+int __kvpb_compact_region(uint8_t mode, kvpb_keyid_t keyid)
#endif
{
KVPB_DPTRTYPE uint8_t *p;
KVPB_DPTRTYPE kvpb_key_t *des,*src;
p=kvpb_region_base(kvpb_block,0);
- src=(KVPB_DPTRTYPE kvpb_key_t*)kvpb_region_base(kvpb_block,1);
des=(KVPB_DPTRTYPE kvpb_key_t*)p;
- kvpb_block->psum1=kvpb_psum_align(kvpb_block,
- (KVPB_DPTRTYPE kvpb_sum_t*)(kvpb_region_base(kvpb_block,1))-1);
+ if(kvpb_block->flags&KVPB_DESC_DOUBLE)
+ src=(KVPB_DPTRTYPE kvpb_key_t*)kvpb_region_base(kvpb_block,1);
+ else
+ src=(KVPB_DPTRTYPE kvpb_key_t*)p;
+
if((!mode && (kvpb_block->flags & KVPB_DESC_USE2ND))||(mode==2)) {
if(!(kvpb_block->flags&KVPB_DESC_DOUBLE))
return -1;
+ des=src;
src=(KVPB_DPTRTYPE kvpb_key_t*)p;
- des=(KVPB_DPTRTYPE kvpb_key_t*)kvpb_region_base(kvpb_block,1);
+ p=(KVPB_DPTRTYPE uint8_t *)des;
kvpb_block->psum2=kvpb_psum_align(kvpb_block,
- (KVPB_DPTRTYPE kvpb_sum_t*)(kvpb_region_base(kvpb_block,2))-1);
+ (KVPB_DPTRTYPE kvpb_sum_t*)(p+kvpb_block->size)-1);
+ } else {
+ kvpb_block->psum1=kvpb_psum_align(kvpb_block,
+ (KVPB_DPTRTYPE kvpb_sum_t*)(p+kvpb_block->size)-1);
}
kvpb_block_flush(kvpb_block);
kvpb_block_erase(kvpb_block,des,kvpb_block->size);
while(src) {
int s=kvpb_chunk_align(kvpb_block,src->size+sizeof(kvpb_key_t));
if((*kvpb_keyid_valid(kvpb_block,src)!=KVPB_KEYID_INVALID) && (src->keyid!=keyid)) {
- kvpb_block_copy(kvpb_block,des,src,s);
+ if(src!=des)
+ kvpb_block_copy(kvpb_block,des,src,s);
if (kvpb_block->flags&KVPB_DESC_CHUNKWO) s+=kvpb_chunk_size(kvpb_block);
des=(KVPB_DPTRTYPE kvpb_key_t*)((uint8_t*)des+s);
}
KVPB_DPTRTYPE kvpb_sum_t *psum;
KVPB_DPTRTYPE kvpb_key_t *key;
KVPB_DPTRTYPE uint8_t *p;
-
+
if(!(kvpb_block->flags&KVPB_DESC_VALID))
return -1;
if(kvpb_block->flags&KVPB_DESC_RO)
return -1;
-
+
/*first region*/
psum=kvpb_psum_align(kvpb_block,kvpb_block->psum1);
sum=0;
p=kvpb_region_base(kvpb_block,0);
sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum1-p);
- kvpb_block_copy(kvpb_block,kvpb_block->psum1,&sum,sizeof(kvpb_sum_t));
+ kvpb_block_copy(kvpb_block,kvpb_block->psum1,&sum,sizeof(kvpb_sum_t));
kvpb_block_flush(kvpb_block);
if(!(kvpb_block->flags&KVPB_DESC_DOUBLE))
- return key?size:-1;
+ return key?size:-1;
/*Write in the first region failed, switching to backup region */
if(kvpb_block->flags&KVPB_DESC_RO){
kvpb_block_copy(kvpb_block,(uint8_t*)(key+1),buf,/*align???*/ size);
}
kvpb_block_flush(kvpb_block);
-
+
p=kvpb_region_base(kvpb_block,1);
sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum2-p);
kvpb_block_copy(kvpb_block,kvpb_block->psum2,&sum,sizeof(kvpb_sum_t));