home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / gnu / emacs-18.59-bin.lha / lib / emacs / 18.59 / lisp / rnews.el < prev    next >
Lisp/Scheme  |  1991-09-13  |  35KB  |  970 lines

  1. ;;; USENET news reader for gnu emacs
  2. ;; Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
  3.  
  4. ;; This file is part of GNU Emacs.
  5.  
  6. ;; GNU Emacs is free software; you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation; either version 1, or (at your option)
  9. ;; any later version.
  10.  
  11. ;; GNU Emacs is distributed in the hope that it will be useful,
  12. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;; GNU General Public License for more details.
  15.  
  16. ;; You should have received a copy of the GNU General Public License
  17. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  18. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20. ;; Created Sun Mar 10,1985 at 21:35:01 ads and sundar@hernes.ai.mit.edu
  21. ;; Should do the point pdl stuff sometime
  22. ;; finito except pdl.... Sat Mar 16,1985 at 06:43:44
  23. ;; lets keep the summary stuff out until we get it working ..
  24. ;;    sundar@hermes.ai.mit.edu Wed Apr 10,1985 at 16:32:06
  25. ;; hack slash maim. mly@prep.ai.mit.edu Thu 18 Apr, 1985 06:11:14
  26. ;; modified to correct reentrance bug, to not bother with groups that
  27. ;;   received no new traffic since last read completely, to find out
  28. ;;   what traffic a group has available much more quickly when
  29. ;;   possible, to do some completing reads for group names - should
  30. ;;   be much faster...
  31. ;;    KING@KESTREL.arpa, Thu Mar 13 09:03:28 1986
  32. ;; made news-{next,previous}-group skip groups with no new messages; and
  33. ;; added checking for unsubscribed groups to news-add-news-group
  34. ;;    tower@prep.ai.mit.edu Jul 18 1986
  35. ;; bound rmail-output to C-o; and changed header-field commands binding to
  36. ;; agree with the new C-c C-f usage in sendmail
  37. ;;     tower@prep Sep  3 1986
  38. ;; added news-rotate-buffer-body
  39. ;;    tower@prep Oct 17 1986
  40. ;; made messages more user friendly, cleanuped news-inews
  41. ;; move posting and mail code to new file rnewpost.el
  42. ;;    tower@prep Oct 29 1986
  43. ;; added caesar-region, rename news-caesar-buffer-body, hacked accordingly
  44. ;;    tower@prep Nov 21 1986
  45. ;; added (provide 'rnews)    tower@prep 22 Apr 87
  46. (provide 'rnews)
  47. (require 'mail-utils)
  48.  
  49. (autoload 'rmail-output "rmailout"
  50.   "Append this message to Unix mail file named FILE-NAME."
  51.   t)
  52.  
  53. (autoload 'news-reply "rnewspost"
  54.   "Compose and post a reply to the current article on USENET.
  55. While composing the reply, use \\[mail-yank-original] to yank the original
  56. message into it."
  57.   t)
  58.  
  59. (autoload 'news-mail-other-window "rnewspost"
  60.   "Send mail in another window.
  61. While composing the message, use \\[mail-yank-original] to yank the
  62. original message into it."
  63.   t)
  64.  
  65. (autoload 'news-post-news "rnewspost"
  66.   "Begin editing a new USENET news article to be posted."
  67.   t)
  68.  
  69. (autoload 'news-mail-reply "rnewspost"
  70.   "Mail a reply to the author of the current article.
  71. While composing the reply, use \\[mail-yank-original] to yank the original
  72. message into it."
  73.   t)
  74.  
  75. (defvar rmail-last-file (expand-file-name "~/mbox.news"))
  76.  
  77. ;Now in paths.el.
  78. ;(defvar news-path "/usr/spool/news/"
  79. ;  "The root directory below which all news files are stored.")
  80.  
  81. (defvar news-startup-file "$HOME/.newsrc" "Contains ~/.newsrc")
  82. (defvar news-certification-file "$HOME/.news-dates" "Contains ~/.news-dates")
  83.  
  84. ;; random headers that we decide to ignore.
  85. (defvar news-ignored-headers
  86.   "^Path:\\|^Posting-Version:\\|^Article-I.D.:\\|^Expires:\\|^Date-Received:\\|^References:\\|^Control:\\|^Xref:\\|^Lines:\\|^Posted:\\|^Relay-Version:\\|^Message-ID:\\|^Nf-ID:\\|^Nf-From:\\|^Approved:\\|^Sender:"
  87.   "All random fields within the header of a message.")
  88.  
  89. (defvar news-mode-map nil)
  90. (defvar news-read-first-time-p t)
  91. ;; Contains the (dotified) news groups of which you are a member. 
  92. (defvar news-user-group-list nil)
  93.  
  94. (defvar news-current-news-group nil)
  95. (defvar news-current-group-begin nil)
  96. (defvar news-current-group-end  nil)
  97. (defvar news-current-certifications nil
  98.        "An assoc list of a group name and the time at which it is
  99. known that the group had no new traffic")
  100. (defvar news-current-certifiable nil
  101.     "The time when the directory we are now working on was written")
  102.  
  103. (defvar news-message-filter nil
  104.   "User specifiable filter function that will be called during
  105. formatting of the news file")
  106.  
  107. ;(defvar news-mode-group-string "Starting-Up"
  108. ;  "Mode line group name info is held in this variable")
  109. (defvar news-list-of-files nil
  110.   "Global variable in which we store the list of files
  111. associated with the current newsgroup")
  112. (defvar news-list-of-files-possibly-bogus nil
  113.   "variable indicating we only are guessing at which files are available.
  114. Not currently used.")
  115.  
  116. ;; association list in which we store lists of the form
  117. ;; (pointified-group-name (first last old-last))
  118. (defvar news-group-article-assoc nil)
  119.   
  120. (defvar news-current-message-number 0 "Displayed Article Number")
  121. (defvar news-total-current-group 0 "Total no of messages in group")
  122.  
  123. (defvar news-unsubscribe-groups ())
  124. (defvar news-point-pdl () "List of visited news messages.")
  125. (defvar news-no-jumps-p t)
  126. (defvar news-buffer () "Buffer into which news files are read.")
  127.  
  128. (defmacro news-push (item ref)
  129.   (list 'setq ref (list 'cons item ref)))
  130.  
  131. (defmacro news-cadr (x) (list 'car (list 'cdr x)))
  132. (defmacro news-cdar (x) (list 'cdr (list 'car x)))
  133. (defmacro news-caddr (x) (list 'car (list 'cdr (list 'cdr x))))
  134. (defmacro news-cadar (x) (list 'car (list 'cdr (list 'car x))))
  135. (defmacro news-caadr (x) (list 'car (list 'car (list 'cdr x))))
  136. (defmacro news-cdadr (x) (list 'cdr (list 'car (list 'cdr x))))
  137.  
  138. (defmacro news-wins (pfx index)
  139.   (` (file-exists-p (concat (, pfx) "/" (int-to-string (, index))))))
  140.  
  141. (defvar news-max-plausible-gap 2
  142.     "* In an rnews directory, the maximum possible gap size.
  143. A gap is a sequence of missing messages between two messages that exist.
  144. An empty file does not contribute to a gap -- it ends one.")
  145.  
  146. (defun news-find-first-and-last (prefix base)
  147.   (and (news-wins prefix base)
  148.        (cons (news-find-first-or-last prefix base -1)
  149.          (news-find-first-or-last prefix base 1))))
  150.  
  151. (defmacro news-/ (a1 a2)
  152. ;; a form of / that guarantees that (/ -1 2) = 0
  153.   (if (zerop (/ -1 2))
  154.       (` (/ (, a1) (, a2)))
  155.     (` (if (< (, a1) 0)
  156.        (- (/ (- (, a1)) (, a2)))
  157.      (/ (, a1) (, a2))))))
  158.  
  159. (defun news-find-first-or-last (pfx base dirn)
  160.   ;; first use powers of two to find a plausible ceiling
  161.   (let ((original-dir dirn))
  162.     (while (news-wins pfx (+ base dirn))
  163.       (setq dirn (* dirn 2)))
  164.     (setq dirn (news-/ dirn 2))
  165.     ;; Then use a binary search to find the high water mark
  166.     (let ((offset (news-/ dirn 2)))
  167.       (while (/= offset 0)
  168.     (if (news-wins pfx (+ base dirn offset))
  169.         (setq dirn (+ dirn offset)))
  170.     (setq offset (news-/ offset 2))))
  171.     ;; If this high-water mark is bogus, recurse.
  172.     (let ((offset (* news-max-plausible-gap original-dir)))
  173.       (while (and (/= offset 0) (not (news-wins pfx (+ base dirn offset))))
  174.     (setq offset (- offset original-dir)))
  175.       (if (= offset 0)
  176.       (+ base dirn)
  177.     (news-find-first-or-last pfx (+ base dirn offset) original-dir)))))
  178.  
  179. (defun rnews ()
  180. "Read USENET news for groups for which you are a member and add or
  181. delete groups.
  182. You can reply to articles posted and send articles to any group.
  183.  
  184. Type \\[describe-mode] once reading news to get a list of rnews commands."
  185.   (interactive)
  186.   (let ((last-buffer (buffer-name)))
  187.     (make-local-variable 'rmail-last-file)
  188.     (switch-to-buffer (setq news-buffer (get-buffer-create "*news*")))
  189.     (news-mode)
  190.     (setq news-buffer-save last-buffer)
  191.     (setq buffer-read-only nil)
  192.     (erase-buffer)
  193.     (setq buffer-read-only t)
  194.     (set-buffer-modified-p t)
  195.     (sit-for 0)
  196.     (message "Getting new USENET news...")
  197.     (news-set-mode-line)
  198.     (news-get-certifications)
  199.     (news-get-new-news)))
  200.  
  201. (defun news-group-certification (group)
  202.   (cdr-safe (assoc group news-current-certifications)))
  203.  
  204.  
  205. (defun news-set-current-certifiable ()
  206.   ;; Record the date that corresponds to the directory you are about to check
  207.   (let ((file (concat news-path
  208.               (string-subst-char ?/ ?. news-current-news-group))))
  209.     (setq news-current-certifiable
  210.       (nth 5 (file-attributes
  211.