*
* \brief Virtual KFile I/O interface.
* KFile is a generic interface for file I/O.
- * Uses an of object oriented model to supply
+ * It uses an object-oriented model to supply
* a generic interface for drivers to communicate.
- * This module contains only definitions,data structure
+ * This module contains only definitions, the instance structure
* and an API.
- * Each KFile user should implement at least some core functions.
+ * Each KFile user should implement at least some methods.
* E.G.
* If you have a serial driver and want to comply to KFile interface,
* you have to declare your context structure:
* \endcode
* KFILESERIAL macro helps to ensure that obj passed is really a Serial.
*
- * KFile interface do not supply the open function: this is done deliberately,
+ * KFile interface do not supply the open function: this is deliberate,
* because in embedded systems each device has its own init parameters.
* For the same reason specific file settings (like baudrate for Serial, for example)
* are demanded to specific driver implementation.
#include <cfg/compiler.h>
#include <cfg/debug.h>
+#include <cfg/macros.h>
/* fwd decl */
struct KFile;
/**
* Prototypes for KFile access functions.
- * I/O file function must be ANSI compliant.
+ * I/O file functions must be ANSI compliant.
* \note A KFile user can choose which function subset to implement,
* but has to set to NULL unimplemented features.
* \{
typedef void (*ClearErrFunc_t) (struct KFile *fd);
/* \} */
-/**
- * KFile type.
- * Used at runtime and in debug mode only to check
- * "dynamic casts".
- * \note Add here new KFile types.
- */
-typedef enum KFileType
-{
- KFT_GENERIC, ///< Generic
- KFT_SERIAL, ///< Serial driver
- KFT_BATTFS, ///< BattFS file
- KFT_CNT
-} KFileType;
-
/**
* Context data for callback functions which operate on
* pseudo files.
FlushFunc_t flush;
ErrorFunc_t error;
ClearErrFunc_t clearerr;
- DB(KFileType _type); ///< Used to keep trace, at runtime, of obj type.
+ DB(id_t _type); ///< Used to keep trace, at runtime, of obj type.
/* NOTE: these must _NOT_ be size_t on 16bit CPUs! */
uint32_t seek_pos;
} KFile;
/**
- * Check if \a fd is a generic KFile type.
+ * Generic implementation of kfile_seek.
*/
-#define KFILE_ASSERT_GENERIC(fd) ASSERT(fd->_type == KFT_GENERIC)
+kfile_off_t kfile_genericSeek(struct KFile *fd, kfile_off_t offset, KSeekMode whence);
/**
- * Generic implementation of kfile_seek.
+ * Generic implementation of kfile_reopen.
*/
-kfile_off_t kfile_genericSeek(struct KFile *fd, kfile_off_t offset, KSeekMode whence);
+struct KFile * kfile_genericReopen(struct KFile *fd);
int kfile_putc(int c, struct KFile *fd); ///< Generic putc implementation using kfile_write.
int kfile_getc(struct KFile *fd); ///< Generic getc implementation using kfile_read.