/* * Copyright (C) 2013 Patrick "P. J." McDermott * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ #include #include #include #include #include "compression.h" #include "logging.h" static void zlib_err(int status) { switch (status) { case Z_OK: case Z_STREAM_END: break; case Z_MEM_ERROR: err(1, "zlib error: out of memory"); break; case Z_VERSION_ERROR: err(1, "zlib error: incompatible library version"); break; case Z_STREAM_ERROR: err(1, "zlib error: invalid stream"); break; case Z_NEED_DICT: err(1, "zlib error: need dictionary"); break; case Z_DATA_ERROR: err(1, "zlib error: corrupted data"); break; case Z_BUF_ERROR: err(1, "zlib error: buffer error"); break; default: err(1, "zlib error: unknown"); break; } } void decompress(char *src, size_t src_len, char *dest, size_t dest_len) { z_stream d_stream; d_stream.zalloc = Z_NULL; d_stream.zfree = Z_NULL; d_stream.opaque = Z_NULL; d_stream.next_in = (Bytef *) src; d_stream.avail_in = src_len; d_stream.next_out = (Bytef *) dest; d_stream.avail_out = dest_len; #ifdef DEBUG_COMPRESSION debug("Initializing inflation stream..."); #endif zlib_err(inflateInit2(&d_stream, 15 + 32)); #ifdef DEBUG_COMPRESSION debug("Inflating %d bytes into up to %d bytes...", src_len, dest_len); #endif zlib_err(inflate(&d_stream, Z_NO_FLUSH)); #ifdef DEBUG_COMPRESSION debug("Ending inflation stream..."); #endif zlib_err(inflateEnd(&d_stream)); }