Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: MacBinaryフィルタに関して(Re: File::Magicでの挙動)
- From: Yukio USUDA <usuda@xxxxxxxxxx>
- Date: Tue, 29 Jul 2003 22:10:42 +0900
- X-ml-name: namazu-devel-ja
- X-mail-count: 03151
- References: <3F265EE2.262D369A@asahi-net.or.jp>
臼田です
Tadamasa Teranishi wrote:
> > > 誤解でした。どうも addMagicEntry で追加した場合に And できない問題
> > > のようです。
問題のaddMagicEntryを見ると
sub addMagicEntry {
my $self = shift;
my $entry = shift;
unshift @{$self->{magic}}, [$entry, -1, []];
return $self;
}
上記のように配列の先頭にそのまま新しいMagicEntryを追加しております。
しかし、File-MMagic内でMagicEntry追加をしているreadMagicEntryを見ると
sub readMagicEntry {
my ($pa_magic, $MF, $depth) = @_;
という引数に対して
$entry = [ $line , $$MF[2], [] ];
# add to list
push(@$pa_magic,$entry);
としており、通常の$entry追加は上記のようにpushで行っていますが
and扱いにする際は
# call ourselves recursively. will return the depth
# of the entry following the nested group.
if (readMagicEntry($entry->[2], $MF, $depth+1) < $depth ||
$$MF[0]->eof())
{
return;
}
となっており、再起呼び出しする際にMagicEntryの登録先を変えています
$entryに直接書かずに$entry->[2]としており
呼び出しされたMagicEntry内の3つ目の配列要素に書き込んでいると思います。
多分and登録専用の別サブルーチンを用意してあげるのが
よいのだろうと思われます。とりあえず作ってみたものが
sub addMagicEntry2 {
my $self = shift;
my $entry = shift;
my $entry2 = shift;
my $ent = [$entry, -1, []];
unshift @{$self->{magic}}, $ent;
my $ent2 = [$entry2, -1, []];
my $p = $ent->[2];
push(@$p, $ent2);
return $self;
}
です。
$magic->addMagicEntry2("0\tstring\tstr\t",
">10\tstring\tstr2\ttext/foo");
として呼び出しています
> 0123456789str2
> str3456789str2
の2種類のファイルを区別して動作しているような
感じです。
16/18 - /usr/home/usuda/namazu-2.0.13pre4/tests/data/en/this_is_foo.txt [text/fo
o]
17/18 - /usr/home/usuda/namazu-2.0.13pre4/tests/data/en/this_isnt_foo.txt [text/
plain]
ただ、本当にこれで大丈夫なのか自信がありません
また、2つのandまでしか対応していないのと
大変ダサいのが気になるのでどなたかぜひ修正してください。
臼田幸生