X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fcompress.c;h=89d1245f6d30ca355acf42f858661eb5456c8256;hb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518;hp=34e63997956c5a7bab91b600b06d140449a0772e;hpb=39f955331c7d8a5c3ff4ae44711f62581568f579;p=wimlib diff --git a/src/compress.c b/src/compress.c index 34e63997..89d1245f 100644 --- a/src/compress.c +++ b/src/compress.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2012 Eric Biggers + * Copyright (C) 2012, 2013 Eric Biggers * * This file is part of wimlib, a library for working with WIM files. * @@ -23,11 +23,20 @@ * along with wimlib; if not, see http://www.gnu.org/licenses/. */ -#include "compress.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + + +#include "wimlib/assert.h" +#include "wimlib/compress.h" +#include "wimlib/util.h" + #include #include -static inline void flush_bits(struct output_bitstream *ostream) +static inline void +flush_bits(struct output_bitstream *ostream) { *(u16*)ostream->bit_output = cpu_to_le16(ostream->bitbuf); ostream->bit_output = ostream->next_bit_output; @@ -38,8 +47,9 @@ static inline void flush_bits(struct output_bitstream *ostream) /* Writes @num_bits bits, given by the @num_bits least significant bits of * @bits, to the output @ostream. */ -int bitstream_put_bits(struct output_bitstream *ostream, output_bitbuf_t bits, - unsigned num_bits) +int +bitstream_put_bits(struct output_bitstream *ostream, output_bitbuf_t bits, + unsigned num_bits) { unsigned rem_bits; @@ -73,7 +83,8 @@ int bitstream_put_bits(struct output_bitstream *ostream, output_bitbuf_t bits, } /* Flushes any remaining bits in the output buffer to the output byte stream. */ -int flush_output_bitstream(struct output_bitstream *ostream) +int +flush_output_bitstream(struct output_bitstream *ostream) { if (ostream->num_bytes_remaining + (ostream->output - ostream->bit_output) < 2) @@ -87,8 +98,9 @@ int flush_output_bitstream(struct output_bitstream *ostream) /* Initializes an output bit buffer to write its output to the memory location * pointer to by @data. */ -void init_output_bitstream(struct output_bitstream *ostream, void *data, - unsigned num_bytes) +void +init_output_bitstream(struct output_bitstream *ostream, void *data, + unsigned num_bytes) { wimlib_assert(num_bytes >= 4); @@ -126,7 +138,8 @@ typedef struct { /* Comparator function for HuffmanLeafNodes. Sorts primarily by symbol * frequency and secondarily by symbol value. */ -static int cmp_leaves_by_freq(const void *__leaf1, const void *__leaf2) +static int +cmp_leaves_by_freq(const void *__leaf1, const void *__leaf2) { const HuffmanLeafNode *leaf1 = __leaf1; const HuffmanLeafNode *leaf2 = __leaf2; @@ -141,7 +154,8 @@ static int cmp_leaves_by_freq(const void *__leaf1, const void *__leaf2) /* Comparator function for HuffmanLeafNodes. Sorts primarily by code length and * secondarily by symbol value. */ -static int cmp_leaves_by_code_len(const void *__leaf1, const void *__leaf2) +static int +cmp_leaves_by_code_len(const void *__leaf1, const void *__leaf2) { const HuffmanLeafNode *leaf1 = __leaf1; const HuffmanLeafNode *leaf2 = __leaf2; @@ -156,7 +170,8 @@ static int cmp_leaves_by_code_len(const void *__leaf1, const void *__leaf2) /* Recursive function to calculate the depth of the leaves in a Huffman tree. * */ -static void huffman_tree_compute_path_lengths(HuffmanNode *node, u16 cur_len) +static void +huffman_tree_compute_path_lengths(HuffmanNode *node, u16 cur_len) { if (node->sym == (u16)(-1)) { /* Intermediate node. */ @@ -168,7 +183,8 @@ static void huffman_tree_compute_path_lengths(HuffmanNode *node, u16 cur_len) } } -/* Creates a canonical Huffman code from an array of symbol frequencies. +/* make_canonical_huffman_code: - Creates a canonical Huffman code from an array + * of symbol frequencies. * * The algorithm used is similar to the well-known algorithm that builds a * Huffman tree using a minheap. In that algorithm, the leaf nodes are @@ -223,9 +239,10 @@ static void huffman_tree_compute_path_lengths(HuffmanNode *node, u16 cur_len) * lens[i] bits of codewords[i] will contain the codeword * for symbol i. */ -void make_canonical_huffman_code(unsigned num_syms, unsigned max_codeword_len, - const u32 freq_tab[], u8 lens[], - u16 codewords[]) +void +make_canonical_huffman_code(unsigned num_syms, unsigned max_codeword_len, + const freq_t freq_tab[], u8 lens[], + u16 codewords[]) { /* We require at least 2 possible symbols in the alphabet to produce a * valid Huffman decoding table. It is allowed that fewer than 2 symbols @@ -350,14 +367,13 @@ try_building_tree_again: while (1) { /* Lowest frequency node. */ - HuffmanNode *f1 = NULL; + HuffmanNode *f1; /* Second lowest frequency node. */ - HuffmanNode *f2 = NULL; + HuffmanNode *f2; - /* Get the lowest and second lowest frequency nodes from - * the remaining leaves or from the intermediate nodes. - * */ + /* Get the lowest and second lowest frequency nodes from the + * remaining leaves or from the intermediate nodes. */ if (cur_leaf != end_leaf && (cur_inode == next_inode || cur_leaf->freq <= cur_inode->freq)) { @@ -371,11 +387,10 @@ try_building_tree_again: f2 = (HuffmanNode*)cur_leaf++; } else if (cur_inode != next_inode) { f2 = cur_inode++; - } - - /* All nodes used up! */ - if (f1 == NULL || f2 == NULL) + } else { + /* All nodes used up! */ break; + } /* next_inode becomes the parent of f1 and f2. */