force lzp to work in single block mode. breaking change.
diff --git a/etc/BENCHMARKS.md b/etc/BENCHMARKS.md
index 7318789..181d6f7 100644
--- a/etc/BENCHMARKS.md
+++ b/etc/BENCHMARKS.md
@@ -24,51 +24,51 @@ Note: These benchmarks are rarely updated.
891321 bzip2/calgary.tar.bz2
3265536 calgary.tar
-1229956 shakespeare.txt.bz3
-1479261 bzip2/shakespeare.txt.bz2
-5458199 shakespeare.txt
-
-2349193 decoda.tar.bz3
+2347279 decoda.tar.bz3
2580600 bzip2/decoda.tar.bz2
6154240 decoda.tar
-2052637 2b2t_signs.txt.bz3
+1229841 shakespeare.txt.bz3
+1479261 bzip2/shakespeare.txt.bz2
+5458199 shakespeare.txt
+
+2052611 2b2t_signs.txt.bz3
2388597 bzip2/2b2t_signs.txt.bz2
9635520 2b2t_signs.txt
-12827699 chinese.txt.bz3
-17952181 bzip2/chinese.txt.bz2
-79912971 chinese.txt
-
-48535494 audio.tar.bz3
+41187302 audio.tar.bz3
95526840 bzip2/audio.tar.bz2
115742720 audio.tar
-22684564 enwik8.bz3
+12753535 chinese.txt.bz3
+17952181 bzip2/chinese.txt.bz2
+79912971 chinese.txt
+
+22677653 enwik8.bz3
29008758 bzip2/enwik8.bz2
100000000 enwik8
-47251466 silesia.tar.bz3
+47227869 silesia.tar.bz3
54538771 bzip2/silesia.tar.bz2
211968000 silesia.tar
-8469526 lisp.mb.bz3
+8437744 lisp.mb.bz3
13462295 bzip2/lisp.mb.bz2
371331415 lisp.mb
-84950917 gcc.tar.bz3
+83624653 gcc.tar.bz3
109065903 bzip2/gcc.tar.bz2
824309760 gcc.tar
-129255792 linux.tar.bz3
-157810434 bzip2/linux.tar.bz2
-1215221760 linux.tar
-
-157642125 dna.tar.bz3
+157642135 dna.tar.bz3
180075480 bzip2/dna.tar.bz2
685619200 dna.tar
-407818170 Windows NT 4.0.vmdk.bz3
+129023226 linux.tar.bz3
+157810434 bzip2/linux.tar.bz2
+1215221760 linux.tar
+
+406343481 Windows NT 4.0.vmdk.bz3
437184515 bzip2/Windows NT 4.0.vmdk.bz2
804192256 Windows NT 4.0.vmdk
```
diff --git a/src/lzp.c b/src/lzp.c
index 15050a7..4354254 100644
--- a/src/lzp.c
+++ b/src/lzp.c
@@ -11,9 +11,7 @@
#define MATCH 0xf2
static inline s32 num_blocks(s32 n) {
- if (n < MiB(4)) return 1;
- if (n < MiB(16)) return 2;
- return 4;
+ return 1;
}
static s32 lzp_encode_block(const u8 * restrict in, const u8 * in_end, u8 * restrict out, u8 * out_end,
@@ -135,89 +133,13 @@ static s32 lzp_decode_block(const u8 * restrict in, const u8 * in_end, s32 * res
}
s32 lzp_compress(const u8 * restrict in, u8 * restrict out, s32 n, s32 hash, s32 m_len, s32 * restrict lut) {
- s32 nblk = num_blocks(n);
+ if (n - m_len < 32) return -1;
- if (nblk == 1) {
- if (n - m_len < 32) return -1;
-
- memset(lut, 0, sizeof(s32) * (1 << hash));
-
- s32 r = lzp_encode_block(in, in + n, out + 1, out + n - 1, lut, (s32)(1 << hash) - 1, m_len);
-
- if (r >= 0) {
- out[0] = 1;
- r++;
- }
-
- return r;
- }
-
- s32 out_ptr = 1 + 8 * nblk;
-
- out[0] = nblk;
- for (s32 b_id = 0; b_id < nblk; ++b_id) {
- s32 ins = b_id * (n / nblk);
- s32 insz = b_id != nblk - 1 ? n / nblk : n - ins;
- s32 outsz = insz;
- if (outsz > n - out_ptr) outsz = n - out_ptr;
-
- s32 r;
-
- if (insz - m_len < 32)
- r = -1;
- else {
- memset(lut, 0, sizeof(s32) * (1 << hash));
-
- r = lzp_encode_block(in + ins, in + ins + insz, out + out_ptr, out + out_ptr + outsz, lut,
- (s32)(1 << hash) - 1, m_len);
- }
-
- if (r < 0) {
- if (out_ptr + insz >= n) return -1;
- r = insz;
- memcpy(out + out_ptr, in + ins, insz);
- }
- memcpy(out + 1 + 8 * b_id + 0, &insz, sizeof(s32));
- memcpy(out + 1 + 8 * b_id + 4, &r, sizeof(s32));
-
- out_ptr += r;
- }
+ memset(lut, 0, sizeof(s32) * (1 << hash));
- return out_ptr;
+ return lzp_encode_block(in, in + n, out, out + n, lut, (s32)(1 << hash) - 1, m_len);
}
s32 lzp_decompress(const u8 * restrict in, u8 * restrict out, s32 n, s32 hash, s32 m_len, s32 * restrict lut) {
- s32 nblk = in[0];
-
- if (nblk == 1) return lzp_decode_block(in + 1, in + n, lut, out, hash, m_len);
-
- s32 dec[256];
-
- for (s32 b_id = 0; b_id < nblk; ++b_id) {
- s32 in_ptr = 0, out_ptr = 0;
- for (s32 p = 0; p < b_id; ++p) {
- in_ptr += *(s32 *)(in + 1 + 8 * p + 4);
- out_ptr += *(s32 *)(in + 1 + 8 * p + 0);
- }
-
- in_ptr += 1 + 8 * nblk;
-
- s32 insz = *(s32 *)(in + 1 + 8 * b_id + 4);
- s32 outsz = *(s32 *)(in + 1 + 8 * b_id + 0);
-
- if (insz != outsz) {
- dec[b_id] = lzp_decode_block(in + in_ptr, in + in_ptr + insz, lut, out + out_ptr, hash, m_len);
- } else {
- dec[b_id] = insz;
- memcpy(out + out_ptr, in + in_ptr, insz);
- }
- }
-
- s32 dataSize = 0, r = 0;
- for (s32 b_id = 0; b_id < nblk; ++b_id) {
- if (dec[b_id] < 0) r = dec[b_id];
- dataSize += dec[b_id];
- }
-
- return (r == 0) ? dataSize : r;
+ return lzp_decode_block(in, in + n, lut, out, hash, m_len);
}
