changeset 47705:797c350a7f8c

(utf-16-decode-ucs): Look up utf-subst-table-for-decode. Fix for the case that the looking up succeeds. (ccl-decode-mule-utf-16-le): Translate characters by utf-translation-table-for-decode. (ccl-decode-mule-utf-16-be): Likewise. (ccl-encode-mule-utf-16-le): Look up utf-subst-table-for-encode at first. Translate characters by utf-translation-table-for-encode. (ccl-encode-mule-utf-16-be): Likewise. (mule-utf-16-le, mule-utf-16-be): Add `dependency' property.
author Kenichi Handa <handa@m17n.org>
date Mon, 30 Sep 2002 06:37:00 +0000
parents 8a5233d2f072
children 361a553249c0
files lisp/international/utf-16.el
diffstat 1 files changed, 84 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/international/utf-16.el	Mon Sep 30 06:36:23 2002 +0000
+++ b/lisp/international/utf-16.el	Mon Sep 30 06:37:00 2002 +0000
@@ -68,48 +68,49 @@
 ;; Needed in macro expansion, so can't be let-bound.  Zapped after use.
 (eval-and-compile
 (defconst utf-16-decode-ucs
-  ;; We have the unicode in r1.  Output is character codes in r0, r1,
-  ;; and r2 if appropriate.
-  `((lookup-integer utf-8-subst-table r0 r3)
-    (if r7 (r1 = r3))			; got a translation
-    (if (r1 < 128)
-       (r0 = ,(charset-id 'ascii))
-     (if (r1 < 160)
-	 (r0 = ,(charset-id 'eight-bit-control))
-       (if (r1 < 256)
-	   ((r0 = ,(charset-id 'latin-iso8859-1))
-	    (r1 -= 128))
-	 (if (r1 < #x2500)
-	     ((r0 = ,(charset-id 'mule-unicode-0100-24ff))
-	      (r1 -= #x100)
-	      (r2 = (((r1 / 96) + 32) << 7))
-	      (r1 %= 96)
-	      (r1 += (r2 + 32)))
-	   (if (r1 < #x3400)
-	       ((r0 = ,(charset-id 'mule-unicode-2500-33ff))
-		(r1 -= #x2500)
-		(r2 = (((r1 / 96) + 32) << 7))
-		(r1 %= 96)
-		(r1 += (r2 + 32)))
-	     (if (r1 < #xd800)		; 2 untranslated bytes
-;;		 ;; Assume this is rare, so don't worry about the
-;; 		 ;; overhead of the call.
-;; 		 (call mule-utf-16-untrans)
-		 ((r0 = ,(charset-id 'mule-unicode-e000-ffff))
-		  (r1 = 15037))		; U+fffd
-	       (if (r1 < #xe000)	; surrogate
-;; 			((call mule-utf-16-untrans)
-;; 			 (write-multibyte-character r0 r1)
-;; 			 (read r3 r4)
-;; 			 (call mule-utf-16-untrans))
-		   ((read r3 r4)
-		    (r0 = ,(charset-id 'mule-unicode-e000-ffff))
-		    (r1 = 15037))
-		 ((r0 = ,(charset-id 'mule-unicode-e000-ffff))
-		  (r1 -= #xe000)
-		  (r2 = (((r1 / 96) + 32) << 7))
-		  (r1 %= 96)
-		  (r1 += (r2 + 32)))))))))))))
+  ;; We have the unicode in r1.  Output is charset ID in r0, code point
+  ;; in r1.
+  `((lookup-integer utf-subst-table-for-decode r1 r3)
+    (if r7				; got a translation
+	((r0 = r1) (r1 = r3))
+      (if (r1 < 128)
+	  (r0 = ,(charset-id 'ascii))
+	(if (r1 < 160)
+	    (r0 = ,(charset-id 'eight-bit-control))
+	  (if (r1 < 256)
+	      ((r0 = ,(charset-id 'latin-iso8859-1))
+	       (r1 -= 128))
+	    (if (r1 < #x2500)
+		((r0 = ,(charset-id 'mule-unicode-0100-24ff))
+		 (r1 -= #x100)
+		 (r2 = (((r1 / 96) + 32) << 7))
+		 (r1 %= 96)
+		 (r1 += (r2 + 32)))
+	      (if (r1 < #x3400)
+		  ((r0 = ,(charset-id 'mule-unicode-2500-33ff))
+		   (r1 -= #x2500)
+		   (r2 = (((r1 / 96) + 32) << 7))
+		   (r1 %= 96)
+		   (r1 += (r2 + 32)))
+		(if (r1 < #xd800)	; 2 untranslated bytes
+		    ;;		 ;; Assume this is rare, so don't worry about the
+		    ;; 		 ;; overhead of the call.
+		    ;; 		 (call mule-utf-16-untrans)
+		    ((r0 = ,(charset-id 'mule-unicode-e000-ffff))
+		     (r1 = 15037))	; U+fffd
+		  (if (r1 < #xe000)	; surrogate
+		      ;; 			((call mule-utf-16-untrans)
+		      ;; 			 (write-multibyte-character r0 r1)
+		      ;; 			 (read r3 r4)
+		      ;; 			 (call mule-utf-16-untrans))
+		      ((read r3 r4)
+		       (r0 = ,(charset-id 'mule-unicode-e000-ffff))
+		       (r1 = 15037))
+		    ((r0 = ,(charset-id 'mule-unicode-e000-ffff))
+		     (r1 -= #xe000)
+		     (r2 = (((r1 / 96) + 32) << 7))
+		     (r1 %= 96)
+		     (r1 += (r2 + 32))))))))))))))
 
 (define-ccl-program ccl-decode-mule-utf-16-le
   `(2					; 2 bytes -> 1 to 4 bytes
@@ -118,14 +119,14 @@
       (read r3 r4)
       (r1 = (r4 <8 r3))
       ,utf-16-decode-ucs
-      (translate-character utf-8-translation-table-for-decode r0 r1)
+      (translate-character utf-translation-table-for-decode r0 r1)
       (write-multibyte-character r0 r1)
       (repeat))))
   "Decode little endian UTF-16 (ignoring signature bytes).
 Basic decoding is done into the charsets ascii, latin-iso8859-1 and
-mule-unicode-*.  Un-representable Unicode characters are
-decoded as U+fffd.  The result is run through translation table
-`utf-8-translation-table-for-decode' if that is defined.")
+mule-unicode-*.  Un-representable Unicode characters are decoded as
+U+fffd.  The result is run through the translation-table named
+`utf-translation-table-for-decode'.")
 
 (define-ccl-program ccl-decode-mule-utf-16-be
   `(2					; 2 bytes -> 1 to 4 bytes
@@ -134,14 +135,14 @@
       (read r3 r4)
       (r1 = (r3 <8 r4))
       ,utf-16-decode-ucs
-      (translate-character utf-8-translation-table-for-decode r0 r1)
+      (translate-character utf-translation-table-for-decode r0 r1)
       (write-multibyte-character r0 r1)
       (repeat))))
   "Decode big endian UTF-16 (ignoring signature bytes).
 Basic decoding is done into the charsets ascii, latin-iso8859-1 and
 mule-unicode-*.  Un-representable Unicode characters are
-decoded as U+fffd.  The result is run through translation table
-`utf-8-non-latin-8859-table'.")
+decoded as U+fffd.  The result is run through the translation-table of
+name `utf-translation-table-for-decode'.")
 
 (makunbound 'utf-16-decode-ucs)		; done with it
 
@@ -176,15 +177,18 @@
      (write #xfe)
      (loop
       (read-multibyte-character r0 r1)
-      (translate-character ucs-mule-to-mule-unicode r0 r1)
-      ,utf-16-decode-to-ucs
+      (lookup-character utf-subst-table-for-encode r0 r1)
+      (if (r7 == 0)
+	  ((translate-character utf-translation-table-for-encode r0 r1)
+	   ,utf-16-decode-to-ucs))
       (write (r0 & 255))
       (write (r0 >> 8))
       (repeat))))
   "Encode to little endian UTF-16 with signature.
 Characters from the charsets ascii, eight-bit-control,
 eight-bit-graphic, latin-iso8859-1 and mule-unicode-* are encoded
-after translation through the table `ucs-mule-to-mule-unicode'.
+after translation through the translation-table of name
+`utf-translation-table-for-encode'.
 Others are encoded as U+FFFD.")
 
 (define-ccl-program ccl-encode-mule-utf-16-be
@@ -193,15 +197,18 @@
      (write #xff)
      (loop
       (read-multibyte-character r0 r1)
-      (translate-character ucs-mule-to-mule-unicode r0 r1)
-      ,utf-16-decode-to-ucs
+      (lookup-character utf-subst-table-for-encode r0 r1)
+      (if (r7 == 0)
+	  ((translate-character utf-translation-table-for-encode r0 r1)
+	   ,utf-16-decode-to-ucs))
       (write (r0 >> 8))
       (write (r0 & 255))
       (repeat))))
   "Encode to big endian UTF-16 with signature.
 Characters from the charsets ascii, eight-bit-control,
 eight-bit-graphic, latin-iso8859-1 and mule-unicode-* are encoded
-after translation through the table `ucs-mule-to-mule-unicode'.
+after translation through the translation-table named
+`utf-translation-table-for-encode'.
 Others are encoded as U+FFFD.")
 
 (makunbound 'utf-16-decode-to-ucs)
@@ -210,20 +217,19 @@
 
 Assumes and ignores the leading two-byte signature.
 
-The supported Emacs character sets are the following, plus others
-which may be included in the translation table
-`ucs-mule-to-mule-unicode':
- ascii
- eight-bit-control
- latin-iso8859-1
- mule-unicode-0100-24ff
- mule-unicode-2500-33ff
- mule-unicode-e000-ffff
+It supports Unicode characters of these ranges:
+    U+0000..U+33FF, U+E000..U+FFFF.
+They correspond to these Emacs character sets:
+    ascii, latin-iso8859-1, mule-unicode-0100-24ff,
+    mule-unicode-2500-33ff, mule-unicode-e000-ffff
 
-Note that Unicode characters out of the ranges U+0000-U+33FF and
-U+E200-U+FFFF are decoded as U+FFFD, effectively corrupting the data
-if they are re-encoded.  Emacs characters without Unicode conversions
-are encoded as U+FFFD."))
+On decoding (e.g. reading a file), Unicode characters not in the above
+ranges are decoded as U+FFFD, effectively corrupting the data
+if they are re-encoded.  
+
+On encoding (e.g. writing a file), Emacs characters not belonging to
+any of the character sets listed above are encoded into the byte
+sequence representing U+FFFD (REPLACEMENT CHARACTER)."))
   (make-coding-system
    'mule-utf-16-le 4
    ?u	      ; Mule-UCS uses ?U, but code-pages uses that for koi8-u.
@@ -242,7 +248,11 @@
      (mime-charset . utf-16le)
      (coding-category . coding-category-utf-16-le)
      (valid-codes (0 . 255))
-     (pre-write-conversion . utf-16-le-pre-write-conversion)))
+     (pre-write-conversion . utf-16-le-pre-write-conversion)
+     (dependency unify-8859-on-encoding-mode
+		 unify-8859-on-decoding-mode
+		 utf-fragment-on-decoding
+		 utf-translate-cjk)))
 
   (make-coding-system
    'mule-utf-16-be 4 ?u
@@ -261,10 +271,11 @@
      (mime-charset . utf-16be)
      (coding-category . coding-category-utf-16-be)
      (valid-codes (0 . 255))
-     (pre-write-conversion . utf-16-be-pre-write-conversion)))
-
-  (register-char-codings 'mule-utf-16-le ucs-mule-to-mule-unicode)
-  (register-char-codings 'mule-utf-16-be ucs-mule-to-mule-unicode))
+     (pre-write-conversion . utf-16-be-pre-write-conversion)
+     (dependency unify-8859-on-encoding-mode
+		 unify-8859-on-decoding-mode
+		 utf-fragment-on-decoding
+		 utf-translate-cjk))))
 
 (define-coding-system-alias 'utf-16-le 'mule-utf-16-le)
 (define-coding-system-alias 'utf-16-be 'mule-utf-16-be)