Namazu-devel-ja(旧)


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

Re: zipフィルタ Re:lha フィルタ



臼田です。

調査結果を取り入れて zip.plを修正しました。

・アーカイブ内のファイル名は file属性が'unx'か'ntf'のときのみ利用します。
 (unzipの文字コード変換トラブル避け)
・再帰呼び出しをする際には拡張子のみ活かして仮名を渡すことにしました。
・アーカイブファイル内にアーカイブファイルがある場合に備え重複しないテンポラリ
 ファイル名をつけ上書きされないようにしました。
・gfilter::filename_to_title() の第一引数にダミーのパスを加えました。

http://www.namazu.org/ml/namazu-devel-ja/msg04267.html
からのdiffをつけています。

何をやっているのかがわかりにくいスクリプトになってきました。


--- filter/zip.pl.old	2004-05-03 15:57:19.000000000 +0900
+++ filter/zip.pl	2004-05-03 22:40:43.000000000 +0900
@@ -62,7 +62,13 @@
     my ($orig_cfile, $contref, $weighted_str, $headings, $fields)
       = @_;
 
-    my $tmpfile = util::tmpnam('NMZ.zip');
+    my $depth = 0;
+    my $tmpfile;
+    do {
+	$tmpfile = util::tmpnam('NMZ.zip' . substr("000$depth", -1, 4));
+	$depth++;
+    } while ( -f $tmpfile);
+
     {
 	my $fh = util::efopen("> $tmpfile");
 	print $fh $$contref;
@@ -79,7 +85,7 @@
         return 'Unable to convert zip file (maybe copying protection)';
     }
 
-    my $tmpfile2 = util::tmpnam('NMZ.zip2');
+    my $tmpfile2 = util::tmpnam('NMZ.zip_comment');
     $status = system("$unzippath -z -qq $tmpfile > $tmpfile2");
     if ($status == 0) {
 	my $summary = util::readfile("$tmpfile2");
@@ -89,28 +95,31 @@
     unlink($tmpfile2);
 
     my %files;
+    my $filesystem;
     $status = system("$unzippath -Z $tmpfile > $tmpfile2");
     if ($status == 0) {
 	my $filelist = util::readfile("$tmpfile2");
-	codeconv::toeuc(\$filelist);
 	while ($filelist =~/\n\S+\s+	# permission
 			\S+\s+		# version
-			\S+\s+		# filesystem
+			(\S+)\s+	# filesystem
 			(\d+)\s+	# filesize
 			\S+\s+		#
 			\S+\s+		#
 			\S+\s+		# day-month-year
 			\S+\s+		# hour:min
-			(\S+)/gx){	# filename
-	    $files{$2} = $1;
+			(.+)/gx){	# filename
+	    $files{$3} = $2;
+	    $filesystem = $1;
 	}
     }
     my $fname;
-    foreach $fname (keys %files){
-	my $tmpfname = $fname;
-	codeconv::toeuc(\$tmpfname);
-	$tmpfname = gfilter::filename_to_title($tmpfname, $weighted_str);
-	$$contref .= $tmpfname . " ";
+    if ($filesystem =~ /unx|nft/) {
+	foreach $fname (keys %files){
+	    my $tmpfname = './' . $fname;
+	    codeconv::toeuc(\$tmpfname);
+	    $tmpfname = gfilter::filename_to_title($tmpfname, $weighted_str);
+	    $$contref .= $tmpfname . " ";
+	}
     }
     foreach $fname (keys %files){
 	my $size = $files{$fname};
@@ -120,11 +129,15 @@
 	    util::dprint("$fname: Too large ziped file");
 	} else {
 	    my $con = "";
-	    my $fh = util::efopen("$unzippath -p $tmpfile $fname|");
+	    my $fh = util::efopen("$unzippath -p $tmpfile \"$fname\"|");
 	    while (defined(my $line = <$fh>)){
 		$con .= $line;
 	    }
-	    my $err = zip::nesting_filter($fname, \$con, $weighted_str);
+	    my $unzippedname = "unzipped_content";
+	    if ($fname =~ /.*(\..*)/){
+		$unzippedname = $unzippedname . $1;
+	    }
+	    my $err = zip::nesting_filter($unzippedname, \$con, $weighted_str);
 	    if (defined $err) {
 		util::dprint("filter/zip.pl gets error message \"$err\"");
 	    }

臼田幸生