[Mew-dist 08169] Re: numeric name directory and impack

SAKAI Kiyotaka ksakai at example.com
1999年 3月 18日 (木) 18:18:12 JST


>> In article <19990311201649J.tatsuya.matsui at example.com>, Tatsuya Matsui/松井龍也 <tatsuya.matsui at example.com> writes:

> あるフォルダの中に数字のフォルダがある時に
> SummaryモードでO(mew-summary-pack)を実行すると
> フォルダも含めてpackされます。

>     例)
>     +fooに 1,2,3, +foo/1997がある時に実行すると
>     +fooに 1,2,3, +foo/4 になる。

> impackを実行しても同様です。

この問題に対応するためのパッチです。

この他に、Folder.pm を読んでいて気が付いたので、

・message_range() を読び出すと readdir でフォルダを読むのを 2〜3回行う
  ので、これを 1回に抑えるようにした。

・range の指定に cur を指定すると、.mh_sequence の cur: を読みにいくコー
  ドの残骸が残っていたが、これは obsolate と思われるので消した。

ということをやっています。
-- 
酒井 清隆 (E-mail: ksakai at example.com)

-------------- next part --------------
===================================================================
RCS file: RCS/Folder.pm,v
retrieving revision 1.1
diff -u -r1.1 Folder.pm
--- Folder.pm	1999/03/18 06:33:16	1.1
+++ Folder.pm	1999/03/18 08:46:54
@@ -135,10 +135,20 @@
     return ($filecnt, $numfilecnt, $min, $max);
 }
 
-sub message_number ($$) {
-    my($folder, $number) = @_;
-    local(*IN, *DIR);
-    my($cur, $folder_dir, @filesinfolder, $offset, $max, $min);
+sub message_list ($) {
+    my ($folder_dir) = @_;
+    my @filesinfolder;
+
+    opendir(DIR, $folder_dir) || im_die("can't open $folder_dir.\n");
+    @filesinfolder = sort {$a <=> $b} grep(/^[1-9]\d*$/ && -f "$folder_dir/$_", readdir(DIR));
+    closedir(DIR);
+
+    return @filesinfolder;
+}
+
+sub message_number ($$;@) {
+    my ($folder, $number, @filesinfolder) = @_;
+    my ($folder_dir, $offset, $max, $min);
 
     # simple case: digits
     if ($number !~ /\D/) {
@@ -146,27 +156,11 @@
     }
 
     # get folder
-    $folder = &cur_folder if ($folder eq '');
-    $folder_dir = &expand_path($folder);
+    $folder = cur_folder if ($folder eq '');
+    $folder_dir = expand_path($folder);
     return '' if (!-d $folder_dir);
 
-    # get 'cur' message
-	$cur = '';
-#   if (-f "$folder_dir/.mh_sequences") {
-#	open(IN, "< $folder_dir/.mh_sequences") || return '';
-#	while (<IN>) {
-#	    s/\n$//;
-#	    if (/^cur:\s*(\d+)$/) {
-#		$cur = $1;
-#	    }
-#	}
-#	close(IN);
-#   }
-
-    # get list of messages
-    opendir(DIR, $folder_dir);
-    @filesinfolder = sort {$a <=> $b} grep(!/\D/, readdir(DIR));
-    closedir(DIR);
+    @filesinfolder = message_list($folder_dir) unless defined(@filesinfolder);
 
     if (scalar(@filesinfolder) == 0) {
 	if ($number eq 'new') {
@@ -197,9 +191,6 @@
 	}
 	return $number;
     }
-    if ($number eq 'cur') {
-	return $cur;
-    }
     if ($number eq 'next' || $number eq 'prev') {
 	$offset = ($number eq 'prev') ?  -1 : +1;
 
@@ -209,68 +200,53 @@
 	    $number += $offset;
 	}
     }
-
     return '';
 }
 
 sub message_range ($$) {
-    my($folder, $range) = @_;
-    my($folder_dir);
-    my(@filesinfolder);	# XXX local?
-    my($start, $end, $n, $dir);
-    local(*DIR);
+    my ($folder, $range) = @_;
+    my $range_regexp = '[1-9]\d*|first|last|next|prev';
 
-    $folder = &cur_folder if ($folder eq '');
-    $folder_dir = &expand_path($folder);
+    $folder = cur_folder if ($folder eq '');
+    my $folder_dir = expand_path($folder);
 
     if ($range eq 'all') {
 	$range = 'first-last';
     }
 
-    if ($range =~ /^(\d+|cur|first|last|next|prev|new)-(\d+|cur|first|last|next|prev|new)$/) {
-	($start, $end) = ($1, $2);
-	$start = &message_number($folder, $start);
-	$end = &message_number($folder, $end);
-	return () if ($start !~ /^\d+$/);
-	return () if ($end !~ /^\d+$/);
-	return () if ($start > $end);
-
-	opendir(DIR, $folder_dir) || im_die("can't open $folder_dir.\n");
-	@filesinfolder = grep(!/\D/ && $start <= $_ && $_ <= $end,
-	    readdir(DIR));
-	closedir(DIR);
-	return (&sort_uniq(\@filesinfolder));
-    }
-    if ($range =~ /^(\d+|cur|last|first|next|prev):([+-]?)(\d+)$/) {
-	($start, $n) = ($1, $3);
-	if ($start eq 'last') {
-	    $dir = ($2 eq '' || $2 eq '-') ? -1 : +1;
+    my @filesinfolder = message_list($folder_dir);
+
+    if ($range =~ /^($range_regexp|new)-($range_regexp|new)$/) {
+	my ($start, $end) = ($1, $2);
+
+	$start = message_number($folder, $start, @filesinfolder);
+	$end = message_number($folder, $end, @filesinfolder);
+
+	if ($start eq '' || $end eq '' || $start > $end) {
+	    return ();
 	} else {
-	    $dir = ($2 eq '' || $2 eq '+') ? +1 : -1;
+	    return grep($start <= $_ && $_ <= $end, @filesinfolder);
 	}
-	$start = &message_number($folder, $1);
-	return ($range) if ($start !~ /^\d+$/);
-
-	opendir(DIR, $folder_dir) || im_die("can't open $folder_dir.\n");
-	@filesinfolder = grep(!/\D/, readdir(DIR));
-	closedir(DIR);
+    } elsif ($range =~ /^($range_regexp):([+-]?)(\d+)$/) {
+	my ($start, $dir, $n) = ($1, $2, $3);
+	if ($dir eq '') {
+	    $dir = ($start eq 'last') ? '-' : '+';
+	}
+	$start = message_number($folder, $start, @filesinfolder);
+	return $range if ($start eq '');
 
-	if ($dir == 1) {
+	if ($dir eq '+') {
 	    @filesinfolder = grep($start <= $_, @filesinfolder);
-	    @filesinfolder = &sort_uniq(\@filesinfolder);
-	    splice(@filesinfolder, $n)
-		if $n < scalar(@filesinfolder);
+	    splice(@filesinfolder, $n) if $n < scalar(@filesinfolder);
 	} else {
 	    @filesinfolder = grep($_ <= $start, @filesinfolder);
-	    @filesinfolder = &sort_uniq(\@filesinfolder);
-	    @filesinfolder = sort {$a <=> $b} @filesinfolder;
 	    splice(@filesinfolder, 0, @filesinfolder - $n)
 		if $n < scalar(@filesinfolder);
 	}
 	return @filesinfolder;
+    } else {
+	return message_number($folder, $range);
     }
-
-    return (&message_number($folder, $range));
 }
 
 sub message_name ($$) {
@@ -312,33 +288,8 @@
 	push(@messages, @x);
     }
 
-    # @messages = &sort_uniq(\@messages);
-
     grep($_ = "$folder_dir/$_", @messages);
 }
-
-sub sort_uniq ($) {
-#    local(*target) = @_;
-#   my(%tmp);
-    my ($target) = shift;
-    my($i);
-
-#   undef %tmp;
-#   foreach $i (@target) {
-#	$tmp{$i} = 1;
-#   }
-#   return sort {$a <=> $b} keys %tmp;
-    my @r = sort {$a <=> $b} @{$target};
-    for ($i = 1; $i <= $#r;) {
-	if ($r[$i-1] == $r[$i]) {
-	    splice (@r, $i, 1);
-	    next;
-	}
-	$i++;
-    }
-    return @r;
-}
-
 
 sub create_folder ($) {
     my $folder = shift;


Mew-dist メーリングリストの案内