Mercurial > hg > th-libs
view th_ioctx.h @ 708:a34715d51ea4
Add support for deallocator function in th_cfg_free() for freeing the values.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 27 Apr 2020 00:44:15 +0300 |
parents | ec8fe89576ff |
children | 7aee25fbc504 |
line wrap: on
line source
/* * Simple I/O abstraction and context handling layer * Programmed and designed by Matti 'ccr' Hamalainen * (C) Copyright 2012-2020 Tecnic Software productions (TNSP) * * Please read file 'COPYING' for information on license and distribution. */ /// @file /// @brief Simple I/O abstraction and context handling layer #ifndef TH_IOCTX_H #define TH_IOCTX_H #include "th_util.h" #include <time.h> #ifdef __cplusplus extern "C" { #endif // // Typedefs and structures // struct th_ioctx; struct th_ioctx_ops; /** I/O context structure */ typedef struct th_ioctx { char *filename; ///< Context filename, if any. May be NULL. BOOL fallocated; ///< TRUE if filename is allocated, FALSE if "const" char *mode; ///< Context's stdio open "mode", may also be NULL. BOOL mallocated; ///< TRUE if mode string is allocated, FALSE if "const" BOOL allocated; ///< TRUE if this structure has been allocated void *data; ///< Internal data time_t atime; ///< Last access time int64_t size; ///< Size in bytes int status; ///< Status size_t line; ///< Line number // Mem data size_t maxSize; ///< Maximum size (0 = no limit) size_t memSize; ///< Size of data size_t memAlloc; ///< Amount allocated size_t minAlloc; ///< Minimum allocation increase (0 = default) off_t memOffset; ///< Current offset in data uint8_t *memData; ///< Pointer to data BOOL memFree; ///< TRUE = free the allocated memory on thfclose(), FALSE = no BOOL memWrite; ///< TRUE = memory can be written to / expanded etc. FALSE = no // Message functions void (*error)(struct th_ioctx *ctx, const int err, const char *msg); void (*msg)(struct th_ioctx *ctx, const int level, const char *msg); const struct th_ioctx_ops *fops; ///< Pointer to I/O ops struct to be used with this context } th_ioctx; typedef struct th_ioctx_ops { char *name; ///< Name of this I/O ops definition int (*fopen)(th_ioctx *ctx); void (*fclose)(th_ioctx *ctx); int (*freset)(th_ioctx *ctx); int (*ferror)(th_ioctx *ctx); int (*fseek)(th_ioctx *ctx, const off_t, const int whence); off_t (*fsize)(th_ioctx *ctx); off_t (*ftell)(th_ioctx *ctx); BOOL (*feof)(th_ioctx *ctx); int (*fgetc)(th_ioctx *ctx); int (*fputc)(int, th_ioctx *ctx); size_t (*fread)(void *ptr, const size_t, const size_t, th_ioctx *ctx); size_t (*fwrite)(const void *ptr, const size_t, const size_t, th_ioctx *ctx); char * (*fgets)(char *str, int size, th_ioctx *ctx); int (*fputs)(const char *str, th_ioctx *ctx); int (*vfprintf)(th_ioctx *ctx, const char *fmt, va_list ap); } th_ioctx_ops; // // Some basic iops // extern const th_ioctx_ops th_stdio_io_ops, th_mem_io_ops; // // I/O context management functions // th_ioctx * th_io_new(const th_ioctx_ops *fops, const char *filename, const char *mode); int th_io_fopen(th_ioctx **pctx, const th_ioctx_ops *fops, const char *filename, const char *mode); int th_io_reopen(th_ioctx *ctx, const char *mode); void th_io_close(th_ioctx *ctx); void th_io_init_stdio(th_ioctx *ctx, FILE *fh); BOOL th_io_set_handlers(th_ioctx *ctx, void (*error)(th_ioctx *, const int, const char *msg), void (*msg)(th_ioctx *, const int, const char *msg)); int th_io_error_v(th_ioctx *ctx, const int err, const char *fmt, va_list ap); void th_io_msg_v(th_ioctx *ctx, const int level, const char *fmt, va_list ap); int th_io_error(th_ioctx *ctx, const int err, const char *fmt, ...) TH_ATTR_PRINTF_FMT(3, 4); void th_io_msg(th_ioctx *ctx, const int level, const char *fmt, ...) TH_ATTR_PRINTF_FMT(3, 4); // // Basic I/O operations // int thfopen(th_ioctx *ctx); void thfclose(th_ioctx *ctx); int thfreset(th_ioctx *ctx); int thferror(th_ioctx *ctx); int thfseek(th_ioctx *ctx, const off_t, const int whence); off_t thfsize(th_ioctx *ctx); off_t thftell(th_ioctx *ctx); BOOL thfeof(th_ioctx *ctx); int thfgetc(th_ioctx *ctx); int thfputc(int ch, th_ioctx *ctx); size_t thfread(void *ptr, const size_t, const size_t, th_ioctx *ctx); size_t thfwrite(const void *, const size_t, const size_t, th_ioctx *ctx); char * thfgets(char *ptr, int size, th_ioctx *ctx); int thfputs(const char *ptr, th_ioctx *ctx); int thvfprintf(th_ioctx *ctx, const char *fmt, va_list ap); int thfprintf(th_ioctx *ctx, const char *fmt, ...) TH_ATTR_PRINTF_FMT(2, 3); BOOL thfread_str(th_ioctx *ctx, void *ptr, const size_t len); BOOL thfread_u8(th_ioctx *ctx, uint8_t *); BOOL thfwrite_str(th_ioctx *ctx, const void *ptr, const size_t len); BOOL thfwrite_u8(th_ioctx *ctx, const uint8_t); // // Endian-handling file read/write routines // BOOL thfwrite_ne16(th_ioctx *ctx, const uint16_t v); BOOL thfwrite_ne32(th_ioctx *ctx, const uint32_t v); BOOL thfwrite_ne64(th_ioctx *ctx, const uint64_t v); BOOL thfread_ne16(th_ioctx *ctx, uint16_t *v); BOOL thfread_ne32(th_ioctx *ctx, uint32_t *v); BOOL thfread_ne64(th_ioctx *ctx, uint64_t *v); BOOL thfwrite_le16(th_ioctx *ctx, const uint16_t v); BOOL thfwrite_le32(th_ioctx *ctx, const uint32_t v); BOOL thfwrite_le64(th_ioctx *ctx, const uint64_t v); BOOL thfread_le16(th_ioctx *ctx, uint16_t *v); BOOL thfread_le32(th_ioctx *ctx, uint32_t *v); BOOL thfread_le64(th_ioctx *ctx, uint64_t *v); BOOL thfwrite_be16(th_ioctx *ctx, const uint16_t v); BOOL thfwrite_be32(th_ioctx *ctx, const uint32_t v); BOOL thfwrite_be64(th_ioctx *ctx, const uint64_t v); BOOL thfread_be16(th_ioctx *ctx, uint16_t *v); BOOL thfread_be32(th_ioctx *ctx, uint32_t *v); BOOL thfread_be64(th_ioctx *ctx, uint64_t *v); #ifdef __cplusplus } #endif #endif // TH_IOCTX_H