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