-
;;; nnheader.el --- header access macros for Gnus and its backends
-;; Copyright (C) 1987-1990,1993-1999 Free Software Foundation, Inc.
+
+;; Copyright (C) 1987-1990,1993-2000
+;; Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
\(setq nnheader-file-name-translation-alist '((?: . ?_)))")
(eval-and-compile
- (autoload 'nnmail-message-id "nnmail")
- (autoload 'mail-position-on-field "sendmail")
- (autoload 'message-remove-header "message")
- (autoload 'cancel-function-timers "timers")
- (autoload 'gnus-point-at-eol "gnus-util")
- (autoload 'gnus-delete-line "gnus-util")
- (autoload 'gnus-buffer-live-p "gnus-util"))
+ (autoload 'nnmail-message-id "nnmail")
+ (autoload 'mail-position-on-field "sendmail")
+ (autoload 'message-remove-header "message")
+ (autoload 'gnus-point-at-eol "gnus-util")
+ (autoload 'gnus-delete-line "gnus-util")
+ (autoload 'gnus-buffer-live-p "gnus-util"))
;;; Header access macros.
"Set the extra headers in HEADER to EXTRA."
`(aset ,header 9 ',extra))
-(defun make-mail-header (&optional init)
+(defsubst make-mail-header (&optional init)
"Create a new mail header structure initialized with INIT."
(make-vector 10 init))
-(defun make-full-mail-header (&optional number subject from date id
- references chars lines xref
- extra)
+(defsubst make-full-mail-header (&optional number subject from date id
+ references chars lines xref
+ extra)
"Create a new mail header structure initialized with the parameters given."
(vector number subject from date id references chars lines xref extra))
'(prog1
(if (eq (char-after) ?\t)
0
- (let ((num (ignore-errors (read (current-buffer)))))
+ (let ((num (condition-case nil
+ (read (current-buffer))
+ (error nil))))
(if (numberp num) num 0)))
(or (eobp) (forward-char 1))))
(pop extra))))
(insert "\n"))
+(defun nnheader-insert-header (header)
+ (insert
+ "Subject: " (or (mail-header-subject header) "(none)") "\n"
+ "From: " (or (mail-header-from header) "(nobody)") "\n"
+ "Date: " (or (mail-header-date header) "") "\n"
+ "Message-ID: " (or (mail-header-id header) (nnmail-message-id)) "\n"
+ "References: " (or (mail-header-references header) "") "\n"
+ "Lines: ")
+ (princ (or (mail-header-lines header) 0) (current-buffer))
+ (insert "\n\n"))
+
(defun nnheader-insert-article-line (article)
(goto-char (point-min))
(insert "220 ")
(when (file-exists-p file)
(if (eq nnheader-max-head-length t)
;; Just read the entire file.
- (mm-insert-file-contents file)
+ (nnheader-insert-file-contents file)
;; Read 1K blocks until we find a separator.
(let ((beg 0)
format-alist)
(while (and (eq nnheader-head-chop-length
- (nth 1 (mm-insert-file-contents
+ (nth 1 (nnheader-insert-file-contents
file nil beg
(incf beg nnheader-head-chop-length))))
(prog1 (not (search-forward "\n\n" nil t))
(if full
;; Do complete translation.
(setq leaf (copy-sequence file)
- path "")
+ path ""
+ i (if (and (< 1 (length leaf)) (eq ?: (aref leaf 1)))
+ 2 0))
;; We translate -- but only the file name. We leave the directory
;; alone.
(if (string-match "/[^/]+\\'" file)
"Get the most recent report from BACKEND."
(condition-case ()
(nnheader-message 5 "%s" (symbol-value (intern (format "%s-status-string"
- backend))))
+ backend))))
(error (nnheader-message 5 ""))))
(defun nnheader-insert (format &rest args)
(setq idx (1+ idx)))
string))
+(defun nnheader-replace-duplicate-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) prev i)
+ ;; Replace all occurrences of FROM with TO.
+ (while (< idx len)
+ (setq i (aref string idx))
+ (when (and (eq prev from) (= i from))
+ (aset string (1- idx) to)
+ (aset string idx to))
+ (setq prev i)
+ (setq idx (1+ idx)))
+ string))
+
(defun nnheader-file-to-group (file &optional top)
"Return a group name based on FILE and TOP."
(nnheader-replace-chars-in-string
(concat
(let ((dir (file-name-as-directory (expand-file-name dir))))
;; If this directory exists, we use it directly.
- (if (file-directory-p (concat dir group))
- (concat dir group "/")
- ;; If not, we translate dots into slashes.
- (concat dir
- (mm-encode-coding-string
- (nnheader-replace-chars-in-string group ?. ?/)
- nnheader-pathname-coding-system)
- "/")))
+ (file-name-as-directory
+ (if (file-directory-p (concat dir group))
+ (expand-file-name group dir)
+ ;; If not, we translate dots into slashes.
+ (expand-file-name (mm-encode-coding-string
+ (nnheader-replace-chars-in-string group ?. ?/)
+ nnheader-pathname-coding-system)
+ dir))))
(cond ((null file) "")
((numberp file) (int-to-string file))
(t file))))
(defvar nnheader-file-coding-system 'raw-text
"Coding system used in file backends of Gnus.")
-(defun mm-insert-file-contents (filename &optional visit beg end replace)
+(defun nnheader-insert-file-contents (filename &optional visit beg end replace)
"Like `insert-file-contents', q.v., but only reads in the file.
A buffer may be modified in several ways after reading into the buffer due
to advanced Emacs features, such as file-name-handlers, format decoding,
find-file-hooks, etc.
This function ensures that none of these modifications will take place."
- (let ((format-alist nil)
- (auto-mode-alist (nnheader-auto-mode-alist))
- (default-major-mode 'fundamental-mode)
- (enable-local-variables nil)
- (after-insert-file-functions nil)
- (enable-local-eval nil)
- (find-file-hooks nil)
- (coding-system-for-read nnheader-file-coding-system))
- (insert-file-contents filename visit beg end replace)))
+ (let ((coding-system-for-read nnheader-file-coding-system))
+ (mm-insert-file-contents filename visit beg end replace)))
(defun nnheader-find-file-noselect (&rest args)
(let ((format-alist nil)
- (auto-mode-alist (nnheader-auto-mode-alist))
+ (auto-mode-alist (mm-auto-mode-alist))
(default-major-mode 'fundamental-mode)
(enable-local-variables nil)
(after-insert-file-functions nil)
(coding-system-for-read nnheader-file-coding-system))
(apply 'find-file-noselect args)))
-(defun nnheader-auto-mode-alist ()
- "Return an `auto-mode-alist' with only the .gz (etc) thingies."
- (let ((alist auto-mode-alist)
- out)
- (while alist
- (when (listp (cdar alist))
- (push (car alist) out))
- (pop alist))
- (nreverse out)))
-
(defun nnheader-directory-regular-files (dir)
"Return a list of all regular files in DIR."
(let ((files (directory-files dir t))