[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

dependency between files (was: pccl)



>> On 25 May 2001 09:47:41 +0900
>> 「山」== yamaoka@jpl.org (Katsumi Yamaoka) said as follows:

山> ところで、make install した後で XEmacs 21.5 を起動して試してみる
山> と、やはり以下のような結果です。

原因が分かりました。

真相は w3m-xmas.el と w3m.el の読み込み順序の問題でした。

まず、w3m.el が先頭から評価されて、w3m-xmas.el が require されるので、
一見、w3m-xmas.el が先に評価されるように見えますが、w3m-xmas.el の中で
は、

    (provide 'w3m-xmas);; It is needed to avoid circular dependencies.
    (require 'w3m)

となっているので、実は w3m.el の本体が先に評価されます。ですから、

    (unless (get 'w3m-euc-japan-decoder 'ccl-program-idx)
      (define-ccl-program w3m-euc-japan-decoder

というように先に定義されているかどうかの検査が意味をなしておらず、
XEmacs21 以外用の decoder を使って w3m-euc-japan が定義されてしまいます。

その後で、w3m-xmas.el 本体が評価されますから、w3m-euc-japan-decoder の
定義も上書きされますので、通常の関数であれば正常に有効になるはずなので
すが、どうも実体参照しているようで、make-ccl-coding-system を再呼び出
ししないと反映されないようです。

というわけで、以下のように強引に make-ccl-coding-system を再呼び出しす
るように変更すると、なんとか XEmacs-21.4.1 でも文字化けせずに見れるよ
うになりました。
--- w3m-xmas.el	2001/05/25 01:46:46	1.35
+++ w3m-xmas.el	2001/05/25 02:12:18
@@ -301,42 +301,49 @@
 		   (and (= emacs-major-version 21)
 			(= emacs-minor-version 2)
 			(>= emacs-beta-version 19)))
-    (define-ccl-program w3m-euc-japan-decoder
-      `(2
-	(loop
-	 (read r0)
-	 ;; Process normal EUC characters.
-	 (if (r0 < ?\x80)
-	     (write-repeat r0))
-	 (if (r0 > ?\xa0)
-	     ((read r1)
-	      (r1 &= ?\x7f)
-	      (r1 |= ((r0 & ?\x7f) << 7))
-	      (r0 = ,(charset-id 'japanese-jisx0208))
-	      (write-multibyte-character r0 r1)
-	      (repeat)))
-	 (if (r0 == ?\x8e)
-	     ((read r1)
-	      (r0 = ,(charset-id 'katakana-jisx0201))
-	      (write-multibyte-character r0 r1)
-	      (repeat)))
-	 (if (r0 == ?\x8f)
-	     ((read r0 r1)
-	      (r1 &= ?\x7f)
-	      (r1 |= ((r0 & ?\x7f) << 7))
-	      (r0 = ,(charset-id 'japanese-jisx0212))
-	      (write-multibyte-character r0 r1)
-	      (repeat)))
-	 ;; Process internal characters used in w3m.
-	 (if (r0 == ?\x80)	     ; Old ANSP (w3m-0.1.11pre+kokb23)
-	     (write-repeat 32))
-	 (if (r0 == ?\x90)		; ANSP (use for empty anchor)
-	     (write-repeat 32))
-	 (if (r0 == ?\x91)		; IMSP (blank around image)
-	     (write-repeat 32))
-	 (if (r0 == ?\xa0)		; NBSP (non breakble space)
-	     (write-repeat 32))
-	 (write-repeat r0)))))
+    (progn
+      (define-ccl-program w3m-euc-japan-decoder
+	`(2
+	  (loop
+	   (read r0)
+	   ;; Process normal EUC characters.
+	   (if (r0 < ?\x80)
+	       (write-repeat r0))
+	   (if (r0 > ?\xa0)
+	       ((read r1)
+		(r1 &= ?\x7f)
+		(r1 |= ((r0 & ?\x7f) << 7))
+		(r0 = ,(charset-id 'japanese-jisx0208))
+		(write-multibyte-character r0 r1)
+		(repeat)))
+	   (if (r0 == ?\x8e)
+	       ((read r1)
+		(r0 = ,(charset-id 'katakana-jisx0201))
+		(write-multibyte-character r0 r1)
+		(repeat)))
+	   (if (r0 == ?\x8f)
+	       ((read r0 r1)
+		(r1 &= ?\x7f)
+		(r1 |= ((r0 & ?\x7f) << 7))
+		(r0 = ,(charset-id 'japanese-jisx0212))
+		(write-multibyte-character r0 r1)
+		(repeat)))
+	   ;; Process internal characters used in w3m.
+	   (if (r0 == ?\x80)	     ; Old ANSP (w3m-0.1.11pre+kokb23)
+	       (write-repeat 32))
+	   (if (r0 == ?\x90)		; ANSP (use for empty anchor)
+	       (write-repeat 32))
+	   (if (r0 == ?\x91)		; IMSP (blank around image)
+	       (write-repeat 32))
+	   (if (r0 == ?\xa0)		; NBSP (non breakble space)
+	       (write-repeat 32))
+	   (write-repeat r0))))
+      (make-ccl-coding-system
+       'w3m-euc-japan ?E
+       "ISO 2022 based EUC encoding for Japanese with w3m internal characters.
+  (generated by `w3m')"
+       'w3m-euc-japan-decoder
+       'w3m-euc-japan-encoder)))
山> ;; それはそれとして、w3m-xmas と w3m の依存関係はやっぱり直す
山> ;; べきだなあ。

というわけで、こちらが本筋だと思いますので、修正をお願いして良いでしょ
うか?

やはり、w3m-static-if などの共通マクロや共通関数を別ファイルに括り出し、
w3m-xmas.el 自体は (require 'w3m) しないようにする、というのが良い解の
ような気がします。

なお、この問題は、他の w3m-e21.el / w3m-om.el も同様だと思います。

-- 
土屋 雅稔  ( TSUCHIYA Masatoshi )
    http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/