summaryrefslogtreecommitdiff
path: root/support/dktools/dk3strmg.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk3strmg.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk3strmg.ctr')
-rw-r--r--support/dktools/dk3strmg.ctr126
1 files changed, 126 insertions, 0 deletions
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 : */
+