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 ///////////////////////////////////////////////////////////////////////////////
20 static lzma_stream strm
= LZMA_STREAM_INIT
;
25 encode(size_t size
, lzma_action action
)
32 if (strm
.avail_in
== 0 && size
> 0) {
33 const size_t amount
= my_min(size
, CHUNK
);
34 strm
.avail_in
= fread(in
, 1, amount
, file_in
);
36 size
-= amount
; // Intentionally not using avail_in.
40 strm
.avail_out
= CHUNK
;
42 ret
= lzma_code(&strm
, size
== 0 ? action
: LZMA_RUN
);
44 if (ret
!= LZMA_OK
&& ret
!= LZMA_STREAM_END
) {
45 fprintf(stderr
, "%s:%u: %s: ret == %d\n",
46 __FILE__
, __LINE__
, __func__
, ret
);
50 fwrite(out
, 1, CHUNK
- strm
.avail_out
, stdout
);
52 } while (size
> 0 || strm
.avail_out
== 0);
54 if ((action
== LZMA_RUN
&& ret
!= LZMA_OK
)
55 || (action
!= LZMA_RUN
&& ret
!= LZMA_STREAM_END
)) {
56 fprintf(stderr
, "%s:%u: %s: ret == %d\n",
57 __FILE__
, __LINE__
, __func__
, ret
);
64 main(int argc
, char **argv
)
66 file_in
= argc
> 1 ? fopen(argv
[1], "rb") : stdin
;
70 lzma_options_lzma opt_lzma
;
71 if (lzma_lzma_preset(&opt_lzma
, 1)) {
72 fprintf(stderr
, "preset failed\n");
75 lzma_filter filters
[LZMA_FILTERS_MAX
+ 1];
76 filters
[0].id
= LZMA_FILTER_LZMA2
;
77 filters
[0].options
= &opt_lzma
;
78 filters
[1].id
= LZMA_VLI_UNKNOWN
;
81 if (lzma_stream_encoder(&strm
, filters
, LZMA_CHECK_CRC32
) != LZMA_OK
) {
82 fprintf(stderr
, "init failed\n");
86 // if (lzma_easy_encoder(&strm, 1)) {
87 // fprintf(stderr, "init failed\n");
92 encode(0, LZMA_FULL_FLUSH
);
93 encode(6, LZMA_FULL_FLUSH
);
94 encode(0, LZMA_FULL_FLUSH
);
95 encode(7, LZMA_FULL_FLUSH
);
96 encode(0, LZMA_FULL_FLUSH
);
97 encode(0, LZMA_FINISH
);