#--------- получение опций комстроки -------
# сделано почти по логике утилит db_*
# если есть опция -fi - то читаем из файла, если нет - то из потока (аналогично опции -fo с выводом)

#разбиваем параметры комстоки на пары и создаем из них хэш ключ-значение
%OPTS = @ARGV;

#если есть значение у ключа -fi, то это - путь исходного файла
# ... но если этого ключа нет - будем читать входящий поток
if ($OPTS{'-fi'})
	{
	open $FI, "<$OPTS{'-fi'}" or die "Can't open input file $fi\n$!\n$usage";
	} else {$FI = STDIN;}

#и аналогично для -fo
if ($OPTS{'-fo'})
	{
	open $FO, ">$OPTS{'-fo'}" or die "Can't open output file $fo\n$!\n$usage";
	} else {$FO = STDOUT;}

#--------- /получение опций комстроки -------

#печатаем "правильный" заголовок очищенного дампа
print $FO	
'VERSION=3
format=bytevalue
database=
type=btree
db_pagesize=1024
HEADER=END
';

#перебираем строки файла (<$FI> считывает строку в переменную $_)
while (<$FI>)
{
#если строка по длине совпадает с длиной ключа (18-неверсионный, 22 - версионный), то:
if (length $_ == 18 or length $_ == 22)
	{
	$key = $_;
	$tile = <$FI>;	# читаем следующую строчку - это предположительно тайл
	#.. но поскольку изредка бывает, что идут подряд ключи без тайлов, то чтобы не потерять тайлы, 
	# необходимо "сдвигать" рамку считывания до тех пор, пока длина второй строки не перестанет равняться длине ключа:
	while (length $tile == 18 or length $tile == 22) {$key = $tile; $tile = <$FI>;}

#$file_beg - hex-начало тайла, записанное текстовыми символами (ffd8ff)
	if (length $key == 18) {$file_beg = substr $tile, 85, 6;}	#неверсионный, начало тайла на 86-м символе
	if (length $key == 22) {$file_beg = substr $tile, 97, 6;}	#версионный, начало тайла на 98-м символе
	$file_end = substr $tile, -5, 4;		#это в любом случае hex-конец тайла

#проверем валидность hex-сигнатур начала и конца тайла: jpg = ffd8ff .. ffd9, png = 89504e .. 6082
#либо, если key заканчивается на ffff (служебные ключи версионного, а также неверсионного кешей), то тайл выводим без проверки hex-сигнатур
	if ( ($file_beg eq 'ffd8ff' and $file_end eq 'ffd9') or ($file_beg eq '89504e' and $file_end eq '6082') or substr($key, -5, 4) eq 'ffff')
		{
		print $FO $key, $tile;
		}
	}
}

print $FO 'DATA=END'."\n"; #печатаем хвост дампа и последнюю пустую строку (без нее db_dump ругается)