From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- support/dktools/dk3strmg.ctr | 126 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 support/dktools/dk3strmg.ctr (limited to 'support/dktools/dk3strmg.ctr') diff --git a/support/dktools/dk3strmg.ctr b/support/dktools/dk3strmg.ctr new file mode 100644 index 0000000000..304991c3c5 --- /dev/null +++ b/support/dktools/dk3strmg.ctr @@ -0,0 +1,126 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2011-xxxx +license = bsd + + + +%% module + +#include "dk3all.h" + + + +$(trace-include) + + +/** Low-level stream function to deal with gzip compression. + Closing the stream also closes the gzip-file. + @param api API structure. +*/ +static +void +dk3stream_gz_fct(dk3_stream_api_t *api) +{ +#if DK3_HAVE_ZLIB_H + int res = 0; /* Operation result. */ + gzFile g = NULL; /* Low-level I/O object. */ +#endif + api->suc = 0; + (api->res).sz = 0; + (api->res).ec = DK3_ERROR_NOT_SUPPORTED; +#if DK3_HAVE_ZLIB_H + (api->res).ec = 0; + g = (gzFile)((api->arg).d); + switch(api->cmd) { + case DK3_STREAM_API_READ: { + if(((api->arg).b) && ((api->arg).sz) && ((api->arg).d)) { + res = gzread(g, (api->arg).b, (int)((api->arg).sz)); + if(res > 0) { + api->suc = 1; (api->res).ec = 0; (api->res).sz = (size_t)res; + } + } + } break; + case DK3_STREAM_API_WRITE: { + if(((api->arg).b) && ((api->arg).sz) && ((api->arg).d)) { + res = gzwrite(g, (api->arg).b, (int)((api->arg).sz)); + (api->res).sz = (size_t)res; + if((size_t)res == (api->arg).sz) { + api->suc = 1; (api->res).ec = 0; + } + } + } break; + case DK3_STREAM_API_FLUSH: { + if((api->arg).d) { + if(gzflush(g, Z_FULL_FLUSH) == Z_OK) { + api->suc = 1; (api->res).ec = 0; + } + } + } break; + case DK3_STREAM_API_AT_END: { + if((api->arg).d) { + if(gzeof(g) == 1) { + api->suc = 1; + } + } + } break; + case DK3_STREAM_API_CLOSE: { + if((api->arg).d) { + if(gzclose(g) == Z_OK) { + api->suc = 1; + } + } + } break; + case DK3_STREAM_API_ZERO_IS_END: { + api->suc = 0; + } break; + case DK3_STREAM_API_ERROR: { + api->suc = 0; + } break; + } +#endif +} + + + +/** Low-level stream function to deal with gzip compression. + Closing the stream does not close the gzip-file. + @param api API structure. +*/ +static +void +dk3stream_gz_fct_no_close(dk3_stream_api_t *api) +{ + if(api->cmd != DK3_STREAM_API_CLOSE) { + dk3stream_gz_fct(api); + } else { + api->suc = 1; (api->res).ec = 0; + } +} + + +#if DK3_HAVE_ZLIB_H + +/** Open stream for existing gzFile. + @param g gzFile already opened. + @param fl Read/write flags. + @param app Application structure for diagnostics, may be NULL. + @return Pointer to new stream on success, NULL on error. +*/ +dk3_stream_t * +dk3stream_open_gz_app(gzFile g, int fl, dk3_app_t *app) +{ + dk3_stream_t *back = NULL; + if(g) { + back = dk3stream_open_app((void *)g, dk3stream_gz_fct_no_close, fl, app); + } + return back; +} + +#endif + + + +/* vim: set ai sw=2 : */ + -- cgit v1.2.3