X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdecomp.h;h=0bd2a69f2f68f8d395e9eab284705f762da85b9b;hb=034fd063f956d0806e557680a36a69a42556a776;hp=ed828c428463255e06ab3b5afe031aac307fd102;hpb=885632f08c75c1d7bb5d25436231c78f6ad7e0c0;p=wimlib diff --git a/src/decomp.h b/src/decomp.h index ed828c42..0bd2a69f 100644 --- a/src/decomp.h +++ b/src/decomp.h @@ -2,23 +2,6 @@ * decomp.h * * Functions useful for decompression, mainly bitstreams. - * - * Copyright (C) 2012 Eric Biggers - * - * wimlib - 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. - * - * 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. - * - * 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 */ #ifndef _WIMLIB_DECOMP_H @@ -36,21 +19,21 @@ struct input_bitstream { /* A variable of length at least 32 bits that is used to hold bits that * have been read from the stream. The bits are ordered from high-order * to low-order; the next bit is always the high-order bit. */ - input_bitbuf_t bitbuf; + input_bitbuf_t bitbuf; /* Pointer to the next byte to be retrieved from the input. */ - const u8 *data; + const u8 *data; /* Number of bits in @bitbuf that are valid. */ - uint bitsleft; + unsigned bitsleft; /* Number of words of data that are left. */ - uint data_bytes_left; + unsigned data_bytes_left; }; /* Initializes a bitstream to receive its input from @data. */ -static inline void init_input_bitstream(struct input_bitstream *istream, - const void *data, uint num_data_bytes) +static inline void init_input_bitstream(struct input_bitstream *istream, + const void *data, unsigned num_data_bytes) { istream->bitbuf = 0; istream->bitsleft = 0; @@ -59,8 +42,8 @@ static inline void init_input_bitstream(struct input_bitstream *istream, } /* Ensures that the bit buffer contains @num_bits bits. */ -static inline int bitstream_ensure_bits(struct input_bitstream *istream, - uint num_bits) +static inline int bitstream_ensure_bits(struct input_bitstream *istream, + unsigned num_bits) { wimlib_assert(num_bits <= 16); @@ -79,9 +62,9 @@ static inline int bitstream_ensure_bits(struct input_bitstream *istream, if (istream->data_bytes_left < 2) return 1; - uint shift = sizeof(input_bitbuf_t) * 8 - 16 - - istream->bitsleft; - istream->bitbuf |= (input_bitbuf_t)to_le16( + unsigned shift = sizeof(input_bitbuf_t) * 8 - 16 - + istream->bitsleft; + istream->bitbuf |= (input_bitbuf_t)le16_to_cpu( *(u16*)istream->data) << shift; istream->data += 2; istream->bitsleft += 16; @@ -92,8 +75,8 @@ static inline int bitstream_ensure_bits(struct input_bitstream *istream, /* Returns the next @num_bits bits in the bit buffer. It must contain at least * @num_bits bits to call this function. */ -static inline uint bitstream_peek_bits(const struct input_bitstream *istream, - uint num_bits) +static inline unsigned +bitstream_peek_bits(const struct input_bitstream *istream, unsigned num_bits) { if (num_bits == 0) return 0; @@ -102,21 +85,21 @@ static inline uint bitstream_peek_bits(const struct input_bitstream *istream, /* Removes @num_bits bits from the bit buffer. It must contain at least * @num_bits bits to call this function. */ -static inline void bitstream_remove_bits(struct input_bitstream *istream, - uint num_bits) +static inline void bitstream_remove_bits(struct input_bitstream *istream, + unsigned num_bits) { istream->bitbuf <<= num_bits; istream->bitsleft -= num_bits; } /* Reads and returns @num_bits bits from the input bitstream. */ -static inline int bitstream_read_bits(struct input_bitstream *istream, - uint num_bits, uint *n) +static inline int bitstream_read_bits(struct input_bitstream *istream, + unsigned num_bits, unsigned *n) { int ret; ret = bitstream_ensure_bits(istream, num_bits); if (ret != 0) { - ERROR("bitstream_read_bits(): Input buffer exhausted\n"); + ERROR("bitstream_read_bits(): Input buffer exhausted"); return ret; } *n = bitstream_peek_bits(istream, num_bits); @@ -128,7 +111,7 @@ static inline int bitstream_read_bits(struct input_bitstream *istream, * compressed bitstream. These bytes are basically separate from the bitstream, * as they come AFTER the bits that are currently in the buffer variable (based * on reading 16 bits at a time), even though the buffer variable may not be - * empty. + * empty. * * This function returns the next such literal length byte in the input * bitstream. Returns -1 if we are at the end of the bitstream. */ @@ -137,7 +120,7 @@ static inline int bitstream_read_byte(struct input_bitstream *istream) wimlib_assert(istream->bitsleft < 32); if (istream->data_bytes_left == 0) { - ERROR("bitstream_read_byte(): Input buffer exhausted\n"); + ERROR("bitstream_read_byte(): Input buffer exhausted"); return -1; } istream->data_bytes_left--; @@ -146,10 +129,10 @@ static inline int bitstream_read_byte(struct input_bitstream *istream) /* Reads @num_bits bits from the bit buffer without checking to see if that many * bits are in the buffer or not. */ -static inline uint bitstream_read_bits_nocheck(struct input_bitstream *istream, - uint num_bits) +static inline unsigned +bitstream_read_bits_nocheck(struct input_bitstream *istream, unsigned num_bits) { - uint n = bitstream_peek_bits(istream, num_bits); + unsigned n = bitstream_peek_bits(istream, num_bits); bitstream_remove_bits(istream, num_bits); return n; } @@ -159,13 +142,25 @@ static inline void flush_input_bitstream(struct input_bitstream *istream) { bitstream_remove_bits(istream, istream->bitsleft); istream->bitsleft = 0; - istream->bitbuf = 0; + istream->bitbuf = 0; } -extern int bitstream_read_bytes(struct input_bitstream *istream, size_t n, +extern int bitstream_read_bytes(struct input_bitstream *istream, size_t n, void *dest); -extern int align_input_bitstream(struct input_bitstream *istream, +extern int align_input_bitstream(struct input_bitstream *istream, bool skip_word_if_aligned); +extern int read_huffsym(struct input_bitstream *stream, + const u16 decode_table[], + const u8 lengths[], + unsigned num_symbols, + unsigned table_bits, + unsigned *n, + unsigned max_codeword_len); + +extern int make_huffman_decode_table(u16 decode_table[], unsigned num_syms, + unsigned num_bits, const u8 lengths[], + unsigned max_codeword_len); + #endif /* _WIMLIB_DECOMP_H */