1 ///////////////////////////////////////////////////////////////////////////////
4 /// \brief Encode files using LZMA_SYNC_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
;
68 lzma_options_lzma opt_lzma
= {
69 .dict_size
= 1U << 16,
70 .lc
= LZMA_LC_DEFAULT
,
71 .lp
= LZMA_LP_DEFAULT
,
72 .pb
= LZMA_PB_DEFAULT
,
74 .mode
= LZMA_MODE_NORMAL
,
80 lzma_options_delta opt_delta
= {
84 lzma_filter filters
[LZMA_FILTERS_MAX
+ 1];
85 filters
[0].id
= LZMA_FILTER_LZMA2
;
86 filters
[0].options
= &opt_lzma
;
87 filters
[1].id
= LZMA_VLI_UNKNOWN
;
90 if (lzma_stream_encoder(&strm
, filters
, LZMA_CHECK_CRC32
) != LZMA_OK
) {
91 fprintf(stderr
, "init failed\n");
96 encode(0, LZMA_SYNC_FLUSH
);
97 encode(6, LZMA_SYNC_FLUSH
);
98 encode(0, LZMA_SYNC_FLUSH
);
99 encode(7, LZMA_SYNC_FLUSH
);
100 encode(0, LZMA_SYNC_FLUSH
);
101 encode(0, LZMA_FINISH
);
104 encode(53, LZMA_SYNC_FLUSH);
108 if (lzma_filters_update(&strm, filters) != LZMA_OK) {
109 fprintf(stderr, "update failed\n");
112 encode(404, LZMA_FINISH);
120 // Prevent useless warnings so we don't need to have special CFLAGS
121 // to disable -Werror.