1 ///////////////////////////////////////////////////////////////////////////////
4 /// \brief Encode files using LZMA_FULL_FLUSH
6 // Author: Lasse Collin
8 // This file has been put into the public domain.
9 // You can do whatever you want with this file.
11 ///////////////////////////////////////////////////////////////////////////////
18 static lzma_stream strm
= LZMA_STREAM_INIT
;
23 encode(size_t size
, lzma_action action
)
25 static const size_t CHUNK
= 64;
31 if (strm
.avail_in
== 0 && size
> 0) {
32 const size_t amount
= my_min(size
, CHUNK
);
33 strm
.avail_in
= fread(in
, 1, amount
, file_in
);
35 size
-= amount
; // Intentionally not using avail_in.
39 strm
.avail_out
= CHUNK
;
41 ret
= lzma_code(&strm
, size
== 0 ? action
: LZMA_RUN
);
43 if (ret
!= LZMA_OK
&& ret
!= LZMA_STREAM_END
) {
44 fprintf(stderr
, "%s:%u: %s: ret == %d\n",
45 __FILE__
, __LINE__
, __func__
, ret
);
49 fwrite(out
, 1, CHUNK
- strm
.avail_out
, stdout
);
51 } while (size
> 0 || strm
.avail_out
== 0);
53 if ((action
== LZMA_RUN
&& ret
!= LZMA_OK
)
54 || (action
!= LZMA_RUN
&& ret
!= LZMA_STREAM_END
)) {
55 fprintf(stderr
, "%s:%u: %s: ret == %d\n",
56 __FILE__
, __LINE__
, __func__
, ret
);
63 main(int argc
, char **argv
)
65 file_in
= argc
> 1 ? fopen(argv
[1], "rb") : stdin
;
69 lzma_options_lzma opt_lzma
;
70 if (lzma_lzma_preset(&opt_lzma
, 1)) {
71 fprintf(stderr
, "preset failed\n");
74 lzma_filter filters
[LZMA_FILTERS_MAX
+ 1];
75 filters
[0].id
= LZMA_FILTER_LZMA2
;
76 filters
[0].options
= &opt_lzma
;
77 filters
[1].id
= LZMA_VLI_UNKNOWN
;
80 if (lzma_stream_encoder(&strm
, filters
, LZMA_CHECK_CRC32
) != LZMA_OK
) {
81 fprintf(stderr
, "init failed\n");
85 // if (lzma_easy_encoder(&strm, 1)) {
86 // fprintf(stderr, "init failed\n");
91 encode(0, LZMA_FULL_FLUSH
);
92 encode(6, LZMA_FULL_FLUSH
);
93 encode(0, LZMA_FULL_FLUSH
);
94 encode(7, LZMA_FULL_FLUSH
);
95 encode(0, LZMA_FULL_FLUSH
);
96 encode(0, LZMA_FINISH
);