changeset 101547:aa2338088b49

(canonicalize-coding-system-name) (coding-system-from-name): New functions.
author Kenichi Handa <handa@m17n.org>
date Tue, 27 Jan 2009 04:36:35 +0000
parents 83a2261dc0ed
children d7ef20f9f52c
files lisp/international/mule-cmds.el
diffstat 1 files changed, 38 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/international/mule-cmds.el	Tue Jan 27 03:53:07 2009 +0000
+++ b/lisp/international/mule-cmds.el	Tue Jan 27 04:36:35 2009 +0000
@@ -243,6 +243,44 @@
      (if coding coding 'undecided)
      (if (numberp eol-type) (aref [unix dos mac] eol-type)))))
 
+;; Canonicalize the coding system name NAME by removing some prefixes
+;; and delimiter characters.  Support function of
+;; coding-system-from-name.
+(defun canonicalize-coding-system-name (name)
+  (if (string-match "^iso[-_ ]?[0-9]" name)
+      ;; "iso-8859-1" -> "8859-1", "iso-2022-jp" ->"2022-jp"
+      (setq name (substring name (1- (match-end 0)))))
+  (let ((idx (string-match "[-_ /]" name)))
+    ;; Delete "-", "_", " ", "/" but do distinguish "16-be" and "16be".
+    (while idx
+      (if (and (>= idx 2)
+	       (eq (string-match "16-[lb]e$" name (- idx 2))
+		   (- idx 2)))
+	  (setq idx (string-match "[-_ /]" name (match-end 0)))
+	(setq name (concat (substring name 0 idx) (substring name (1+ idx)))
+	      idx (string-match "[-_ /]" name idx))))
+    name))
+
+(defun coding-system-from-name (name)
+  "Return a coding system whose name matches with NAME (string or symbol)."
+  (let (sym)
+    (if (stringp name) (setq sym (intern name))
+      (setq sym name name (symbol-name name)))
+    (if (coding-system-p sym)
+	sym
+      (let ((eol-type
+	     (if (string-match "-\\(unix\\|dos\\|mac\\)$" name)
+		 (prog1 (intern (match-string 1 name))
+		   (setq name (substring name 0 (match-beginning 0)))))))
+	(setq name (canonicalize-coding-system-name (downcase name)))
+	(catch 'tag
+	  (dolist (elt (coding-system-list))
+	    (if (string= (canonicalize-coding-system-name (symbol-name elt))
+			 name)
+		(throw 'tag (if eol-type (coding-system-change-eol-conversion
+					  elt eol-type)
+			      elt)))))))))
+
 (defun toggle-enable-multibyte-characters (&optional arg)
   "Change whether this buffer uses multibyte characters.
 With ARG, use multibyte characters if the ARG is positive.