diff --git a/ArhiveFileList.hs b/ArhiveFileList.hs index fc526f9..4a0d1f2 100644 --- a/ArhiveFileList.hs +++ b/ArhiveFileList.hs @@ -339,11 +339,11 @@ splitToSolidBlocks command filelist = (dirs &&& [(aNO_COMPRESSION,dirs)]) else files.$ splitBy (opt_group_data command .$ addBlockSizeCrit) (opt_recompress command) .$ map (\x->(compressor,x)) where - -- Для цепочек алгоритмов, начинающихся с TTA/MM/JPG, отключить солид-сжатие + -- Для цепочек алгоритмов, начинающихся с non-solid алгоритмов (TTA/MM/JPG/BMF/...) - отключить солид-сжатие -- Для цепочек алгоритмов, начинающихся с DICT - ограничить солид-блок размером блока DICT -- Для остальных блочных алгоритмов (grzip, lzp) alone - размером блока в алгоритме сжатия. addBlockSizeCrit = case compressor of - algorithm:_ | makeNonSolid algorithm -> const [GroupNone] + algorithm:_ | isNonSolidMethod algorithm -> const [GroupNone] algorithm:_ | isDICT_Method algorithm -> ([GroupByBlockSize $ getBlockSize algorithm]++) [algorithm] | getBlockSize algorithm > 0 -> ([GroupByBlockSize $ getBlockSize algorithm]++) _ -> id @@ -353,8 +353,9 @@ splitToSolidBlocks command filelist = (dirs &&& [(aNO_COMPRESSION,dirs)]) -- когда алгоритм содержит строку "*8" и не содержит строки ":o", то есть -- все данные сжимаются как непрерывная последовательность байтов, которую -- нет нужды разбивать на отдельные блоки -makeNonSolid m = any_function [isTTA_Method, isMM_Method, isJPG_Method] m - && (not (m `substr` "*8") || (m `substr` ":o")) +--makeNonSolid m = compressionIs "MakeNonSolid" m +-- any_function [isTTA_Method, isMM_Method, isJPG_Method] m +-- && (not (m `substr` "*8") || (m `substr` ":o")) ---------------------------------------------------------------------------------------------------- diff --git a/Compression.hs b/Compression.hs index 826da02..5c51208 100644 --- a/Compression.hs +++ b/Compression.hs @@ -53,6 +53,8 @@ isMM_Method method = method_name method == "mm" isJPG_Method method = method_name method == "jpg" -- |GRZip метод сжатия. isGRZIP_Method method = method_name method == "grzip" +-- |Метод, которому нужно подавать файлы по одному на солид-блок (bmf, tta и так далее) +isNonSolidMethod = CompressionLib.compressionIs "nosolid?" -- |Очень быстрый метод упаковки (>10 mb/s на 1ГГц процессоре) isVeryFastMethod = CompressionLib.compressionIs "VeryFast?" -- |Быстрый метод распаковки diff --git a/Compression/External/C_External.cpp b/Compression/External/C_External.cpp index bfb8fc4..18d4331 100644 --- a/Compression/External/C_External.cpp +++ b/Compression/External/C_External.cpp @@ -338,6 +338,7 @@ int AddExternalCompressor (char *params) version[i].packcmd = ""; version[i].unpackcmd = ""; version[i].defaultopt = ""; + version[i].solid = 1; } @@ -376,6 +377,7 @@ int AddExternalCompressor (char *params) else if (strequ (left, "datafile")) version[i].datafile = subst (strdup_msg(right), "{compressor}", version[i].name); else if (strequ (left, "packedfile")) version[i].packedfile = subst (strdup_msg(right), "{compressor}", version[i].name); else if (strequ (left, "default")) version[i].defaultopt = subst (strdup_msg(right), "{compressor}", version[i].name); + else if (strequ (left, "solid")) version[i].solid = parseInt (right, &error); else error=1; if (error) return 0; diff --git a/Compression/External/C_External.h b/Compression/External/C_External.h index abd3d4b..0e25134 100644 --- a/Compression/External/C_External.h +++ b/Compression/External/C_External.h @@ -15,9 +15,9 @@ class EXTERNAL_METHOD : public COMPRESSION_METHOD public: // Параметры этого метода сжатия char *name; // Имя метода (pmm, ccm...) - bool can_set_mem; // Доступно изменение требований к памяти? - MemSize cmem; // Объём памяти, используемой для сжатия - MemSize dmem; // Объём памяти, используемой для распаковки + bool can_set_mem; // Доступно изменение требований к памяти? + MemSize cmem; // Объём памяти, используемой для сжатия + MemSize dmem; // Объём памяти, используемой для распаковки char *datafile; // Наименование файла с неупакованными данными char *packedfile; // Наименование файла с упакованными данными char *packcmd; // Команда упаковки данных (datafile -> packedfile) @@ -25,6 +25,7 @@ class EXTERNAL_METHOD : public COMPRESSION_METHOD char *options[MAX_PARAMETERS]; // Доп. параметры метода char option_strings[MAX_METHOD_STRLEN]; // Текстовый буфер для хранения текста параметров char *defaultopt; // Значения параметров по умолчанию + int solid; // Разрешено делать солид-блоки? // Параметры, специфичные для PPMonstr int order; // Порядок модели (по скольким последним сивмолам предсказывается следующий) @@ -36,6 +37,7 @@ class EXTERNAL_METHOD : public COMPRESSION_METHOD virtual int doit (char *what, int param, void *data, CALLBACK_FUNC *callback) { if (strequ (what,"external?")) return 1; + else if (strequ (what,"nosolid?")) return !solid; else return COMPRESSION_METHOD::doit (what, param, data, callback); }