Skip to content

Commit

Permalink
arc.ini: solid=0 in ext. compressor definition forces individual soli…
Browse files Browse the repository at this point in the history
…d block for every file compressed by this method (or by compression methods chain started with this method)

git-svn-id: https://freearc.svn.sourceforge.net/svnroot/freearc@488 3a4f7f31-9599-433d-91b1-573e8b61252c
  • Loading branch information
bulatz committed Aug 4, 2009
1 parent d876b7e commit 19f4725
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 7 deletions.
9 changes: 5 additions & 4 deletions ArhiveFileList.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"))


----------------------------------------------------------------------------------------------------
Expand Down
2 changes: 2 additions & 0 deletions Compression.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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?"
-- |Áûñòðûé ìåòîä ðàñïàêîâêè
Expand Down
2 changes: 2 additions & 0 deletions Compression/External/C_External.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@ int AddExternalCompressor (char *params)
version[i].packcmd = "";
version[i].unpackcmd = "";
version[i].defaultopt = "";
version[i].solid = 1;
}


Expand Down Expand Up @@ -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;
Expand Down
8 changes: 5 additions & 3 deletions Compression/External/C_External.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,17 @@ 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)
char *unpackcmd; // Команда распаковки данных (packedfile -> datafile)
char *options[MAX_PARAMETERS]; // Доп. параметры метода
char option_strings[MAX_METHOD_STRLEN]; // Текстовый буфер для хранения текста параметров
char *defaultopt; // Значения параметров по умолчанию
int solid; // Разрешено делать солид-блоки?

// Параметры, специфичные для PPMonstr
int order; // Порядок модели (по скольким последним сивмолам предсказывается следующий)
Expand All @@ -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);
}

Expand Down

0 comments on commit 19f4725

Please sign in to comment.