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