[Mew-dist 04122] Re: IM-86: IM::Config does not consider which selectors are defined?

Makoto MATSUSHITA ( まつしたまこと ) matusita at example.com
1998年 3月 7日 (土) 18:18:04 JST


matusita> というわけで,このままじゃ辛いのでなんとなく  Config.pm を触
matusita> りたいと思っているのですが,

というわけでなんとなく触ってみました.やったことは以下の通りです.

・case X 時に定義される値は $DEFSELECTORS{'X'} で示される hash にはいっ
  てることにする
・&used_selectors と同様な &defined_selectors を作ってこいつで値を戻す

手元で動かしてみて,一応期待した通りに動いていることを確認しています.

この後 impath を触ろうと一瞬思ったのですが「それは impath の仕事じゃな
い」と思ったのでまずこれはやめました.触るならば,impath の一部機能ま
で含めて imsetup にくっつけてしまえばいいんじゃねえのか? と次に思った
のですが(FreeBSD の sysinstall は,install する時以外にも使いますし:-),
imsetup とは別に impath が単独で存在している意味を知らないのでやめました.

-- -
Makoto `MAR' MATSUSHITA
これさえあれば,あとは 3 statements の perl program ですぐにできる.

*** Config.pm.in.orig	Tue Feb 10 13:45:34 1998
--- Config.pm.in	Sat Mar  7 18:03:17 1998
***************
*** 31,37 ****
      read_cfg_selector
      init_opt
      read_env read_cfg read_opt
!     set_selector used_selectors
      sanity_check
      help
      home_dir conf_dir
--- 31,37 ----
      read_cfg_selector
      init_opt
      read_env read_cfg read_opt
!     set_selector defined_selectors used_selectors
      sanity_check
      help
      home_dir conf_dir
***************
*** 57,63 ****
  	    @O_IORD %O_DESC %O_VNAM %O_FULL %O_ABBR %O_HELP
  	    $O_FOPT %C_DESC %C_VNAM
  	    %WHO_SET
! 	    @SELECTORS);
  
  $CURRENT_DIR = $ENV{'PWD'} || eval { use Cwd; fastcwd(); } ||
      im_die("can't get your current directory\n");
--- 57,63 ----
  	    @O_IORD %O_DESC %O_VNAM %O_FULL %O_ABBR %O_HELP
  	    $O_FOPT %C_DESC %C_VNAM
  	    %WHO_SET
! 	    %DEFSELECTORS @SELECTORS);
  
  $CURRENT_DIR = $ENV{'PWD'} || eval { use Cwd; fastcwd(); } ||
      im_die("can't get your current directory\n");
***************
*** 318,327 ****
  	    s/\s*$//;
  	    if (/^case\s*(.*)/) {
  		($case = $1) =~ s/\s*//g;
! 		# make sure defined(%{$case}) is true
  		foreach (split(',', $case)) {
! 		    $_->{0} = '';
! 		    delete $_->{0};
  		}
  		next;
  	    }
--- 318,327 ----
  	    s/\s*$//;
  	    if (/^case\s*(.*)/) {
  		($case = $1) =~ s/\s*//g;
! 		# make sure defined(%{$DEFSELECTORS{$case}}) is true
  		foreach (split(',', $case)) {
! 		    $DEFSELECTORS{$_}->{0} = '';
! 		    delete $DEFSELECTORS{$_}->{0};
  		}
  		next;
  	    }
***************
*** 431,449 ****
  
      foreach $s (split(',', lc($selector))) {
  	next if ($s eq 'default');
! 	unless (defined(%{$s})) {
  	    im_err("no 'case $s' in config file.\n");
  	    return -1;
  	} else {
  	    push(@SELECTORS, $s);
! 	    foreach (keys(%{$s})){
! 		${$_} = $s->{$_};
  	    }
  	}
      }
      return 0;
  }
  
  sub used_selectors () {
      return join(',', @SELECTORS);
  }
--- 431,453 ----
  
      foreach $s (split(',', lc($selector))) {
  	next if ($s eq 'default');
! 	unless (defined(%{$DEFSELECTORS{$s}})) {
  	    im_err("no 'case $s' in config file.\n");
  	    return -1;
  	} else {
  	    push(@SELECTORS, $s);
! 	    foreach (keys(%{$DEFSELECTORS{$s}})){
! 		${$_} = $DEFSELECTORS{$s}->{$_};
  	    }
  	}
      }
      return 0;
  }
  
+ sub defined_selectors() {
+     return join(',', sort keys %DEFSELECTORS);
+ }
+ 
  sub used_selectors () {
      return join(',', @SELECTORS);
  }
***************
*** 613,631 ****
  
      if ($desc =~ /[bB]/) {
  	if ($val =~ /^(yes|on|true|1)$/i) {
! 	    $case->{$vnam} = 1;
  	} else {
! 	    $case->{$vnam} = 0;
  	}
      } elsif ($desc =~ /F/) {  # xxx how about f
  	# +inbox -> + inbox -> --src +inbox
  	if ($val =~ /^[+\-=%]/) {
! 	    $case->{$vnam} = $val;
  	} else {
! 	    $case->{$vnam} = "+$val";
  	}
      } else {
! 	$case->{$vnam} = $val;
      }
  
      return 1;
--- 617,635 ----
  
      if ($desc =~ /[bB]/) {
  	if ($val =~ /^(yes|on|true|1)$/i) {
! 	    $DEFSELECTORS{$case}->{$vnam} = 1;
  	} else {
! 	    $DEFSELECTORS{$case}->{$vnam} = 0;
  	}
      } elsif ($desc =~ /F/) {  # xxx how about f
  	# +inbox -> + inbox -> --src +inbox
  	if ($val =~ /^[+\-=%]/) {
! 	    $DEFSELECTORS{$case}->{$vnam} = $val;
  	} else {
! 	    $DEFSELECTORS{$case}->{$vnam} = "+$val";
  	}
      } else {
! 	$DEFSELECTORS{$case}->{$vnam} = $val;
      }
  
      return 1;



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