Mercurial > hg > th-libs
view th_ioctx.h @ 209:462b837ea492
Change io context API. Again.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 12 Feb 2016 03:00:19 +0200 |
parents | 3635415a2d03 |
children | 2341776f880b |
line wrap: on
line source
/* * Simple I/O abstraction and context handling layer * Programmed and designed by Matti 'ccr' Hamalainen * (C) Copyright 2012,2016 Tecnic Software productions (TNSP) * * Please read file 'COPYING' for information on license and distribution. */ #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; typedef struct th_ioctx { char *filename; char *mode; void *data; time_t atime; int64_t size; int errno; size_t line; void (*error)(struct th_ioctx *, const int err, const char *msg); void (*msg)(struct th_ioctx *, const int level, const char *msg); const struct th_ioctx_ops *fops; } th_ioctx; typedef struct th_ioctx_ops { char *name; 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; // // I/O context management functions // th_ioctx * th_io_new(const th_ioctx_ops *fops, const char *filename); int th_io_open(th_ioctx *ctx, const char *mode); th_ioctx * th_io_fopen(const th_ioctx_ops *fops, const char *filename, const char *mode); void th_io_close(th_ioctx *ctx); void th_io_free(th_ioctx *ctx); 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)); void 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); void th_io_error(th_ioctx *ctx, const int err, const char *fmt, ...); void th_io_msg(th_ioctx *ctx, const int level, const char *fmt, ...); // // Basic I/O operations // 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, ...); int thfread_str(th_ioctx *ctx, void *ptr, const size_t len); BOOL thfread_byte(th_ioctx *ctx, uint8_t *); int thfwrite_str(th_ioctx *ctx, const void *ptr, const size_t len); BOOL thfwrite_byte(th_ioctx *ctx, const uint8_t); // // Endian-handling file read/write routines // #define TH_DEFINE_HEADER(xname, xtype) \ BOOL thfread_ ## xname (th_ioctx *ctx, xtype *v); \ BOOL thfwrite_ ## xname (th_ioctx *ctx, const xtype v); TH_DEFINE_HEADER(le16, uint16_t) TH_DEFINE_HEADER(le32, uint32_t) TH_DEFINE_HEADER(be16, uint16_t) TH_DEFINE_HEADER(be32, uint32_t) TH_DEFINE_HEADER(be64, uint64_t) TH_DEFINE_HEADER(le64, uint64_t) #undef TH_DEFINE_HEADER #ifdef __cplusplus } #endif #endif // TH_IOCTX_H