[mew-win32 03984] Re: string-bytesの実行結果が違う?

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2003年 10月 3日 (金) 12:36:17 JST


えーと太田さんって mew-win32 にいらっしゃいましたっけ?

From: Tak Ota <Takaaki.Ota at example.com> さん曰く
Subject: [mew-dist 24052] args-out-of-range in mew-summary-execute-external, mew-summary-display-down
Message-ID: <20031002.092445.01366031.Takaaki.Ota at example.com>
Date: Thu, 02 Oct 2003 09:24:45 -0700 (PDT)

ota> 昨日からサイズが大きい(100K 以上?)添付をデコードしようとすると以下の
ota> エラーに遭遇するようになりました。以下二つの backtrace 例です。

これも mew-win32 で続いている話と原因が同じなので、mew-dist にも
投げます。

# Meadow だけの話じゃなかったし。

From: Kazu Yamamoto (山本和彦) <kazu at example.com> さん曰く
Subject: [mew-win32 03980] Re: string-bytesの実行結果が違う?
Message-ID: <20031002.151113.249640722.kazu at example.com>
Date: Thu, 02 Oct 2003 15:11:13 +0900 (JST)

kazu> 他の方はどうでしょう?

ということで、かずさんの変更

  (defsubst mew-region-bytes (beg end buf)
!   (save-excursion
!     (set-buffer buf)
!     (save-restriction
!       (narrow-to-region beg end)
!       (mew-set-buffer-multibyte nil)
!       (prog1
! 	  (- (point-max) (point-min))
! 	(mew-set-buffer-multibyte t)))))

を試してみたのですが、

○ Emacs-20.7(Meadow-1.15), Emacs-21.3.50(Solaris)
× Emacs-21.1(Meadow-2beta), Emacs-21.2(Solaris)

となりました。ちなみに

○ 107792 byte
× 102034 byte

と表示されます。× な環境でちょっとしらべてみたところ、
" *mew cache*" が

-------------------------------------------------------
----Next_Part(Wed_Oct__1_10:19:14_2003_918)--
Content-Type: Application/Octet-Stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="fiber.exe"

(1)...................................................
...................................................(2)
----Next_Part(Wed_Oct__1_10:19:14_2003_918)----
-------------------------------------------------------

な状態で、

(defsubst mew-region-bytes (beg end buf)
  (save-excursion
    (set-buffer buf)
    (save-restriction
      (narrow-to-region beg end) <= (*1)
      (mew-set-buffer-multibyte nil) <= (*2)
      (prog1
 	  (- (point-max) (point-min))
 	(mew-set-buffer-multibyte t)))))

を動かすと、

(*1) の時点で " *mew cache*"  が
-------------------------------------------------------
(1)...................................................
...................................................(2)
-------------------------------------------------------

ときちんと (1)〜(2) だけの表示になりますが、
(*2) で narrowing すると、今度は

-------------------------------------------------------
; filename="fiber.exe"

(1)...................................................
.........途中で切れている
-------------------------------------------------------

と変な風になってしまいます。一度この状態になると、
save-restriction から抜けるときに、もとの widen の状態にうまく戻
らないようで、太田さんの指摘したエラーが発生するようです。

narrowing した状態での unibyte <==> multibyte の変換がだめですね。

というわけで、ちょっとエレガントにして :-)

(defsubst mew-region-bytes (beg end buf)
  (save-excursion
    (set-buffer buf)
    (if (fboundp 'string-as-unibyte)
	(length (string-as-unibyte (mew-buffer-substring beg end)))
      (- end beg))))

はどうでしょう。とりあえず手持ちの Emacsen でちゃんと動くのは確
認しました。

# ちなみに Emacs-21.3 は現在持っていないのでどうなるかはわかりま
# せん。

-- 
白井秀行 (mailto:shirai at example.com)



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