Namazu-devel-ja(旧)


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

Re: File-MMagic (Re: ichitaro)



<20000228182733P.satoru-t@xxxxxxxxxxxxxxxxxx>の記事において
satoru-t@xxxxxxxxxxxxxxxxxxさんは書きました。

>> >  checktype_filehandle() なら正しく判別されると思います。
>> 
>> 駄目みたいです。

  うーん、おかしいですね... あ、良くみたら自分の script は
checktype_contents() を使ってました。しかし、その挙動は妙です。

  こちらで使っている script を末尾につけておきますので、一度そちらでも
試してみてもらえませんでしょうか。

  それから、念のため

# perl -MFile::MMagic -e '$m = new File::MMagic; print "$File::MMagic::VERSION\n"; $m->check_magic();'

  を実行した結果も見せてもらえませんでしょうか。
-- 
野首 貴嗣
E-mail: knok@xxxxxxxxxxxxx (private)
        nokubi@xxxxxxxxx (official)

#! /usr/local/perl5/bin/perl -w

use strict;

#use FileHandle;
use File::MMagic; 
use Compress::Zlib;

for my $filename (@ARGV) {
	my $mm = new File::MMagic;
    $mm->addSpecials("text/plain; x-type=rfc",
                        "^Network Working Group",
                        "^Request for Comments:",
                        "^Obsoletes:",
                        "^Category:",
                        "^Updates:");
    $mm->addSpecials("application/x-tex",
        '^\\\\document(style|class)');
    $mm->addFileExts('\\.tex$', 'application/x-tex');

	my $fh = new FileHandle "< $filename";
	my $cont = join('', <$fh>);
	my $type = $mm->checktype_contents($cont);
	if ($type =~ /^application\/x-gzip/) {
		{
			my $offset = 0;
			$offset += 3;
			my $flags = unpack('C', substr($cont, $offset, 1));
			$offset += 1;
			$offset += 6;
			$cont = substr($cont, $offset);
			$cont = substr($cont, 2) if ($flags & 0x04);
			$cont =~ s/^[^\0]*\0// if ($flags & 0x08);
			$cont =~ s/^[^\0]*\0// if ($flags & 0x10);
			$cont = substr($cont, 2) if ($flags & 0x02);
		}
		my $x = inflateInit(-WindowBits     =>  - MAX_WBITS()) ;
		my ($inf, $stat) = $x->inflate($cont);
		$cont = $inf if $stat == Z_OK or $stat == Z_STREAM_END ;
		$type = $mm->checktype_contents($cont);
		print "Compressed:"
	}
	print "$type\n";
}