X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Femul%2Fkfile_posix.c;fp=bertos%2Femul%2Fkfile_posix.c;h=3fce00bcf2b46b54bde179d7c4f18b8ce6fd6d25;hb=b1c122a36a111f4bb088a8f000a7fc8f8975734e;hp=0000000000000000000000000000000000000000;hpb=be0a17acfc88c13e609d4297f36e667c14bdd395;p=bertos.git diff --git a/bertos/emul/kfile_posix.c b/bertos/emul/kfile_posix.c new file mode 100644 index 00000000..3fce00bc --- /dev/null +++ b/bertos/emul/kfile_posix.c @@ -0,0 +1,97 @@ +/** + * \file + * + * + * \brief KFile interface implementation in Posix systems. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#include + +static size_t kfile_posix_read(struct KFile *_fd, void *buf, size_t size) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fread(buf, sizeof(uint8_t), size, fd->fp); +} + +static size_t kfile_posix_write(struct KFile *_fd, const void *buf, size_t size) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fwrite(buf, sizeof(uint8_t), size, fd->fp); +} + +static kfile_off_t kfile_posix_seek(struct KFile *_fd, kfile_off_t offset, KSeekMode whence) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + int std_whence; + switch (whence) + { + case KSM_SEEK_CUR: + std_whence = SEEK_CUR; + break; + case KSM_SEEK_END: + std_whence = SEEK_END; + break; + case KSM_SEEK_SET: + /* fall */ + default: + std_whence = SEEK_SET; + } + + return fseek(fd->fp, offset, std_whence); +} + +static int kfile_posix_close(struct KFile *_fd) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fclose(fd->fp); +} + +static int kfile_posix_flush(struct KFile *_fd) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fflush(fd->fp); +} + +FILE* kfile_posix_init(KFilePosix *file, const char *filename, const char *mode) +{ + file->fd._type = KFT_KFILEPOSIX; + file->fd.read = kfile_posix_read; + file->fd.write = kfile_posix_write; + file->fd.close = kfile_posix_close; + file->fd.seek = kfile_posix_seek; + file->fd.flush = kfile_posix_flush; + + file->fp = fopen(filename, mode); + return file->fp; +}