[Mew-dist 07750] 'use' primitive for IM Config
Makoto MATSUSHITA ( まつしたまこと )
matusita at example.com
1999年 2月 26日 (金) 11:33:28 JST
かなり大昔に投げたかもしれないのですが,多分忘れさられていると思うので投
げ直してみます.$HOME/.im/Config へ 'use' 文を加える patch です.
use 文は
use label{,label,...}
として使い「'case label' で定義された内容が,あたかも use 文が書いてある
場所に書いてある」ような挙動をします.つまり,
case smtpserver-localhost
SMTPservers=localhost
case smtpserver-mailserver
SMTPservers=mailserver.isp.dom.ain
とある状況で
case my-isp
FromDomain=isp.dom.ain
use smtpserver-mailserver
と書くと,
case my-isp
FromDomain=isp.dom.ain
SMTPservers=mailserver.isp.dom.ain
と書いたのと等価,になります.case label を場合わけではなく subroutine
的に見せてるという感じ,です.等価な記述はもちろん既存の枠組で可能ですが,
とてもじゃないけど人間 friendly とは思えないのでこの patch を書きました.
BUGS: Config 中における command.opt 的記述の処理まできっちり面倒をみるた
めには「$HOME/.im/Config の中身を全部なめたあと」で use 文の処理をしなけ
ればいけません(現状の構成はそうなっています).このため,use 文はその影響
を受けます.つまり「ファイルを上から順番になめて,use 文が出てきた時点に
おけるその case 文の内容」が import されるのではなく「ファイルを全部読み
終えた時点でその case 文の内容」が import されます.
patch は IM-101 時代に作りましたが,IM-107 でも問題なく使えます.
-- -
Makoto `MAR' MATSUSHITA
--- IM/Config.pm.in.orig Wed Sep 23 18:20:21 1998
+++ IM/Config.pm.in Mon Oct 5 19:49:44 1998
@@ -297,6 +297,8 @@
my ($profile, @profiles);
my $prev_line = '';
my $case;
+ my $use;
+ my @USECASES;
my @prog_cfg;
@profiles = ('<DATA>', $IM_SYS_PROFILE, $IM_USER_PROFILE);
@@ -344,6 +346,11 @@
}
next;
}
+ if (/^use\s*(.*)/) {
+ ($use = $1) =~ s/\s*//g;
+ my @array = ($case, $use);
+ push(@USECASES, \@array);
+ }
if (/^(\*|[\w]+)\.(\w+)[:=]\s*(.*)$/) {
# Imls.Src=+inbox
if ($1 eq '*') {
@@ -374,6 +381,12 @@
foreach $array (@prog_cfg) {
set_value_cfg(@$array);
}
+ foreach $array (@USECASES) {
+ ($case, $use) = @$array;
+ foreach (split(',', $case)) {
+ set_selector($use, $_);
+ }
+ }
}
sub read_opt ($) {
@@ -444,8 +457,8 @@
}
}
-sub set_selector ($) {
- my $selector = shift;
+sub set_selector ($;$) {
+ my ($selector, $base) = @_;
my $s;
foreach $s (split(',', lc($selector))) {
@@ -454,9 +467,15 @@
im_err("no 'case $s' in config file.\n");
return -1;
} else {
- push(@SELECTORS, $s);
- foreach (keys(%{$s})){
- ${$_} = $s->{$_};
+ if (!defined($base) or $base eq 'default') {
+ push(@SELECTORS, $s) if !defined($base);
+ foreach (keys(%{$s})){
+ ${$_} = $s->{$_};
+ }
+ } else {
+ foreach (keys(%{$s})){
+ $base->{$_} = $s->{$_};
+ }
}
}
}
Mew-dist メーリングリストの案内