X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/f8d7cde0d035f087f39c8076061bd8ef608e14f4..b2be2bbd665328f4ec3dc14d7d84fdbac4c58e11:/embedded/libs4c/keyval/keyvalpb.c diff --git a/embedded/libs4c/keyval/keyvalpb.c b/embedded/libs4c/keyval/keyvalpb.c index 8dd6d1e..e1f48b3 100644 --- a/embedded/libs4c/keyval/keyvalpb.c +++ b/embedded/libs4c/keyval/keyvalpb.c @@ -17,7 +17,7 @@ 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. *******************************************************************/ @@ -57,16 +57,16 @@ kvpb_sum_t kvpb_memsum(KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size) * 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); } @@ -142,9 +142,9 @@ int __kvpb_check(uint8_t mode) 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) { @@ -172,7 +172,7 @@ int __kvpb_check(uint8_t mode) if(ret>=0) ret=0; } - + if(ret){ if(!mode) { kvpb_block->flags|=KVPB_DESC_RO; @@ -207,7 +207,7 @@ int __kvpb_check(uint8_t mode) 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; } @@ -236,7 +236,7 @@ KVPB_DPTRTYPE kvpb_key_t *__kvpb_first(uint8_t mode) } 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; @@ -310,9 +310,9 @@ KVPB_DPTRTYPE kvpb_key_t *__kvpb_find(kvpb_keyid_t keyid, uint8_t mode, KVPB_DPT * 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; @@ -321,22 +321,24 @@ int __kvpb_compact_region(uint8_t mode, kvpb_keyid_t keyid) 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((!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); + 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); } @@ -397,12 +399,12 @@ int __kvpb_set_key(kvpb_keyid_t keyid, kvpb_size_t size, const void *buf) 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; @@ -429,10 +431,10 @@ int __kvpb_set_key(kvpb_keyid_t keyid, kvpb_size_t size, const void *buf) 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){ @@ -462,7 +464,7 @@ int __kvpb_set_key(kvpb_keyid_t keyid, kvpb_size_t size, const void *buf) 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));