Synch to No Gnus 200401081739.
[elisp/gnus.git-] / lisp / dgnushack.el
index 505f844..a8def9e 100644 (file)
@@ -37,8 +37,6 @@
        (if (memq 'shift-jis (coding-priority-list))
           (set-coding-priority-list
            (append (delq 'shift-jis (coding-priority-list)) '(shift-jis)))))
-      ((boundp 'MULE)
-       (put '*coding-category-sjis* 'priority (length *predefined-category*)))
       ((featurep 'mule)
        (if (memq 'coding-category-sjis coding-category-list)
           (set-coding-priority
 ;  (cons 'progn (cdr form)))
 ;(defalias 'byte-compile-file-form-defsubst 'byte-compile-file-form-defun)
 
-(when (boundp 'MULE)
-  (let (current-load-list)
-    ;; Make the function to be silent at compile-time.
-    (defun locate-library (library &optional nosuffix)
-      "Show the full path name of Emacs library LIBRARY.
-This command searches the directories in `load-path' like `M-x load-library'
-to find the file that `M-x load-library RET LIBRARY RET' would load.
-Optional second arg NOSUFFIX non-nil means don't add suffixes `.elc' or `.el'
-to the specified name LIBRARY (a la calling `load' instead of `load-library')."
-      (interactive "sLocate library: ")
-      (catch 'answer
-       (mapcar
-        '(lambda (dir)
-           (mapcar
-            '(lambda (suf)
-               (let ((try (expand-file-name (concat library suf) dir)))
-                 (and (file-readable-p try)
-                      (null (file-directory-p try))
-                      (progn
-                        (or noninteractive
-                            (message "Library is file %s" try))
-                        (throw 'answer try)))))
-            (if nosuffix '("") '(".elc" ".el" ""))))
-        load-path)
-       (or noninteractive
-           (message "No library %s in search path" library))
-       nil))
-    (byte-compile 'locate-library)))
+(when (and (not (featurep 'xemacs))
+          (= emacs-major-version 21)
+          (= emacs-minor-version 3)
+          (condition-case code
+              (let ((byte-compile-error-on-warn t))
+                (byte-optimize-form (quote (pop x)) t)
+                nil)
+            (error (string-match "called for effect"
+                                 (error-message-string code)))))
+  (defadvice byte-optimize-form-code-walker (around silence-warn-for-pop
+                                                   (form for-effect)
+                                                   activate)
+    "Silence the warning \"...called for effect\" for the `pop' form.
+It is effective only when the `pop' macro is defined by cl.el rather
+than subr.el."
+    (let (tmp)
+      (if (and (eq (car-safe form) 'car)
+              for-effect
+              (setq tmp (get 'car 'side-effect-free))
+              (not byte-compile-delete-errors)
+              (not (eq tmp 'error-free))
+              (eq (car-safe (cadr form)) 'prog1)
+              (let ((var (cadr (cadr form)))
+                    (last (nth 2 (cadr form))))
+                (and (symbolp var)
+                     (null (nthcdr 3 (cadr form)))
+                     (eq (car-safe last) 'setq)
+                     (eq (cadr last) var)
+                     (eq (car-safe (nth 2 last)) 'cdr)
+                     (eq (cadr (nth 2 last)) var))))
+         (progn
+           (put 'car 'side-effect-free 'error-free)
+           (unwind-protect
+               ad-do-it
+             (put 'car 'side-effect-free tmp)))
+       ad-do-it))))
 
 (setq max-specpdl-size 3000)
 
@@ -178,7 +184,36 @@ It has already been fixed in XEmacs since 1999-12-06."
         '(char-before (point))
        form))))
 
-(load (expand-file-name "dgnuspath.el" srcdir) nil nil t)
+;; Add `early-package-load-path' to `load-path' for XEmacs.  Those paths
+;; won't appear in `load-path' when XEmacs starts with the `-no-autoloads'
+;; option because of a bug. :<
+(when (and (featurep 'xemacs)
+          (string-match "--package-path=\\([^ ]+\\)"
+                        system-configuration-options))
+  (let ((paths
+        (apply 'nconc
+               (mapcar
+                (lambda (path)
+                  (when (file-directory-p
+                         (setq path (expand-file-name "lisp" path)))
+                    (directory-files path t)))
+                (split-string (match-string 1 system-configuration-options)
+                              "::"))))
+       path adds)
+    (while paths
+      (setq path (car paths)
+           paths (cdr paths))
+      (when (and path
+                (not (or (string-match "/\\.\\.?\\'" path)
+                         (member (file-name-as-directory path) load-path)
+                         (member path load-path)))
+                (file-directory-p path))
+       (push (file-name-as-directory path) adds)))
+    (setq load-path (nconc (nreverse adds) load-path))))
+
+(if (file-exists-p (expand-file-name "dgnuspath.el" srcdir))
+    (load (expand-file-name "dgnuspath.el" srcdir) nil nil t)
+  (message "  ** There's no dgnuspath.el file"))
 
 (condition-case err
     (load "~/.lpath.el" t nil t)
@@ -240,16 +275,6 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
 (push srcdir load-path)
 (load (expand-file-name "lpath.el" srcdir) nil t t)
 
-(load (expand-file-name "gnus-clfns.el" srcdir) nil t t)
-
-(when (boundp 'MULE)
-  ;; Bind the function `base64-encode-string' before loading canlock.
-  ;; Since canlock will bind it as an autoloaded function, it causes
-  ;; damage to define the function by MEL.
-  (load (expand-file-name "base64.el" srcdir) nil t t)
-  ;; Load special macros for compiling canlock.el.
-  (load (expand-file-name "canlock-om.el" srcdir) nil t t))
-
 (require 'custom)
 
 ;; Bind functions defined by `defun-maybe'.
@@ -314,16 +339,11 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
                 (if (string-match "\\(\\.gz$\\)\\|\\.bz2$" file)
                     (let ((temp (expand-file-name "dgnustemp.el" srcdir)))
                       (when
-                          (let* ((binary (if (boundp 'MULE)
-                                             '*noconv*
-                                           'binary))
-                                 (coding-system-for-read binary)
-                                 (coding-system-for-write binary)
-                                 (input-coding-system binary)
-                                 (output-coding-system binary)
-                                 (default-process-coding-system
-                                   (cons binary binary))
-                                 call-process-hook)
+                          (let ((coding-system-for-read 'binary)
+                                (coding-system-for-write 'binary)
+                                (default-process-coding-system
+                                  '(binary . binary))
+                                call-process-hook)
                             (insert-file-contents file nil nil nil t)
                             (when
                                 (condition-case code
@@ -385,76 +405,7 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
    (byte-compile 'dgnushack-bind-colon-keywords)
    (dgnushack-bind-colon-keywords)))
 
-(when (boundp 'MULE)
-  (setq :version ':version
-       :set-after ':set-after)
-  (require 'custom)
-  (defadvice custom-handle-keyword
-    (around dont-signal-an-error-even-if-unsupported-keyword-is-given
-           activate)
-    "Don't signal an error even if unsupported keyword is given."
-    (if (not (memq (ad-get-arg 1) '(:version :set-after)))
-       ad-do-it)))
-
-(when (boundp 'MULE)
-  (put 'custom-declare-face 'byte-optimizer
-       'byte-optimize-ignore-unsupported-custom-keywords)
-  (put 'custom-declare-group 'byte-optimizer
-       'byte-optimize-ignore-unsupported-custom-keywords)
-  (defun byte-optimize-ignore-unsupported-custom-keywords (form)
-    (if (or (memq ':version (nthcdr 4 form))
-           (memq ':set-after (nthcdr 4 form)))
-       (let ((newform (list (car form) (nth 1 form)
-                            (nth 2 form) (nth 3 form)))
-             (args (nthcdr 4 form)))
-         (while args
-           (or (memq (car args) '(:version :set-after))
-               (setq newform (nconc newform (list (car args)
-                                                  (car (cdr args))))))
-           (setq args (cdr (cdr args))))
-         newform)
-      form))
-
-  (put 'custom-declare-variable 'byte-hunk-handler
-       'byte-compile-file-form-custom-declare-variable)
-  (defun byte-compile-file-form-custom-declare-variable (form)
-    ;; Bind defcustom'ed variables.
-    (if (memq 'free-vars byte-compile-warnings)
-       (setq byte-compile-bound-variables
-             (cons (nth 1 (nth 1 form)) byte-compile-bound-variables)))
-    (if (memq ':version (nthcdr 4 form))
-       ;; Make the variable uncustomizable.
-       `(defvar ,(nth 1 (nth 1 form)) ,(nth 1 (nth 2 form))
-          ,(substring (nth 3 form) (if (string-match "^[\t *]+" (nth 3 form))
-                                       (match-end 0)
-                                     0)))
-      ;; Ignore unsupported keyword(s).
-      (if (memq ':set-after (nthcdr 4 form))
-         (let ((newform (list (car form) (nth 1 form)
-                              (nth 2 form) (nth 3 form)))
-               (args (nthcdr 4 form)))
-           (while args
-             (or (eq (car args) ':set-after)
-                 (setq newform (nconc newform (list (car args)
-                                                    (car (cdr args))))))
-             (setq args (cdr (cdr args))))
-           newform)
-       form)))
-
-  (defadvice byte-compile-inline-expand (around ignore-built-in-functions
-                                               (form) activate)
-    "Ignore built-in functions."
-    (let* ((name (car form))
-          (fn (and (fboundp name)
-                   (symbol-function name))))
-      (if (subrp fn)
-         ;; Give up on inlining.
-         (setq ad-return-value form)
-       ad-do-it))))
-
 ;; Unknown variables and functions.
-(unless (boundp 'buffer-file-coding-system)
-  (defvar buffer-file-coding-system (symbol-value 'file-coding-system)))
 (unless (featurep 'xemacs)
   (defalias 'Custom-make-dependencies 'ignore)
   (defalias 'update-autoloads-from-directory 'ignore))
@@ -468,11 +419,6 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
 
 (eval-and-compile
   (when (featurep 'xemacs)
-    ;; XEmacs 21.1 needs some extra hand holding
-    (when (eq emacs-minor-version 1)
-      (autoload 'custom-declare-face "cus-face" nil t)
-      (autoload 'cl-compile-time-init "cl-macs" nil t)
-      (autoload 'defadvice "advice" nil nil 'macro))
     (unless (fboundp 'defadvice)
       (autoload 'defadvice "advice" nil nil 'macro))
     (autoload 'Info-directory "info" nil t)
@@ -488,6 +434,8 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
     (autoload 'delete-annotation "annotations")
     (autoload 'dolist "cl-macs" nil nil 'macro)
     (autoload 'enriched-decode "enriched")
+    (autoload 'executable-find "executable")
+    (autoload 'font-lock-fontify-buffer "font-lock" nil t)
     (autoload 'info "info" nil t)
     (autoload 'make-annotation "annotations")
     (autoload 'make-display-table "disp-table")
@@ -537,9 +485,6 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
 
 (defconst dgnushack-unexporting-files
   (append '("dgnushack.el" "dgnuspath.el" "dgnuskwds.el" "lpath.el")
-         (condition-case nil
-             (progn (require 'shimbun) nil)
-           (error '("nnshimbun.el")))
          (unless (or (condition-case code
                          (require 'w3-parse)
                        (error
@@ -595,17 +540,15 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
                        ""))
             '("gnus-bbdb.el")))
          (unless (featurep 'xemacs)
-           '("gnus-xmas.el" "messagexmas.el" "nnheaderxm.el"))
-         (when (and (not (featurep 'xemacs))
-                    (<= emacs-major-version 20))
-           '("smiley.el"))
+           '("gnus-xmas.el" "messagexmas.el" "nnheaderxm.el"
+             "run-at-time.el"))
          (when (and (fboundp 'base64-decode-string)
                     (subrp (symbol-function 'base64-decode-string)))
            '("base64.el"))
          (when (and (fboundp 'md5) (subrp (symbol-function 'md5)))
            '("md5.el"))
-         (unless (boundp 'MULE)
-           '("canlock-om.el")))
+         (when (featurep 'xemacs)
+           '("gnus-load.el")))
   "Files which will not be installed.")
 
 (defconst dgnushack-exporting-files
@@ -620,7 +563,8 @@ Try to re-configure with --with-addpath=FLIM_PATH and run make again.
   (princ (mapconcat 'identity dgnushack-exporting-files " ")))
 
 (defconst dgnushack-dont-compile-files
-  '("mm-bodies.el" "mm-decode.el" "mm-encode.el" "mm-extern.el"
+  '("gnus-load.el"
+    "mm-bodies.el" "mm-decode.el" "mm-encode.el" "mm-extern.el"
     "mm-partial.el" "mm-url.el" "mm-uu.el" "mm-view.el" "mml-sec.el"
     "mml-smime.el" "mml.el" "mml1991.el" "mml2015.el")
   "Files which should not be byte-compiled.")
@@ -632,13 +576,6 @@ dgnushack-compile-verbosely.  All other users should continue to use
 dgnushack-compile."
   (dgnushack-compile t))
 
-(defun dgnushack-compile-verbosely ()
-  "Call dgnushack-compile with warnings ENABLED.  If you are compiling
-patches to gnus, you should consider modifying make.bat to call
-dgnushack-compile-verbosely.  All other users should continue to use
-dgnushack-compile."
-  (dgnushack-compile t))
-
 (defun dgnushack-compile (&optional warn)
   ;;(setq byte-compile-dynamic t)
   (unless warn
@@ -685,18 +622,25 @@ Modify to suit your needs."))
   (require 'gnus)
   (byte-recompile-directory "." 0))
 
-(defvar dgnushack-gnus-load-file (expand-file-name "gnus-load.el" srcdir))
-(defvar dgnushack-cus-load-file (expand-file-name "cus-load.el" srcdir))
-(defvar dgnushack-auto-load-file (expand-file-name "auto-autoloads.el" srcdir))
+(defvar dgnushack-gnus-load-file
+  (if (featurep 'xemacs)
+      (expand-file-name "auto-autoloads.el" srcdir)
+    (expand-file-name "gnus-load.el" srcdir)))
+
+(defvar        dgnushack-cus-load-file
+  (if (featurep 'xemacs)
+      (expand-file-name "custom-load.el" srcdir)
+    (expand-file-name "cus-load.el" srcdir)))
 
 (defun dgnushack-make-cus-load ()
-  (when (condition-case nil
-           (load "cus-dep")
-         (error nil))
-    (let ((cusload-base-file dgnushack-cus-load-file))
-      (if (fboundp 'custom-make-dependencies)
-         (custom-make-dependencies)
-       (Custom-make-dependencies)))))
+  (load "cus-dep")
+  (let ((cusload-base-file dgnushack-cus-load-file))
+    (if (fboundp 'custom-make-dependencies)
+       (custom-make-dependencies)
+      (Custom-make-dependencies))
+    (when (featurep 'xemacs)
+      (message "Compiling %s..." dgnushack-cus-load-file)
+      (byte-compile-file dgnushack-cus-load-file))))
 
 (defun dgnushack-make-auto-load ()
   (require 'autoload)
@@ -718,11 +662,8 @@ Modify to suit your needs."))
        (make-backup-files nil)
        (autoload-package-name "gnus"))
     (if (featurep 'xemacs)
-       (progn
-         (if (file-exists-p generated-autoload-file)
-             (delete-file generated-autoload-file))
-         (if (file-exists-p dgnushack-auto-load-file)
-             (delete-file dgnushack-auto-load-file)))
+       (if (file-exists-p generated-autoload-file)
+           (delete-file generated-autoload-file))
       (with-temp-file generated-autoload-file
        (insert ?\014)))
     (if (featurep 'xemacs)
@@ -741,55 +682,44 @@ Modify to suit your needs."))
       (batch-update-autoloads))))
 
 (defun dgnushack-make-load ()
-  (message (format "Generating %s..." dgnushack-gnus-load-file))
-  (with-temp-file dgnushack-gnus-load-file
-    (if (file-exists-p dgnushack-cus-load-file)
-       (progn
-         (insert-file-contents dgnushack-cus-load-file)
-         (delete-file dgnushack-cus-load-file)
-         (goto-char (point-min))
-         (search-forward ";;; Code:")
-         (forward-line)
-         (delete-region (point-min) (point))
-         (unless (re-search-forward "\
-^[\t ]*(autoload[\t\n ]+\\('\\|(quote[\t\n ]+\\)custom-add-loads[\t\n ]"
-                                    nil t)
-           (insert "\n(autoload 'custom-add-loads \"cus-load\")\n"))
-         (goto-char (point-min))
-         (insert "\
+  (unless (featurep 'xemacs)
+    (message "Generating %s..." dgnushack-gnus-load-file)
+    (with-temp-file dgnushack-gnus-load-file
+      (insert-file-contents dgnushack-cus-load-file)
+      (delete-file dgnushack-cus-load-file)
+      (goto-char (point-min))
+      (search-forward ";;; Code:")
+      (forward-line)
+      (delete-region (point-min) (point))
+      (insert "\
 ;;; gnus-load.el --- automatically extracted custom dependencies and autoload
 ;;
 ;;; Code:
 ")
-         (goto-char (point-max))
-         (if (search-backward "custom-versions-load-alist" nil t)
-             (forward-line -1)
-           (forward-line -1)
-           (while (eq (char-after) ?\;)
-             (forward-line -1))
-           (forward-line))
-         (delete-region (point) (point-max))
-         (insert "\n"))
+      (goto-char (point-max))
+      (if (search-backward "custom-versions-load-alist" nil t)
+         (forward-line -1)
+       (forward-line -1)
+       (while (eq (char-after) ?\;)
+         (forward-line -1))
+       (forward-line))
+      (delete-region (point) (point-max))
+      (insert "\n")
+      ;; smiley-* are duplicated. Remove them all.
+      (let ((point (point)))
+       (insert-file-contents dgnushack-gnus-load-file)
+       (goto-char point)
+       (while (search-forward "smiley-" nil t)
+         (beginning-of-line)
+         (if (looking-at "(autoload ")
+             (delete-region (point) (progn (forward-sexp) (point)))
+           (forward-line))))
+      ;;
+      (goto-char (point-max))
+      (when (search-backward "\n(provide " nil t)
+       (forward-line -1)
+       (delete-region (point) (point-max)))
       (insert "\
-;;; gnus-load.el --- automatically extracted autoload
-;;
-;;; Code:
-"))
-    ;; smiley-* are duplicated. Remove them all.
-    (let ((point (point)))
-      (insert-file-contents dgnushack-gnus-load-file)
-      (goto-char point)
-      (while (search-forward "smiley-" nil t)
-       (beginning-of-line)
-       (if (looking-at "(autoload ")
-           (delete-region (point) (progn (forward-sexp) (point)))
-         (forward-line))))
-    ;;
-    (goto-char (point-max))
-    (when (search-backward "\n(provide " nil t)
-      (forward-line -1)
-      (delete-region (point) (point-max)))
-    (insert "\
 
 \(provide 'gnus-load)
 
@@ -800,72 +730,22 @@ Modify to suit your needs."))
 ;;; End:
 ;;; gnus-load.el ends here
 ")
-    ;; Workaround the bug in some version of XEmacs.
-    (when (featurep 'xemacs)
-      (condition-case nil
-         (require 'cus-load)
-       (error nil))
-      (goto-char (point-min))
-      (when (and (fboundp 'custom-add-loads)
-                (not (search-forward "\n(autoload 'custom-add-loads " nil t)))
-       (search-forward "\n;;; Code:" nil t)
-       (forward-line 1)
-       (insert "\n(autoload 'custom-add-loads \"cus-load\")\n"))))
-  (message (format "Compiling %s..." dgnushack-gnus-load-file))
-  (byte-compile-file dgnushack-gnus-load-file))
-
-\f
-(defun dgnushack-compose-package ()
-  "Re-split the file gnus-load.el into custom-load.el and
-auto-autoloads.el.  It is silly, should be improved!"
-  (message "
-Re-splitting gnus-load.el into custom-load.el and auto-autoloads.el...")
-  (let ((customload (expand-file-name "custom-load.el" srcdir))
-       (autoloads (expand-file-name "auto-autoloads.el" srcdir))
-       start)
-    (with-temp-buffer
-      (insert-file-contents dgnushack-gnus-load-file)
-      (delete-file dgnushack-gnus-load-file)
-      (when (file-exists-p (concat dgnushack-gnus-load-file "c"))
-       (delete-file (concat dgnushack-gnus-load-file "c")))
-      (while (prog1
-                (looking-at "[\t ;]")
-              (forward-line 1)))
-      (setq start (point))
+      ))
+  (message "Compiling %s..." dgnushack-gnus-load-file)
+  (byte-compile-file dgnushack-gnus-load-file)
+  (when (featurep 'xemacs)
+    (message "Creating dummy gnus-load.el...")
+    (with-temp-file (expand-file-name "gnus-load.el")
       (insert "\
-;;; custom-load.el --- automatically extracted custom dependencies\n
-;;; Code:\n\n")
-      (goto-char (point-max))
-      (while (progn
-              (forward-line -1)
-              (not (looking-at "[\t ]*(custom-add-loads[\t\n ]"))))
-      (forward-list 1)
-      (forward-line 1)
-      (insert "\n;;; custom-load.el ends here\n")
-      (write-region start (point) customload)
-      (while (looking-at "[\t ]*$")
-       (forward-line 1))
-      (setq start (point))
-      (if (re-search-forward "^[\t\n ]*(if[\t\n ]+(featurep[\t\n ]" nil t)
-         (let ((from (goto-char (match-beginning 0))))
-           (delete-region from (progn
-                                 (forward-list 1)
-                                 (forward-line 1)
-                                 (point))))
-       (while (looking-at "[\t ;]")
-         (forward-line 1)))
-      (insert "(if (featurep 'gnus-autoloads) (error \"Already loaded\"))\n")
-      (goto-char (point-max))
-      (while (progn
-              (forward-line -1)
-              (not (looking-at "[\t ]*(provide[\t\n ]"))))
-      (insert "(provide 'gnus-autoloads)\n")
-      (write-region start (point) autoloads))
-    (byte-compile-file customload)
-    (byte-compile-file autoloads))
-  (message "\
-Re-splitting gnus-load.el into custom-load.el and auto-autoloads.el...done
-\n"))
+
+\(provide 'gnus-load)
+
+;;; Local Variables:
+;;; version-control: never
+;;; no-byte-compile: t
+;;; no-update-autoloads: t
+;;; End:
+;;; gnus-load.el ends here"))))
 
 \f
 (defconst dgnushack-info-file-regexp-en