(spam-report-gmane-max-requests): New constant.
[gnus] / lisp / mm-util.el
index 7e9f0ca..7077cae 100644 (file)
 
 (defvar mm-mime-mule-charset-alist )
 
+;; Emulate functions that are not available in every (X)Emacs version.
+;; The name of a function is prefixed with mm-, like `mm-char-int' for
+;; `char-int' that is a native XEmacs function, not available in Emacs.
+;; Gnus programs all should use mm- functions, not the original ones.
 (eval-and-compile
   (mapc
    (lambda (elem)
        (if (fboundp (car elem))
           (defalias nfunc (car elem))
         (defalias nfunc (cdr elem)))))
-   '((coding-system-list . ignore)
+   `(;; `coding-system-list' is not available in XEmacs 21.4 built
+     ;; without the `file-coding' feature.
+     (coding-system-list . ignore)
+     ;; `char-int' is an XEmacs function, not available in Emacs.
      (char-int . identity)
+     ;; `coding-system-equal' is an Emacs function, not available in XEmacs.
      (coding-system-equal . equal)
+     ;; `annotationp' is an XEmacs function, not available in Emacs.
      (annotationp . ignore)
+     ;; `set-buffer-file-coding-system' is not available in XEmacs 21.4
+     ;; built without the `file-coding' feature.
      (set-buffer-file-coding-system . ignore)
+     ;; `read-charset' is an Emacs function, not available in XEmacs.
      (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))))
+      . ,(lambda (prompt)
+          "Return a charset."
+          (intern
+           (completing-read
+            prompt
+            (mapcar (lambda (e) (list (symbol-name (car e))))
+                    mm-mime-mule-charset-alist)
+            nil t))))
+     ;; `subst-char-in-string' is not available in XEmacs 21.4.
      (subst-char-in-string
-      . (lambda (from to string &optional inplace)
-         ;; stolen (and renamed) from nnheader.el
-         "Replace characters in STRING from FROM to TO.
+      . ,(lambda (from to string &optional inplace)
+          ;; stolen (and renamed) from nnheader.el
+          "Replace characters in STRING from FROM to TO.
          Unless optional argument INPLACE is non-nil, return a new string."
-         (let ((string (if inplace string (copy-sequence 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)))
+          (let ((string (if inplace string (copy-sequence 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)))
+     ;; `replace-in-string' is an XEmacs function, not available in Emacs.
      (replace-in-string
-      . (lambda (string regexp rep &optional literal)
-         "See `replace-regexp-in-string', only the order of args differs."
-         (replace-regexp-in-string regexp rep string nil literal)))
+      . ,(lambda (string regexp rep &optional literal)
+          "See `replace-regexp-in-string', only the order of args differs."
+          (replace-regexp-in-string regexp rep string nil literal)))
+     ;; `string-as-unibyte' is an Emacs function, not available in XEmacs.
      (string-as-unibyte . identity)
+     ;; `string-make-unibyte' is an Emacs function, not available in XEmacs.
      (string-make-unibyte . identity)
      ;; string-as-multibyte often doesn't really do what you think it does.
      ;; Example:
      ;; (string-as-multibyte s)   ~= (decode-coding-string s 'emacs-mule)
      ;; (string-to-multibyte s)   ~= (decode-coding-string s 'binary)
      ;; (string-make-multibyte s) ~= (decode-coding-string s locale-coding-system)
+     ;; `string-as-multibyte' is an Emacs function, not available in XEmacs.
      (string-as-multibyte . identity)
+     ;; `multibyte-string-p' is an Emacs function, not available in XEmacs.
      (multibyte-string-p . ignore)
+     ;; `insert-byte' is available only in Emacs 23.1 or greater.
      (insert-byte . insert-char)
+     ;; `multibyte-char-to-unibyte' is an Emacs function, not available
+     ;; in XEmacs.
      (multibyte-char-to-unibyte . identity)
+     ;; `set-buffer-multibyte' is an Emacs function, not available in XEmacs.
      (set-buffer-multibyte . ignore)
+     ;; `special-display-p' is an Emacs function, not available in XEmacs.
      (special-display-p
-      . (lambda (buffer-name)
-         "Returns non-nil if a buffer named BUFFER-NAME gets a special frame."
-         (and special-display-function
-              (or (and (member buffer-name special-display-buffer-names) t)
-                  (cdr (assoc buffer-name special-display-buffer-names))
-                  (catch 'return
-                    (dolist (elem special-display-regexps)
-                      (and (stringp elem)
-                           (string-match elem buffer-name)
-                           (throw 'return t))
-                      (and (consp elem)
-                           (stringp (car elem))
-                           (string-match (car elem) buffer-name)
-                           (throw 'return (cdr elem))))))))))))
-
+      . ,(lambda (buffer-name)
+          "Returns non-nil if a buffer named BUFFER-NAME gets a special frame."
+          (and special-display-function
+               (or (and (member buffer-name special-display-buffer-names) t)
+                   (cdr (assoc buffer-name special-display-buffer-names))
+                   (catch 'return
+                     (dolist (elem special-display-regexps)
+                       (and (stringp elem)
+                            (string-match elem buffer-name)
+                            (throw 'return t))
+                       (and (consp elem)
+                            (stringp (car elem))
+                            (string-match (car elem) buffer-name)
+                            (throw 'return (cdr elem)))))))))
+     ;; `substring-no-properties' is available only in Emacs 22.1 or greater.
+     (substring-no-properties
+      . ,(lambda (string &optional from to)
+          "Return a substring of STRING, without text properties.
+It starts at index FROM and ending before TO.
+TO may be nil or omitted; then the substring runs to the end of STRING.
+If FROM is nil or omitted, the substring starts at the beginning of STRING.
+If FROM or TO is negative, it counts from the end.
+
+With one argument, just copy STRING without its properties."
+          (setq string (substring string (or from 0) to))
+          (set-text-properties 0 (length string) nil string)
+          string)))))
+
+;; `decode-coding-string', `encode-coding-string', `decode-coding-region'
+;; and `encode-coding-region' are available in Emacs and XEmacs built with
+;; the `file-coding' feature, but the XEmacs versions treat nil, that is
+;; given as the `coding-system' argument, as the `binary' coding system.
 (eval-and-compile
   (if (featurep 'xemacs)
       (if (featurep 'file-coding)
-         ;; Don't modify string if CODING-SYSTEM is nil.
          (progn
            (defun mm-decode-coding-string (str coding-system)
              (if coding-system
     (defalias 'mm-decode-coding-region 'decode-coding-region)
     (defalias 'mm-encode-coding-region 'encode-coding-region)))
 
+;; `string-to-multibyte' is available only in Emacs 22.1 or greater.
 (defalias 'mm-string-to-multibyte
   (cond
    ((featurep 'xemacs)
     'string-to-multibyte)
    (t
     (lambda (string)
-      "Return a multibyte string with the same individual chars as string."
+      "Return a multibyte string with the same individual chars as STRING."
       (mapconcat
        (lambda (ch) (mm-string-as-multibyte (char-to-string ch)))
        string "")))))
 
+;; `char-or-char-int-p' is an XEmacs function, not available in Emacs.
 (eval-and-compile
   (defalias 'mm-char-or-char-int-p
     (cond
@@ -425,6 +466,8 @@ could use `autoload-coding-system' here."
   :group 'mime)
 (put 'mm-charset-eval-alist 'risky-local-variable t)
 
+(defvar mm-charset-override-alist)
+
 ;; Note: this function has to be defined before `mm-charset-override-alist'
 ;; since it will use this function in order to determine its default value
 ;; when loading mm-util.elc.