/* * Copyright (C) 2013 P. J. McDermott * * This file is part of Dodge Balls * * Dodge Balls is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dodge Balls 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Dodge Balls. If not, see . */ #include #include #include "compression.h" #include "output.h" static void _db_zlib_err(int status) { switch (status) { case Z_OK: case Z_STREAM_END: break; case Z_MEM_ERROR: db_err("zlib error: out of memory"); break; case Z_VERSION_ERROR: db_err("zlib error: incompatible library version"); break; case Z_STREAM_ERROR: db_err("zlib error: invalid stream"); break; case Z_NEED_DICT: db_err("zlib error: need dictionary"); break; case Z_DATA_ERROR: db_err("zlib error: corrupted data"); break; case Z_BUF_ERROR: db_err("zlib error: buffer error"); break; default: db_err("zlib error: unknown"); break; } } void db_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; db_dbg("Initializing inflation stream..."); _db_zlib_err(inflateInit2(&d_stream, 15 + 32)); db_dbg("Inflating %zu bytes into up to %zu bytes...", src_len, dest_len); _db_zlib_err(inflate(&d_stream, Z_NO_FLUSH)); db_dbg("Ending inflation stream..."); _db_zlib_err(inflateEnd(&d_stream)); }