X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxpress-decomp.c;h=45b52350abc8561d312ca53eb21a61a67786c0f1;hb=b5ebbcd5e245b48791404f1f88ee006f4eeec3a2;hp=0d1f68c5e6506468945d84d44b078ce919446ede;hpb=6f7956a06fcf92a304fae93e393e8eaee34e92d5;p=wimlib diff --git a/src/xpress-decomp.c b/src/xpress-decomp.c index 0d1f68c5..45b52350 100644 --- a/src/xpress-decomp.c +++ b/src/xpress-decomp.c @@ -11,16 +11,16 @@ * This file is part of wimlib, a library for working with WIM files. * * wimlib 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) + * 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. * * 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 Lesser General Public License for more + * 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 + * You should have received a copy of the GNU General Public License * along with wimlib; if not, see http://www.gnu.org/licenses/. */ @@ -83,7 +83,7 @@ /* 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; @@ -157,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]; @@ -225,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, + 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); }