%% options copyright owner = Dirk Krause copyright year = 2015-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** @file Generic dk4_stream_t API for input and output, implementation for FILE. CRT on Windows: Required. */ #ifndef DK4CONF_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" #else #include #endif #endif #ifndef DK4STRM_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4strm.h" #else #include #endif #endif #ifndef STDIO_H_INCLUDED #include #define STDIO_H_INCLUDED 1 #endif #ifdef __cplusplus extern "C" { #endif /** Low level function to access a FILE. @param api The stream API structure for arguments and results. */ void dk4stream_file_function(dk4_stream_api_t *api); /** Low level function to access a FILE and close it on dk4stream_close(). @param api The stream API structure for arguments and results. */ void dk4stream_file_with_close_function(dk4_stream_api_t *api); /** Open a stream for an existing file. @param fipo Existing file, not closed on dk4stream_close(). @param fl Access flag: DK4_STREAM_READ, DK4_STREAM_WRITE or (DK4_STREAM_READ | DK4_STREAM_WRITE). @param ibs Input buffer size (0 for default). @param obs Output buffer size (0 for default). @param erp Error report, may be NULL. @return Pointer to stream on success, NULL on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if obj or fct is NULL or fl is invalid, - DK4_E_MATH_OVERFLOW
if ibs or obs is too large, - DK4_E_MEMORY_ALLOCATION_FAILED
if allocation of input or output buffer failed. */ dk4_stream_t * dk4stream_open_for_file( FILE *fipo, int fl, size_t ibs, size_t obs, dk4_er_t *erp ); /** Open a stream for an existing file. @param fipo Existing file, closed on dk4stream_close(). @param fl Access flag: DK4_STREAM_READ,, DK4_STREAM_WRITE or (DK4_STREAM_READ | DK4_STREAM_WRITE). @param ibs Input buffer size (0 for default). @param obs Output buffer size (0 for default). @param erp Error report, may be NULL. @return Pointer to stream on success, NULL on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if obj or fct is NULL or fl is invalid, - DK4_E_MATH_OVERFLOW
if ibs or obs is too large, - DK4_E_MEMORY_ALLOCATION_FAILED
if allocation of input or output buffer failed. */ dk4_stream_t * dk4stream_open_for_file_with_close( FILE *fipo, int fl, size_t ibs, size_t obs, dk4_er_t *erp ); #ifdef __cplusplus } #endif %% module #include "dk4conf.h" #include "dk4strmf.h" #ifndef STDIO_H_INCLUDED #include #define STDIO_H_INCLUDED 1 #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif void dk4stream_file_with_close_function(dk4_stream_api_t *api) { FILE *fipo; size_t res; #if DK4_USE_ASSERT assert(NULL != api); #endif if (NULL != api) { api->res = 0; api->sz_out = 0; fipo = (FILE *)(api->d); if (NULL != fipo) { switch (api->cmd) { case DK4_STREAM_API_READ: { res = fread(api->b, 1, api->sz_in, fipo); api->sz_out = res; if (0 < res) { api->res = 1; } } break; case DK4_STREAM_API_WRITE: { if (0 < api->sz_in) { res = fwrite(api->b, 1, api->sz_in, fipo); if (res == api->sz_in) { api->res = 1; } api->sz_out = res; } else { api->res = 1; } } break; case DK4_STREAM_API_FLUSH: { if (0 == fflush(fipo)) { api->res = 1; } } break; case DK4_STREAM_API_AT_END: { if (0 != feof(fipo)) { api->res = 1; } } break; case DK4_STREAM_API_CLOSE: { if (0 == fclose(fipo)) { api->res = 1; } } break; } } } } void dk4stream_file_function(dk4_stream_api_t *api) { #if DK4_USE_ASSERT assert(NULL != api); #endif if (NULL != api) { switch (api->cmd) { case DK4_STREAM_API_CLOSE: { api->res = 1; } break; default: { dk4stream_file_with_close_function(api); } break; } } } dk4_stream_t * dk4stream_open_for_file( FILE *fipo, int fl, size_t ibs, size_t obs, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != fipo); #endif return ( dk4stream_open( (void *)fipo, dk4stream_file_function, fl, ibs, obs, erp ) ); } dk4_stream_t * dk4stream_open_for_file_with_close( FILE *fipo, int fl, size_t ibs, size_t obs, dk4_er_t *erp ) { #if DK4_USE_ASSERT assert(NULL != fipo); #endif return ( dk4stream_open( (void *)fipo, dk4stream_file_with_close_function, fl, ibs, obs, erp ) ); }