[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 メーリングリストの案内