[Mew-dist 09296] Re: mew-refile-guess-by-alist2

Kyotaro HORIGUCHI kyota at example.com
1999年 6月 10日 (木) 11:58:29 JST


堀口です. すみません. パッチの元が半端に書き換えたやつでした^^;

At Wed, 9 Jun 1999 20:29:00 +0900, Yoshinari NOMURA <nom at example.com> wrote in <19990609202856D.nom at example.com>
> 添付していただいたパッチですが、手元の mew-refile.el 0.74 には当
> たりませんでした。手で当てようとしましたが、該当する箇所も発見で
> きないです。mew-refile.el 0.74 に対するパッチをいただけませんで
> しょうか。

 diff を取りなおして添付しました.

> # mew-refile-guess-by-alist2 はかなり前からもういじっていないは
> # ずなんですが。

 結構昔から出ていましたが, meadow を再起動するととりあえず収まる
のでそれでしのいでました.

> >  そこでマッチの数より大きなインデックス(?)を指定せずに済むように
> > たとえば以下のように修正してもらいたいのですがどうでしょうか.
> 
> すみません。ちょっと理解できません。
> error になる場合の具体的な引数を教えていただけませんでしょうか。

 出るときは

 (mew-refile-guess-by-alist2 
  "\\(foo\\|bar\\|hoge\\)@some\.domain.jp\\|.*\\@other\.domain\.jp")
  "bar at example.com"
  "+SomeFolder")

 という具合です.

 通常は通っているのですが何らかのきっかけで mew-refile.el:187 の 
(match-beginning p) で p=4 とかのあたりで

 Args out of range 4 4

 となります. ちょっと Emacs20.3.1 のソースを見てみたら search.c 
の match_limit の以下の部分(L2504)であたっているらしいことがわか
りました.

!  if (n < 0 || n >= search_regs.num_regs)
!    args_out_of_range (num, make_number (search_regs.num_regs));

 で, 私の環境ではどうやらこの search_regs.num_regs が 4 とか 5 と
かになってしまうことがあるらしいのです.

 いずれにしても string-match の後の search_regs の要素数はマッチ
の数だけしか保証されていないと考えた方がよさそうなので, マッチの
数があらかじめ特定できないときは (match-beginning n) の n を決め
打ちで指定して良いことはなさそうであるというのが件のパッチの心で
す.

--
堀口恭太郎

-------------- next part --------------
--- mew-refile.el.org	Fri Jun 04 18:47:20 1999
+++ mew-refile.el	Wed Jun 09 18:26:48 1999
@@ -182,19 +182,23 @@
 
 (defun mew-refile-guess-by-alist2 (regexp field string)
-  (let ((p 1) match-list b e)
+  (let (match-strings match-list)
     (string-match regexp field)
-    (while (<= p 9)
-      (setq b (or (match-beginning p) 0))
-      (setq e (or (match-end p) 0))
-      (setq match-list (cons (substring field b e) match-list))
-      (setq p (1+ p)))
-    (setq  p 1)
-    (while (<= p 9)
-      (if (string-match (concat "\\\\" (int-to-string p)) string)
-	  (setq string
-		(concat (substring string 0 (match-beginning 0))
-			(nth (- 9 p) match-list)
-			(substring string (match-end 0))))
-	(setq p (1+ p))))
+    (setq match-list (cddr (match-data)))
+    (while (car match-list)
+      (setq match-strings
+	    (cons (substring field
+			     (car match-list) (cadr match-list))
+		  match-strings))
+      (setq match-list (cddr match-list)))
+    (while (string-match "\\\\\\([1-9]\\)" string)
+	(setq string
+	      (concat (substring string 0 (match-beginning 0))
+		      (nth (- (length match-strings)
+			      (string-to-int 
+			       (substring string
+					  (match-beginning 1)
+					  (match-end 1))))
+			   match-strings)
+		      (substring string (match-end 0)))))
     string))
 


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