Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: MacBinaryフィルタに関して(Re: File::Magicでの挙動)



臼田です

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までしか対応していないのと
大変ダサいのが気になるのでどなたかぜひ修正してください。

臼田幸生