* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
-#include "xpress.h"
-#include "compress.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "wimlib.h"
+#include "wimlib/assert.h"
+#include "wimlib/compress.h"
+#include "wimlib/error.h"
+#include "wimlib/util.h"
+#include "wimlib/xpress.h"
+
#include <stdlib.h>
#include <string.h>
* @codewords and @lens provide the Huffman code that is being used.
*/
static int
-xpress_write_match(struct output_bitstream *ostream, u32 match,
- const u16 codewords[], const u8 lens[])
+xpress_write_match(struct output_bitstream *restrict ostream,
+ u32 match,
+ const u16 codewords[restrict],
+ const u8 lens[restrict])
{
u32 adjusted_match_len = match & 0xffff;
u32 match_offset = match >> 16;
int ret;
ret = bitstream_put_bits(ostream, codewords[sym], lens[sym]);
- if (ret != 0)
+ if (ret)
return ret;
if (adjusted_match_len >= 0xf) {
u8 byte1 = min(adjusted_match_len - 0xf, 0xff);
ret = bitstream_put_byte(ostream, byte1);
- if (ret != 0)
+ if (ret)
return ret;
if (byte1 == 0xff) {
ret = bitstream_put_two_bytes(ostream, adjusted_match_len);
- if (ret != 0)
+ if (ret)
return ret;
}
}
static int
xpress_write_compressed_literals(struct output_bitstream *ostream,
- const u32 match_tab[],
+ const u32 match_tab[restrict],
unsigned num_matches,
- const u16 codewords[],
- const u8 lens[])
+ const u16 codewords[restrict],
+ const u8 lens[restrict])
{
for (unsigned i = 0; i < num_matches; i++) {
int ret;
else /* literal byte */
ret = bitstream_put_bits(ostream, codewords[match],
lens[match]);
- if (ret != 0)
+ if (ret)
return ret;
}
return bitstream_put_bits(ostream, codewords[XPRESS_END_OF_DATA],
}
static u32
-xpress_record_literal(u8 literal, void *__freq_tab)
+xpress_record_literal(u8 literal, void *_freq_tab)
{
- freq_t *freq_tab = __freq_tab;
+ freq_t *freq_tab = _freq_tab;
freq_tab[literal]++;
return literal;
}
static u32
xpress_record_match(unsigned match_offset, unsigned match_len,
- void *freq_tab, void *ignore)
+ void *freq_tab, void *_ignore)
{
wimlib_assert(match_len >= XPRESS_MIN_MATCH &&
match_len <= XPRESS_MAX_MATCH);
.too_far = 4096,
};
-/*
- * Performs XPRESS compression on a block of data.
- *
- * Please see the documentation for the 'compress_func_t' type in write.c for
- * the exact behavior of this function and how to call it.
- */
-#ifdef EXPORT_COMPRESSION_FUNCTIONS
-WIMLIBAPI
-#endif
-unsigned
-xpress_compress(const void *__uncompressed_data, unsigned uncompressed_len,
- void *__compressed_data)
+/* API function documented in wimlib.h */
+WIMLIBAPI unsigned
+wimlib_xpress_compress(const void * restrict _uncompressed_data,
+ unsigned uncompressed_len,
+ void * restrict _compressed_data)
{
- const u8 *uncompressed_data = __uncompressed_data;
- u8 *compressed_data = __compressed_data;
+ u8 *compressed_data = _compressed_data;
struct output_bitstream ostream;
u32 match_tab[uncompressed_len];
freq_t freq_tab[XPRESS_NUM_SYMBOLS];
unsigned compressed_len;
unsigned i;
int ret;
+ u8 uncompressed_data[uncompressed_len + 8];
+
+ memcpy(uncompressed_data, _uncompressed_data, uncompressed_len);
+ memset(uncompressed_data + uncompressed_len, 0, 8);
wimlib_assert(uncompressed_len <= 32768);
* the compressed data, in which case they are actually unnecessary, or
* they may precede a number of bytes embedded into the bitstream.) */
if (ostream.bit_output >
- (const u8*)__compressed_data + uncompressed_len - 3)
+ (const u8*)_compressed_data + uncompressed_len - 3)
return 0;
*(u16*)ostream.bit_output = cpu_to_le16(0);
- compressed_len = ostream.next_bit_output - (const u8*)__compressed_data;
+ compressed_len = ostream.next_bit_output - (const u8*)_compressed_data;
wimlib_assert(compressed_len <= uncompressed_len - 1);
#ifdef ENABLE_VERIFY_COMPRESSION
/* Verify that we really get the same thing back when decompressing. */
- u8 buf[uncompressed_len];
- ret = xpress_decompress(__compressed_data, compressed_len, buf,
- uncompressed_len);
- if (ret) {
- ERROR("xpress_compress(): Failed to decompress data we "
- "compressed");
- abort();
- }
- for (i = 0; i < uncompressed_len; i++) {
- if (buf[i] != uncompressed_data[i]) {
- ERROR("xpress_compress(): Data we compressed didn't "
- "decompress to the original data (difference at "
- "byte %u of %u)", i + 1, uncompressed_len);
+ {
+ u8 buf[uncompressed_len];
+ ret = wimlib_xpress_decompress(_compressed_data, compressed_len,
+ buf, uncompressed_len);
+ if (ret) {
+ ERROR("xpress_compress(): Failed to decompress data we "
+ "compressed");
abort();
}
+ for (i = 0; i < uncompressed_len; i++) {
+ if (buf[i] != uncompressed_data[i]) {
+ ERROR("xpress_compress(): Data we compressed didn't "
+ "decompress to the original data (difference at "
+ "byte %u of %u)", i + 1, uncompressed_len);
+ abort();
+ }
+ }
}
#endif
return compressed_len;