(gnus-article-display-xface)
[gnus] / lisp / mm-util.el
index bf94df4..296098e 100644 (file)
@@ -1,5 +1,5 @@
 ;;; mm-util.el --- Utility functions for MIME things
-;; Copyright (C) 1998,99 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;;     MORIOKA Tomohiko <morioka@jaist.ac.jp>
     (iso-8859-3 latin-iso8859-3)
     (iso-8859-4 latin-iso8859-4)
     (iso-8859-5 cyrillic-iso8859-5)
-    (koi8-r cyrillic-iso8859-5)
+    ;; Non-mule (X)Emacs uses the last mule-charset for 8bit characters.
+    ;; The fake mule-charset, gnus-koi8-r, tells Gnus that the default 
+    ;; charset is koi8-r, not iso-8859-5.
+    (koi8-r cyrillic-iso8859-5 gnus-koi8-r)
     (iso-8859-6 arabic-iso8859-6)
     (iso-8859-7 greek-iso8859-7)
     (iso-8859-8 hebrew-iso8859-8)
@@ -64,7 +67,8 @@
                    chinese-cns11643-1 chinese-cns11643-2
                    chinese-cns11643-3 chinese-cns11643-4
                    chinese-cns11643-5 chinese-cns11643-6
-                   chinese-cns11643-7))
+                   chinese-cns11643-7)
+    (utf-8 unicode-a unicode-b unicode-c unicode-d unicode-e))
   "Alist of MIME-charset/MULE-charsets.")
 
 (eval-and-compile
          "Prompt the user for a coding system."
          (completing-read
           prompt (mapcar (lambda (s) (list (symbol-name (car s))))
-                         mm-mime-mule-charset-alist)))))))
+                         mm-mime-mule-charset-alist))))
+     (read-charset
+      . (lambda (prompt)
+         "Return a charset."
+         (intern
+          (completing-read
+           prompt
+           (mapcar (lambda (e) (list (symbol-name (car e))))
+                   mm-mime-mule-charset-alist)
+           nil t)))))))
+
+(eval-and-compile
+  (defalias 'mm-char-or-char-int-p
+    (cond 
+     ((fboundp 'char-or-char-int-p) 'char-or-char-int-p)
+     ((fboundp 'char-valid-p) 'char-valid-p) 
+     (t 'identity))))
 
 (defvar mm-coding-system-list nil)
 (defun mm-get-coding-system-list ()
@@ -180,17 +200,20 @@ used as the line break code type of the coding system."
    (t
     nil)))
 
-(defun mm-replace-chars-in-string (string from to)
-  "Replace characters in STRING from FROM to TO."
-  (let ((string (substring string 0))  ;Copy string.
-       (len (length string))
-       (idx 0))
-    ;; Replace all occurrences of FROM with TO.
-    (while (< idx len)
-      (when (= (aref string idx) from)
-       (aset string idx to))
-      (setq idx (1+ idx)))
-    string))
+(if (fboundp 'subst-char-in-string)
+    (defsubst mm-replace-chars-in-string (string from to)
+      (subst-char-in-string from to string))
+  (defun mm-replace-chars-in-string (string from to)
+    "Replace characters in STRING from FROM to TO."
+    (let ((string (substring string 0))        ;Copy string.
+         (len (length string))
+         (idx 0))
+      ;; Replace all occurrences of FROM with TO.
+      (while (< idx len)
+       (when (= (aref string idx) from)
+         (aset string idx to))
+       (setq idx (1+ idx)))
+      string)))
 
 (defsubst mm-enable-multibyte ()
   "Enable multibyte in the current buffer."
@@ -241,7 +264,7 @@ If the charset is `composition', return the actual one."
 
 (defun mm-mime-charset (charset)
   "Return the MIME charset corresponding to the MULE CHARSET."
-  (if (fboundp 'coding-system-get)
+  (if (and (fboundp 'coding-system-get) (fboundp 'get-charset-property))
       ;; This exists in Emacs 20.
       (or
        (and (mm-preferred-coding-system charset)
@@ -279,7 +302,7 @@ If the charset is `composition', return the actual one."
 
 (defsubst mm-multibyte-p ()
   "Say whether multibyte is enabled."
-  (or (string-match "XEmacs\\|Lucid" emacs-version)
+  (or (featurep 'xemacs)
       (and (boundp 'enable-multibyte-characters)
           enable-multibyte-characters)))
 
@@ -288,7 +311,7 @@ If the charset is `composition', return the actual one."
 See also `with-temp-file' and `with-output-to-string'."
   (let ((temp-buffer (make-symbol "temp-buffer"))
        (multibyte (make-symbol "multibyte")))
-    `(if (or (string-match "XEmacs\\|Lucid" emacs-version)
+    `(if (or (featurep 'xemacs)
             (not (boundp 'enable-multibyte-characters)))
         (with-temp-buffer ,@forms)
        (let ((,multibyte (default-value 'enable-multibyte-characters))
@@ -313,7 +336,7 @@ See also `with-temp-file' and `with-output-to-string'."
 (defmacro mm-with-unibyte-current-buffer (&rest forms)
   "Evaluate FORMS there like `progn' in current buffer."
   (let ((multibyte (make-symbol "multibyte")))
-    `(if (or (string-match "XEmacs\\|Lucid" emacs-version)
+    `(if (or (featurep 'xemacs)
             (not (fboundp 'set-buffer-multibyte)))
         (progn
           ,@forms)
@@ -323,7 +346,9 @@ See also `with-temp-file' and `with-output-to-string'."
                   (coding-system-for-read mm-binary-coding-system)
                   (coding-system-for-write mm-binary-coding-system))
               (set-buffer-multibyte nil)
+              (setq-default enable-multibyte-characters nil)
               ,@forms)
+          (setq-default enable-multibyte-characters ,multibyte)
           (set-buffer-multibyte ,multibyte))))))
 (put 'mm-with-unibyte-current-buffer 'lisp-indent-function 0)
 (put 'mm-with-unibyte-current-buffer 'edebug-form-spec '(body))
@@ -331,7 +356,7 @@ See also `with-temp-file' and `with-output-to-string'."
 (defmacro mm-with-unibyte (&rest forms)
   "Set default `enable-multibyte-characters' to `nil', eval the FORMS."
   (let ((multibyte (make-symbol "multibyte")))
-    `(if (or (string-match "XEmacs\\|Lucid" emacs-version)
+    `(if (or (featurep 'xemacs)
             (not (boundp 'enable-multibyte-characters)))
         (progn ,@forms)
        (let ((,multibyte (default-value 'enable-multibyte-characters)))
@@ -377,27 +402,20 @@ See also `with-temp-file' and `with-output-to-string'."
                            (or (car (last (assq 'charset entry)))
                                'latin-iso8859-1))))))))))
 
-(defun mm-read-charset (prompt)
-  "Return a charset."
-  (intern
-   (completing-read
-    prompt
-    (mapcar (lambda (e) (list (symbol-name (car e))))
-           mm-mime-mule-charset-alist)
-    nil t)))
-
-(defun mm-quote-arg (arg)
-  "Return a version of ARG that is safe to evaluate in a shell."
-  (let ((pos 0) new-pos accum)
-    ;; *** bug: we don't handle newline characters properly
-    (while (setq new-pos (string-match "[]*[;!'`\"$\\& \t{} |()<>]" arg pos))
-      (push (substring arg pos new-pos) accum)
-      (push "\\" accum)
-      (push (list (aref arg new-pos)) accum)
-      (setq pos (1+ new-pos)))
-    (if (= pos 0)
-        arg
-      (apply 'concat (nconc (nreverse accum) (list (substring arg pos)))))))
+(if (fboundp 'shell-quote-argument)
+    (defalias 'mm-quote-arg 'shell-quote-argument)
+  (defun mm-quote-arg (arg)
+    "Return a version of ARG that is safe to evaluate in a shell."
+    (let ((pos 0) new-pos accum)
+      ;; *** bug: we don't handle newline characters properly
+      (while (setq new-pos (string-match "[]*[;!'`\"$\\& \t{} |()<>]" arg pos))
+       (push (substring arg pos new-pos) accum)
+       (push "\\" accum)
+       (push (list (aref arg new-pos)) accum)
+       (setq pos (1+ new-pos)))
+      (if (= pos 0)
+         arg
+       (apply 'concat (nconc (nreverse accum) (list (substring arg pos))))))))
 
 (defun mm-auto-mode-alist ()
   "Return an `auto-mode-alist' with only the .gz (etc) thingies."