Add documentation; remove ASSERT on partial write.
[bertos.git] / bertos / io / kblock_file.c
index c445612e128ce8ae353e0edc6247ae8a67ae4763..cd18431d101c6b141804d0651a721d2f05efa7b2 100644 (file)
@@ -79,22 +79,13 @@ static size_t kblockfile_writeBuf(struct KBlock *b, const void *buf, size_t offs
        return size;
 }
 
-static int kblockfile_writeBlock(struct KBlock *b, block_idx_t index, const void *buf)
+static size_t kblockfile_writeDirect(struct KBlock *b, block_idx_t index, const void *buf, size_t offset, size_t size)
 {
        KBlockFile *f = KBLOCKFILE_CAST(b);
        ASSERT(buf);
        ASSERT(index < b->blk_cnt);
-       fseek(f->fp, index * b->blk_size, SEEK_SET);
-       return (fwrite(f->b.priv.buf, 1, b->blk_size, f->fp) == b->blk_size) ? 0 : EOF;
-}
-
-static int kblockfile_readBlock(struct KBlock *b, block_idx_t index, void *buf)
-{
-       KBlockFile *f = KBLOCKFILE_CAST(b);
-       ASSERT(buf);
-       ASSERT(index < b->blk_cnt);
-       fseek(f->fp, index * b->blk_size, SEEK_SET);
-       return (fread(f->b.priv.buf, 1, b->blk_size, f->fp) == b->blk_size) ? 0 : EOF;
+       fseek(f->fp, index * b->blk_size + offset, SEEK_SET);
+       return fwrite(buf, 1, size, f->fp);
 }
 
 static int kblockfile_error(struct KBlock *b)
@@ -123,13 +114,11 @@ static int kblockfile_close(struct KBlock *b)
 static const KBlockVTable kblockfile_hwbuffered_vt =
 {
        .readDirect = kblockfile_readDirect,
+
        .readBuf = kblockfile_readBuf,
        .writeBuf = kblockfile_writeBuf,
        .load = kblockfile_load,
        .store = kblockfile_store,
-       
-       .readBlock = kblock_swReadBlock,
-       .writeBlock = kblock_swWriteBlock,
 
        .error = kblockfile_error,
        .clearerr = kblockfile_claererr,
@@ -138,14 +127,13 @@ static const KBlockVTable kblockfile_hwbuffered_vt =
 
 static const KBlockVTable kblockfile_swbuffered_vt =
 {
-       .readDirect = kblock_swReadDirect,
+       .readDirect = kblockfile_readDirect,
+       .writeDirect =kblockfile_writeDirect,
+
        .readBuf = kblock_swReadBuf,
        .writeBuf = kblock_swWriteBuf,
        .load = kblock_swLoad,
        .store = kblock_swStore,
-       
-       .readBlock = kblockfile_readBlock,
-       .writeBlock =kblockfile_writeBlock,
 
        .error = kblockfile_error,
        .clearerr = kblockfile_claererr,
@@ -154,8 +142,8 @@ static const KBlockVTable kblockfile_swbuffered_vt =
 
 static const KBlockVTable kblockfile_unbuffered_vt =
 {
-       .readBlock = kblockfile_readBlock,
-       .writeBlock =kblockfile_writeBlock,
+       .readDirect = kblockfile_readDirect,
+       .writeDirect =kblockfile_writeDirect,
 
        .error = kblockfile_error,
        .clearerr = kblockfile_claererr,
@@ -177,7 +165,8 @@ void kblockfile_init(KBlockFile *f, FILE *fp, bool hwbuf, void *buf, size_t bloc
        f->fp = fp;
        f->b.blk_size = block_size;
        f->b.blk_cnt = block_count;
-       
+
+       f->b.priv.flags |= KB_PARTIAL_WRITE;
        if (buf)
        {
                f->b.priv.flags |= KB_BUFFERED;
@@ -188,7 +177,6 @@ void kblockfile_init(KBlockFile *f, FILE *fp, bool hwbuf, void *buf, size_t bloc
                        f->b.priv.vt = &kblockfile_swbuffered_vt;
                kblockfile_load(&f->b, 0);
                f->b.priv.curr_blk = 0;
-               f->b.priv.cache_dirty = false;
        }
        else
                f->b.priv.vt = &kblockfile_unbuffered_vt;