X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxpress-decomp.c;h=45b52350abc8561d312ca53eb21a61a67786c0f1;hb=b5ebbcd5e245b48791404f1f88ee006f4eeec3a2;hp=267720e2a8327e2fd5bfcb45a9ed3651410f6f09;hpb=885632f08c75c1d7bb5d25436231c78f6ad7e0c0;p=wimlib diff --git a/src/xpress-decomp.c b/src/xpress-decomp.c index 267720e2..45b52350 100644 --- a/src/xpress-decomp.c +++ b/src/xpress-decomp.c @@ -2,23 +2,26 @@ * xpress-decomp.c * * XPRESS decompression routines. + */ + +/* * * Copyright (C) 2012 Eric Biggers * - * wimlib - Library for working with WIM files + * This file is part of wimlib, a library for working with WIM files. * - * This library 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 2.1 of the License, or (at your option) any - * later version. + * wimlib 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. * - * This library 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. + * wimlib 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 Lesser General Public License along - * with this library; if not, write to the Free Software Foundation, Inc., 59 - * Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the GNU General Public License + * along with wimlib; if not, see http://www.gnu.org/licenses/. */ @@ -66,7 +69,7 @@ * the end. Otherwise Microsoft's software will fail to decompress the * XPRESS-compressed data. * - * Howeve, WIMLIB's decompressor in xpress-decomp.c currently does not care if + * Howeve, wimlib's decompressor in xpress-decomp.c currently does not care if * this extra symbol is there or not. */ @@ -77,13 +80,10 @@ #define XPRESS_DECOMP #include "decomp.h" -#include "huffman.h" - - /* Decodes @huffsym, a value >= XPRESS_NUM_CHARS, that is the header of a match. * */ -static int xpress_decode_match(int huffsym, uint window_pos, uint window_len, +static int xpress_decode_match(int huffsym, uint window_pos, uint window_len, u8 window[], struct input_bitstream *istream) { uint match_len; @@ -138,15 +138,14 @@ static int xpress_decode_match(int huffsym, uint window_pos, uint window_len, if (window_pos + match_len > window_len) { ERROR("XPRESS dedecompression error: match of length %d " - "bytes overflows window\n", match_len); + "bytes overflows window", match_len); return -1; } if (match_src < window) { ERROR("XPRESS decompression error: match of length %d bytes " - "references data before window (match_offset = " - "%d, window_pos = %d)\n", match_len, - match_offset, window_pos); + "references data before window (match_offset = %d, " + "window_pos = %d)", match_len, match_offset, window_pos); return -1; } @@ -158,41 +157,45 @@ static int xpress_decode_match(int huffsym, uint window_pos, uint window_len, /* Decodes the Huffman-encoded matches and literal bytes in a block of * XPRESS-encoded data. */ -static int xpress_decompress_literals(struct input_bitstream *istream, - u8 uncompressed_data[], - uint uncompressed_len, - const u8 lens[], +static int xpress_decompress_literals(struct input_bitstream *istream, + u8 uncompressed_data[], + uint uncompressed_len, + const u8 lens[], const u16 decode_table[]) { uint curpos = 0; uint huffsym; int match_len; - int ret; + int ret = 0; while (curpos < uncompressed_len) { - ret = read_huffsym(istream, decode_table, lens, - XPRESS_NUM_SYMBOLS, XPRESS_TABLEBITS, &huffsym, - XPRESS_MAX_CODEWORD_LEN); + ret = read_huffsym(istream, decode_table, lens, + XPRESS_NUM_SYMBOLS, XPRESS_TABLEBITS, + &huffsym, XPRESS_MAX_CODEWORD_LEN); if (ret != 0) - return ret; + break; if (huffsym < XPRESS_NUM_CHARS) { uncompressed_data[curpos++] = huffsym; } else { - match_len = xpress_decode_match(huffsym, curpos, - uncompressed_len, - uncompressed_data, istream); - if (match_len == -1) - return 1; + match_len = xpress_decode_match(huffsym, + curpos, + uncompressed_len, + uncompressed_data, + istream); + if (match_len == -1) { + ret = 1; + break; + } curpos += match_len; } } - return 0; + return ret; } -int xpress_decompress(const void *__compressed_data, uint compressed_len, - void *uncompressed_data, uint uncompressed_len) +int xpress_decompress(const void *__compressed_data, uint compressed_len, + void *uncompressed_data, uint uncompressed_len) { u8 lens[XPRESS_NUM_SYMBOLS]; u16 decode_table[(1 << XPRESS_TABLEBITS) + 2 * XPRESS_NUM_SYMBOLS]; @@ -205,8 +208,8 @@ int xpress_decompress(const void *__compressed_data, uint compressed_len, compressed_data = __compressed_data; lens_p = lens; - DEBUG2("compressed_len = %d, uncompressed_len = %d\n", - compressed_len, uncompressed_len); + DEBUG2("compressed_len = %d, uncompressed_len = %d", + compressed_len, uncompressed_len); /* XPRESS uses only one Huffman tree. It contains 512 symbols, and the * code lengths of these symbols are given literally as 4-bit integers @@ -226,9 +229,10 @@ int xpress_decompress(const void *__compressed_data, uint compressed_len, if (ret != 0) return ret; - init_input_bitstream(&istream, compressed_data + XPRESS_NUM_SYMBOLS / 2, - compressed_len - XPRESS_NUM_SYMBOLS / 2); + init_input_bitstream(&istream, compressed_data + XPRESS_NUM_SYMBOLS / 2, + compressed_len - XPRESS_NUM_SYMBOLS / 2); - return xpress_decompress_literals(&istream, uncompressed_data, - uncompressed_len, lens, decode_table); + return xpress_decompress_literals(&istream, uncompressed_data, + uncompressed_len, lens, + decode_table); }