]> wimlib.net Git - wimlib/blobdiff - src/lzx-compress.c
portability and compression cleanups
[wimlib] / src / lzx-compress.c
index a9745b62c8a74973114e1088a358468d1123d8cc..201a1cfb52c3984322a4266bbf627c8e0f177e29 100644 (file)
@@ -7,20 +7,18 @@
 /*
  * Copyright (C) 2012, 2013, 2014 Eric Biggers
  *
- * This file is part of wimlib, a library for working with WIM files.
+ * This file 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 3 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.
- *
- * 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
+ * This file 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 General Public License
- * along with wimlib; if not, see http://www.gnu.org/licenses/.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this file; if not, see http://www.gnu.org/licenses/.
  */
 
 
@@ -359,7 +357,7 @@ lzx_write_varbits(struct lzx_output_bitstream *os,
 
                /* Write a coding unit, unless it would overflow the buffer.  */
                if (os->next != os->end)
-                       *os->next++ = cpu_to_le16(os->bitbuf >> os->bitcount);
+                       put_unaligned_u16_le(os->bitbuf >> os->bitcount, os->next++);
 
                /* If writing 17 bits, a second coding unit might need to be
                 * written.  But because 'max_num_bits' is a compile-time
@@ -367,7 +365,7 @@ lzx_write_varbits(struct lzx_output_bitstream *os,
                 * call sites.  */
                if (max_num_bits == 17 && os->bitcount == 16) {
                        if (os->next != os->end)
-                               *os->next++ = cpu_to_le16(os->bitbuf);
+                               put_unaligned_u16_le(os->bitbuf, os->next++);
                        os->bitcount = 0;
                }
        }
@@ -393,7 +391,7 @@ lzx_flush_output(struct lzx_output_bitstream *os)
                return 0;
 
        if (os->bitcount != 0)
-               *os->next++ = cpu_to_le16(os->bitbuf << (16 - os->bitcount));
+               put_unaligned_u16_le(os->bitbuf << (16 - os->bitcount), os->next++);
 
        return (const u8 *)os->next - (const u8 *)os->start;
 }
@@ -904,8 +902,7 @@ lzx_get_matches_nocache_multiblock(struct lzx_compressor *c,
  * offset.
  */
 static inline unsigned
-lzx_get_matches(struct lzx_compressor *c,
-               const struct lz_match **matches_ret)
+lzx_get_matches(struct lzx_compressor *c, const struct lz_match **matches_ret)
 {
        return (*c->get_matches_func)(c, matches_ret);
 }
@@ -1207,7 +1204,7 @@ lzx_match_cost_raw(unsigned len, unsigned offset_slot,
        unsigned main_symbol;
 
        if (len - LZX_MIN_MATCH_LEN < LZX_NUM_PRIMARY_LENS) {
-               len_header = len - LZX_MIN_MATCH_LEN ;
+               len_header = len - LZX_MIN_MATCH_LEN;
                cost = 0;
        } else {
                len_header = LZX_NUM_PRIMARY_LENS;
@@ -1788,6 +1785,8 @@ lzx_choose_lazy_items_for_block(struct lzx_compressor *c,
                         * length 3 match.  Output the previous match if there
                         * is one; otherwise output a literal.  */
 
+               no_match_found:
+
                        if (prev_len) {
                                skip_len = prev_len - 2;
                                goto output_prev_match;
@@ -1825,11 +1824,8 @@ lzx_choose_lazy_items_for_block(struct lzx_compressor *c,
                if (unlikely(cur_len > block_end - (window_ptr - 1))) {
                        /* Nearing end of block.  */
                        cur_len = block_end - (window_ptr - 1);
-                       if (cur_len < 3) {
-                               lzx_declare_literal(c, *(window_ptr - 1), &next_chosen_item);
-                               prev_len = 0;
-                               continue;
-                       }
+                       if (cur_len < 3)
+                               goto no_match_found;
                }
 
                if (prev_len == 0 || cur_score > prev_score) {
@@ -1893,11 +1889,11 @@ static int
 lzx_choose_verbatim_or_aligned(const struct lzx_freqs * freqs,
                               const struct lzx_codes * codes)
 {
-       unsigned aligned_cost = 0;
-       unsigned verbatim_cost = 0;
+       u32 aligned_cost = 0;
+       u32 verbatim_cost = 0;
 
-       /* A verbatim block require 3 bits in each place that an aligned symbol
-        * was used.  */
+       /* A verbatim block requires 3 bits in each place that an aligned symbol
+        * would be used in an aligned offset block.  */
        for (unsigned i = 0; i < LZX_ALIGNEDCODE_NUM_SYMBOLS; i++) {
                verbatim_cost += 3 * freqs->aligned[i];
                aligned_cost += codes->lens.aligned[i] * freqs->aligned[i];