diff --git a/src/liblzma/api/lzma/container.h b/src/liblzma/api/lzma/container.h index ba2c4f8..daf0edc 100644 --- a/src/liblzma/api/lzma/container.h +++ b/src/liblzma/api/lzma/container.h @@ -47,7 +47,7 @@ /* * Preset flags * - * Currently only one flag is defined. + * Currently only two flags are defined. */ /** @@ -63,6 +63,13 @@ */ #define LZMA_PRESET_EXTREME (UINT32_C(1) << 31) +/** + * \brief Text compression preset + * + * TODO + */ +#define LZMA_PRESET_TEXT (UINT32_C(1) << 18) + /** * \brief Calculate rough memory usage of easy encoder diff --git a/src/liblzma/lzma/lzma_encoder_presets.c b/src/liblzma/lzma/lzma_encoder_presets.c index 31928d6..74e66ff 100644 --- a/src/liblzma/lzma/lzma_encoder_presets.c +++ b/src/liblzma/lzma/lzma_encoder_presets.c @@ -25,7 +25,7 @@ lzma_lzma_preset(lzma_options_lzma *options, uint32_t preset) { const uint32_t level = preset & LZMA_PRESET_LEVEL_MASK; const uint32_t flags = preset & ~LZMA_PRESET_LEVEL_MASK; - const uint32_t supported_flags = LZMA_PRESET_EXTREME; + const uint32_t supported_flags = LZMA_PRESET_EXTREME | LZMA_PRESET_TEXT; if (level > 9 || (flags & ~supported_flags)) return true; @@ -56,5 +56,16 @@ lzma_lzma_preset(lzma_options_lzma *options, uint32_t preset) options->depth = 512; } + if (flags & LZMA_PRESET_TEXT) { + options->dict_size = LZMA_PRESET_TEXT; + options->lc = 3; + options->lp = 0; + options->pb = 0; + options->mode = LZMA_MODE_NORMAL; + options->nice_len = 273; + options->mf = LZMA_MF_BT4; + options->depth = 512; + } + return false; } diff --git a/src/xz/args.c b/src/xz/args.c index c9d1dc1..9d848fb 100644 --- a/src/xz/args.c +++ b/src/xz/args.c @@ -51,6 +51,8 @@ parse_real(args_info *args, int argc, char **argv) OPT_FILES, OPT_FILES0, + + OPT_TEXT, }; static const char short_opts[] = "cC:defF:hHlkM:qrS:tT:vVz0123456789"; @@ -83,6 +85,7 @@ parse_real(args_info *args, int argc, char **argv) { "extreme", no_argument, NULL, 'e' }, { "fast", no_argument, NULL, '0' }, { "best", no_argument, NULL, '9' }, + { "text", no_argument, NULL, OPT_TEXT }, // Filters { "lzma1", optional_argument, NULL, OPT_LZMA1 }, @@ -327,6 +330,10 @@ parse_real(args_info *args, int argc, char **argv) break; + case OPT_TEXT: + coder_set_text(); + break; + default: message_try_help(); my_exit(E_ERROR); diff --git a/src/xz/process.c b/src/xz/process.c index e6870f8..12bc8a7 100644 --- a/src/xz/process.c +++ b/src/xz/process.c @@ -50,6 +50,9 @@ static bool preset_default = true; /// compression ratio. static bool preset_extreme = false; +/// TODO: Description.. +static bool preset_text = false; + /// Integrity check type static lzma_check check = LZMA_CHECK_CRC64; @@ -80,6 +83,14 @@ coder_set_extreme(void) extern void +coder_set_text(void) +{ + preset_text = true; + return; +} + + +extern void coder_add_filter(lzma_vli id, void *options) { if (filters_count == LZMA_FILTERS_MAX) @@ -127,6 +138,9 @@ coder_set_compression_settings(void) if (preset_extreme) preset_number |= LZMA_PRESET_EXTREME; + if (preset_text) + preset_number |= LZMA_PRESET_TEXT; + if (lzma_lzma_preset(&opt_lzma, preset_number)) message_bug(); diff --git a/src/xz/process.h b/src/xz/process.h index 3848528..964ad79 100644 --- a/src/xz/process.h +++ b/src/xz/process.h @@ -60,6 +60,9 @@ extern void coder_set_preset(size_t new_preset); /// Enable extreme mode extern void coder_set_extreme(void); +/// Enable text mode +extern void coder_set_text(void); + /// Add a filter to the custom filter chain extern void coder_add_filter(lzma_vli id, void *options);