Commits

Anonymous committed 1856695

Import from CVS: tag r20-2b5

Comments (0)

Files changed (59)

 							-*- indented-text -*-
+to 20.2 beta5
+-- Interface Changes:
+   `allow-deletion-of-last-visible-frame' becomes a boolean
+   `delete-auto-save-files' becomes a boolean
+-- Miscellaneous Customization cleanup from Hrvoje Niksic
+-- Miscellaneous Egg fixes from Jareth Hein
+-- Gnus-5.4.51
+-- etags.c-11.86
+-- Byte compiler optimization backed out for release
+-- Miscellaneous bug fixes
+
 to 20.2 beta4
+-- 1+ Byte compiler optimization courtesy of Jamie Zawinski
 -- Miscellaneous Mule/ Egg/Quail patches courtesy of Jareth Hein
 -- featurep reader macro code introduced and enabled for this beta only.
 -- Do not default with-xim to Motif if Motif libraries are availble
+Thu May  8 20:22:34 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* XEmacs 20.2-b5 is released.
+
 Fri May  2 16:50:02 1997  Steven L Baur  <steve@altair.xemacs.org>
 
 	* XEmacs 20.2-b4 is released.

etc/sgml/README.cdtd

+The compiled dtd's are currently built by hand.  Currently, something like
+the following will work:
+
+../../src/xemacs -batch -q -l psgml-parse.elc -l psgml-dtd.elc -eval "(progn (sgml-set-global) (setq sgml-no-elements 0) (sgml-compile-dtd \"$(pwd)/html.dtd\" \"$(pwd)/cdtd/html\" []))"
+
+Note that the parameters are taken roughly from the ECAT file.

etc/sgml/cdtd/html

Binary file modified.
  *	Francesco Potorti` (F.Potorti@cnuce.cnr.it) is the current maintainer.
  */
 
-char pot_etags_version[] = "@(#) pot revision number is 11.83";
+char pot_etags_version[] = "@(#) pot revision number is 11.86";
 
 #define	TRUE	1
 #define	FALSE	0
 # define DEBUG FALSE
 #endif
 
+#ifndef TeX_named_tokens
+# define TeX_named_tokens FALSE
+#endif
+
 #ifdef MSDOS
 # include <string.h>
 # include <fcntl.h>
 # define MAXPATHLEN _MAX_PATH
 #endif
 
-#if !defined (MSDOS) && !defined (WINDOWSNT) && defined (STDC_HEADERS)
-#include <stdlib.h>
-#include <string.h>
-#endif
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
   /* On some systems, Emacs defines static as nothing for the sake
 # undef static
 #endif
 
+#if !defined (MSDOS) && !defined (WINDOWSNT) && defined (STDC_HEADERS)
+#include <stdlib.h>
+#include <string.h>
+#endif
+
 #include <stdio.h>
 #include <ctype.h>
 #include <errno.h>
  *
  * SYNOPSIS:	Type *xnew (int n, Type);
  */
-#define xnew(n,Type)	((Type *) xmalloc ((n) * sizeof (Type)))
+#ifdef chkmalloc
+# include "chkmalloc.h"
+# define xnew(n,Type)	((Type *) trace_xmalloc (__FILE__, __LINE__, \
+						 (n) * sizeof (Type)))
+#else
+# define xnew(n,Type)	((Type *) xmalloc ((n) * sizeof (Type)))
+#endif
 
 typedef int logical;
 
  * A `struct linebuffer' is a structure which holds a line of text.
  * `readline' reads a line from a stream into a linebuffer and works
  * regardless of the length of the line.
+ * SIZE is the size of BUFFER, LEN is the length of the string in
+ * BUFFER after readline reads it.
  */
 struct linebuffer
 {
   long size;
+  int len;
   char *buffer;
 };
 
 system (cmd)
      char *cmd;
 {
-  fprintf (stderr, "system() function not implemented under VMS\n");
+  error ("%s", "system() function not implemented under VMS");
 }
 #endif
 
      char *argv[];
 {
   int i;
-  unsigned int nincluded_files = 0;
-  char **included_files = xnew (argc, char *);
+  unsigned int nincluded_files;
+  char **included_files;
   char *this_file;
   argument *argbuffer;
-  int current_arg = 0, file_count = 0;
+  int current_arg, file_count;
   struct linebuffer filename_lb;
 #ifdef VMS
   logical got_err;
 #endif /* DOS_NT */
 
   progname = argv[0];
+  nincluded_files = 0;
+  included_files = xnew (argc, char *);
+  current_arg = 0;
+  file_count = 0;
 
   /* Allocate enough no matter what happens.  Overkill, but each one
      is small. */
 	case 'o':
 	  if (tagfile)
 	    {
-	      fprintf (stderr, "%s: -%c option may only be given once.\n",
-		       progname, opt);
+	      error ("-%c option may only be given once.", opt);
 	      suggest_asking_for_help ();
 	    }
 	  tagfile = optarg;
 
   if (nincluded_files == 0 && file_count == 0)
     {
-      fprintf (stderr, "%s: No input files specified.\n", progname);
+      error ("%s", "No input files specified.");
       suggest_asking_for_help ();
     }
 
 	  return lang->function;
       }
 
-  fprintf (stderr, "%s: language \"%s\" not recognized.\n",
-	   progname, optarg);
+  error ("language \"%s\" not recognized.", optarg);
   suggest_asking_for_help ();
 
   /* This point should never be reached.  The function should either
 
   if (stat (file, &stat_buf) == 0 && !S_ISREG (stat_buf.st_mode))
     {
-      fprintf (stderr, "Skipping %s: it is not a regular file.\n", file);
+      error ("Skipping %s: it is not a regular file.", file);
       return;
     }
   if (streq (file, tagfile) && !streq (tagfile, "-"))
     {
-      fprintf (stderr, "Skipping inclusion of %s in self.\n", file);
+      error ("Skipping inclusion of %s in self.", file);
       return;
     }
   inf = fopen (file, "r");
     }
 
   /* Look for sharp-bang as the first two characters. */
-  if (readline_internal (&lb, inf) > 2
+  if (readline_internal (&lb, inf)
+      && lb.len >= 2
       && lb.buffer[0] == '#'
       && lb.buffer[1] == '!')
     {
 	    continue;
 
 	  /* save all values for later tagging */
-	  grow_linebuffer (&tline, strlen (lb.buffer) + 1);
+	  grow_linebuffer (&tline, lb.len + 1);
 	  strcpy (tline.buffer, lb.buffer);
 	  save_lineno = lineno;
 	  save_lcno = linecharno;
 void TEX_mode ();
 struct TEX_tabent *TEX_decode_env ();
 int TEX_Token ();
-#if TeX_named_tokens
-void TEX_getit ();
-#endif
+static void TEX_getit ();
 
 char TEX_esc = '\\';
 char TEX_opgrp = '{';
 	  if (0 <= i)
 	    {
 	      pfnote ((char *)NULL, TRUE,
-		      lb.buffer, strlen (lb.buffer), lineno, linecharno);
-#if TeX_named_tokens
-	      TEX_getit (lasthit, TEX_toktab[i].len);
-#endif
+		      lb.buffer, lb.len, lineno, linecharno);
+	      if (TeX_named_tokens)
+		TEX_getit (lasthit, TEX_toktab[i].len);
 	      break;		/* We only save a line once */
 	    }
 	}
   return tab;
 }
 
-#if TeX_named_tokens
 /* Record a tag defined by a TeX command of length LEN and starting at NAME.
    The name being defined actually starts at (NAME + LEN + 1).
    But we seem to include the TeX command in the tag name.  */
-void
+static void
 TEX_getit (name, len)
      char *name;
      int len;
   while (*p && *p != TEX_clgrp)
     p++;
   pfnote (savenstr (name, p-name), TRUE,
-	  lb.buffer, strlen (lb.buffer), lineno, linecharno);
+	  lb.buffer, lb.len, lineno, linecharno);
 }
-#endif
 
 /* If the text at CP matches one of the tag-defining TeX command names,
    return the pointer to the first occurrence of that command in TEX_toktab.
   patbuf->buffer = NULL;
   patbuf->allocated = 0;
 
+  re_syntax_options = RE_INTERVALS;
   err = re_compile_pattern (regexp_pattern, strlen (regexp_pattern), patbuf);
   if (err != NULL)
     {
      char *in, *out;
      struct re_registers *regs;
 {
-  char *result = NULL, *t;
-  int size = 0;
-
-  /* Pass 1: figure out how much size to allocate. */
-  for (t = out; *t; ++t)
-    {
-      if (*t == '\\')
-	{
-	  ++t;
-	  if (!*t)
-	    {
-	      fprintf (stderr, "%s: pattern substitution ends prematurely\n",
-		       progname);
-	      return NULL;
-	    }
-	  if (isdigit (*t))
-	    {
-	      int dig = *t - '0';
-	      size += regs->end[dig] - regs->start[dig];
-	    }
-	}
-    }
+  char *result, *t;
+  int size, dig, diglen;
+
+  result = NULL;
+  size = strlen (out);
+
+  /* Pass 1: figure out how much to allocate by finding all \N strings. */
+  if (out[size - 1] == '\\')
+    fatal ("pattern error in \"%s\"", out);
+  for (t = etags_strchr (out, '\\');
+       t != NULL;
+       t = etags_strchr (t + 2, '\\'))
+    if (isdigit (t[1]))
+      {
+	dig = t[1] - '0';
+	diglen = regs->end[dig] - regs->start[dig];
+	size += diglen - 2;
+      }
+    else
+      size -= 1;
 
   /* Allocate space and do the substitutions. */
   result = xnew (size + 1, char);
-  size = 0;
-  for (; *out; ++out)
-    {
-      if (*out == '\\')
-	{
-	  ++out;
-	  if (isdigit (*out))
-	    {
-	      /* Using "dig2" satisfies my debugger.  Bleah. */
-	      int dig2 = *out - '0';
-	      strncpy (result + size, in + regs->start[dig2],
-		       regs->end[dig2] - regs->start[dig2]);
-	      size += regs->end[dig2] - regs->start[dig2];
-	    }
-	  else
-	    result[size++] = *out;
-	}
-      else
-	result[size++] = *out;
-    }
-  result[size] = '\0';
+
+  for (t = result; *out != '\0'; out++)
+    if (*out == '\\' && isdigit (*++out))
+      {
+	/* Using "dig2" satisfies my debugger.  Bleah. */
+	dig = *out - '0';
+	diglen = regs->end[dig] - regs->start[dig];
+	strncpy (t, in + regs->start[dig], diglen);
+	t += diglen;
+      }
+    else
+      *t++ = *out;
+  *t = '\0';
+
+  if (DEBUG && (t > result + size || t - result != strlen (result)))
+    abort ();
 
   return result;
 }
 	{
 	  if (p > buffer && p[-1] == '\r')
 	    {
-	      *--p = '\0';
+	      p -= 1;
 #ifdef DOS_NT
 	     /* Assume CRLF->LF translation will be performed by Emacs
 		when loading this file, so CRs won't appear in the buffer.
 	    }
 	  else
 	    {
-	      *p = '\0';
 	      chars_deleted = 1;
 	    }
+	  *p = '\0';
 	  break;
 	}
       *p++ = c;
     }
-
-  return p - buffer + chars_deleted;
+  linebuffer->len = p - buffer;
+
+  return linebuffer->len + chars_deleted;
 }
 
 /*
- * Like readline_internal, above, but try to match the input
- * line against any existing regular expressions.
+ * Like readline_internal, above, but in addition try to match the
+ * input line against any existing regular expressions.
  */
 long
 readline (linebuffer, stream)
   int i;
 
   /* Match against all listed patterns. */
-  for (i = 0; i < num_patterns; ++i)
-    {
-      int match = re_match (patterns[i].pattern, linebuffer->buffer,
-			    (int)result, 0, &patterns[i].regs);
-      switch (match)
-	{
-	case -2:
-	  /* Some error. */
-	  if (!patterns[i].error_signaled)
-	    {
-	      error ("error while matching pattern %d", i);
-	      patterns[i].error_signaled = TRUE;
-	    }
-	  break;
-	case -1:
-	  /* No match. */
-	  break;
-	default:
-	  /* Match occurred.  Construct a tag. */
-	  if (patterns[i].name_pattern[0] != '\0')
-	    {
-	      /* Make a named tag. */
-	      char *name = substitute (linebuffer->buffer,
-				       patterns[i].name_pattern,
-				       &patterns[i].regs);
-	      if (name != NULL)
-		pfnote (name, TRUE,
+  if (linebuffer->len > 0)
+    for (i = 0; i < num_patterns; ++i)
+      {
+	int match = re_match (patterns[i].pattern, linebuffer->buffer,
+			      linebuffer->len, 0, &patterns[i].regs);
+	switch (match)
+	  {
+	  case -2:
+	    /* Some error. */
+	    if (!patterns[i].error_signaled)
+	      {
+		error ("error while matching pattern %d", i);
+		patterns[i].error_signaled = TRUE;
+	      }
+	    break;
+	  case -1:
+	    /* No match. */
+	    break;
+	  default:
+	    /* Match occurred.  Construct a tag. */
+	    if (patterns[i].name_pattern[0] != '\0')
+	      {
+		/* Make a named tag. */
+		char *name = substitute (linebuffer->buffer,
+					 patterns[i].name_pattern,
+					 &patterns[i].regs);
+		if (name != NULL)
+		  pfnote (name, TRUE,
+			  linebuffer->buffer, match, lineno, linecharno);
+	      }
+	    else
+	      {
+		/* Make an unnamed tag. */
+		pfnote ((char *)NULL, TRUE,
 			linebuffer->buffer, match, lineno, linecharno);
-	    }
-	  else
-	    {
-	      /* Make an unnamed tag. */
-	      pfnote ((char *)NULL, TRUE,
-		      linebuffer->buffer, match, lineno, linecharno);
-	    }
-	  break;
-	}
-    }
+	      }
+	    break;
+	  }
+      }
 #endif /* ETAGS_REGEXPS */
-
+  
   return result;
 }
 
       if (errno != ERANGE)
 	pfatal ("getcwd");
       bufsize *= 2;
+      free (path);
       path = xnew (bufsize, char);
     }
 
+Thu May  8 14:35:34 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* hm--html-menus/hm--html.el: Define obsolete aliases for the
+	previous function spellings.
+0
+	* hm--html-menus/hm--html-keys.el: Define obsolete aliases for the 
+	previous variable spellings.
+
+	* prim/obsolete.el (define-obsolete-variable-alias): Fix docstring 
+	spelling.
+	(define-compatible-variable-alias): Ditto.
+
+	* tm/tm-vm.el (vm-unsaved-message): Symbol doesn't exist any
+	more.
+
+Tue May  6 21:33:19 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* mule/mule-files.el (write-region): Correct docstring.
+
+	* prim/files-nomule.el (write-region): Correct docstring.
+
+Mon May  5 12:26:41 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* prim/about.el (about-xemacs-xref): Infodock Associates is now
+	Altrasoft.
+
+Sat May  3 16:32:47 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* efs/dired.el (dired-chown-program): chown program is in /bin on
+	Linux.
+
+Fri May  2 20:04:35 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* egg/egg.el: paren.el needed at bytecompile time for
+	`pos-visible-in-window-safe' defsubst.
+
+	* pcl-cvs/pcl-cvs.el (cvs-update): Inhibit dialog box usage in
+	call to cvs-do-update as this bombs when this function is invoked
+	from a menu.
+
 Wed Apr 30 18:06:35 1997  Steven L Baur  <steve@altair.xemacs.org>
 
 	* prim/loadup.el: Put features.elc in the dump list.

lisp/bytecomp/byte-optimize.el

 ;;      (byte-optimize-two-args-right form)
 ;;      form))
 
-;; jwz: (byte-optimize-approx-equal 0.0 0.0) was returning nil
-;; in xemacs 19.15 because it used < instead of <=.
 (defun byte-optimize-approx-equal (x y)
-  (<= (* (abs (- x y)) 100) (abs (+ x y))))
+  (< (* (abs (- x y)) 100) (abs (+ x y))))
 
 ;; Collect all the constants from FORM, after the STARTth arg,
 ;; and apply FUN to them to make one argument at the end.
 	 (condition-case ()
 	     (eval form)
 	   (error form)))
-
-	;; `add1' and `sub1' are a marginally fewer instructions
-	;; than `plus' and `minus', so use them when possible.
-	((and (null (nthcdr 3 form))
-	      (eq (nth 2 form) 1))
-	 (list '1+ (nth 1 form)))	; (+ x 1)  -->  (1+ x)
-	((and (null (nthcdr 3 form))
-	      (eq (nth 1 form) 1))
-	 (list '1+ (nth 2 form)))	; (+ 1 x)  -->  (1+ x)
-	((and (null (nthcdr 3 form))
-	      (eq (nth 2 form) -1))
-	 (list '1- (nth 1 form)))	; (+ x -1)  -->  (1- x)
-	((and (null (nthcdr 3 form))
-	      (eq (nth 1 form) -1))
-	 (list '1- (nth 2 form)))	; (+ -1 x)  -->  (1- x)
-
 ;;; It is not safe to delete the function entirely
 ;;; (actually, it would be safe if we know the sole arg
 ;;; is not a marker).
 		(numberp last))
 	   (setq form (nconc (list '- (- (nth 1 form) last) (nth 2 form))
 			     (delq last (copy-sequence (nthcdr 3 form))))))))
-  (setq form
 ;;; It is not safe to delete the function entirely
 ;;; (actually, it would be safe if we know the sole arg
 ;;; is not a marker).
 	 (cons (car form) (cdr (cdr form)))
        form))
 ;;;    )
-    )
-
-  ;; `add1' and `sub1' are a marginally fewer instructions than `plus'
-  ;; and `minus', so use them when possible.
-  (cond ((and (null (nthcdr 3 form))
-	      (eq (nth 2 form) 1))
-	 (list '1- (nth 1 form)))	; (- x 1)  -->  (1- x)
-	((and (null (nthcdr 3 form))
-	      (eq (nth 2 form) -1))
-	 (list '1+ (nth 1 form)))	; (- x -1)  -->  (1+ x)
-	(t
-	 form))
   )
 
 (defun byte-optimize-multiply (form)

lisp/efs/dired.el

 
 ;;;###autoload
 (defvar dired-chown-program
-  (if (memq system-type '(hpux dgux usg-unix-v)) "chown" "/etc/chown")
+  (if (memq system-type '(hpux dgux usg-unix-v linux)) "chown" "/etc/chown")
   "*Name of chown command (usually `chown' or `/etc/chown').")
 
 ;;;###autoload
   (let ((event (make-event))
 	(ch nil))
     (next-command-event event)
-    (if (and (key-press-event-p event)
-	     (eq 0 (event-modifier-bits event)))
-	(setq ch (event-key event))
-      (if (eq 1 (event-modifier-bits event))
-	  (setq ch (int-to-char (- (char-to-int (event-key event)) 96)))
-	(setq unread-command-events (list event))))
+    (if (key-press-event-p event)
+	(if (eq 0 (event-modifier-bits event))
+	    (setq ch (event-key event))
+	  (if (eq 1 (event-modifier-bits event))
+	      (setq ch (int-to-char (- (char-to-int (event-key event)) 96)))
+	    (setq unread-command-events (list event))))
+      (setq unread-command-events (list event)))
     ch))
 
 (eval-when-compile (require 'egg-jsymbol))
 	(minibuffer (window-buffer (minibuffer-window)))
 	value)
     (save-window-excursion
-      (if (fboundp 'redirect-frame-focus)
-	  (redirect-frame-focus (selected-frame)
-				(window-frame (minibuffer-window))))
       (set-window-buffer (minibuffer-window) menubuffer)
       (select-window (minibuffer-window))
       (set-buffer menubuffer)
   (and (characterp ch) (<= ch 127)
        (eq (lookup-key fence-mode-map (char-to-string ch)) 'fence-backward-delete-char)))
     
+(defvar egg:fence-buffer nil "Buffer fence is active in")
+
 (defun fence-self-insert-command ()
   (interactive)
-  (let ((ch (event-to-character last-command-event)))
-    (cond((or (not egg:*input-mode*)
-	      (null (get-next-map its:*current-map* ch)))
-	  (insert ch))
-	 (t
-	  (insert ch)
-	  (its:translate-region (1- (point)) (point) t)))))
+  (if (not (eq (current-buffer) egg:fence-buffer))
+      nil	;; #### This is to bandaid a deep event-handling bug
+    (let ((ch (event-to-character last-command-event)))
+      (cond((or (not egg:*input-mode*)
+		(null (get-next-map its:*current-map* ch)))
+	    (insert ch))
+	   (t
+	    (insert ch)
+	    (its:translate-region (1- (point)) (point) t))))))
 
 ;;;
 ;;; its: completing-read system
 (make-variable-buffer-local 'egg:*in-fence-mode*)
 (set-default 'egg:*in-fence-mode* nil)
 
-(defvar egg:fence-buffer nil "Buffer fence is active in")
-
 ;;(load-library "its-dump/roma-kana")         ;;;(define-its-mode "roma-kana"        " a$B$"(B")
 ;;(load-library "its-dump/roma-kata")         ;;;(define-its-mode "roma-kata"        " a$B%"(B")
 ;;(load-library "its-dump/downcase")          ;;;(define-its-mode "downcase"         " a a")
   (set-marker egg:*region-end* egg:*region-start*)
   (egg:fence-face-on)
   (goto-char egg:*region-start*)
-  (add-hook 'pre-command-hook 'fence-pre-command-hook)
+  (add-hook 'post-command-hook 'fence-post-command-hook)
   )
 
 (defun henkan-fence-region-or-single-space ()
 
 (defun egg:exit-if-empty-region ()
   (if (= egg:*region-start* egg:*region-end*)
-      (fence-exit-mode)))
+      (fence-exit-internal)))
 
 (defun fence-delete-char ()
   (interactive)
 
 (defun fence-exit-mode ()
   (interactive)
+  (fence-exit-internal))
+
+(defun fence-exit-internal ()
   (delete-region (- egg:*region-start* (length egg:*fence-open*)) egg:*region-start*)
   (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*fence-close*)))
   (egg:fence-face-off)
 (defun egg:quit-egg-mode ()
   ;;;(use-global-map egg:*global-map-backup*)
   (use-local-map egg:*local-map-backup*)
-  (remove-hook 'pre-command-hook 'fence-pre-command-hook)
+  (remove-hook 'post-command-hook 'fence-post-command-hook)
   (setq egg:*in-fence-mode* nil)
   (egg:mode-line-display)
   (if overwrite-mode
   )
 
 (defun fence-cancel-input ()
+  "Cancel all fence operations in the current buffer"
   (interactive)
+  (fence-kill-operation))
+
+(defun fence-kill-operation ()
+  "Internal method to remove fences"
   (delete-region egg:*region-start* egg:*region-end*)
-  (fence-exit-mode))
-
-(defun fence-mouse-protect ()
-  "Cancel entry in progress if mouse events occur."
-  (if egg:*in-fence-mode*
-      (save-excursion
-	(its:reset-input)
-	(fence-cancel-input))))
-
-(if (boundp 'mouse-track-cleanup-hook)
-    (add-hook 'mouse-track-cleanup-hook 'fence-mouse-protect))
-
-(defun fence-pre-command-hook ()
-  ;; cribbed off of isearch-mode
-  ;;
-  ;; For use as the value of `pre-command-hook' when fence is active.
-  ;; If the command about to be executed is not ours,
+  (fence-exit-internal))
+
+(defun fence-post-command-hook ()
+  ;; For use as the value of `post-command-hook' when fence is active.
+  ;; If we got out of the region specified by the fence,
   ;; kill the fence before that command is executed.
   ;;
   (cond ((not (eq (current-buffer) egg:fence-buffer))
 	 (save-excursion
 	   (set-buffer egg:fence-buffer)
 	   (its:reset-input)
-	   (fence-cancel-input)))
-	((not (and this-command
-		   (symbolp this-command)
-		   (get this-command 'egg-fence-command)))
-	 (its:reset-input)
-	 (fence-cancel-input))
-	(t
-	 (if (or (not (pos-visible-in-window-safe
-		       (marker-position egg:*region-start*)))
-		 (not (pos-visible-in-window-safe
-		       (marker-position egg:*region-end*))))
-	     (recenter))))
-  )
+	   (fence-kill-operation)))
+	((or (< (point) egg:*region-start*)
+	     (> (point) egg:*region-end*))
+	 (save-excursion
+	   (its:reset-input)
+	   (fence-kill-operation)))))
 
 (defun egg-lang-switch-callback ()
   "Do whatever processing is necessary when the language-environment changes."
   (if egg:*in-fence-mode*
       (progn
 	(its:reset-input)
-	(fence-cancel-input)))
+	(fence-kill-operation)))
   (let ((func (get current-language-environment 'set-egg-environ)))
     (if (not (null func))
       (funcall func)))
 (define-key fence-mode-map [right] 'fence-forward-char)
 (define-key fence-mode-map [left] 'fence-backward-char)
 
-(put 'fence-self-insert-command 'egg-fence-command t)
-(put 'fence-hiragana 'egg-fence-command t)
-(put 'fence-katakana 'egg-fence-command t)
-(put 'fence-hankaku 'egg-fence-command t)
-(put 'fence-zenkaku 'egg-fence-command t)
-(put 'its:select-hiragana 'egg-fence-command t)
-(put 'its:select-katakana 'egg-fence-command t)
-(put 'its:select-downcase 'egg-fence-command t)
-(put 'its:select-upcase 'egg-fence-command t)
-(put 'its:select-zenkaku-downcase 'egg-fence-command t)
-(put 'its:select-zenkaku-upcase 'egg-fence-command t)
-(put 'its:minibuffer-completion-help 'egg-fence-command t)
-(put 'henkan-fence-region-or-single-space 'egg-fence-command t)
-(put 'henkan-fence-region 'egg-fence-command t)
-(put 'fence-beginning-of-line 'egg-fence-command t)
-(put 'fence-backward-char 'egg-fence-command t)
-(put 'fence-cancel-input 'egg-fence-command t)
-(put 'fence-delete-char 'egg-fence-command t)
-(put 'fence-end-of-line 'egg-fence-command t)
-(put 'fence-forward-char 'egg-fence-command t)
-(put 'fence-cancel-input 'egg-fence-command t)
-(put 'fence-mode-help-command 'egg-fence-command t)
-(put 'fence-kill-line 'egg-fence-command t)
-(put 'fence-exit-mode 'egg-fence-command t)
-(put 'fence-exit-mode 'egg-fence-command t)
-(put 'fence-exit-mode 'egg-fence-command t)
-(put 'its:select-previous-mode 'egg-fence-command t)
-(put 'fence-transpose-chars 'egg-fence-command t)
-(put 'eval-expression 'egg-fence-command t)
-(put 'fence-toggle-egg-mode 'egg-fence-command t)
-(put 'jis-code-input 'egg-fence-command t)
-(put 'fence-backward-delete-char 'egg-fence-command t)
-(put 'fence-backward-delete-char 'egg-fence-command t)
-(put 'fence-backward-delete-char 'egg-fence-command t)
-(put 'fence-forward-char 'egg-fence-command t)
-(put 'fence-backward-char 'egg-fence-command t)
-(put 'hiragana-region 'egg-fence-command t)
-(put 'hiragana-paragraph 'egg-fence-command t)
-(put 'hiragana-sentance 'egg-fence-command t)
-(put 'katakana-region 'egg-fence-command t)
-(put 'katakana-paragraph 'egg-fence-command t)
-(put 'katakana-sentance 'egg-fence-command t)
-(put 'hankaku-region 'egg-fence-command t)
-(put 'hankaku-paragraph 'egg-fence-command t)
-(put 'hankaku-sentance 'egg-fence-command t)
-(put 'hankaku-word 'egg-fence-command t)
-(put 'zenkaku-region 'egg-fence-command t)
-(put 'zenkaku-paragraph 'egg-fence-command t)
-(put 'zenkaku-sentance 'egg-fence-command t)
-(put 'zenkaku-word 'egg-fence-command t)
-(put 'roma-kana-region 'egg-fence-command t)
-(put 'roma-kana-paragraph 'egg-fence-command t)
-(put 'roma-kana-sentance 'egg-fence-command t)
-(put 'roma-kana-word 'egg-fence-command t)
-(put 'roma-kanji-region 'egg-fence-command t)
-(put 'roma-kanji-paragraph 'egg-fence-command t)
-(put 'roma-kanji-sentance 'egg-fence-command t)
-(put 'roma-kanji-word 'egg-fence-command t)
-(put 'its:select-mode 'egg-fence-command t)
-(put 'its:select-mode-from-menu 'egg-fence-command t)
-(put 'its:next-mode 'egg-fence-command t)
-(put 'its:previous-mode 'egg-fence-command t)
-(put 'its:select-hiragana 'egg-fence-command t)
-(put 'its:select-katakana 'egg-fence-command t)
-(put 'its:select-downcase 'egg-fence-command t)
-(put 'its:select-upcase   'egg-fence-command t)
-(put 'its:select-zenkaku-downcase 'egg-fence-command t)
-(put 'its:select-zenkaku-upcase   'egg-fence-command t)
-(put 'its:select-mode-temporally 'egg-fence-command t)
-(put 'its:select-previous-mode 'egg-fence-command t)
-(put 'fence-toggle-egg-mode 'egg-fence-command t)
-(put 'fence-transpose-chars 'egg-fence-command t)
-(put 'henkan-region 'egg-fence-command t)
-(put 'henkan-paragraph 'egg-fence-command t)
-(put 'henkan-sentance 'egg-fence-command t)
-(put 'henkan-word 'egg-fence-command t)
-(put 'henkan-kakutei 'egg-fence-command t)
-(put 'gyaku-henkan-region 'egg-fence-command t)
-(put 'gyaku-henkan-sentance 'egg-fence-command t)
-(put 'gyaku-henkan-word 'egg-fence-command t)
-(put 'gyaku-henkan-kakutei 'egg-fence-command t)
-(put 'henkan-kakutei-first-char 'egg-fence-command t)
-(put 'henkan-kakutei-before-point 'egg-fence-command t)
-(put 'sai-henkan 'egg-fence-command t)
-(put 'henkan-forward-bunsetu 'egg-fence-command t)
-(put 'henkan-backward-bunsetu 'egg-fence-command t)
-(put 'henkan-first-bunsetu 'egg-fence-command t)
-(put 'henkan-last-bunsetu 'egg-fence-command t)
-(put 'henkan-hiragana 'egg-fence-command t)
-(put 'henkan-katakana 'egg-fence-command t)
-(put 'henkan-next-kouho 'egg-fence-command t)
-(put 'henkan-next-kouho-dai 'egg-fence-command t)
-(put 'henkan-next-kouho-sho 'egg-fence-command t)
-(put 'henkan-previous-kouho 'egg-fence-command t)
-(put 'henkan-previous-kouho-dai 'egg-fence-command t)
-(put 'henkan-previous-kouho-sho 'egg-fence-command t)
-(put 'henkan-bunsetu-chijime-dai 'egg-fence-command t)
-(put 'henkan-bunsetu-chijime-sho 'egg-fence-command t)
-(put 'henkan-bunsetu-nobasi-dai 'egg-fence-command t)
-(put 'henkan-bunsetu-nobasi-sho 'egg-fence-command t)
-(put 'henkan-saishou-bunsetu 'egg-fence-command t)
-(put 'henkan-saichou-bunsetu 'egg-fence-command t)
-(put 'henkan-quit 'egg-fence-command t)
-(put 'henkan-select-kouho-dai 'egg-fence-command t)
-(put 'henkan-select-kouho-sho 'egg-fence-command t)
-(put 'henkan-word-off 'egg-fence-command t)
-(put 'henkan-kakutei-and-self-insert 'egg-fence-command t)
-(put 'henkan-help-command 'egg-fence-command t)
-(put 'toroku-region 'egg-fence-command t)
-(put 'toroku-henkan-mode 'egg-fence-command t)
-(put 'recenter 'egg-fence-command t)
-
-
 ;;;----------------------------------------------------------------------
 ;;;
 ;;; Read hiragana from minibuffer
 (autoload 'busyu-input "egg-busyu" nil t)
 (autoload 'kakusuu-input "egg-busyu" nil t)
 
+;; put us into all existing buffer's modelines
+(if (not (featurep 'egg))
+    (mapc-internal
+     (lambda (buf) 
+       (save-excursion
+	 (set-buffer buf)
+	 (setq modeline-format (cons (list 'display-minibuffer-mode-in-minibuffer
+		 ;;; minibuffer mode in minibuffer
+					   (list 
+					    (list 'its:*previous-map* "<" "[")
+					    'mode-line-egg-mode
+					    (list 'its:*previous-map* ">" "]")
+					    )
+		       ;;;; minibuffer mode in mode line
+					   (list 
+					    (list 'minibuffer-window-selected
+						  (list 'display-minibuffer-mode
+							"m"
+							" ")
+						  " ")
+					    (list 'its:*previous-map* "<" "[")
+					    (list 'minibuffer-window-selected
+						  (list 'display-minibuffer-mode
+							'mode-line-egg-mode-in-minibuffer
+							'mode-line-egg-mode)
+						  'mode-line-egg-mode)
+					    (list 'its:*previous-map* ">" "]")
+					    ))
+				     modeline-format))))
+     (buffer-list)))
+
 (provide 'egg)
 
 ;; if set-lang-environment has already been called, call egg-lang-switch-callback

lisp/games/NeXTify.el

 
 ;; Copyright status unknown
 
-;; Author: Unknown
+;; Author: Jamie Zawinski <jwz@netscape.com>
 ;; Keywords: games
 
 ;; This file is part of XEmacs.
 ;;; Commentary:
 
 ;;; Code:
+
 (defun SeLF-insert-command (arg)
   "Insert the character you TyPE.
 Whichever character you TyPE to run ThIS command is inserted."

lisp/gnus/ChangeLog

+Thu May  8 10:53:12 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* gnus-msg.el (gnus-summary-mail-crosspost-complaint):
+	`deactivate-mark' doesn't exist in XEmacs.
+
+Thu May  8 17:37:38 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+	* gnus.el: Gnus v5.4.51 is released.
+
+Thu May  8 15:58:43 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+	* gnus-sum.el (gnus-execute-command): Place point at start of
+	prompt. 
+
+	* gnus-int.el (gnus-request-replace-article): Don't bug out on
+	unknown groups.
+
+	* gnus-sum.el (gnus-summary-update-info): Force undo boundary here.
+	(gnus-update-read-articles): ... and not here.
+
+	* gnus-art.el (article-display-x-face): Would only show one X-Face.
+
+Wed May  7 05:23:20 1997  Kim-Minh Kaplan  <kimminh.kaplan@utopia.eunet.fr>
+
+	* gnus-picon.el: (gnus-picons-url-alist): new variable.
+	(gnus-picons-jobs-alist): new variable.
+	(gnus-picons-remove): clean this new variable. FIXME: race
+	condition.
+	(gnus-picons-job-already-running): new variable.
+	(gnus-article-display-picons): use the job queue if using the
+	network.
+	(gnus-group-display-picons): ditto.
+	(gnus-picons-make-path): function deleted.
+	(gnus-picons-lookup-internal): modified accordingly.
+	(gnus-picons-lookup-user-internal): take the LETs out of the
+	loops.
+	(gnus-picons-lookup-pairs): take constant calculation outside of
+	loop.
+	(gnus-picons-display-picon-or-name): use COND instead of nested IFs
+	(gnus-picons-display-pairs): take the LET outside of loop.
+	(gnus-picons-try-face): ditto.
+	(gnus-picons-users-image-alist): variable deleted.
+	(gnus-picons-clear-cache): don't clear it.
+	(gnus-picons-retrieve-limit): variable deleted.
+	(gnus-picons-url-retrieve): clear url-request-method
+	(gnus-picons-retrieve-user-callback): function deleted.
+	(gnus-picons-retrieve-user): function deleted.
+	(gnus-picons-retrieve-domain-callback): function deleted
+	(gnus-picons-retrieve-domain-internal): function deleted.
+	(gnus-picons-parse-value): new function.
+	(gnus-picons-parse-filenames): new function.
+	(gnus-picons-network-display-internal): new function.
+	(gnus-picons-network-display-callback): new function.
+	(gnus-picons-network-display): new function.
+	(gnus-picons-network-search-internal): new function.
+	(gnus-picons-network-search-callback): new function.
+	(gnus-picons-network-search): new function.
+	(gnus-picons-next-job-internal): new function.
+	(gnus-picons-next-job): new function.
+
+Wed May  7 22:14:32 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+	* gnus-start.el (gnus-setup-news): Don't fold case.
+
+Sat May  3 16:55:25 1997  Kim-Minh Kaplan  <kimminh.kaplan@utopia.eunet.fr>
+
+	* gnus-picon.el: * gnus-picons-clear-cache-on-shutdown: new variable.
+	* gnus-picons-piconsearch-cache-user: variable deleted.
+	* gnus-picons-clear-cache: new function.
+	* gnus-picons-close: only clear cache if
+ 	gnus-picons-clear-cache-on-shutdown.
+	* gnus-picons-url-retrieve: set url-package-name and
+ 	url-package-version.
+	* gnus-picons-users-image-alist: new variable.
+	* gnus-picons-retrieve-user-callback: use it.
+	* Added support for network retrieval of picons.
+	* gnus-picons-map: removed.
+	* gnus-picons-remove: removed case to handle processes.
+	* gnus-picons-processes-alist: new variable
+	* gnus-picons-x-face-sentinel: simplified.  Use processes alist.
+	* gnus-picons-display-x-face: explicitly request an xface image.
+	Always call gnus-picons-prepare-for-annotations.  Use processes
+	alist.
+	* gnus-picons-lookup-internal: new function.
+	* gnus-picons-lookup: use it.
+	* gnus-picons-lookup-user-internal: ditto.
+	* gnus-picons-display-picon-or-name: no more xface-p argument.
+	* gnus-picons-try-suffixes: removed.
+	* gnus-picons-try-face: new function.  Does the caching in
+	gnus-picons-glyph-alist.
+	* gnus-picons-try-to-find-face: take a glyph argument instead of a
+	path.  No more xface-p argument.  Only use one annotation even if
+	gnus-picons-display-as-address.
+	* gnus-picons-toggle-extent: changed into an annotation action.
+
 Sat May  3 00:59:39 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
 	* gnus.el: Gnus v5.4.50 is released.

lisp/gnus/gnus-art.el

 		    ;; Has to be present.
 		    (re-search-forward "^X-Face: " nil t))
 	  ;; We now have the area of the buffer where the X-Face is stored.
-	  (let ((beg (point))
-		(end (1- (re-search-forward "^\\($\\|[^ \t]\\)" nil t))))
-	    (save-excursion
+	  (save-excursion
+	    (let ((beg (point))
+		  (end (1- (re-search-forward "^\\($\\|[^ \t]\\)" nil t))))
 	      ;; We display the face.
 	      (if (symbolp gnus-article-x-face-command)
 		  ;; The command is a lisp function, so we call it.

lisp/gnus/gnus-int.el

 	     last)))
 
 (defun gnus-request-replace-article (article group buffer)
-  (let ((func (car (gnus-find-method-for-group group))))
+  (let ((func (car (gnus-group-name-to-method group))))
     (funcall (intern (format "%s-request-replace-article" func))
 	     article (gnus-group-real-name group) buffer)))
 

lisp/gnus/gnus-msg.el

 	  (message-goto-subject)
 	  (re-search-forward " *$")
 	  (replace-match " (crosspost notification)" t t)
-	  (deactivate-mark)
+	  (when (fboundp 'deactivate-mark)
+	    (deactivate-mark))
 	  (when (gnus-y-or-n-p "Send this complaint? ")
 	    (message-send-and-exit)))))))
 

lisp/gnus/gnus-picon.el

 
 ;;; Commentary:
 
+;;; TODO:
+;; See the comment in gnus-picons-remove
+
 ;;; Code:
 
 (require 'gnus)
 (require 'gnus-art)
 (require 'gnus-win)
 
+;;; User variables:
+
 (defgroup picons nil
   "Show pictures of people, domains, and newsgroups (XEmacs).
 For this to work, you must add gnus-group-display-picons to the
   :type 'boolean
   :group 'picons)
 
-(defvar gnus-picons-map (make-sparse-keymap "gnus-picons-keys")
- "keymap to hide/show picon glyphs")
+(defcustom gnus-picons-clear-cache-on-shutdown t
+  "*Whether to clear the picons cache when exiting gnus.
+Gnus caches every picons it finds while it is running.  This saves
+some time in the search process but eats some memory.  If this
+variable is set to nil, Gnus will never clear the cache itself; you
+will have to manually call `gnus-picons-clear-cache' to clear it.
+Otherwise the cache will be cleared every time you exit Gnus."
+  :type 'boolean
+  :group 'picons)
 
-(define-key gnus-picons-map [(button2)] 'gnus-picons-toggle-extent)
+(defcustom gnus-picons-piconsearch-url nil
+  "*The url to query for picons.  Setting this to nil will disable it.
+The only plublicly available address currently known is
+http://www.cs.indiana.edu:800/piconsearch.  If you know of any other,
+please tell me so that we can list it."
+  :type '(choice (const :tag "Disable" :value nil)
+		 (const :tag "www.cs.indiana.edu"
+			:value "http://www.cs.indiana.edu:800/piconsearch")
+		 (string))
+  :group 'picons)
 
-;;; Internal variables.
+;;; Internal variables:
+
+(defvar gnus-picons-processes-alist nil
+  "Picons processes currently running and their environment.")
+(defvar gnus-picons-glyph-alist nil
+  "Picons glyphs cache.
+List of pairs (KEY . GLYPH) where KEY is either a filename or an URL.")
+(defvar gnus-picons-url-alist nil
+  "Picons file names cache.
+List of pairs (KEY . NAME) where KEY is (USER HOST DBS) and NAME is an URL.")
 
 (defvar gnus-group-annotations nil
   "List of annotations added/removed when selecting/exiting a group")
+(defvar gnus-group-annotations-lock nil)
 (defvar gnus-article-annotations nil
   "List of annotations added/removed when selecting an article")
+(defvar gnus-article-annotations-lock nil)
 (defvar gnus-x-face-annotations nil
-  "List of annotations added/removed when selecting an article with an X-Face.")
+  "List of annotations added/removed when selecting an article with an
+X-Face.")
+(defvar gnus-x-face-annotations-lock nil)
+
+(defvar gnus-picons-jobs-alist nil
+  "List of jobs that still need be done.
+This is a list of (SYM-ANN TAG ARGS...) where SYM-ANN three annotations list,
+TAG is one of `picon' or `search' indicating that the job should query a
+picon or do a search for picons file names, and ARGS is some additionnal
+arguments necessary for the job.")
+
+(defvar gnus-picons-job-already-running nil
+  "Lock to ensure only one stream of http requests is running.")
+
+;;; Functions:
+
+(defsubst gnus-picons-lock (symbol)
+  (intern (concat (symbol-name symbol) "-lock")))
 
 (defun gnus-picons-remove (symbol)
-  "Remove all annotations/processes in variable named SYMBOL.
+  "Remove all annotations in variable named SYMBOL.
 This function is careful to set it to nil before removing anything so that
 asynchronous process don't get crazy."
-  (let ((listitems (symbol-value symbol)))
-    (set symbol nil)
-    (while listitems
-      (let ((item (pop listitems)))
-	(cond ((annotationp item)
-	       (delete-annotation item))
-	      ((processp item)
-	       ;; kill the process, ignore any output.
-	       (set-process-sentinel item (function (lambda (p e))))
-	       (delete-process item)))))))
+  ;; clear the lock
+  (set (gnus-picons-lock symbol) nil)
+  ;; clear all annotations
+  (mapc (function (lambda (item)
+		    (if (annotationp item)
+			(delete-annotation item))))
+	(prog1 (symbol-value symbol)
+	  (set symbol nil)))
+  ;; FIXME: there's a race condition here.  If a job is already
+  ;; running, it has already removed itself from this queue...  But
+  ;; will still display its picon.
+  ;; TODO: push a request to clear an annotation.  Then
+  ;; gnus-picons-next-job will be able to clean up when it gets the
+  ;; hand
+  (setq gnus-picons-jobs-alist (remassq symbol gnus-picons-jobs-alist)))
 
 (defun gnus-picons-remove-all ()
   "Removes all picons from the Gnus display(s)."
 
 (defun gnus-get-buffer-name (variable)
   "Returns the buffer name associated with the contents of a variable."
-  (cond ((symbolp variable)
-         (let ((newvar (cdr (assq variable gnus-window-to-buffer))))
-           (cond ((symbolp newvar)
-                  (symbol-value newvar))
-                 ((stringp newvar) newvar))))
-        ((stringp variable)
-         variable)))
+  (cond ((symbolp variable) (let ((newvar (cdr (assq variable
+						     gnus-window-to-buffer))))
+			      (cond ((symbolp newvar)
+				     (symbol-value newvar))
+				    ((stringp newvar) newvar))))
+        ((stringp variable) variable)))
 
 (defun gnus-picons-prepare-for-annotations (annotations)
   "Prepare picons buffer for puting annotations memorized in ANNOTATIONS.
   (if (and (eq gnus-picons-display-where 'article)
 	   gnus-picons-display-article-move-p)
       (when (search-forward "\n\n" nil t)
-	(forward-line -1)))
+	(forward-line -1))
+    (make-local-variable 'inhibit-read-only)
+    (setq buffer-read-only t
+	  inhibit-read-only nil))
   (gnus-picons-remove annotations))
 
 (defun gnus-picons-article-display-x-face ()
     (gnus-article-display-x-face)))
 
 (defun gnus-picons-x-face-sentinel (process event)
-  ;; don't call gnus-picons-prepare-for-annotations, it would reset
-  ;; gnus-x-face-annotations.
-  (set-buffer (get-buffer-create
-	       (gnus-get-buffer-name gnus-picons-display-where)))
-  (gnus-add-current-to-buffer-list)
-  (goto-char (point-min))
-  (if (and (eq gnus-picons-display-where 'article)
-	   gnus-picons-display-article-move-p)
-      (when (search-forward "\n\n" nil t)
-	(forward-line -1)))
-  ;; If the process is still in the list, insert this icon
-  (let ((myself (member process gnus-x-face-annotations)))
-    (when myself
-      (setcar myself
-	      (make-annotation gnus-picons-x-face-file-name nil 'text))
-      (delete-file gnus-picons-x-face-file-name))))
+  (let* ((env (assq process gnus-picons-processes-alist))
+	 (annot (cdr env)))
+    (setq gnus-picons-processes-alist (remassq process
+					       gnus-picons-processes-alist))
+    (when annot
+      (set-annotation-glyph annot
+			    (make-glyph gnus-picons-x-face-file-name))
+      (if (memq annot gnus-x-face-annotations)
+	  (delete-file gnus-picons-x-face-file-name)))))
 
 (defun gnus-picons-display-x-face (beg end)
   "Function to display the x-face header in the picons window.
 	(save-excursion
 	  (gnus-picons-prepare-for-annotations 'gnus-x-face-annotations)
 	  (setq gnus-x-face-annotations
-		(cons (make-annotation (concat "X-Face: "
-					       (buffer-substring beg end buf))
+		(cons (make-annotation
+		       (vector 'xface
+			       :data (concat "X-Face: "
+					     (buffer-substring beg end buf)))
 				       nil 'text)
 		      gnus-x-face-annotations))))
     ;; convert the x-face header to a .xbm file
     (let* ((process-connection-type nil)
-	   (process (start-process "gnus-x-face" nil
-				   shell-file-name shell-command-switch
-				   gnus-picons-convert-x-face)))
+	   (annot (save-excursion
+		    (gnus-picons-prepare-for-annotations
+		     'gnus-x-face-annotations)
+		    (make-annotation nil nil 'text)))
+	   (process (start-process-shell-command "gnus-x-face" nil 
+						 gnus-picons-convert-x-face)))
+      (push annot gnus-x-face-annotations)
+      (push (cons process annot) gnus-picons-processes-alist)
       (process-kill-without-query process)
-      (setq gnus-x-face-annotations (list process))
       (set-process-sentinel process 'gnus-picons-x-face-sentinel)
       (process-send-region process beg end)
       (process-send-eof process))))
     (when (and (featurep 'xpm)
 	       (or (not (fboundp 'device-type)) (equal (device-type) 'x))
 	       (setq from (mail-fetch-field "from"))
-	       (setq from (downcase
-			   (or (cadr (mail-extract-address-components from))
-			       "")))
+	       (setq from (downcase (or (cadr (mail-extract-address-components
+					       from))
+					"")))
 	       (or (setq at-idx (string-match "@" from))
 		   (setq at-idx (length from))))
       (save-excursion
-	(let ((username (substring from 0 at-idx))
+	(let ((username (downcase (substring from 0 at-idx)))
 	      (addrs (if (eq at-idx (length from))
 			 (if gnus-local-domain
-			     (message-tokenize-header gnus-local-domain ".")
-			   nil)
+			     (message-tokenize-header gnus-local-domain "."))
 		       (message-tokenize-header (substring from (1+ at-idx))
 						"."))))
 	  (gnus-picons-prepare-for-annotations 'gnus-article-annotations)
-	  (setq gnus-article-annotations
-		(nconc gnus-article-annotations
-		       ;; look for domain paths.
-		       (gnus-picons-display-pairs
-			(gnus-picons-lookup-pairs addrs
-					       gnus-picons-domain-directories)
-			(not (or gnus-picons-display-as-address
-				 gnus-article-annotations))
-			nil "." t)
-		       ;; add an '@' if displaying as address
-		       (if  (and gnus-picons-display-as-address addrs)
-			 (list (make-annotation "@" nil 'text nil nil nil t)))
-		       ;; then do user directories,
-		       (gnus-picons-display-picon-or-name
-			(gnus-picons-lookup-user (downcase username) addrs)
-			username nil t)))
+	  (if (null gnus-picons-piconsearch-url)
+	      (setq gnus-article-annotations
+		    (nconc gnus-article-annotations
+			   (gnus-picons-display-pairs
+			    (gnus-picons-lookup-pairs
+			     addrs gnus-picons-domain-directories)
+			    (not (or gnus-picons-display-as-address
+				     gnus-article-annotations))
+			    "." t)
+			   (if (and gnus-picons-display-as-address addrs)
+			       (list (make-annotation [string :data "@"] nil
+						      'text nil nil nil t)))
+			   (gnus-picons-display-picon-or-name
+			    (gnus-picons-lookup-user username addrs)
+			    username t)))
+	    (push (list 'gnus-article-annotations 'search username addrs
+			gnus-picons-domain-directories t)
+		  gnus-picons-jobs-alist)
+	    (gnus-picons-next-job))
 
 	  (add-hook 'gnus-summary-exit-hook 'gnus-picons-remove-all))))))
 
 	     (or (not (fboundp 'device-type)) (equal (device-type) 'x)))
     (save-excursion
       (gnus-picons-prepare-for-annotations 'gnus-group-annotations)
-      (setq gnus-group-annotations
-	    (gnus-picons-display-pairs
-	     (gnus-picons-lookup-pairs (reverse (message-tokenize-header
-					      gnus-newsgroup-name "."))
-				    gnus-picons-news-directory)
-	     t nil "."))
+      (if (null gnus-picons-piconsearch-url)
+	  (setq gnus-group-annotations
+		(gnus-picons-display-pairs
+		 (gnus-picons-lookup-pairs (reverse (message-tokenize-header
+						     gnus-newsgroup-name "."))
+					   gnus-picons-news-directory)
+		 t "."))
+	(push (list 'gnus-group-annotations 'search nil
+		    (message-tokenize-header gnus-newsgroup-name ".")
+		    (if (listp gnus-picons-news-directory)
+			gnus-picons-news-directory
+		      (list gnus-picons-news-directory))
+		    nil)
+	      gnus-picons-jobs-alist)
+	(gnus-picons-next-job))
+
       (add-hook 'gnus-summary-exit-hook 'gnus-picons-remove-all))))
 
-(defun gnus-picons-make-path (dir subdirs)
-  "Make a directory name from a base DIR and a list of SUBDIRS.
-Returns a directory name build by concatenating DIR and all elements of
-SUBDIRS with \"/\" between elements."
-  (while subdirs
-    (setq dir (file-name-as-directory (concat dir (pop subdirs)))))
-  dir)
-
-(defsubst gnus-picons-try-suffixes (file)
-  (let ((suffixes gnus-picons-file-suffixes)
-	f)
-    (while (and suffixes
-		(not (file-exists-p (setq f (concat file (pop suffixes))))))
-      (setq f nil))
-    f))
+(defsubst gnus-picons-lookup-internal (addrs dir)
+  (setq dir (expand-file-name dir gnus-picons-database))
+  (gnus-picons-try-face (dolist (part (reverse addrs) dir)
+			  (setq dir (expand-file-name part dir)))))
 
 (defun gnus-picons-lookup (addrs dirs)
   "Lookup the picon for ADDRS in databases DIRS.
 Returns the picon filename or NIL if none found."
   (let (result)
     (while (and dirs (null result))
-      (setq result
-	    (gnus-picons-try-suffixes
-	     (expand-file-name "face."
-			       (gnus-picons-make-path
-				(file-name-as-directory
-				 (concat
-				  (file-name-as-directory gnus-picons-database)
-				  (pop dirs)))
-				(reverse addrs))))))
+      (setq result (gnus-picons-lookup-internal addrs (pop dirs))))
     result))
 
 (defun gnus-picons-lookup-user-internal (user domains)
   (let ((dirs gnus-picons-user-directories)
-	picon)
+	domains-tmp dir picon)
     (while (and dirs (null picon))
-      (let ((dir (list (pop dirs)))
-	    (domains domains))
-	(while (and domains (null picon))
-	  (setq picon (gnus-picons-lookup (cons user domains) dir))
-	  (pop domains))
-	;; Also make a try MISC subdir
-	(unless picon
-	  (setq picon (gnus-picons-lookup (list user "MISC") dir)))))
-
+      (setq domains-tmp domains
+	    dir (pop dirs))
+      (while (and domains-tmp
+		  (null (setq picon (gnus-picons-lookup-internal
+				     (cons user domains-tmp) dir))))
+	(pop domains-tmp))
+      ;; Also make a try in MISC subdir
+      (unless picon
+	(setq picon (gnus-picons-lookup-internal (list user "MISC") dir))))
     picon))
 
 (defun gnus-picons-lookup-user (user domains)
 Returns a list of PAIRS whose CAR is the picon filename or NIL if
 none, and whose CDR is the corresponding element of DOMAINS."
   (let (picons)
+    (setq directories (if (listp directories)
+			  directories
+			(list directories)))
     (while domains
-      (push (list (gnus-picons-lookup (cons "unknown" domains)
-				      (if (listp directories)
-					  directories
-					(list directories)))
+      (push (list (gnus-picons-lookup (cons "unknown" domains) directories)
 		  (pop domains))
 	    picons))
     picons))
 
-(defun gnus-picons-display-picon-or-name (picon name &optional xface-p right-p)
-  (if picon
-      (gnus-picons-try-to-find-face picon xface-p name right-p)
-    (list (make-annotation name nil 'text nil nil nil right-p))))
+(defun gnus-picons-display-picon-or-name (picon name &optional right-p)
+  (cond (picon (gnus-picons-display-glyph picon name right-p))
+	(gnus-picons-display-as-address (list (make-annotation
+					       (vector 'string :data name)
+					       nil 'text
+					       nil nil nil right-p)))))
 
-(defun gnus-picons-display-pairs (pairs &optional bar-p xface-p dot-p right-p)
+(defun gnus-picons-display-pairs (pairs &optional bar-p dot-p right-p)
   "Display picons in list PAIRS."
   (let ((bar (and bar-p (or gnus-picons-display-as-address
-			  (annotations-in-region (point)
-						 (min (point-max) (1+ (point)))
-						 (current-buffer)))))
+			    (annotations-in-region (point)
+						   (min (point-max)
+							(1+ (point)))
+						   (current-buffer)))))
 	(domain-p (and gnus-picons-display-as-address dot-p))
-	picons)
+	pair picons)
     (while pairs
-      (let ((pair (pop pairs)))
-	(setq picons (nconc (if (and domain-p picons (not right-p))
-				(list (make-annotation
-				       dot-p nil 'text nil nil nil right-p)))
-			    (gnus-picons-display-picon-or-name (car pair)
-							       (cadr pair)
-							       xface-p
-							       right-p)
-			    (if (and domain-p pairs right-p)
-				(list (make-annotation
-				       dot-p nil 'text nil nil nil right-p)))
-			    (when (and bar domain-p)
-			      (setq bar nil)
-			      (gnus-picons-try-to-find-face
-			       (expand-file-name "bar.xbm"
-						 gnus-xmas-glyph-directory)
-			       nil nil t))
-			    picons))))
+      (setq pair (pop pairs)
+	    picons (nconc (if (and domain-p picons (not right-p))
+			      (list (make-annotation
+				     (vector 'string :data dot-p)
+				     nil 'text nil nil nil right-p)))
+			  (gnus-picons-display-picon-or-name (car pair)
+							     (cadr pair)
+							     right-p)
+			  (if (and domain-p pairs right-p)
+			      (list (make-annotation
+				     (vector 'string :data dot-p)
+				     nil 'text nil nil nil right-p)))
+			  (when (and bar domain-p)
+			    (setq bar nil)
+			    (gnus-picons-display-glyph
+			     (gnus-picons-try-face gnus-xmas-glyph-directory
+						   "bar.")
+			     nil t))
+			  picons)))
     picons))
 
-(defvar gnus-picons-glyph-alist nil)
+(defun gnus-picons-try-face (dir &optional filebase)
+  (let* ((dir (file-name-as-directory dir))
+	 (filebase (or filebase "face."))
+	 (key (concat dir filebase))
+	 (glyph (cdr (assoc key gnus-picons-glyph-alist)))
+	 (suffixes gnus-picons-file-suffixes)
+	 f)
+    (while (and suffixes (null glyph))
+      (when (file-exists-p (setq f (expand-file-name (concat filebase
+								 (pop suffixes))
+							 dir)))
+	(setq glyph (make-glyph f))
+	(push (cons key glyph) gnus-picons-glyph-alist)))
+    glyph))
 
-(defun gnus-picons-try-to-find-face (path &optional xface-p part rightp)
-  "If PATH exists, display it as a bitmap.  Returns t if succeeded."
-  (let ((glyph (and (not xface-p)
-		    (cdr (assoc path gnus-picons-glyph-alist)))))
-    (when (or glyph (file-exists-p path))
-      (unless glyph
-	(setq glyph (make-glyph path))
-	(unless xface-p
-	  (push (cons path glyph) gnus-picons-glyph-alist))
-	(set-glyph-face glyph 'default))
-      (let ((new (make-annotation glyph (point) 'text nil nil nil rightp)))
-	(nconc
-	 (list new)
-	 (when (and (eq major-mode 'gnus-article-mode)
-		    (not gnus-picons-display-as-address)
-		    (not part))
-	   (list (make-annotation " " (point) 'text nil nil nil rightp)))
-	 (when (and part gnus-picons-display-as-address)
-	   (let ((txt (make-annotation part (point) 'text nil nil nil rightp)))
-	     (hide-annotation txt)
-	     (set-extent-property txt 'its-partner new)
-	     (set-extent-property txt 'keymap gnus-picons-map)
-	     (set-extent-property txt 'mouse-face gnus-article-mouse-face)
-	     (set-extent-property new 'its-partner txt)
-	     (set-extent-property new 'keymap gnus-picons-map)
-	     (list txt))))))))
+(defun gnus-picons-display-glyph (glyph &optional part rightp)
+  (let ((new (make-annotation glyph (point) 'text nil nil nil rightp)))
+    (when (and part gnus-picons-display-as-address)
+      (set-annotation-data new (cons new
+				     (make-glyph (vector 'string :data part))))
+      (set-annotation-action new 'gnus-picons-action-toggle))
+    (nconc
+     (list new)
+     (if (and (eq major-mode 'gnus-article-mode)
+	      (not gnus-picons-display-as-address)
+	      (not part))
+	 (list (make-annotation [string :data " "]
+				(point) 'text nil nil nil rightp))))))
 
-(defun gnus-picons-toggle-extent (event)
-  "Toggle picon glyph at given point"
+(defun gnus-picons-action-toggle (data)
+  "Toggle annotation"
   (interactive "e")
-  (let* ((ant1 (event-glyph-extent event))
-	 (ant2 (extent-property ant1 'its-partner)))
-    (when (and (annotationp ant1) (annotationp ant2))
-      (reveal-annotation ant2)
-      (hide-annotation ant1))))
+  (let* ((annot (car data))
+	 (glyph (annotation-glyph annot)))
+    (set-annotation-glyph annot (cdr data))
+    (set-annotation-data annot (cons annot glyph))))
+
+(defun gnus-picons-clear-cache ()
+  "Clear the picons cache"
+  (interactive)
+  (setq gnus-picons-glyph-alist nil))
 
 (gnus-add-shutdown 'gnus-picons-close 'gnus)
 
 (defun gnus-picons-close ()
   "Shut down the picons."
-  (setq gnus-picons-glyph-alist nil))
+  (if gnus-picons-clear-cache-on-shutdown
+      (gnus-picons-clear-cache)))
+
+;;; Query a remote DB.  This requires some stuff from w3 !
+
+(require 'url)
+(require 'w3-forms)
+
+(defun gnus-picons-url-retrieve (url fn arg)
+  (let ((old-asynch (default-value 'url-be-asynchronous))
+	(url-working-buffer (generate-new-buffer " *picons*"))
+	(url-request-method nil)
+	(url-package-name "Gnus")
+	(url-package-version gnus-version-number))
+    (setq-default url-be-asynchronous t)
+    (save-excursion
+      (set-buffer url-working-buffer)
+      (setq url-be-asynchronous t
+	    url-show-status nil
+	    url-current-callback-data arg
+	    url-current-callback-func fn)
+      (url-retrieve url t))
+    (setq-default url-be-asynchronous old-asynch)))
+
+(defun gnus-picons-make-glyph (type)
+  "Make a TYPE glyph using current buffer as data.  Handles xbm nicely."
+  (cond ((null type) nil)
+	((eq type 'xbm) (let ((fname (make-temp-name "/tmp/picon")))
+			  (write-region (point-min) (point-max) fname
+					nil 'quiet)
+			  (prog1 (make-glyph (vector 'xbm :file fname))
+			    (delete-file fname))))
+	(t (make-glyph (vector type :data (buffer-string))))))
+
+;;; Parsing of piconsearch result page.
+
+;; Assumes:
+;; 1 - each value field has the form: "<strong>key</strong> = <kbd>value</kbd>"
+;; 2 - a "<p>" separates the keywords from the results
+;; 3 - every results begins by the path within the database at the beginning
+;;     of the line in raw text.
+;; 3b - and the href following it is the preferred image type.
+
+;; if 1 or 2 is not met, it will probably cause an error.  The other
+;; will go undetected
+
+(defun gnus-picons-parse-value (name)
+  (goto-char (point-min))
+  (re-search-forward (concat "<strong>"
+			     (regexp-quote name)
+			     "</strong> *= *<kbd> *\\([^ <][^<]*\\) *</kbd>"))
+  (buffer-substring (match-beginning 1) (match-end 1)))
+
+(defun gnus-picons-parse-filenames ()
+  ;; returns an alist of ((USER ADDRS DB) . URL)
+  (let* ((case-fold-search t)
+	 (user (gnus-picons-parse-value "user"))
+	 (host (gnus-picons-parse-value "host"))
+	 (dbs (message-tokenize-header (gnus-picons-parse-value "db") " "))
+	 (start-re
+	  (concat
+	   ;; dbs
+	   "^\\(" (mapconcat 'identity dbs "\\|") "\\)/"
+	   ;; host
+	   "\\(\\(" (replace-in-string host "\\." "/\\|" t) "/\\|MISC/\\)*\\)"
+	   ;; user
+	   "\\(" (regexp-quote user) "\\|unknown\\)/"
+	   "face\\."))
+	 cur-db cur-host cur-user types res)
+    ;; now point will be somewhere in the header.  Find beginning of
+    ;; entries
+    (re-search-forward "<p>[ \t\n]*")
+    (while (re-search-forward start-re nil t)
+      (setq cur-db (buffer-substring (match-beginning 1) (match-end 1))
+	    cur-host (buffer-substring (match-beginning 2) (match-end 2))
+	    cur-user (buffer-substring (match-beginning 4) (match-end 4))
+	    cur-host (nreverse (message-tokenize-header cur-host "/")))
+      ;; XXX - KLUDGE: there is a blank picon in news/MISC/unknown
+      (unless (and (string-equal cur-db "news")
+		   (string-equal cur-user "unknown")
+		   (equal cur-host '("MISC")))
+	;; ok now we have found an entry (USER HOST DB), find the
+	;; corresponding picon URL
+	(save-restriction
+	  ;; restrict region to this entry
+	  (narrow-to-region (point) (search-forward "<br>"))
+	  (goto-char (point-min))
+	  (setq types gnus-picons-file-suffixes)
+	  (while (and types
+		      (not (re-search-forward
+			    (concat "<a[ \t\n]+href=\"\\([^\"]*\\."
+				    (regexp-quote (car types)) "\\)\"")
+			    nil t)))
+	    (pop types))
+	  (push (cons (list cur-user cur-host cur-db)
+		      (buffer-substring (match-beginning 1) (match-end 1)))
+		res))))
+    (nreverse res)))
+
+;;; picon network display functions :
+
+(defun gnus-picons-network-display-internal (sym-ann glyph part right-p)
+  (set-buffer
+   (get-buffer-create (gnus-get-buffer-name gnus-picons-display-where)))
+  (set sym-ann (nconc (symbol-value sym-ann)
+		      (gnus-picons-display-picon-or-name glyph part right-p)))
+  (gnus-picons-next-job-internal))
+
+(defun gnus-picons-network-display-callback (url part sym-ann right-p)
+  (let ((glyph (gnus-picons-make-glyph (cdr (assoc url-current-mime-type
+						   w3-image-mappings)))))
+    (kill-buffer (current-buffer))
+    (push (cons url glyph) gnus-picons-glyph-alist)
+    (gnus-picons-network-display-internal sym-ann glyph part right-p)))
+
+(defun gnus-picons-network-display (url part sym-ann right-p)
+  (let ((cache (assoc url gnus-picons-glyph-alist)))
+    (if (or cache (null url))
+	(gnus-picons-network-display-internal sym-ann (cdr cache) part right-p)
+      (gnus-picons-url-retrieve url 'gnus-picons-network-display-callback
+				(list url part sym-ann right-p)))))
+
+;;; search job functions
+
+(defun gnus-picons-network-search-internal (user addrs dbs sym-ann right-p
+						 &optional fnames)
+  (let (curkey dom pfx url dbs-tmp cache new-jobs)
+    ;; First do the domain search
+    (dolist (part (if right-p
+		      (reverse addrs)
+		    addrs))
+      (setq pfx (nconc (list part) pfx)
+	    dom (cond ((and dom right-p) (concat part "." dom))
+		      (dom (concat dom "." part))
+		      (t part))
+	    curkey (list "unknown" dom dbs))
+      (when (null (setq cache (assoc curkey gnus-picons-url-alist)))
+	;; This one is not yet in the cache, create a new entry
+	;; Search for an entry
+	(setq dbs-tmp dbs
+	      url nil)
+	(while (and dbs-tmp (null url))
+	  (setq url (or (cdr (assoc (list "unknown" pfx (car dbs-tmp)) fnames))
+			(and (eq dom part)
+			     ;; This is the first component.  Try the
+			     ;; catch-all MISC component
+			     (cdr (assoc (list "unknown"
+					       '("MISC")
+					       (car dbs-tmp))
+					 fnames)))))
+	  (pop dbs-tmp))
+	(push (setq cache (cons curkey url)) gnus-picons-url-alist))
+      ;; Put this glyph in the job list
+      (if (and (not (eq dom part)) gnus-picons-display-as-address)
+	  (push (list sym-ann "." right-p) new-jobs))
+      (push (list sym-ann 'picon (cdr cache) part right-p) new-jobs))
+    ;; next, the user search
+    (when user
+      (setq curkey (list user dom gnus-picons-user-directories))
+      (if (null (setq cache (assoc curkey gnus-picons-url-alist)))
+	  (let ((users (list user "unknown"))
+		dirs usr domains-tmp dir picon)
+	    (while (and users (null picon))
+	      (setq dirs gnus-picons-user-directories
+		    usr (pop users))
+	      (while (and dirs (null picon))
+		(setq domains-tmp addrs
+		      dir (pop dirs))
+		(while (and domains-tmp
+			    (null (setq picon (assoc (list usr domains-tmp dir)
+						     fnames))))
+		  (pop domains-tmp))
+		(unless picon
+		  (setq picon (assoc (list usr '("MISC") dir) fnames)))))
+	    (push (setq cache (cons curkey (cdr picon)))
+		  gnus-picons-url-alist)))
+      (if (and gnus-picons-display-as-address new-jobs)
+	  (push (list sym-ann "@" right-p) new-jobs))
+      (push (list sym-ann 'picon (cdr cache) user right-p) new-jobs))
+    (setq gnus-picons-jobs-alist (nconc (nreverse new-jobs)
+					gnus-picons-jobs-alist))
+    (gnus-picons-next-job-internal)))
+
+(defun gnus-picons-network-search-callback (user addrs dbs sym-ann right-p)
+  (gnus-picons-network-search-internal user addrs dbs sym-ann right-p
+				       (prog1 (gnus-picons-parse-filenames)
+					 (kill-buffer (current-buffer)))))
+
+(defun gnus-picons-network-search (user addrs dbs sym-ann right-p)
+  (let* ((host (mapconcat 'identity addrs "."))
+	 (key (list (or user "unknown") host (if user
+						  gnus-picons-user-directories
+						dbs)))
+	 (cache (assoc key gnus-picons-url-alist)))
+    (if (null cache)
+	(gnus-picons-url-retrieve
+	 (concat gnus-picons-piconsearch-url
+		 "?user=" (w3-form-encode-xwfu (or user "unknown"))
+		 "&host=" (w3-form-encode-xwfu host)
+		 "&db=" (mapconcat 'w3-form-encode-xwfu
+				   (if user
+				       (append dbs
+					       gnus-picons-user-directories)
+				     dbs)
+				   "+"))
+	 'gnus-picons-network-search-callback
+	 (list user addrs dbs sym-ann right-p))
+      (gnus-picons-network-search-internal user addrs dbs sym-ann right-p))))
+
+;;; Main jobs dispatcher function
+;; Given that XEmacs is not really multi threaded, this locking should
+;; be sufficient
+
+(defun gnus-picons-next-job-internal ()
+  (if gnus-picons-jobs-alist
+      (let* ((job (pop gnus-picons-jobs-alist))
+	     (sym-ann (pop job))
+	     (tag (pop job)))
+	(if tag
+	    (cond ((stringp tag);; (SYM-ANN "..." RIGHT-P)
+		   (gnus-picons-network-display-internal sym-ann nil tag
+							 (pop job)))
+		  ((eq 'search tag);; (SYM-ANN 'search USER ADDRS DBS RIGHT-P)
+		   (gnus-picons-network-search
+		    (pop job) (pop job) (pop job) sym-ann (pop job)))
+		  ((eq 'picon tag);; (SYM-ANN 'picon URL PART RIGHT-P)
+		   (gnus-picons-network-display
+		    (pop job) (pop job) sym-ann (pop job)))
+		  (t (error "Unknown picon job tag %s" tag)))))
+    (setq gnus-picons-job-already-running nil)))
+
+(defun gnus-picons-next-job ()
+  "Start processing the job queue."
+  (unless gnus-picons-job-already-running
+    (setq gnus-picons-job-already-running t)
+    (gnus-picons-next-job-internal)))
 
 (provide 'gnus-picon)
 

lisp/gnus/gnus-start.el

 
     ;; See whether we need to read the description file.
     (when (and (boundp 'gnus-group-line-format)
-	       (string-match "%[-,0-9]*D" gnus-group-line-format)
+	       (let ((case-fold-search nil))
+		 (string-match "%[-,0-9]*D" gnus-group-line-format))
 	       (not gnus-description-hashtb)
 	       (not dont-connect)
 	       gnus-read-active-file)

lisp/gnus/gnus-sum.el

 		   (not non-destructive))
 	  (setq gnus-newsgroup-scored nil))
 	;; Set the new ranges of read articles.
+	(save-excursion
+	  (set-buffer gnus-group-buffer)
+	  (gnus-undo-force-boundary))
 	(gnus-update-read-articles
 	 group (append gnus-newsgroup-unreads gnus-newsgroup-unselected))
 	;; Set the current article marks.
     (gnus-article-setup-buffer)
     (set-buffer gnus-article-buffer)
     (setq buffer-read-only nil)
-    (let ((command (if automatic command (read-string "Command: " command))))
+    (let ((command (if automatic command
+		     (read-string "Command: " (cons command 0)))))
       (erase-buffer)
       (insert "$ " command "\n\n")
       (if gnus-view-pseudo-asynchronously
 	(push (cons prev (cdr active)) read))
       (save-excursion
 	(set-buffer gnus-group-buffer)
-	(gnus-undo-force-boundary)
 	(gnus-undo-register
 	  `(progn
 	     (gnus-info-set-marks ',info ',(gnus-info-marks info) t)

lisp/gnus/gnus.el

   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "5.4.50"
+(defconst gnus-version-number "5.4.51"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Gnus v%s" gnus-version-number)

lisp/gnus/message.el

       (insert string)
       (if (not comp)
 	  (message "No matching groups")
-	(pop-to-buffer "*Completions*")
-	(buffer-disable-undo (current-buffer))
-	(let ((buffer-read-only nil))
-	  (erase-buffer)
-	  (let ((standard-output (current-buffer)))
-	    (display-completion-list (sort completions 'string<)))
-	  (goto-char (point-min))
-	  (pop-to-buffer cur)))))))
+	(save-selected-window
+	  (pop-to-buffer "*Completions*")
+	  (buffer-disable-undo (current-buffer))
+	  (let ((buffer-read-only nil))
+	    (erase-buffer)
+	    (let ((standard-output (current-buffer)))
+	      (display-completion-list (sort completions 'string<)))
+	    (goto-char (point-min))
+	    (delete-region (point) (progn (forward-line 3) (point))))))))))
 
 ;;; Help stuff.
 

lisp/gnus/nnfolder.el

       (nnmail-save-active nnfolder-group-alist nnfolder-active-file))
 
     (if dont-check
-	(setq nnfolder-current-group group)
+	(setq nnfolder-current-group group
+	      nnfolder-current-folder nil)
       (let (inf file)
 	;; If we have to change groups, see if we don't already have the
 	;; folder in memory.  If we do, verify the modtime and destroy

lisp/gnus/nnmh.el

 (deffoo nnmh-request-list (&optional server dir)
   (nnheader-insert "")
   (let ((nnmh-toplev
-	 (or dir (file-truename (file-name-as-directory nnmh-directory)))))
+	 (file-truename (or dir (file-name-as-directory nnmh-directory)))))
     (nnmh-request-list-1 nnmh-toplev))
   (setq nnmh-group-alist (nnmail-get-active))
   t)

lisp/hm--html-menus/hm--html-keys.el

-;;; $Id: hm--html-keys.el,v 1.5 1997/03/28 02:28:41 steve Exp $
+;;; $Id: hm--html-keys.el,v 1.6 1997/05/09 03:28:00 steve Exp $
 ;;; 
 ;;; Copyright (C) 1995, 1996, 1997 Heiko Muenkel
 ;;; email: muenkel@tnt.uni-hannover.de
     [(meta d)] 'hm--html-add-document-division-to-region)
   )
 
-(defvar hm--html-noregion-formating-paragraph-map nil
-  "Noregion sub keymap for inserting paragraph formating elements.")
+(defvar hm--html-noregion-formatting-paragraph-map nil
+  "Noregion sub keymap for inserting paragraph formatting elements.")
+(define-obsolete-variable-alias
+  'hm--html-noregion-formating-paragraph-map
+  'hm--html-noregion-formatting-paragraph-map)
 
-(if hm--html-noregion-formating-paragraph-map
+(if hm--html-noregion-formatting-paragraph-map
     ()
-  (setq hm--html-noregion-formating-paragraph-map (make-sparse-keymap))
-;  (define-key hm--html-noregion-formating-paragraph-map
+  (setq hm--html-noregion-formatting-paragraph-map (make-sparse-keymap))
+;  (define-key hm--html-noregion-formatting-paragraph-map
 ;    "o" 'hm--html-add-plaintext)
-  (define-key hm--html-noregion-formating-paragraph-map
-    "p" 'hm--html-add-preformated)
-  (define-key hm--html-noregion-formating-paragraph-map
+  (define-key hm--html-noregion-formatting-paragraph-map
+    "p" 'hm--html-add-preformatted)
+  (define-key hm--html-noregion-formatting-paragraph-map
     "b" 'hm--html-add-blockquote)
-  (define-key hm--html-noregion-formating-paragraph-map
+  (define-key hm--html-noregion-formatting-paragraph-map
     "\C-b" 'hm--html-add-basefont)
-  (define-key hm--html-noregion-formating-paragraph-map
+  (define-key hm--html-noregion-formatting-paragraph-map
     "f" 'hm--html-add-font)
-  (define-key hm--html-noregion-formating-paragraph-map
+  (define-key hm--html-noregion-formatting-paragraph-map
     "c" 'hm--html-add-center)
-  (define-key hm--html-noregion-formating-paragraph-map
+  (define-key hm--html-noregion-formatting-paragraph-map
     "\C-c" 'hm--html-add-comment)
-;  (define-key hm--html-noregion-formating-paragraph-map
+;  (define-key hm--html-noregion-formatting-paragraph-map
 ;    "l" 'hm--html-add-listing)
-;  (define-key hm--html-noregion-formating-paragraph-map
+;  (define-key hm--html-noregion-formatting-paragraph-map
 ;    "a" 'hm--html-add-abstract)
   )
 
-(defvar hm--html-region-formating-paragraph-map nil
-  "Region sub keymap for inserting paragraph formating elements.")
+(defvar hm--html-region-formatting-paragraph-map nil
+  "Region sub keymap for inserting paragraph formatting elements.")
+(define-obsolete-variable-alias
+  'hm--html-region-formating-paragraph-map
+  'hm--html-region-formatting-paragraph-map)
 
-(if hm--html-region-formating-paragraph-map
+(if hm--html-region-formatting-paragraph-map
     ()
-  (setq hm--html-region-formating-paragraph-map (make-sparse-keymap))
-;  (define-key hm--html-region-formating-paragraph-map
+  (setq hm--html-region-formatting-paragraph-map (make-sparse-keymap))
+;  (define-key hm--html-region-formatting-paragraph-map
 ;    "o" 'hm--html-add-plaintext-to-region)
-  (define-key hm--html-region-formating-paragraph-map
-    "p" 'hm--html-add-preformated-to-region)
-  (define-key hm--html-region-formating-paragraph-map
+  (define-key hm--html-region-formatting-paragraph-map
+    "p" 'hm--html-add-preformatted-to-region)
+  (define-key hm--html-region-formatting-paragraph-map
     "b" 'hm--html-add-blockquote-to-region)
-  (define-key hm--html-region-formating-paragraph-map
+  (define-key hm--html-region-formatting-paragraph-map
     "\C-b" 'hm--html-add-basefont-to-region)
-  (define-key hm--html-region-formating-paragraph-map
+  (define-key hm--html-region-formatting-paragraph-map
     "f" 'hm--html-add-font-to-region)
-  (define-key hm--html-region-formating-paragraph-map
+  (define-key hm--html-region-formatting-paragraph-map
     "c" 'hm--html-add-center-to-region)
-  (define-key hm--html-region-formating-paragraph-map
+  (define-key hm--html-region-formatting-paragraph-map
     "\C-c" 'hm--html-add-comment-to-region)
-;  (define-key hm--html-region-formating-paragraph-map
+;  (define-key hm--html-region-formatting-paragraph-map
 ;    "l" 'hm--html-add-listing-to-region)
-;  (define-key hm--html-region-formating-paragraph-map
+;  (define-key hm--html-region-formatting-paragraph-map
 ;    "a" 'hm--html-add-abstract-to-region)
   )
 
-(defvar hm--html-noregion-formating-word-map nil
-  "Norgion sub keymap for inserting physical text formating elements.")
+(defvar hm--html-noregion-formatting-word-map nil
+  "Norgion sub keymap for inserting physical text formatting elements.")
+(define-obsolete-variable-alias
+  'hm--html-noregion-formating-word-map
+  'hm--html-noregion-formatting-word-map)
 
-(if hm--html-noregion-formating-word-map
+(if hm--html-noregion-formatting-word-map
     ()
-  (setq hm--html-noregion-formating-word-map (make-sparse-keymap))
-  (define-key hm--html-noregion-formating-word-map
+  (setq hm--html-noregion-formatting-word-map (make-sparse-keymap))
+  (define-key hm--html-noregion-formatting-word-map
     "b" 'hm--html-add-bold)
-  (define-key hm--html-noregion-formating-word-map
+  (define-key hm--html-noregion-formatting-word-map
     "i" 'hm--html-add-italic)
-  (define-key hm--html-noregion-formating-word-map
+  (define-key hm--html-noregion-formatting-word-map
     "u" 'hm--html-add-underline)
-  (define-key hm--html-noregion-formating-word-map
+  (define-key hm--html-noregion-formatting-word-map
     "t" 'hm--html-add-fixed)
-  (define-key hm--html-noregion-formating-word-map
+  (define-key hm--html-noregion-formatting-word-map
<