[Mew-dist 06630] patch: A new directive 'use' to IM config file

Makoto MATSUSHITA ( まつしたまこと ) matusita at example.com
1998年 10月 5日 (月) 20:09:04 JST


$HOME/.im/Config の書き方についての話,です.例えば,

・設定 X は,case A と case B で使いたい
・設定 Y は,case C と case D で使いたい
・case A〜D それぞれの設定(設定A〜D)も当然ある

という場合を考えます.この場合には

共通の設定
case A
設定A
case B
設定B
case C
設定C
case D
設定D
case A,B
設定X
case C,D
設定Y

とすれば良いことは良く知られています(よね).

しかし,この記述方法では「じゃあ,結局 case A の場合にはどういう設定にな
るの?」と思ったときに,全部の記述を自分で merge して確認することになって
しまいます(つまり,頭の中で「設定A」を「設定X」で上書きした時のことを考
えなければいけない).上記のように case ラベルが 4 種類程度なら良いですが,
いっぱい書いてある時には(一画面におさまらなくなった時など),ちょっと辛い
と思っていました.

これをなんとかするために,新たな directive である「use」を実装してみまし
た.IIJ-PPP を使われている方は,ppp.conf における load コマンドを想像し
ていただけるとイメージがつかめるかもしれません.

上記のような場合には,例えばこんな感じになります.

共通の設定
case X
設定X
case Y
設定Y
case A
設定A
use X
case B
設定B
use X
case C
設定C
use Y
case D
設定D
use Y

「どこがどう簡単になったねん」という話も多々ありますが‥‥以下,IM-101
に対する patch です.多分 IM-100 でもあたるでしょう(未確認).いちおう

case X,Y,Z
use A,B,C

などとやってもちゃんと動くようにしたつもり,です.一瞬だけ「use で後方参
照(その行より後に定義される case を参照)するのはあり?」とか思ってしまう
わけですが,もちろんできます(というか,そうした方が楽だった).

というわけで,動くように書いたつもりですが,嘘ついてたらごめんなさい.

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