[Namazu-devel-ja 814] File-MMagic CR-LF 問題 Re: Windowsネイティブ版 Namazu 2.0.15pre4

Yukio USUDA m6694ha392t @ asahi-net.or.jp
2005年 12月 28日 (水) 01:23:25 JST


臼田です。

Tadamasa Teranishi wrote:
> それとは別にFile-MMagicの改行コード依存なところはいずれ修正しないと
> いけないでしょうね。
> 
追いかけてみたところ

binmode で読み込みんでいるファイルが cr-lf の時に
tell() が間違えた位置を返すことと
sub readMagicEntry 内の一部の条件判定に問題があるようだ
ということがわかりました。

binmode の問題は perl5.8.1 以降であれば
binmode($fh,":crlf"); として問題が解消できるようです
http://perldoc.jp/docs/perl/5.8.1/perldelta.pod
が、テキスト部分を binmode で読み込む理由がないので
修正してみました。

CR-LF, LF どちらで保存しても大丈夫になると思います。

$ diff -ub MMagic.pm.1.25.org MMagic.pm
--- MMagic.pm.1.25.org  2005-08-28 06:59:09.000000000 +0900
+++ MMagic.pm   2005-12-28 01:12:29.154750000 +0900
@@ -351,18 +351,7 @@
     $self->{magic} = [];
     if (! @_) {
        my $fh = *File::MMagic::DATA{IO};
-       binmode($fh);
        bless $fh, 'FileHandle' if ref $fh ne 'FileHandle';
-       my $dataLoc;
-       # code block to localise the no strict;, contribute by Simon Matthews
-       {
-           no strict 'refs';
-           my $instance = \${ "$class\::_instance" };
-           $$instance = $fh->tell() unless $$instance;
-           $dataLoc = $$instance;
-       }
-
-       $fh->seek($dataLoc, 0);
        &readMagicHandle($self, $fh);
     } else {
        my $filename = shift;
@@ -1086,6 +1075,7 @@
        if ($line =~ /^\#/ || $line =~ /^\s*$/) {
            last if $magicFH->eof();
            $line = <$magicFH>;
+           $line =~ s/\x0d\x0a|\x0d/\x0a/;
            $$MF[2]++;
            next;
        }
@@ -1099,6 +1089,7 @@
 
            # call ourselves recursively.  will return the depth
            # of the entry following the nested group.
+            $$MF[0] = $magicFH;
            if ((readMagicEntry($entry->[2], $MF, $depth+1) || 0) < $depth ||
                $$MF[0]->eof())
            {
@@ -1110,7 +1101,7 @@
            $$MF[1] = $line;
            return length($thisDepth);
        }
-       elsif (defined(@$entry)) {
+       elsif (defined(@$pa_magic)) {
            # already have an entry.  this is not a continuation.
            # save this line for the next call and exit.
            $$MF[1] = $line;
@@ -1131,6 +1122,7 @@
            # read the next line
            last if $magicFH->eof();
            $line = <$magicFH>;
+           $line =~ s/\x0d\x0a|\x0d/\x0a/;
            $$MF[2]++;
        }
     }

臼田幸生




Namazu-devel-ja メーリングリストの案内