[WIP] [PATCH v0.0-20200229 11/11] ez: lzma: add test program
Gao Xiang
hsiangkao at aol.com
Sat Feb 29 15:50:17 AEDT 2020
Usage:
$ ./run.sh
$ ./a.out output.bin.lzma infile
It will compress the beginning as much
as possible into 4k RAW LZMA block.
Signed-off-by: Gao Xiang <hsiangkao at aol.com>
---
lzma/lzma_encoder.c | 115 ++++++++++++++++++++++++++++++++++++++++++++
lzma/run.sh | 1 +
2 files changed, 116 insertions(+)
create mode 100755 lzma/run.sh
diff --git a/lzma/lzma_encoder.c b/lzma/lzma_encoder.c
index 98cde22..7c4b51d 100644
--- a/lzma/lzma_encoder.c
+++ b/lzma/lzma_encoder.c
@@ -757,3 +757,118 @@ void lzma_default_properties(struct lzma_properties *p, int level)
p->mf.depth = (16 + (p->mf.nice_len >> 1)) >> 1;
}
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#if 0
+const char text[] = "HABEABDABABABHHHEAAAAAAAA";
+#elif 0
+const char text[] = "abcde_bcdefgh_abcdefghxxxxxxx";
+#else
+const char text[] = "The only time we actually leave the path spinning is if we're truncating "
+"a small amount and don't actually free an extent, which is not a common "
+"occurrence. We have to set the path blocking in order to add the "
+"delayed ref anyway, so the first extent we find we set the path to "
+"blocking and stay blocking for the duration of the operation. With the "
+"upcoming file extent map stuff there will be another case that we have "
+"to have the path blocking, so just swap to blocking always.";
+#endif
+
+static const uint8_t lzma_header[] = {
+ 0x5D, /* LZMA model properties (lc, lp, pb) in encoded form */
+ 0x00, 0x00, 0x80, 0x00, /* Dictionary size (32-bit unsigned integer, little-endian) */
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, /* Uncompressed size (64-bit unsigned integer, little-endian) */
+};
+
+int main(int argc, char *argv[])
+{
+ char *outfile;
+ struct lzma_encoder lzmaenc = {0};
+ struct lzma_properties props = {
+ .mf.dictsize = 65536,
+ };
+ struct lzma_encoder_destsize dstsize;
+ uint8_t buf[4096];
+ int inf, outf;
+
+ int err;
+
+ lzmaenc.mf.buffer = malloc(65536) + 1;
+ lzmaenc.mf.buffer[-1] = 0;
+
+ if (argc >= 3) {
+ int len;
+
+ inf = open(argv[2], O_RDONLY);
+
+ len = lseek(inf, 0, SEEK_END);
+ if (len >= 65535)
+ len = 65535;
+
+ printf("len: %d\n", len);
+
+ lseek(inf, 0, SEEK_SET);
+ read(inf, lzmaenc.mf.buffer, len);
+ close(inf);
+ lzmaenc.mf.iend = lzmaenc.mf.buffer + len;
+ } else {
+ memcpy(lzmaenc.mf.buffer, text, sizeof(text));
+ lzmaenc.mf.iend = lzmaenc.mf.buffer + sizeof(text);
+ }
+ lzmaenc.op = buf;
+ lzmaenc.oend = buf + sizeof(buf);
+ lzmaenc.finish = true;
+
+ lzmaenc.need_eopm = true;
+ dstsize.capacity = 4096 - sizeof(lzma_header); //UINT32_MAX;
+ lzmaenc.dstsize = &dstsize;
+
+
+ lzma_default_properties(&props, 5);
+ lzma_encoder_reset(&lzmaenc, &props);
+
+ err = __lzma_encode(&lzmaenc);
+
+ printf("%d\n", err);
+
+ rc_encode(&lzmaenc.rc, &lzmaenc.op, lzmaenc.oend);
+
+ if (err != -ERANGE) {
+ memcpy(lzmaenc.op, dstsize.ending, dstsize.esz);
+ lzmaenc.op += dstsize.esz;
+ } else {
+ encode_eopm(&lzmaenc);
+ rc_flush(&lzmaenc.rc);
+
+ rc_encode(&lzmaenc.rc, &lzmaenc.op, lzmaenc.oend);
+ }
+
+ printf("encoded length: %lu + %lu\n", lzmaenc.op - buf,
+ sizeof(lzma_header));
+
+ if (argc < 2)
+ outfile = "output.bin.lzma";
+ else
+ outfile = argv[1];
+
+ outf = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ write(outf, lzma_header, sizeof(lzma_header));
+ write(outf, buf, lzmaenc.op - buf);
+ close(outf);
+
+#if 0
+ nliterals = lzma_get_optimum_fast(&lzmaenc, &back_res, &len_res);
+ printf("nlits %d (%d %d)\n", nliterals, back_res, len_res);
+ encode_sequence(&lzmaenc, nliterals, back_res, len_res, &position);
+ nliterals = lzma_get_optimum_fast(&lzmaenc, &back_res, &len_res);
+ printf("nlits %d (%d %d)\n", nliterals, back_res, len_res);
+ nliterals = lzma_get_optimum_fast(&lzmaenc, &back_res, &len_res);
+ printf("nlits %d (%d %d)\n", nliterals, back_res, len_res);
+ nliterals = lzma_get_optimum_fast(&lzmaenc, &back_res, &len_res);
+ printf("nlits %d (%d %d)\n", nliterals, back_res, len_res);
+#endif
+}
+
diff --git a/lzma/run.sh b/lzma/run.sh
new file mode 100755
index 0000000..57adc12
--- /dev/null
+++ b/lzma/run.sh
@@ -0,0 +1 @@
+gcc -Wall -g -I ../include lzma_encoder.c mf.c
--
2.20.1
More information about the Linux-erofs
mailing list