(canonicalize-coding-system-name)
authorKenichi Handa <handa@m17n.org>
Tue, 27 Jan 2009 04:39:30 +0000 (04:39 +0000)
committerKenichi Handa <handa@m17n.org>
Tue, 27 Jan 2009 04:39:30 +0000 (04:39 +0000)
(coding-system-from-name): New functions.

etc/ChangeLog
lisp/international/mule-cmds.el

index 0114da8..06118d9 100644 (file)
@@ -1,3 +1,7 @@
+2009-01-27  Kenichi Handa  <handa@m17n.org>
+
+       * NEWS: New function `coding-sytem-from-name'.
+
 2009-01-25  Carsten Dominik  <dominik@science.uva.nl>
 
        * refcards/orgcard.tex: New year and version number.
index a354a10..cbed1e3 100644 (file)
@@ -243,6 +243,44 @@ how text is formatted automatically while decoding."
      (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.