namazu-dev(ring)


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

Re: File::MMagic



<199909050415.NAA22486@xxxxxxxxxxxxxx>の記事において
masao@xxxxxxxxxxさんは書きました。

>> File::MMagic::check_binary() の判定基準で、
>> TAB(0x09)もバイナリとしてしまっているバグがありました。
>> ## 一応、TAB ってテキストですよね !?

  はい、テキストとみなすのが正しいと思います。

>> 一応、これを直したものを commit しました。

  File::MMagic自体はローカルにCVS管理していて、更新する度にその都度ロー
カルの最新版をNamazuのCVS repositoryに置くようにしています。というわけ
で、一旦こちらでローカルなCVS repositoryに修正をmergeしてから、それを
再度NamazuのCVS treeに戻すという形にしました。

# ついでに他から報告されている別のバグ修正も含め、version 0.17としてお
# きました。

  事後報告で申し訳ないですが、今後もこういう形にさせてもらえませんでしょ
うか?

>> ところで、File::MMagicでVRML(model/vrml)[1] の判定もしませんか?
>> 確か、一行目がヘッダで、必ず以下の行を含むので判定できるはず…。
>> #VRML V1.0 ascii	(VRML1.0 [2] の場合)
>> #VRML V2.0 utf8		(VRML97 [3] の場合)

  こちらも追加しました。いかんせん手元にVRMLなファイルがないので、どな
たか試して頂けませんでしょうか。

# File::MMagicを用いたfileコマンドもどきをメールの末尾に添付しておきま
# す(要 Compress::Zlib)。
-- 
野首 貴嗣
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;
	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";
}