%% options copyright owner = Dirk Krause copyright year = 2011-2014 license = bsd %% module #include "dk3all.h" $(trace-include) /** Low-level stream function to deal with bzip2 compression. Closing the stream also closes the bzip2-file. @param api API structure. */ static void dk3stream_bz_fct(dk3_stream_api_t *api) { #if DK3_HAVE_BZLIB_H BZFILE *b = NULL; /* Low level I/O object. */ int res = 0; /* Operation result. */ #endif api->suc = 0; (api->res).sz = 0; (api->res).ec = DK3_ERROR_NOT_SUPPORTED; #if DK3_HAVE_BZLIB_H b = (BZFILE *)((api->arg).d); (api->res).ec = 0; switch(api->cmd) { case DK3_STREAM_API_READ: { if(((api->arg).b) && ((api->arg).sz) && ((api->arg).d)) { res = BZ2_bzread(b, (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 = BZ2_bzwrite(b, (api->arg).b, (int)((api->arg).sz)); if(res > 0) { (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) { BZ2_bzflush(b); api->suc = 1; (api->res).ec = 0; /* As the library manual explains BZ2_bzflush() does nothing. So we always return success. */ } } break; case DK3_STREAM_API_AT_END: { } break; case DK3_STREAM_API_CLOSE: { if((api->arg).d) { BZ2_bzclose(b); api->suc = 1; (api->res).ec = 0; } } break; case DK3_STREAM_API_ZERO_IS_END: { api->suc = 1; (api->res).ec = 0; /* Correct if necessary */ } break; case DK3_STREAM_API_ERROR: { } break; } #endif } /** Low-level stream function to deal with bzip2 compression. Closing the stream does not close the bzip2 file. @param api API structure. */ static void dk3stream_bz_fct_no_close(dk3_stream_api_t *api) { if(api->cmd != DK3_STREAM_API_CLOSE) { dk3stream_bz_fct(api); } else { api->suc = 1; (api->res).ec = 0; } } #if DK3_HAVE_BZLIB_H /** Open a stream for an existing BZFILE. @param b BZFILE 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_bz2_app(BZFILE *b, int fl, dk3_app_t *app) { dk3_stream_t *back = NULL; if(b) { back = dk3stream_open_app((void *)b, dk3stream_bz_fct_no_close, fl, app); } return back; } #endif /* vim: set ai sw=2 : */