changeset 20112:6e6838a12511

The summary of the following changes: (1) Make all coding systems (including aliases and subsidiaries) directly have coding-spec vector in `coding-system' property. (2) Properties of a coding system (except for `coding-system' and `eol-type') is embeded in PLIST slot of coding-spec vector. (coding-spec-plist-idx): Initialize to 3. (coding-system-spec-ref): Deleted. (coding-system-spec): Moved from src/coding.c. (coding-system-type): Adjusted for the above change. (coding-system-mnemonic): Likewise. (coding-system-doc-string): Likewise. (coding-system-flags): Likewise. (coding-system-eol-type): Likewise. (coding-system-category): Likewise. (coding-system-get, coding-system-put, coding-system-category): New functions. (coding-system-base): Moved from mule-util.el and adjusted for the above change. (coding-system-parent): Make it obsolete alias of coding-system-base. (make-subsidiary-coding-system): Adjusted for the above change. Update coding-system-list and coding-system-alist. (make-coding-system): Likewise. (set-buffer-file-coding-system): Typo in doc-string fixed. (after-insert-file-set-buffer-file-coding-system): Change enable-multibyte-characters only when find-new-buffer-file-coding-system returns non-nil value. (find-new-buffer-file-coding-system): Adjusted for the abobe change.
author Kenichi Handa <handa@m17n.org>
date Tue, 21 Oct 1997 10:47:35 +0000
parents 761a83f7cb4e
children 00ca5f419c16
files lisp/international/mule.el
diffstat 1 files changed, 174 insertions(+), 110 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/international/mule.el	Tue Oct 21 10:45:26 1997 +0000
+++ b/lisp/international/mule.el	Tue Oct 21 10:47:35 1997 +0000
@@ -247,6 +247,7 @@
     (and (or (= (nth 1 l) 0) (eq (nth 2 l) 0))
 	 (not (eq (car l) 'composition)))))
 
+
 ;; Coding system staffs
 
 ;; Coding system is a symbol that has the property `coding-system'.
@@ -260,92 +261,150 @@
 (defconst coding-spec-type-idx 0)
 (defconst coding-spec-mnemonic-idx 1)
 (defconst coding-spec-doc-string-idx 2)
-(defconst coding-spec-plist-idx 2)
+(defconst coding-spec-plist-idx 3)
 (defconst coding-spec-flags-idx 4)
 
-;; Coding system may have property `eol-type'.  The value of the
-;; property `eol-type' is integer 0..2 or a vector of three coding
-;; systems.  The integer value 0, 1, and 2 indicate the format of
-;; end-of-line LF, CRLF, and CR respectively.  The vector value
-;; indicates that the format of end-of-line should be detected
-;; automatically.  Nth element of the vector is the subsidiary coding
-;; system whose `eol-type' property is N.
+;; PLIST is a property list of a coding system.  A coding system has
+;; PLIST in coding-spec instead of having it in normal proper list of
+;; Lisp symbol to share PLIST among alias coding systems.  Here's a
+;; list of properties to be held in PLIST.
+;;
+;; o coding-category
+;;
+;; The value is a coding category the coding system belongs to.  The
+;; function `make-coding-system' and `define-coding-system-alias' sets
+;; this value automatically.
 ;;
-;; Coding system may also have properties `post-read-conversion' and
-;; `pre-write-conversion.  Values of these properties are functions.
+;; o alias-coding-systems
+;;
+;; The value is a list of coding systems of the same alias group.  The
+;; first element is the coding system made at first, which we call as
+;; `base coding system'.  The function `make-coding-system' and
+;; `define-coding-system-alias' set this value automatically.
 ;;
-;; The function in `post-read-conversion' is called after some text is
-;; inserted and decoded along the coding system and before any
-;; functions in `after-insert-functions' are called.  The arguments to
-;; this function is the same as those of a function in
+;; o post-read-conversion
+;;
+;; The value is a function to call after some text is inserted and
+;; decoded by the coding system itself and before any functions in
+;; `after-insert-functions' are called.  The arguments to this
+;; function is the same as those of a function in
 ;; `after-insert-functions', i.e. LENGTH of a text while putting point
 ;; at the head of the text to be decoded
 ;;
-;; The function in `pre-write-conversion' is called after all
-;; functions in `write-region-annotate-functions' and
-;; `buffer-file-format' are called, and before the text is encoded by
-;; the coding system.  The arguments to this function is the same as
-;; those of a function in `write-region-annotate-functions', i.e. FROM
-;; and TO specifying region of a text.
+;; o pre-write-conversion
+;;
+;; The value is a function to call after all functions in
+;; `write-region-annotate-functions' and `buffer-file-format' are
+;; called, and before the text is encoded by the coding system itself.
+;; The arguments to this function is the same as those of a function
+;; in `write-region-annotate-functions', i.e. FROM and TO specifying
+;; region of a text.
+;;
+;; o character-unification-table-for-decode
+;;
+;; The value is a unification table to be applied on decoding.  See
+;; the function `make-unification-table' for the format of unification
+;; table.
+;;
+;; o character-unification-table-for-encode
+;;
+;; The value is a unification table to be applied on encoding.
 
-;; Return Nth element of coding-spec of CODING-SYSTEM.
-(defun coding-system-spec-ref (coding-system n)
-  (check-coding-system coding-system)
-  (let ((vec (coding-system-spec coding-system)))
-    (and vec (aref vec n))))
+;; Return coding-spec of CODING-SYSTEM
+(defsubst coding-system-spec (coding-system)
+  (get (check-coding-system coding-system) 'coding-system))
 
 (defun coding-system-type (coding-system)
-  "Return TYPE element in coding-spec of CODING-SYSTEM."
-  (coding-system-spec-ref coding-system coding-spec-type-idx))
+  "Return the coding type of CODING-SYSTEM.
+A coding type is an integer value indicating the encoding method
+of CODING-SYSTEM.  See the function `make-coding-system' for more detail."
+  (aref (coding-system-spec coding-system) coding-spec-type-idx))
 
 (defun coding-system-mnemonic (coding-system)
-  "Return MNEMONIC element in coding-spec of CODING-SYSTEM."
-  (or (coding-system-spec-ref coding-system coding-spec-mnemonic-idx)
+  "Return the mnemonic character of CODING-SYSTEM.
+A mnemonic character of a coding system is used in mode line
+to indicate the coding system."
+  (or (aref (coding-system-spec coding-system) coding-spec-mnemonic-idx)
       ?-))
 
 (defun coding-system-doc-string (coding-system)
-  "Return DOC-STRING element in coding-spec of CODING-SYSTEM."
-  (coding-system-spec-ref coding-system coding-spec-doc-string-idx))
+  "Return the documentation string for CODING-SYSTEM."
+  (aref (coding-system-spec coding-system) coding-spec-doc-string-idx))
 
 (defun coding-system-plist (coding-system)
-  "Return PLIST element in coding-spec of CODING-SYSTEM."
-  (coding-system-spec-ref coding-system coding-spec-plist-idx))
+  "Return the property list of CODING-SYSTEM."
+  (aref (coding-system-spec coding-system) coding-spec-plist-idx))
 
 (defun coding-system-flags (coding-system)
-  "Return FLAGS element in coding-spec of CODING-SYSTEM."
-  (coding-system-spec-ref coding-system coding-spec-flags-idx))
+  "Return `flags' of CODING-SYSTEM.
+A `flags' of a coding system is a vector of length 32 indicating detailed
+information of a coding system.  See the function `make-coding-system'
+for more detail."
+  (aref (coding-system-spec coding-system) coding-spec-flags-idx))
+
+(defun coding-system-get (coding-system prop)
+  "Extract a value from CODING-SYSTEM's property list for property PROP."
+  (plist-get (coding-system-plist coding-system) prop))
+
+(defun coding-system-put (coding-system prop val)
+  "Change value in CODING-SYSTEM's property list PROP to VAL."
+  (let ((plist (coding-system-plist coding-system)))
+    (if plist
+	(plist-put plist prop val)
+      (aset (coding-system-spec coding-system) coding-spec-plist-idx
+	    (list prop val)))))
+
+(defun coding-system-category (coding-system)
+  "Return the coding category of CODING-SYSTEM."
+  (coding-system-get coding-system 'coding-category))
+
+(defun coding-system-base (coding-system)
+  "Return the base coding system of CODING-SYSTEM.
+A base coding system is what made by `make-coding-system',
+not what made by `define-coding-system-alias'."
+  (car (coding-system-get coding-system 'alias-coding-systems)))
+
+(defalias 'coding-system-parent 'coding-system-base)
+(make-obsolete 'coding-system-parent 'coding-system-base)
+
+;; Coding system also has a property `eol-type'.
+;;
+;; This property indicates how the coding system handles end-of-line
+;; format.  The value is integer 0, 1, 2, or a vector of three coding
+;; systems.  Each integer value 0, 1, and 2 indicates the format of
+;; end-of-line LF, CRLF, and CR respectively.  A vector value
+;; indicates that the format of end-of-line should be detected
+;; automatically.  Nth element of the vector is the subsidiary coding
+;; system whose `eol-type' property is N.
 
 (defun coding-system-eol-type (coding-system)
-  "Return eol-type property of CODING-SYSTEM."
-  (check-coding-system coding-system)
-  (and coding-system
-       (or (get coding-system 'eol-type)
-	   (coding-system-eol-type (get coding-system 'coding-system)))))
+  "Return eol-type of CODING-SYSTEM.
+An eol-type is integer 0, 1, 2, or a vector of coding systems.
 
-(defun coding-system-category (coding-system)
-  "Return coding category of CODING-SYSTEM."
-  (and coding-system
-       (symbolp coding-system)
-       (or (get coding-system 'coding-category)
-	   (coding-system-category (get coding-system 'coding-system)))))
+Integer values 0, 1, and 2 indicate a format of end-of-line; LF,
+CRLF, and CR respectively.
 
-(defun coding-system-parent (coding-system)
-  "Return parent of CODING-SYSTEM."
-  (let ((parent (get coding-system 'parent-coding-system)))
-    (and parent
-	 (or (coding-system-parent parent)
-	     parent))))
+A vector value indicates that a format of end-of-line should be
+detected automatically.  Nth element of the vector is the subsidiary
+coding system whose eol-type is N."
+  (get coding-system 'eol-type))
 
 ;; Make subsidiary coding systems (eol-type variants) of CODING-SYSTEM.
 (defun make-subsidiary-coding-system (coding-system)
-  (let ((subsidiaries (vector (intern (format "%s-unix" coding-system))
+  (let ((coding-spec (coding-system-spec coding-system))
+	(subsidiaries (vector (intern (format "%s-unix" coding-system))
 			      (intern (format "%s-dos" coding-system))
 			      (intern (format "%s-mac" coding-system))))
-	(i 0))
+	(i 0)
+	temp)
     (while (< i 3)
-      (put (aref subsidiaries i) 'coding-system coding-system)
+      (put (aref subsidiaries i) 'coding-system coding-spec)
       (put (aref subsidiaries i) 'eol-type i)
-      (put (aref subsidiaries i) 'eol-variant t)
+      (setq coding-system-list
+	    (cons (aref subsidiaries i) coding-system-list))
+      (setq coding-system-alist
+	    (cons (list (symbol-name (aref subsidiaries i)))
+		  coding-system-alist))
       (setq i (1+ i)))
     subsidiaries))
 
@@ -354,7 +413,7 @@
   "Define a new CODING-SYSTEM (symbol).
 Remaining arguments are TYPE, MNEMONIC, DOC-STRING, and FLAGS (optional) which
 construct a coding-spec of CODING-SYSTEM in the following format:
-	[TYPE MNEMONIC DOC-STRING nil FLAGS]
+	[TYPE MNEMONIC DOC-STRING PLIST FLAGS]
 TYPE is an integer value indicating the type of coding-system as follows:
   0: Emacs internal format,
   1: Shift-JIS (or MS-Kanji) used mainly on Japanese PC,
@@ -362,8 +421,14 @@
   3: Big5 used mainly on Chinese PC,
   4: private, CCL programs provide encoding/decoding algorithm,
   5: Raw-text, which means that text contains random 8-bit codes. 
+
 MNEMONIC is a character to be displayed on mode line for the coding-system.
+
 DOC-STRING is a documentation string for the coding-system.
+
+PLIST is the propert list for CODING-SYSTEM.  This function sets
+properties coding-category and alias-coding-systems.
+
 FLAGS specifies more precise information of each TYPE.
 
   If TYPE is 2 (ISO-2022), FLAGS should be a list of:
@@ -399,17 +464,21 @@
   If TYPE is 4 (private), FLAGS should be a cons of CCL programs,
     for decoding and encoding.  See the documentation of CCL for more detail."
 
-  ;; At first, set a value of `coding-system' property.
+  (if (memq coding-system coding-system-list)
+      (error "Coding system %s already exists"))
+
+  ;; Set a value of `coding-system' property.
   (let ((coding-spec (make-vector 5 nil))
+	(no-initial-designation nil)
 	coding-category)
     (if (or (not (integerp type)) (< type 0) (> type 5))
-	(error "TYPE argument must be 0..4"))
+	(error "TYPE argument must be 0..5"))
     (if (or (not (integerp mnemonic)) (<= mnemonic ? ) (> mnemonic 127))
-	(error "MNEMONIC arguemnt must be a printable character."))
-    (aset coding-spec 0 type)
-    (aset coding-spec 1 mnemonic)
-    (aset coding-spec 2 (if (stringp doc-string) doc-string ""))
-    (aset coding-spec 3 nil)		; obsolete element
+	(error "MNEMONIC arguemnt must be an ASCII printable character."))
+    (aset coding-spec coding-spec-type-idx type)
+    (aset coding-spec coding-spec-mnemonic-idx mnemonic)
+    (aset coding-spec coding-spec-doc-string-idx
+	  (if (stringp doc-string) doc-string ""))
     (cond ((= type 0)
 	   (setq coding-category 'coding-category-emacs-mule))
 	  ((= type 1)
@@ -417,8 +486,8 @@
 	  ((= type 2)			; ISO2022
 	   (let ((i 0)
 		 (vec (make-vector 32 nil))
-		 (no-initial-designation t)
 		 (g1-designation nil))
+	     (setq no-initial-designation t)
 	     (while (< i 4)
 	       (let ((charset (car flags)))
 		 (if (and no-initial-designation
@@ -446,8 +515,6 @@
 	       (aset vec i (car flags))
 	       (setq flags (cdr flags) i (1+ i)))
 	     (aset coding-spec 4 vec)
-	     (if no-initial-designation
-		 (put coding-system 'no-initial-designation t))
 	     (setq coding-category
 		   (if (aref vec 8)	; Use locking-shift.
 		       (or (and (aref vec 7) 'coding-category-iso-7-else)
@@ -473,8 +540,14 @@
 	     (error "Invalid FLAGS argument for TYPE 4 (CCL)")))
 	  (t				; i.e. (= type 5)
 	   (setq coding-category 'coding-category-raw-text)))
+
+    (let ((plist (list 'coding-category coding-category
+		       'alias-coding-systems (list coding-system))))
+      (if no-initial-designation
+	  (setq plist (cons 'no-initial-designation
+			    (cons no-initial-designation plist))))
+      (aset coding-spec coding-spec-plist-idx plist))
     (put coding-system 'coding-system coding-spec)
-    (put coding-system 'coding-category coding-category)
     (put coding-category 'coding-systems
 	 (cons coding-system (get coding-category 'coding-systems))))
 
@@ -484,30 +557,25 @@
   (put coding-system 'eol-type
        (if (or (<= type 3) (= type 5))
 	   (make-subsidiary-coding-system coding-system)
-	 0)))
+	 0))
+
+  ;; At last, register CODING-SYSTEM in `coding-system-list' and
+  ;; `coding-system-alist'.
+  (setq coding-system-list (cons coding-system coding-system-list))
+  (setq coding-system-alist (cons (list (symbol-name coding-system))
+				  coding-system-alist)))
 
 (defun define-coding-system-alias (alias coding-system)
   "Define ALIAS as an alias for coding system CODING-SYSTEM."
-  (check-coding-system coding-system)
-  (let ((parent (coding-system-parent coding-system)))
-    (if parent
-	(setq coding-system parent)))
-  (put alias 'coding-system coding-system)
-  (put alias 'parent-coding-system coding-system)
-  (put coding-system 'alias-coding-systems
-       (cons alias (get coding-system 'alias-coding-systems)))
-  (let ((eol-variants (coding-system-eol-type coding-system))
-	subsidiaries)
-    (if (vectorp eol-variants)
-	(let ((i 0))
-	  (setq subsidiaries (make-subsidiary-coding-system alias))
-	  (while (< i 3)
-	    (put (aref subsidiaries i) 'parent-coding-system
-		 (aref eol-variants i))
-	    (put (aref eol-variants i) 'alias-coding-systems
-		 (cons (aref subsidiaries i) (get (aref eol-variants i)
-						  'alias-coding-systems)))
-	    (setq i (1+ i)))))))
+  (put alias 'coding-system (coding-system-spec coding-system))
+  (nconc (coding-system-get alias 'alias-coding-systems) (list alias))
+  (setq coding-system-list (cons alias coding-system-list))
+  (setq coding-system-alist (cons (list (symbol-name alias))
+				  coding-system-alist))
+  (let ((eol-type (coding-system-eol-type coding-system)))
+    (if (vectorp eol-type)
+	(put alias 'eol-type (make-subsidiary-coding-system alias))
+      (put alias 'eol-type eol-type))))
 
 (defun set-buffer-file-coding-system (coding-system &optional force)
   "Set the file coding-system of the current buffer to CODING-SYSTEM.
@@ -519,7 +587,7 @@
 conversion, and CODING-SYSTEM does not specify one, CODING-SYSTEM is
 merged with the already-specified end-of-line conversion.
 However, if the optional prefix argument FORCE is non-nil,
-them CODING-SYSTEM is used exactly as specified."
+then CODING-SYSTEM is used exactly as specified."
   (interactive "zCoding system for visited file: \nP")
   (check-coding-system coding-system)
   (if (null force)
@@ -707,15 +775,15 @@
       (let ((coding-system
 	     (find-new-buffer-file-coding-system last-coding-system-used))
 	    (modified-p (buffer-modified-p)))
-	(if coding-system
-	    (set-buffer-file-coding-system coding-system))
-	(if (or (eq coding-system 'no-conversion)
-		(eq (coding-system-type coding-system) 5))
-	    ;; It seems that random 8-bit codes are read.  We had
-	    ;; better edit this buffer without multibyte character
-	    ;; facility.
-	    (setq enable-multibyte-characters nil))
-	(set-buffer-modified-p modified-p)))
+	(when coding-system
+	  (set-buffer-file-coding-system coding-system)
+	  (if (or (eq coding-system 'no-conversion)
+		  (eq (coding-system-type coding-system) 5))
+	      ;; It seems that random 8-bit codes are read.  We had
+	      ;; better edit this buffer without multibyte character
+	      ;; facility.
+	      (setq enable-multibyte-characters nil))
+	  (set-buffer-modified-p modified-p))))
   nil)
 
 (setq after-insert-file-functions
@@ -745,12 +813,10 @@
       (if (null (numberp local-eol))
 	  ;; But eol-type is not yet set.
 	  (setq local-eol nil))
-      (when (and buffer-file-coding-system
-		 (not (eq (coding-system-type buffer-file-coding-system) t)))
-	;; This is not `undecided'.
-	(setq local-coding buffer-file-coding-system)
-	(while (symbolp (get local-coding 'coding-system))
-	  (setq local-coding (get local-coding 'coding-system))))
+      (if (and buffer-file-coding-system
+	       (not (eq (coding-system-type buffer-file-coding-system) t)))
+	  ;; This is not `undecided'.
+	  (setq local-coding (coding-system-base buffer-file-coding-system)))
 
       (if (and (local-variable-p 'buffer-file-coding-system)
 	       local-eol local-coding)
@@ -762,11 +828,9 @@
 	(if (null (numberp found-eol))
 	    ;; But eol-type is not found.
 	    (setq found-eol nil))
-	(unless (eq (coding-system-type coding) t)
-	  ;; This is not `undecided'.
-	  (setq found-coding coding)
-	  (while (symbolp (get found-coding 'coding-system))
-	    (setq found-coding (get found-coding 'coding-system))))
+	(if (not (eq (coding-system-type coding) t))
+	    ;; This is not `undecided'.
+	    (setq found-coding (coding-system-base coding)))
 
 	;; The local setting takes precedence over the found one.
 	(setq new-coding (or (and (local-variable-p 'buffer-file-coding-system)