X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fstruct%2Fkfile_mem.c;fp=bertos%2Fstruct%2Fkfile_mem.c;h=5560fdc6181c7af6b58b9e1a9d1ec73ec64784ff;hb=e4b96c973d54ffbd7950253295c6686a9db08b0a;hp=0000000000000000000000000000000000000000;hpb=97b217a3c33051e68cc0c77374d543e2d5903fcc;p=bertos.git diff --git a/bertos/struct/kfile_mem.c b/bertos/struct/kfile_mem.c new file mode 100644 index 00000000..5560fdc6 --- /dev/null +++ b/bertos/struct/kfile_mem.c @@ -0,0 +1,83 @@ +/** + * \file + * + * + * \brief KFile interface over a memory buffer. + * + * \version $Id: cfg_adc.h 2348 2009-02-16 13:43:44Z duplo $ + * \author Francesco Sacchi + */ + +#include "kfile_mem.h" + +#include + +#include + +static size_t kfilemem_read(struct KFile *_fd, void *buf, size_t size) +{ + KFileMem *fd = KFILEMEM_CAST(_fd); + + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + uint8_t *mem = (uint8_t *)fd->mem; + memcpy(buf, mem + fd->fd.seek_pos, size); + fd->fd.seek_pos += size; + + return size; +} + +static size_t kfilemem_write(struct KFile *_fd, const void *buf, size_t size) +{ + KFileMem *fd = KFILEMEM_CAST(_fd); + + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + uint8_t *mem = (uint8_t *)fd->mem; + memcpy(mem + fd->fd.seek_pos, buf, size); + fd->fd.seek_pos += size; + + return size; +} + +void kfilemem_init(KFileMem *km, void *mem, size_t len) +{ + ASSERT(km); + ASSERT(mem); + ASSERT(len); + + memset(km, 0, sizeof(*km)); + + km->mem = mem; + kfile_init(&km->fd); + km->fd.read = kfilemem_read; + km->fd.write = kfilemem_write; + km->fd.size = len; + DB(km->fd._type = KFT_KFILEMEM); +}