NN 6.3 -- Official Patch #4 (part 02/03)

Kim F. Storm storm at texas.dk
Tue Jul 11 00:36:42 AEST 1989


This is patch #4 for nn 6.3 (part 2 of 3).

#!/bin/sh
# this is part 2 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file PATCH.4 continued
#
CurArch=2
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file PATCH.4"
sed 's/^X//' << 'NN_IS_BETTER' >> PATCH.4
X+ 	    free(kl);
X+ 	}
X+ 	kl = nxt;
X+     }
X+ }
X+ 
X  dump_kill_list()
X  {
X      register kill_list_entry *kl;
X***************
X*** 646,654 ****
X  
X      if (pg_next() < 0) goto out;
X      if (pg_next() < 0) goto out;
X      so_printf("\1GROUP %s kill list entries\1", current_group->group_name);
X      
X-     kl = (kill_list_entry *)(current_group->kill_list);
X      while (kl) {
X  	if (print_kill(kl) < 0) break;
X  	kl = kl->next_kill;
X--- 718,731 ----
X  
X      if (pg_next() < 0) goto out;
X      if (pg_next() < 0) goto out;
X+ 
X+     kl = (kill_list_entry *)(current_group->kill_list);
X+     if (kl == NULL) {
X+ 	printf("No kill entries for %s", current_group->group_name);
X+ 	goto out;
X+     }
X      so_printf("\1GROUP %s kill list entries\1", current_group->group_name);
X      
X      while (kl) {
X  	if (print_kill(kl) < 0) break;
X  	kl = kl->next_kill;
X***************
X*** 669,676 ****
X      printf("\r%s ON %s '%.35s'%s\n",
X  	   kl->kill_flag & AUTO_KILL ? "KILL" : "SELECT",
X  	   kl->kill_flag & ON_SUBJECT ? "SUBJECT" : "NAME",
X! 	   kl->kill_flag & KILL_ON_REGEXP ? "*regexp*" : kl->kill_pattern,
X! 	   kl->kill_flag & KILL_MUST_MATCH ? " (exact)" : "");
X  
X      return 0;
X  }
X--- 746,754 ----
X      printf("\r%s ON %s '%.35s'%s\n",
X  	   kl->kill_flag & AUTO_KILL ? "KILL" : "SELECT",
X  	   kl->kill_flag & ON_SUBJECT ? "SUBJECT" : "NAME",
X! 	   kl->kill_pattern,
X! 	   kl->kill_flag & KILL_MUST_MATCH ? " (exact)" : 
X! 	   kl->kill_flag & KILL_ON_REGEXP ? " (re)" : "");
X  
X      return 0;
X  }
X
X*** /usr/storm/nn6.3.2/MANIFEST	Wed Jun 28 20:07:53 1989
X--- MANIFEST	Mon Jul 10 13:24:25 1989
X***************
X*** 47,61 ****
X--- 47,66 ----
X  kill.c
X  log_entry.c
X  m-att3b.h
X+ m-convex.h
X  m-dec3100.h
X  m-gould.h
X  m-hp9000.h
X+ m-i80286.h
X  m-m680x0.h
X+ m-sgi4D.h
X  m-sparc.h
X  m-sun.h
X  m-sun386i.h
X+ m-symmetry.h
X  m-template.h
X  m-vax.h
X+ m-xenix386.h
X  macro.c
X  master.c
X  match.c
X***************
X*** 95,111 ****
X--- 100,122 ----
X  regexp.h
X  reroute.c
X  routes.sample
X+ s-aux1-1.h
X  s-bsd4-2.h
X  s-bsd4-3.h
X  s-dnix5-2.h
X+ s-dynix3-0.h
X+ s-fortune.h
X  s-hpux.h
X  s-hpux2-1.h
X  s-hpux3-0.h
X+ s-sgi4D.h
X  s-sunos3.h
X  s-sunos4-0.h
X  s-template.h
X  s-tower32.h
X+ s-uport2-2.h
X  s-usg3-1.h
X+ s-xenix386.h
X  save.c
X  selection.c
X  sequence.c
X
X*** /usr/storm/nn6.3.0/macro.c	Thu Jun  1 11:10:46 1989
X--- macro.c	Wed Jul  5 16:52:14 1989
X***************
X*** 76,82 ****
X      struct macro *m1;
X      
X      m1 = (struct macro *)calloc(1, sizeof(struct macro));
X!     mem_check(m1, sizeof(struct macro), "for macro");
X  
X      if (m == NULL)
X  	m = macro[cur_m] = m1;
X--- 76,82 ----
X      struct macro *m1;
X      
X      m1 = (struct macro *)calloc(1, sizeof(struct macro));
X!     mem_check((char *)m1, sizeof(struct macro), "for macro");
X  
X      if (m == NULL)
X  	m = macro[cur_m] = m1;
X***************
X*** 123,129 ****
X      if (f == NULL) {
X  	clrdisp();
X  	printf("DEFINE MACRO %d -- END WITH 'end'\n\n\r", cur_m);
X! 	no_raw();
X  	f = stdin;
X      }
X      
X--- 123,129 ----
X      if (f == NULL) {
X  	clrdisp();
X  	printf("DEFINE MACRO %d -- END WITH 'end'\n\n\r", cur_m);
X! 	unset_raw();
X  	f = stdin;
X      }
X      
X
X*** /usr/storm/nn6.3.0/nnmaster.1m	Thu Jun  1 11:10:58 1989
X--- nnmaster.1m	Fri Jul  7 16:18:03 1989
X***************
X*** 16,21 ****
X--- 16,23 ----
X  .B nnmaster
X  [ \-\fBr [ \fP\fIN\fP ] ]
X  [ \-\fBe\fP\fIN\fP ] 
X+ [ \-\fBy\fP\fIN\fP ] 
X+ [ \-\fBf\fP ]
X  [ \-\fBC\fP ]
X  [ \-\fBE\fP ]
X  [ \-\fBu\fP ]
X***************
X*** 60,66 ****
X  .TP
X  \-\fBr\fP [ \fImin\fP ]
X  .br
X! Daemon mode.  The \fInnmaster\fP will put itself in the background,
X  and will checks for arrival of new articles and expired articles every
X  .I min
X  minutes (and update the database accordingly).  If 
X--- 62,69 ----
X  .TP
X  \-\fBr\fP [ \fImin\fP ]
X  .br
X! Daemon mode.  The \fInnmaster\fP will put itself in the background
X! (unless \-\fBf\fP is also specified),
X  and will checks for arrival of new articles and expired articles every
X  .I min
X  minutes (and update the database accordingly).  If 
X***************
X*** 80,85 ****
X--- 83,92 ----
X  I cannot recommend this unless you receive batched news; invoking
X  \fInnmaster\fP for every received article sounds too expensive to me.)
X  .TP
X+ .B \-f
X+ Run \fInnmaster\fP in foreground in daemon mode (see \-\fBr\fP).
X+ Useful if \fInnmaster\fP is invoked from inittab.
X+ .TP
X  \-\fBe\fP \fIart\fP
X  .br
X  Run internal
X***************
X*** 102,107 ****
X--- 109,122 ----
X  expired articles on tape.)  You can then use the Expire command in
X  \fInnadmin\fP(1M) to instruct the \fInnmaster\fP to expire individual
X  or all groups.
X+ .TP
X+ \-\fBy\fP \fIretries\fP
X+ .br
X+ In some networked environment, opening an article (shared from another
X+ machine via NFS) may fail for no obvious reason.  Using this option,
X+ it is possible to cause 
X+ \fInnmaster\fP to perform \fIretries\fP attempts to open an article
X+ before marking the article as non-existing in the database.
X  .TP
X  .B \-C
X  Perform a consistency check on the database on start-up, and rebuild
X
X*** /usr/storm/nn6.3.3/master.c	Fri Jun 30 11:30:51 1989
X--- master.c	Mon Jul 10 12:30:48 1989
X***************
X*** 14,19 ****
X--- 14,22 ----
X   *
X   *	-e N	expire a group if more than N articles are gone
X   *	-r N	repeat every N minutes
X+ 
X+  *	-f	foreground execution (use with -r)
X+  *	-y N	retry N times on error
X   *
X   *	-E	expire by recolleting entire groups rather than copying files
X   *	-C	check consistency of database on start-up
X***************
X*** 37,44 ****
X--- 40,51 ----
X      clean_to_expire = 0,
X      check_on_startup = 0,
X      repeat_delay = 0,
X+     foreground = 0,
X      debug_mode = 0;
X  
X+ import int
X+     retry_on_error;
X+ 
X  export int
X      trace = 0,
X  #ifdef NNTP
X***************
X*** 57,62 ****
X--- 64,72 ----
X      'e', Int_Option( expire_level ),
X      'r', Int_Option_Optional( repeat_delay, 10 ),
X  
X+     'f', Bool_Option( foreground ),
X+     'y', Int_Option( retry_on_error ),
X+ 
X      'E', Bool_Option( clean_to_expire ),
X      'C', Bool_Option( check_on_startup ),
X  
X***************
X*** 72,77 ****
X--- 82,90 ----
X  
X  static int rm_mpid_on_exit = 0;
X  
X+ extern long collect_group();
X+ extern long expire_group();
X+ 
X  main(argc, argv)
X  int argc;
X  char **argv;
X***************
X*** 81,87 ****
X      register int		cur_group;
X      int				col_article_count, col_group_count;
X      int				exp_article_count, exp_group_count;
X!     int				temp;
X      time_t			start_time;
X      FILE			*m_pid;
X  	
X--- 94,100 ----
X      register int		cur_group;
X      int				col_article_count, col_group_count;
X      int				exp_article_count, exp_group_count;
X!     long			temp;
X      time_t			start_time;
X      FILE			*m_pid;
X  	
X***************
X*** 119,127 ****
X  	close(0);
X  	close(1);
X  	close(2);
X      }
X      
X!     if (repeat_delay && !debug_mode) {
X  	while ((temp = fork()) < 0) sleep(1);
X  	if (temp) nn_exit(0);
X  
X--- 132,141 ----
X  	close(0);
X  	close(1);
X  	close(2);
X+ 	if (open("/dev/null", 2) == 0) dup(0), dup(0);
X      }
X      
X!     if (repeat_delay && !debug_mode && !foreground) {
X  	while ((temp = fork()) < 0) sleep(1);
X  	if (temp) nn_exit(0);
X  
X***************
X*** 216,226 ****
X  
X  	gh = &active_groups[cur_group];
X  
X- 	if (gh->group_flag & G_NO_DIRECTORY) {
X- 	    if (gh->group_flag & G_BLOCKED) goto unblock_group;
X- 	    continue;
X- 	}
X- 	
X  	if (gh->last_l_article  > gh->last_article || 
X  	    gh->first_l_article > gh->first_article) {
X  	    log_entry('X', "group %s renumbered", gh->group_name);
X--- 230,235 ----
X***************
X*** 250,262 ****
X  	
X       do_collect:
X  	if (!init_group(gh)) {
X! 	    log_entry('R', "%s: no directory", gh->group_name);
X! 	    gh->group_flag |= G_NO_DIRECTORY;
X  	    gh->group_flag &= ~(G_EXPIRE | G_BLOCKED);	    
X  	    save_group(current_group);
X  	    continue;
X  	}
X  	
X  	if (gh->group_flag & G_EXPIRE) {
X  	    if (clean_to_expire) {
X  		temp = gh->first_article - gh->first_l_article;
X--- 259,281 ----
X  	
X       do_collect:
X  	if (!init_group(gh)) {
X! 	    if ((gh->group_flag & G_NO_DIRECTORY) == 0) {
X! 		log_entry('R', "%s: no directory", gh->group_name);
X! 		gh->group_flag |= G_NO_DIRECTORY;
X! 	    }
X! 	    gh->last_l_article = gh->last_article;
X! 	    gh->first_l_article = gh->last_article;	/* OBS: not first */
X  	    gh->group_flag &= ~(G_EXPIRE | G_BLOCKED);	    
X  	    save_group(current_group);
X  	    continue;
X  	}
X  	
X+ 	if (gh->group_flag & G_NO_DIRECTORY) {
X+ 	    /* The directory has been created now */
X+ 	    gh->group_flag &= ~G_NO_DIRECTORY;
X+ 	    clean_group(gh);
X+ 	}
X+ 	
X  	if (gh->group_flag & G_EXPIRE) {
X  	    if (clean_to_expire) {
X  		temp = gh->first_article - gh->first_l_article;
X***************
X*** 412,418 ****
X  save_group(gh)
X  group_header *gh;
X  {
X!     int flag;
X      
X      flag = gh->group_flag;
X      gh->group_flag &= G_MASTER_FLAGS;
X--- 431,437 ----
X  save_group(gh)
X  group_header *gh;
X  {
X!     int32 flag;
X      
X      flag = gh->group_flag;
X      gh->group_flag &= G_MASTER_FLAGS;
X***************
X*** 534,540 ****
X      
X      open_master(OPEN_CREATE);
X  
X!     fseek(master_file, sizeof(master), 0);
X      
X      master.number_of_groups = 0;
X      
X--- 553,559 ----
X      
X      open_master(OPEN_CREATE);
X  
X!     fseek(master_file, (off_t)sizeof(master), 0);
X      
X      master.number_of_groups = 0;
X      
X***************
X*** 546,557 ****
X  	groupname[group.group_name_length] = NUL;
X  	group.group_name = groupname;
X  
X  	init_group(&group);
X  
X  	clean_group(&group);
X  	
X- 	group.group_flag = 0;
X- 
X  	/* moderation flag will be set by first visit_active_file call */
X  
X  	if (strcmp(groupname, "control") == 0)
X--- 565,576 ----
X  	groupname[group.group_name_length] = NUL;
X  	group.group_name = groupname;
X  
X+ 	group.group_flag = 0;
X+ 
X  	init_group(&group);
X  
X  	clean_group(&group);
X  	
X  	/* moderation flag will be set by first visit_active_file call */
X  
X  	if (strcmp(groupname, "control") == 0)
X***************
X*** 649,655 ****
X  	    visit_active_file();	/* just in case */
X  	    Loop_Groups_Header(gh) {
X  		if (gh->first_l_article + arg2 < gh->first_article) {
X! 		    gh->group_flag |= G_EXPIRE;
X  		    save_group(gh);	/* could block here */
X  		}
X  	    }
X--- 668,674 ----
X  	    visit_active_file();	/* just in case */
X  	    Loop_Groups_Header(gh) {
X  		if (gh->first_l_article + arg2 < gh->first_article) {
X! 		    gh->group_flag |= G_EXPIRE | G_BLOCKED;
X  		    save_group(gh);	/* could block here */
X  		}
X  	    }
X***************
X*** 661,667 ****
X  	    continue;
X  
X  	 case 'C':	/* clear flag */
X! 	    gh->group_flag |= arg2;
X  	    save_group(gh);
X  	    continue;
X  
X--- 680,686 ----
X  	    continue;
X  
X  	 case 'C':	/* clear flag */
X! 	    gh->group_flag &= ~arg2;
X  	    save_group(gh);
X  	    continue;
X  
X
X*** /usr/storm/nn6.3.3/menu.c	Fri Jun 30 11:30:53 1989
X--- menu.c	Sat Jul  8 19:28:08 1989
X***************
X*** 7,12 ****
X--- 7,13 ----
X  #include "term.h"
X  #include "keymap.h"
X  #include "menu.h"
X+ #include "regexp.h"
X  
X  
X  export int  preview_window = 0;	/* size of preview window */
X***************
X*** 17,22 ****
X--- 18,24 ----
X  export int  delay_redraw   = 0; /* prompt again if :-command clears screen */
X  
X  export char *delayed_msg = NULL;	/* give to msg() after redraw */
X+ export long dl_msg_arg = 0;		/* optional arg to delayed_msg */
X  
X  import also_read_articles;
X  import merged_menu;
X***************
X*** 23,31 ****
X  
X  extern group_completion();
X  
X  static int firstl;	/* first menu line */
X  
X! static int firsta;	/* first article on menu (0 based) */
X  static int cura;	/* current article */
X  static int next_cura;	/* article to become cura if >= 0 */
X  static int numa;	/* no of articles on menu - 1 */
X--- 25,35 ----
X  
X  extern group_completion();
X  
X+ static regexp *regular_expr = NULL;
X+ 
X  static int firstl;	/* first menu line */
X  
X! static article_number firsta;	/* first article on menu (0 based) */
X  static int cura;	/* current article */
X  static int next_cura;	/* article to become cura if >= 0 */
X  static int numa;	/* no of articles on menu - 1 */
X***************
X*** 45,50 ****
X--- 49,55 ----
X  #define	SAVED	4
X  #define	REMOVE	5
X  #define CANCEL	6
X+ #define	ON_LEAVE 7
X  
X  static int how;
X  
X***************
X*** 74,84 ****
X  	    how = OFF;
X  	    goto toggle;
X  	}
X  	ah->flag |= A_SELECT;
X  	break;
X  	
X       case OFF:
X! 	ah->flag &= ~A_SELECT;
X  	break;
X  
X       case INIT:
X--- 79,90 ----
X  	    how = OFF;
X  	    goto toggle;
X  	}
X+ 	ah->flag &= ~(A_LEAVE | A_READ);
X  	ah->flag |= A_SELECT;
X  	break;
X  	
X       case OFF:
X! 	ah->flag &= ~(A_SELECT | A_AUTO);
X  	break;
X  
X       case INIT:
X***************
X*** 99,111 ****
X  	return;
X  
X       case CANCEL:
X! 	gotoxy(1, lno);
X! 	if (ah->flag & A_SELECT) {
X! 	    ah->flag &= ~A_SELECT;
X  	    break;
X  	}
X  	putchar((ah->flag & A_CANCEL) ? '#' : ' ');
X  	return;
X      }
X  
X      if (cura < 0 || cura > numa) return;
X--- 105,126 ----
X  	return;
X  
X       case CANCEL:
X! 	if (must_print && (ah->flag & A_SELECT)) {
X! 	    ah->flag &= ~(A_SELECT | A_AUTO);
X  	    break;
X  	}
X+ 	ah->flag &= ~(A_SELECT | A_AUTO | A_LEAVE | A_LEAVE_NEXT | A_READ);
X+ 	gotoxy(1, lno);
X  	putchar((ah->flag & A_CANCEL) ? '#' : ' ');
X  	return;
X+ 
X+      case ON_LEAVE:
X+ 	if (cura < 0 || cura > numa) return;
X+ 	gotoxy(1, lno);
X+ 	putchar((ah->flag & A_LEAVE) ? '+' :
X+ 		(ah->flag & A_LEAVE_NEXT) ? '=' : ' ');
X+ 	return;
X+ 	
X      }
X  
X      if (cura < 0 || cura > numa) return;
X***************
X*** 124,132 ****
X  
X  	if (fmt_linenum > 4) fmt_linenum = 1;
X  	
X! 	if (ah->flag & A_CANCEL) {
X  	    gotoxy(1, lno);
X! 	    putchar('#');
X  	} else
X  	if (how == ON) {
X  	    if (so_gotoxy(1, lno, 1) == 0) putchar('*');
X--- 139,152 ----
X  
X  	if (fmt_linenum > 4) fmt_linenum = 1;
X  	
X! 	if (ah->flag & (A_CANCEL | A_LEAVE | A_LEAVE_NEXT | A_READ)) {
X  	    gotoxy(1, lno);
X! 	    putchar(
X! 		    (ah->flag & A_READ) ? '.' :
X! 		    (ah->flag & A_LEAVE) ? '+' :
X! 		    (ah->flag & A_CANCEL) ? '#' :
X! 		    '='
X! 		    );
X  	} else
X  	if (how == ON) {
X  	    if (so_gotoxy(1, lno, 1) == 0) putchar('*');
X***************
X*** 187,196 ****
X  	    so_printf(ah->lines >= 0 ? " +%d" : " +?", ah->lines);
X  
X  	so_end();
X!     } else
X  	putchar((how == OFF) ? ' ' : '*');
X!     
X!     fl;
X      
X      return;
X  }
X--- 207,216 ----
X  	    so_printf(ah->lines >= 0 ? " +%d" : " +?", ah->lines);
X  
X  	so_end();
X!     } else {
X! 	gotoxy(1, lno);
X  	putchar((how == OFF) ? ' ' : '*');
X!     }    
X      
X      return;
X  }
X***************
X*** 273,284 ****
X  {
X      register 		k_cmd, cur_k_cmd;
X      register		article_header *ah;
X!     int			last_k_cmd, last_how, was_selected;
X      int 		seen_all, menu_cmd, temp;
X!     int 		save_selected, last_save;
X      int			doing_unshar, did_unshar;
X      char 		*fname, *savemode, *init_save();
X!     int 		nexta;	/* first article on next menu */
X      int 		maxa;	/* max no of articles per menu page */
X      int 		o_firsta, o_mode;	/* for recursive calls */
X      static		menu_level = 0;
X--- 293,305 ----
X  {
X      register 		k_cmd, cur_k_cmd;
X      register		article_header *ah;
X!     int			last_k_cmd, last_how;
X      int 		seen_all, menu_cmd, temp;
X!     int 		save_selected;
X!     article_number	last_save;
X      int			doing_unshar, did_unshar;
X      char 		*fname, *savemode, *init_save();
X!     article_number	nexta;	/* first article on next menu */
X      int 		maxa;	/* max no of articles per menu page */
X      int 		o_firsta, o_mode;	/* for recursive calls */
X      static		menu_level = 0;
X***************
X*** 285,290 ****
X--- 306,312 ----
X      char		purpose[80], pr_fmt[60];
X      extern int 		enable_stop, file_completion();
X      extern int		alt_cmd_key, in_menu_mode, slow_mode, any_message;
X+     article_number	elim_list[3];
X      
X  #define	menu_return(cmd) \
X      { menu_cmd = (cmd); goto menu_exit; }
X***************
X*** 373,379 ****
X  	    REDRAW_CHECK;
X      
X  	    how = INIT;
X! 	    mark(); fl;
X  	    
X  	    if (s_keyboard) {	  /* Signal may have corrupted output.  */
X  		if (cura == 0)
X--- 395,401 ----
X  	    REDRAW_CHECK;
X      
X  	    how = INIT;
X! 	    mark(); /* fl; */
X  	    
X  	    if (s_keyboard) {	  /* Signal may have corrupted output.  */
X  		if (cura == 0)
X***************
X*** 389,395 ****
X  	    
X  	    nexta++; cura++;
X  	}
X!     
X      s_keyboard = 0;
X  
X      prompt_line = firstl + cura;
X--- 411,418 ----
X  	    
X  	    nexta++; cura++;
X  	}
X! 
X!     fl;
X      s_keyboard = 0;
X  
X      prompt_line = firstl + cura;
X***************
X*** 419,425 ****
X  	    pct(0L, (long)(n_articles-1), (long)firsta, (long)(firsta+numa)));
X  
X       if (delayed_msg != NULL) {
X! 	 msg(delayed_msg);
X  	 delayed_msg = NULL;
X       }
X  
X--- 442,448 ----
X  	    pct(0L, (long)(n_articles-1), (long)firsta, (long)(firsta+numa)));
X  
X       if (delayed_msg != NULL) {
X! 	 msg(delayed_msg, dl_msg_arg);
X  	 delayed_msg = NULL;
X       }
X  
X***************
X*** 584,590 ****
X  		 if (save(ah)) {
X  		     if (doing_unshar) {
X  			 if (save_selected)
X! 			     ah->flag &= ~A_SELECT;
X  		     } else
X  		     if (cura >= 0 && cura <= numa) {
X  			 how = save_selected ? OFF : SAVED;
X--- 607,613 ----
X  		 if (save(ah)) {
X  		     if (doing_unshar) {
X  			 if (save_selected)
X! 			     ah->flag &= ~(A_SELECT | A_AUTO);
X  		     } else
X  		     if (cura >= 0 && cura <= numa) {
X  			 how = save_selected ? OFF : SAVED;
X***************
X*** 592,598 ****
X  			 how = TOGGLE;
X  		     } else
X  		     if (save_selected)
X! 			 ah->flag &= ~A_SELECT;
X  		 }
X  	     }
X  	 }
X--- 615,621 ----
X  			 how = TOGGLE;
X  		     } else
X  		     if (save_selected)
X! 			 ah->flag &= ~(A_SELECT | A_AUTO);
X  		 }
X  	     }
X  	 }
X***************
X*** 680,686 ****
X  	 goto redraw;
X  
X        case K_KILL_HANDLING:
X! 	 kill_menu((article_header *)NULL);
X  	 goto Prompt;
X  
X        case K_CONTINUE:	/* goto next menu page or show the articles */
X--- 703,728 ----
X  	 goto redraw;
X  
X        case K_KILL_HANDLING:
X! 	 switch (kill_menu((article_header *)NULL)) {
X! 	  case 0:		/* select */
X! 	     do_auto_select((regexp *)NULL, 2);
X! 	     break;
X! 	  case 1:		/* kill */
X! 	     if (!do_auto_kill()) break;
X! 	     elim_list[0] = firsta;
X! 	     elim_list[1] = firsta + cura;
X! 	     elim_list[2] = nexta;
X! 	     if (elim_articles(elim_list, 3)) {
X! 		 firsta = elim_list[0];
X! 		 goto redraw;
X! 	     }
X! 	     firsta = elim_list[0];
X! 	     cura   = elim_list[1] - firsta;
X! 	     nexta  = elim_list[2];
X! 	     break;
X! 	  default:
X! 	     break;
X! 	 }
X  	 goto Prompt;
X  
X        case K_CONTINUE:	/* goto next menu page or show the articles */
X***************
X*** 797,803 ****
X  
X        case K_UNSELECT_ALL:
X  	 for (cura = -firsta; cura < n_articles - firsta; cura++) {
X! 	     how = OFF;
X  	     mark();
X  	 }
X  	 fl;
X--- 839,851 ----
X  
X        case K_UNSELECT_ALL:
X  	 for (cura = -firsta; cura < n_articles - firsta; cura++) {
X! 	     if (last_k_cmd == K_UNSELECT_ALL) {
X! 		 if ((articles[firsta + cura]->flag & (A_LEAVE | A_LEAVE_NEXT)) == 0)
X! 		     continue;
X! 		 articles[firsta + cura]->flag &= ~(A_LEAVE | A_LEAVE_NEXT);
X! 		 how = ON_LEAVE;
X! 	     } else
X! 		 how = OFF;
X  	     mark();
X  	 }
X  	 fl;
X***************
X*** 872,880 ****
X  	 goto Prompt;
X  
X        case K_AUTO_SELECT:
X! 	 do_auto_select();
X  	 goto same_prompt;
X  
X        case K_NEXT_PAGE:
X  	 if (nexta < n_articles) goto nextmenu;
X  	 if (firsta == 0) goto same_prompt;
X--- 920,945 ----
X  	 goto Prompt;
X  
X        case K_AUTO_SELECT:
X! 	 do_auto_select((regexp *)NULL, 1);
X  	 goto same_prompt;
X  
X+      case K_GOTO_MATCH:
X+ 	 prompt("\1Select regexp\1 ");
X+ 	 if ((fname = get_s(NONE, NONE, NONE, NO_COMPLETION)) == NULL) 
X+ 	     goto Prompt;
X+ 
X+ 	 if (*fname != NUL) {
X+ 	     if (regular_expr) free((char *)regular_expr);
X+ 	     regular_expr = regcomp(fname);
X+ 	 }
X+ 
X+ 	 if (regular_expr == NULL)
X+ 	    msg("No previous expression");
X+ 	 else
X+ 	    do_auto_select(regular_expr, 2);
X+ 
X+ 	 goto Prompt;
X+ 	
X        case K_NEXT_PAGE:
X  	 if (nexta < n_articles) goto nextmenu;
X  	 if (firsta == 0) goto same_prompt;
X***************
X*** 922,931 ****
X        preview_next:
X  	 ah = articles[firsta+article_id];
X  	 cura = article_id + 1;
X! 	 was_selected = (ah->flag & A_SELECT);
X! 
X  	 switch (more(ah, MM_PREVIEW, prompt_line)) {
X  	     
X  	  case MC_REDRAW:
X  	     next_cura = cura;
X  	     goto redraw;
X--- 987,1014 ----
X        preview_next:
X  	 ah = articles[firsta+article_id];
X  	 cura = article_id + 1;
X! 	 
X! 	 no_raw();
X  	 switch (more(ah, MM_PREVIEW, prompt_line)) {
X  	     
X+ 	  case MC_DO_KILL:
X+ 	     if (!do_auto_kill()) break;
X+ 	     elim_list[0] = firsta;
X+ 	     elim_list[1] = firsta + cura;
X+ 	     elim_articles(elim_list, 2);
X+ 	     firsta = elim_list[0];
X+ 	     next_cura = elim_list[1] - firsta;
X+ 	     goto redraw;
X+ 	     
X+ 	  case MC_DO_SELECT:
X+ 	     if (prompt_line >= 0) { /* not redrawn */
X+ 		 do_auto_select((regexp *)NULL, 2);
X+ 		 break;
X+ 	     }
X+ 	     numa = -1;
X+ 	     do_auto_select((regexp *)NULL, 2);
X+ 	     /* FALL THRU */
X+ 
X  	  case MC_REDRAW:
X  	     next_cura = cura;
X  	     goto redraw;
X***************
X*** 947,956 ****
X  		 if ((firsta + cura) >= n_articles) goto redraw;
X  		 prompt_line = Lines;
X  	     } else {
X! 		 if ((ah->flag & A_SELECT) && was_selected == 0) {
X  		     cura--;
X! 		     ah->flag &= ~A_SELECT;
X! 		     how = ON;
X  		     mark();
X  		     cura++;
X  		 }
X--- 1030,1038 ----
X  		 if ((firsta + cura) >= n_articles) goto redraw;
X  		 prompt_line = Lines;
X  	     } else {
X! 		 if (ah->flag & (A_LEAVE | A_LEAVE_NEXT)) {
X  		     cura--;
X! 		     how = ON_LEAVE;
X  		     mark();
X  		     cura++;
X  		 }
X***************
X*** 995,1001 ****
X  
X  static show_articles()
X  {
X!     register cur, next, mode;
X      int cmd, prev = -1, again;
X      
X      do {
X--- 1077,1086 ----
X  
X  static show_articles()
X  {
X!     register article_number cur, next;
X!     register article_header *ah;
X!     article_number elim_list[1];
X!     register int mode;
X      int cmd, prev = -1, again;
X      
X      do {
X***************
X*** 1011,1017 ****
X  		if (articles[next]->flag & A_SELECT) break;
X  	    }
X  	    
X! 	    articles[cur]->flag &= ~A_SELECT;
X  	    
X  	 show:
X  	    mode = 0;
X--- 1096,1102 ----
X  		if (articles[next]->flag & A_SELECT) break;
X  	    }
X  	    
X! 	    articles[cur]->flag &= ~(A_SELECT | A_AUTO);
X  	    
X  	 show:
X  	    mode = 0;
X***************
X*** 1020,1029 ****
X  	    if ((cur + 1) >= n_articles) mode |= MM_LAST_ARTICLE;
X  	    if (cur == 0) mode |= MM_FIRST_ARTICLE;
X  	    
X! 	    cmd = more(articles[cur], mode, 0);
X  	    
X  	    switch(cmd) {
X  		
X  	     case MC_PREV:
X  		if (prev == next) break;
X  		
X--- 1105,1132 ----
X  	    if ((cur + 1) >= n_articles) mode |= MM_LAST_ARTICLE;
X  	    if (cur == 0) mode |= MM_FIRST_ARTICLE;
X  	    
X! 	    cmd = more(ah = articles[cur], mode, 0);
X  	    
X  	    switch(cmd) {
X+ 	     
X+ 	     case MC_DO_KILL:
X+ 		if (do_auto_kill()) {
X+ 		    elim_list[0] = next;
X+ 		    elim_articles(elim_list, 1);
X+ 		    cur = elim_list[0];
X+ 		    if (cur <= 0) cur = n_articles;
X+ 		    continue;
X+ 		}
X+ 		break;
X  		
X+ 	     case MC_DO_SELECT:
X+ 		for (next = cur+1, cur = -1; next < n_articles; next++) {
X+ 		    if (auto_select_article(ah = articles[next], 2)) 
X+ 			ah->flag |= A_SELECT;
X+ 		    if (cur < 0 && ah->flag & A_SELECT) cur = next;
X+ 		}
X+ 		continue;
X+ 		
X  	     case MC_PREV:
X  		if (prev == next) break;
X  		
X***************
X*** 1031,1039 ****
X  		goto show;
X  		
X  	     case MC_NEXTSUBJ:
X  		for (next = cur+1; next < n_articles; next++) {
X! 		    if ((articles[next]->flag & A_SAME) == 0) break;
X! 		    articles[next]->flag &= ~A_SELECT;
X  		}
X  		for (; next < n_articles; next++) {
X  		    if (articles[next]->flag & A_SELECT) break;
X--- 1134,1143 ----
X  		goto show;
X  		
X  	     case MC_NEXTSUBJ:
X+ 		ah->flag |= A_READ;
X  		for (next = cur+1; next < n_articles; next++) {
X! 		    if (((ah = articles[next])->flag & A_SAME) == 0) break;
X! 		    ah->flag &= ~(A_SELECT | A_AUTO | A_LEAVE | A_LEAVE_NEXT);
X  		}
X  		for (; next < n_articles; next++) {
X  		    if (articles[next]->flag & A_SELECT) break;
X***************
X*** 1042,1049 ****
X  		
X  	     case MC_ALLSUBJ:
X  		for (next = cur+1; next < n_articles; next++) {
X! 		    if ((articles[next]->flag & A_SAME) == 0) break;
X! 		    articles[next]->flag |= A_SELECT;
X  		}
X  		for (next = cur+1; next < n_articles; next++)
X  		    if (articles[next]->flag & A_SELECT) break;
X--- 1146,1155 ----
X  		
X  	     case MC_ALLSUBJ:
X  		for (next = cur+1; next < n_articles; next++) {
X! 		    ah = articles[next];
X! 		    if ((ah->flag & A_SAME) == 0) break;
X! 		    ah->flag &= ~(A_AUTO | A_LEAVE | A_LEAVE_NEXT | A_READ);
X! 		    ah->flag |= A_SELECT;
X  		}
X  		for (next = cur+1; next < n_articles; next++)
X  		    if (articles[next]->flag & A_SELECT) break;
X***************
X*** 1050,1056 ****
X  		break;
X  		
X  	     case MC_MENU:
X! 		articles[cur]->flag |= A_SELECT;
X  		firsta = cur - 5;
X  		if (firsta < 0) firsta = 0;
X  		next_cura = cur - firsta;
X--- 1156,1162 ----
X  		break;
X  		
X  	     case MC_MENU:
X! 		ah->flag |= A_SELECT;
X  		firsta = cur - 5;
X  		if (firsta < 0) firsta = 0;
X  		next_cura = cur - firsta;
X***************
X*** 1058,1067 ****
X  		return SH_MENU;
X  		
X  	     case MC_QUIT:
X  		return SH_QUIT;
X  		
X  	     case MC_NEXT:
X! 		if (articles[cur]->flag & A_SELECT) again++;
X  		break;
X  
X  	     case MC_BACK_ART:
X--- 1164,1175 ----
X  		return SH_MENU;
X  		
X  	     case MC_QUIT:
X+ 		ah->flag |= A_SELECT;
X  		return SH_QUIT;
X  		
X  	     case MC_NEXT:
X! 		if ((ah->flag & (A_LEAVE | A_LEAVE_NEXT)) == 0)
X! 		    ah->flag |= A_READ;
X  		break;
X  
X  	     case MC_BACK_ART:
X***************
X*** 1076,1081 ****
X--- 1184,1190 ----
X  		break;
X  		
X  	     case MC_NEXTGROUP:
X+ 		ah->flag |= A_SELECT;
X  		return SH_NEXT;
X  		
X  	     case MC_READGROUP:
X***************
X*** 1085,1093 ****
X  	    prev = cur; cur = next;
X  	}
X  
X! 	if (again > 1)
X! 	    delayed_msg = "Showing this and the following articles again";
X! 	else
X  	    if (again == 1)
X  		delayed_msg = "Showing article again";
X  	
X--- 1194,1215 ----
X  	    prev = cur; cur = next;
X  	}
X  
X! 	for (cur = 0; cur < n_articles; cur++) 
X! 	    if (articles[cur]->flag & A_SELECT) continue;
X! 
X! 	for (cur = 0; cur < n_articles; cur++) {
X! 	    ah = articles[cur];
X! 	    if (ah->flag & A_LEAVE) {
X! 		ah->flag &= ~A_LEAVE;
X! 		ah->flag |= A_SELECT;
X! 		again++;
X! 	    }
X! 	}
X! 
X! 	if (again > 1) {
X! 	    delayed_msg = "Showing %ld articles again";
X! 	    dl_msg_arg = again;
X! 	} else
X  	    if (again == 1)
X  		delayed_msg = "Showing article again";
X  	
X***************
X*** 1155,1163 ****
X   *	if article is in range firsta..firsta+numa (incl) mark article
X   */
X  
X! static do_auto_select()
X  {
X!     register int i;
X      register article_header *ah, **ahp;
X      int count = 0, o_cura;
X      
X--- 1277,1287 ----
X   *	if article is in range firsta..firsta+numa (incl) mark article
X   */
X  
X! static do_auto_select(re, mode)
X! regexp *re;
X! int mode;
X  {
X!     register article_number i;
X      register article_header *ah, **ahp;
X      int count = 0, o_cura;
X      
X***************
X*** 1165,1185 ****
X      
X      for (i = 0, ahp = articles; i < n_articles; i++, ahp++) {
X  	ah = *ahp;
X! 	if (auto_select_article(ah)) {
X! 	    count++;
X! 	    if (ah->flag & A_SELECT) continue;
X! 	    if (firsta <= i && i <= (firsta+numa)) {
X! 		cura = i - firsta;
X! 		how = ON;
X! 		mark();
X! 	    } else
X! 		ah->flag |= A_SELECT;
X! 	}
X      }
X      
X      msg(count == 0 ? "No selections" : "Selected %d article%s",
X  	   count, count > 1 ? "s" : "");
X      cura = o_cura;
X  }
X  
X  	    
X--- 1289,1329 ----
X      
X      for (i = 0, ahp = articles; i < n_articles; i++, ahp++) {
X  	ah = *ahp;
X! 	if (re != NULL) {
X! 	    if (!regexec(re, ah->subject)) continue;
X! 	} else
X! 	    if (!auto_select_article(ah, mode)) continue;
X! 	
X! 	count++;
X! 	if (ah->flag & A_SELECT) continue;
X! 	if (firsta <= i && i <= (firsta+numa)) {
X! 	    cura = i - firsta;
X! 	    how = ON;
X! 	    mark();
X! 	} else
X! 	    ah->flag |= A_SELECT;
X      }
X      
X      msg(count == 0 ? "No selections" : "Selected %d article%s",
X  	   count, count > 1 ? "s" : "");
X      cura = o_cura;
X+ }
X+ 
X+ static do_auto_kill()
X+ {
X+     register article_number i;
X+     register article_header *ah, **ahp;
X+     int any = 0;
X+     
X+     for (i = 0, ahp = articles; i < n_articles; i++, ahp++) {
X+ 	ah = *ahp;
X+ 	if (auto_select_article(ah, 0)) {
X+ 	    ah->flag |= A_KILL;
X+ 	    ah->flag &= ~(A_SELECT | A_AUTO);
X+ 	    any = 1;
X+ 	}
X+     }
X+     return any;
X  }
X  
X  	    
X
X*** /usr/storm/nn6.3.3/menu.h	Fri Jun 30 11:30:55 1989
X--- menu.h	Thu Jul  6 00:06:59 1989
X***************
X*** 33,38 ****
X--- 33,40 ----
X  #define MC_NO_REDRAW	11	/* screen is not corrupted */
X  #define	MC_BACK_ART	12	/* back one article (don't deselect cur) */
X  #define MC_FORW_ART	13	/* forward one article (deselect cur) */
X+ #define MC_DO_KILL	14	/* did kill-select kill */
X+ #define MC_DO_SELECT	15	/* did kill-select selection */
X  
X  /* more modes */
X  
X
X*** /usr/storm/nn6.3.3/more.c	Fri Jun 30 11:30:56 1989
X--- more.c	Sat Jul  8 19:24:54 1989
X***************
X*** 16,21 ****
X--- 16,22 ----
X  import int  novice;
X  
X  import char *delayed_msg;
X+ import long dl_msg_arg;
X  
X  extern char *init_save();
X  
X***************
X*** 47,52 ****
X--- 48,54 ----
X      'S', "Subject",	&news.ng_subj,		&digest.dg_subj,
X      'W', "Followup-To",	&news.ng_follow,	0,
X      'X', "References",	&news.ng_ref,		0,
X+     'Y', "Summary",	&news.ng_summ,		0,
X      0
X  };
X  
X***************
X*** 54,60 ****
X  int32 flag;
X  {
X      static char buf[40];
X!     register char *cp, *sp;
X      static int32 prevflag = 0;
X      
X      flag &= A_ST_FILED | A_ST_REPLY | A_ST_FOLLOW;
X--- 56,62 ----
X  int32 flag;
X  {
X      static char buf[40];
X!     register char *cp;
X      static int32 prevflag = 0;
X      
X      flag &= A_ST_FILED | A_ST_REPLY | A_ST_FOLLOW;
X***************
X*** 108,114 ****
X      int underline_line, fake_underline;
X      int match_lines, match_redraw, match_topline, match_botline;
X      int goto_line, prev_goto, stop_line, extra_lines;
X!     int in_digest = ah->flag & A_DIGEST;
X      article_header digestah;
X      char *fname, *hdrline;
X      extern STANDOUT;
X--- 110,116 ----
X      int underline_line, fake_underline;
X      int match_lines, match_redraw, match_topline, match_botline;
X      int goto_line, prev_goto, stop_line, extra_lines;
X!     int32 in_digest = ah->flag & A_DIGEST;
X      article_header digestah;
X      char *fname, *hdrline;
X      extern STANDOUT;
X***************
X*** 622,628 ****
X  	   a_st_flags(ah->flag));
X  
X      if (delayed_msg != NULL) {
X! 	msg(delayed_msg);
X  	delayed_msg = NULL;
X      }
X      
X--- 624,630 ----
X  	   a_st_flags(ah->flag));
X  
X      if (delayed_msg != NULL) {
X! 	msg(delayed_msg, dl_msg_arg);
X  	delayed_msg = NULL;
X      }
X      
X***************
X*** 657,663 ****
X  	}
X  #endif	
X  	 goto redraw;
X! 	
X       case K_CONTINUE:
X  	if (eof) break;
X  	if (screen_offset == 0 && form_feed == 0 && stop_line) {
X--- 659,672 ----
X  	}
X  #endif	
X  	 goto redraw;
X! 
X!      case K_NEXT_PAGE:
X! 	if (eof) {
X! 	    ding();
X! 	    goto same_prompt;
X! 	}
X! 	/* FALL THRU */
X! 	    
X       case K_CONTINUE:
X  	if (eof) break;
X  	if (screen_offset == 0 && form_feed == 0 && stop_line) {
X***************
X*** 755,761 ****
X  	goto redraw;
X  	
X       case K_KILL_HANDLING:
X! 	kill_menu(ah);
X  	goto Prompt;
X  	
X       case K_READ_GROUP_UPDATE:
X--- 764,777 ----
X  	goto redraw;
X  	
X       case K_KILL_HANDLING:
X! 	switch (kill_menu(ah)) {
X! 	 case 0:
X! 	    more_return(MC_DO_SELECT);
X! 	 case 1:
X! 	    more_return(MC_DO_KILL);
X! 	 default:
X! 	    break;
X! 	}
X  	goto Prompt;
X  	
X       case K_READ_GROUP_UPDATE:
X***************
X*** 812,822 ****
X  	clrpage(prompt_line);
X  	no_raw();
X  	
X! 	if (print_lines + lno < Lines)
X  	    goto next_page;
X  	    
X  	gotoxy(0, Lines-1);
X! 	c = print_lines + lno - Lines + 1;
X  	while (--c >= 0) {
X  	    putchar(NL);
X  	    if (--lno1 < 0) topline++;
X--- 828,838 ----
X  	clrpage(prompt_line);
X  	no_raw();
X  	
X! 	if (print_lines + lno < (Lines - 1))
X  	    goto next_page;
X  	    
X  	gotoxy(0, Lines-1);
X! 	c = print_lines + lno - Lines + 2;
X  	while (--c >= 0) {
X  	    putchar(NL);
X  	    if (--lno1 < 0) topline++;
X***************
X*** 893,899 ****
X  	    goto Prompt;
X  
X  	if (*fname && *fname != '/') {
X! 	    if (regular_expr) free(regular_expr);
X  	    regular_expr = regcomp(fname);
X  	}
X  
X--- 909,915 ----
X  	    goto Prompt;
X  
X  	if (*fname && *fname != '/') {
X! 	    if (regular_expr) free((char *)regular_expr);
X  	    regular_expr = regcomp(fname);
X  	}
X  
X***************
X*** 941,947 ****
X  	}
X  
X       case K_LEAVE_ARTICLE:
X! 	ah->flag |= A_SELECT;
X  	/* fall thru */
X  
X       case K_NEXT_ARTICLE:
X--- 957,964 ----
X  	}
X  
X       case K_LEAVE_ARTICLE:
X! 	ah->flag &= ~(A_SELECT | A_AUTO | A_READ);
X! 	ah->flag |= A_LEAVE;
X  	/* fall thru */
X  
X       case K_NEXT_ARTICLE:
X***************
X*** 1008,1014 ****
X      if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
X  	gotoxy(0, screen_offset);
X  	clrpage(screen_offset);
X! 	if (more_cmd == MC_PREVIEW_NEXT) {
X  	    if (screen_offset == 0) prompt_line = -1;
X  	} else {
X  	    if (screen_offset == 0) return MC_REDRAW;
X--- 1025,1032 ----
X      if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
X  	gotoxy(0, screen_offset);
X  	clrpage(screen_offset);
X! 	if (more_cmd == MC_PREVIEW_NEXT ||
X! 	    more_cmd == MC_DO_SELECT || more_cmd == MC_DO_KILL) {
X  	    if (screen_offset == 0) prompt_line = -1;
X  	} else {
X  	    if (screen_offset == 0) return MC_REDRAW;
X
X*** /usr/storm/nn6.3.0/news.c	Thu Jun  1 11:10:47 1989
X--- news.c	Mon Jul  3 17:59:12 1989
X***************
X*** 66,71 ****
X--- 66,72 ----
X  	    news.ng_dist 	= NULL;
X  	    news.ng_org 	= NULL;
X  	    news.ng_appr 	= NULL;
X+ 	    news.ng_summ	= NULL;
X  	    news.ng_date	= NULL;
X  	}
X  
X***************
X*** 225,230 ****
X--- 226,233 ----
X  	check("ubject: ",	 8, ng_subj);
X  	if (news.ng_from == NULL)
X  	    check("ender: ",	 7, ng_from);
X+ 	if (!all) break;
X+ 	check("ummary: ",	 8, ng_summ);
X  	break;
X  
X       case 'T':
X
X*** /usr/storm/nn6.3.0/news.h	Thu Jun  1 11:10:47 1989
X--- news.h	Mon Jul  3 17:59:12 1989
X***************
X*** 22,28 ****
X  	char	*ng_dist;	/*   distibution		*/
X  	char	*ng_org;	/*   organization		*/
X  	char	*ng_appr;	/*   approved			*/
X! 
X  	char	*ng_date;	/*   date			*/
X  	
X  	char	*ng_xlines;	/*   lines (from header)	*/
X--- 22,29 ----
X  	char	*ng_dist;	/*   distibution		*/
X  	char	*ng_org;	/*   organization		*/
X  	char	*ng_appr;	/*   approved			*/
X! 	char	*ng_summ;	/*   summary			*/
X! 	
X  	char	*ng_date;	/*   date			*/
X  	
X  	char	*ng_xlines;	/*   lines (from header)	*/
X
X*** /usr/storm/nn6.3.3/nn.1	Fri Jun 30 11:30:58 1989
X--- nn.1	Sat Jul  8 01:26:21 1989
X***************
X*** 106,116 ****
X  .I never
X  mark unread articles as read.
X  .TP
X  \fInews.group\fP  or  \fIfile\fP  or  \fI+folder\fP 
X  If none of these arguments are given, all subscribed news groups will
X  be used.  Otherwise, only the specified news groups and/or files will
X  be collected and presented.  In specifying a news groups, the
X! following `meta notation' can be used: If the news group ends with a
X  \&`.' (or `.all'), all subgroups of the news group will be collected,
X  e.g.
X  .br
X--- 106,125 ----
X  .I never
X  mark unread articles as read.
X  .TP
X+ \-\fBX\fP	{\fIno corresponding variable\fP}
X+ Read/scan unsubscribed groups also.  Most useful when looking for
X+ a specific subject in \fBall\fP groups, e.g.
X+ .br
X+    nn -mxX -sSubject all
X+ .br
X+ .TP
X  \fInews.group\fP  or  \fIfile\fP  or  \fI+folder\fP 
X  If none of these arguments are given, all subscribed news groups will
X  be used.  Otherwise, only the specified news groups and/or files will
X  be collected and presented.  In specifying a news groups, the
X! following `meta notation' can be used:
X! .br
X! If the news group ends with a
X  \&`.' (or `.all'), all subgroups of the news group will be collected,
X  e.g.
X  .br
X***************
X*** 121,127 ****
X  .br
X  	\&.sources.unix
X  .br
X! These notations cannot be mixed (yet)!
X  .SH COMMAND INPUT
X  In general, \fInn\fP commands consist of one or two key-strokes, and \fInn\fP
X  reacts instantly to the commands you give it; you don't have to enter 
X--- 130,136 ----
X  .br
X  	\&.sources.unix
X  .br
X! The argument `all' identifies all (subscribed) news groups.
X  .SH COMMAND INPUT
X  In general, \fInn\fP commands consist of one or two key-strokes, and \fInn\fP
X  reacts instantly to the commands you give it; you don't have to enter 
X***************
X*** 366,371 ****
X--- 375,385 ----
X  \&\fB+\fP	{\fBselect-auto\fP}
X  Perform auto-selections in the group (see the section on "auto
X  kill/select" below).
X+ .TP
X+ \&\fB=\fP	{\fBfind\fP}
X+ Prompts for a regular expression, and selects all articles on the menu
X+ (all pages) whose subject matches the regular expression.  An empty
X+ answer (\fB= return\fP) will reuse the previous expression.
X  .LP
X  During selection, the cursor will normally be placed on the article
X  following the last selected article (initially the first article).
X***************
X*** 563,569 ****
X  in the group have been read as usual, these `left over' articles will
X  be presented once more.  This is useful if you see an article which
X  you may want to respond to unless one the following articles is
X! already saying what you intended to say.
X  .TP
X  \&\fBp\fP	{\fBprevious\fP}
X  Goto previous article.
X--- 577,584 ----
X  in the group have been read as usual, these `left over' articles will
X  be presented once more.  This is useful if you see an article which
X  you may want to respond to unless one the following articles is
X! already saying what you intended to say.  The `left over' article is
X! marked with a `+' following the article id on the menu.
X  .TP
X  \&\fBp\fP	{\fBprevious\fP}
X  Goto previous article.
X***************
X*** 649,656 ****
X  Skip the rest of the current article, and \fIpreview the next article\fP.
X  .TP
X  \&\fBl\fP	{\fBleave-article\fP}
X! Select the article on the menu, then skip the rest of the current
X! article, and preview the next article.
X  .TP
X  \&\fB%\fP\fIy\fP	{\fBpreview\fP}
X  Preview article 
X--- 664,673 ----
X  Skip the rest of the current article, and \fIpreview the next article\fP.
X  .TP
X  \&\fBl\fP	{\fBleave-article\fP}
X! Mark the article as `left over' on the menu for handling later on.
X! Then skip the rest of the current 
X! article, and preview the next article.  The `left over' article is
X! marked with a `+' following the article id on the menu.
X  .TP
X  \&\fB%\fP\fIy\fP	{\fBpreview\fP}
X  Preview article 
X***************
X*** 1732,1737 ****
X--- 1749,1760 ----
X  \fBdebug\fP \fImask\fP	(integer, default 0)
X  Look in the source if you are going to use this.
X  .TP
X+ \fBdefault-distribution\fP \fIdistr\fP	(string, default not set)
X+ The distribution to use as the default suggestion when posting
X+ articles using the \fBpost\fP command.  If it is not set, the
X+ first component of the group name is used as the suggested
X+ distribution, e.g. `comp' when posting to comp.whatever.
X+ .TP
X  \fBdefault-save-file\fP \fIfile\fP	(string, default +$F)
X  The default save file used in quick save mode.  It can also be
X  specified using the abbreviation "+" as the file name in normal save
X***************
X*** 1832,1837 ****
X--- 1855,1869 ----
X  When set, \fInn\fP will save articles in a format that is compatible
X  with normal mail folders.
X  .TP
X+ \fBmail-header\fP \fIheaders\fP	(string, default not set)
X+ The \fIheaders\fP string specifies one or more extra header lines
X+ (separated by semi-colons `;') which are added to the header of mail
X+ sent from \fInn\fP using the \fBreply\fP and \fBmail\fP commands.  For
X+ example: 
X+ .br
X+    set mail-header Reply-To: storm at texas.dk
X+ .br
X+ .TP
X  \fBmail-record\fP \fIfile\fP	(string, default not set)
X  \fIfile\fP must be a full path name of a file.  If defined, all replies and
X  mail will be saved in this file in standard
X***************
X*** 1850,1855 ****
X--- 1882,1893 ----
X  characters in the received messages using a "cat -v" like format.
X  Otherwise, only the printable characters are shown (default).
X  .TP
X+ \fBnews-header\fP \fIheaders\fP	(string, default not set)
X+ The \fIheaders\fP string specifies one or more extra header lines
X+ (separated by semi-colons `;') which are added to the header of
X+ articles posted from \fInn\fP using the \fBfollow\fP and \fBpost\fP
X+ commands.
X+ .TP
X  \fBnews-record\fP \fIfile\fP	(string, default not set)
X  Save file for follow-ups and postings.  Same rules and format as the
X  \fBmail-record\fP variable.
X***************
X*** 2029,2034 ****
X--- 2067,2074 ----
X  \fBW\fP	Followup-To:
X  .br
X  \fBX\fP	References:
X+ .br
X+ \fBY\fP	Summary:
X  .in -8n
X  .DT
X  .LP
X***************
X*** 2153,2158 ****
X--- 2193,2205 ----
X  read articles.  This will 
X  .I never
X  mark unread articles as read.
X+ .TP
X+ \-\fBX\fP	{\fIno corresponding variable\fP}
X+ Read/scan unsubscribed groups also.  Most useful when looking for
X+ a specific subject in all groups, e.g.
X+ .br
X+    nn -mxX -sSubject all
X+ .br
X  .SH KEY MAPPINGS
X  The descriptions of the keys and commands provided in this manual
X  reflects the default key mappings in \fInn\fP.  However, you can
X***************
X*** 2304,2310 ****
X  .br
X  \fBcontinue\fP	\fBspace\fP 	\fBspace\fP 
X  .br
X! \fBfind\fP	\fBnix\fP 	/ 
X  .br
X  \fBfind-next\fP	\fBnix\fP 	. 
X  .br
X--- 2351,2357 ----
X  .br
X  \fBcontinue\fP	\fBspace\fP 	\fBspace\fP 
X  .br
X! \fBfind\fP	= 	/ 
X  .br
X  \fBfind-next\fP	\fBnix\fP 	. 
X  .br
X
X*** /usr/storm/nn6.3.0/nn.c	Thu Jun  1 11:10:57 1989
X--- nn.c	Sat Jul  8 01:26:22 1989
X***************
X*** 30,35 ****
X--- 30,36 ----
X      show_article_date, first_page_lines,			/* more.c */
X      dont_split_digests, dont_sort_articles,			/* group.c */
X      dont_sort_folders,						/* folder.c */
X+     also_unsub_groups,						/* sequence.c*/
X      show_current_time, conf_dont_sleep;				/* term.c */
X  
X  Option_Description(nn_options) {
X***************
X*** 52,57 ****
X--- 53,59 ----
X      'w', Int_Option_Optional(preview_window, 5),
X      'W', Bool_Option(conf_dont_sleep),
X      'x', Int_Option_Optional(also_read_articles, -1),
X+     'X', Bool_Option(also_unsub_groups),
X      'Z', Int_Option(Debug),
X      '\0',
X  };
X***************
X*** 84,98 ****
X      extern long unread_articles;
X      extern char *program_name();
X      int emacs_slave_mode = 0, check_news = 0, enter_admin_mode = 0;
X! 
X      pname = program_name(argv);
X!     if (strcmp(pname, "nnadmin") == 0)
X  	enter_admin_mode = 1;
X!     else
X      if (strcmp(pname, "nnemacs") == 0)
X  	emacs_slave_mode = 1;
X      else
X      if (strcmp(pname, "nncheck") == 0) {
X  	keep_rc_backup = 0;    
X  	check_news = 1;
X      }
X--- 86,103 ----
X      extern long unread_articles;
X      extern char *program_name();
X      int emacs_slave_mode = 0, check_news = 0, enter_admin_mode = 0;
X!     int who_am_i = 0;
X!     
X      pname = program_name(argv);
X!     if (strcmp(pname, "nnadmin") == 0) {
X! 	who_am_i = 2;
X  	enter_admin_mode = 1;
X!     } else
X      if (strcmp(pname, "nnemacs") == 0)
X  	emacs_slave_mode = 1;
X      else
X      if (strcmp(pname, "nncheck") == 0) {
X+ 	who_am_i = 3;
X  	keep_rc_backup = 0;    
X  	check_news = 1;
X      }
X***************
X*** 103,109 ****
X  	    nn_exit(1);
X  	}
X      
X!     init_global(0);
X      init_key_map();
X      init_execute();
X      init_macro();
X--- 108,118 ----
X  	    nn_exit(1);
X  	}
X      
X!     if (init_global(who_am_i) < 0) {
X! 	fprintf(stderr, "%s: nn has not been invoked to initialize user files\n", pname);
X! 	nn_exit(1);
X!     }
X!     
X      init_key_map();
X      init_execute();
X      init_macro();
X***************
X*** 209,217 ****
X      }
X  
X      if (prompt_for_group) {
X  	raw();
X  	current_group = NULL;
X! 	prompt_line = Lines - 1;
X  	goto_group(K_GOTO_GROUP, (article_header *)NULL);
X  	no_raw();
X  	clrdisp();
X--- 218,227 ----
X      }
X  
X      if (prompt_for_group) {
X+ 	printf("\r\n\n"); 
X  	raw();
X  	current_group = NULL;
X! 	prompt_line = Lines - 3;
X  	goto_group(K_GOTO_GROUP, (article_header *)NULL);
X  	no_raw();
X  	clrdisp();
X***************
X*** 276,281 ****
X--- 286,293 ----
X      
X      if (loop) exit(n);
X      loop++;
X+ 
X+     unset_raw();
X      
X  #ifdef NNTP
X      nntp_cleanup();
X***************
X*** 352,358 ****
X  		cur->last_l_article = 0;
X  	    }
X  	} else
X! 	    menu_cmd = group_menu(cur, -1, 
X  				  match_subject, do_kill_handling, menu);
X  
X  	if (menu_cmd != ME_NO_ARTICLES)
X--- 364,370 ----
X  		cur->last_l_article = 0;
X  	    }
X  	} else
X! 	    menu_cmd = group_menu(cur, (article_number)(-1), 
X  				  match_subject, do_kill_handling, menu);
X  
X  	if (menu_cmd != ME_NO_ARTICLES)
X
X*** /usr/storm/nn6.3.2/rc.c	Wed Jun 28 20:08:07 1989
X--- rc.c	Wed Jul  5 14:53:09 1989
X***************
X*** 186,191 ****
X--- 186,197 ----
X  	    gh->group_flag |= G_SUBSCRIPTION | G_NEW;
X  
X  	gh->last_article = LASTART(line);
X+ 
X+ 	if (gh->group_flag & G_BLOCKED) {
X+ 	    /* We cannot trust this group, so we leave it alone */
X+ 	    /* group_menu after update_group will do what is necessary */
X+ 	    continue;
X+ 	}
X  	
X  	if (gh->last_article > gh->last_l_article)
X  	    gh->group_flag |= G_RENUM;	/* mark for use below */
X***************
X*** 420,426 ****
X  int mode;	/* +1 => add, -1 => subtract */
X  {
X      long art;
X!     int was_unread;
X      
X      art = gh->last_l_article - gh->last_article;
X      was_unread = (gh->group_flag & G_UNREAD_COUNT);
X--- 426,432 ----
X  int mode;	/* +1 => add, -1 => subtract */
X  {
X      long art;
X!     int32 was_unread;
X      
X      art = gh->last_l_article - gh->last_article;
X      was_unread = (gh->group_flag & G_UNREAD_COUNT);
X
X*** /usr/storm/nn6.3.3/save.c	Fri Jun 30 11:31:09 1989
X--- save.c	Wed Jul  5 17:00:28 1989
X***************
X*** 259,265 ****
X      
X  #ifdef PAGED_OUTPUT
X      if (save_mode & DO_UNSHAR) {
X! 	int was_raw = no_raw();
X  	pager_stream = popen(pager, "w");
X  	if (was_raw) raw();
X  	
X--- 259,265 ----
X      
X  #ifdef PAGED_OUTPUT
X      if (save_mode & DO_UNSHAR) {
X! 	int was_raw = unset_raw();
X  	pager_stream = popen(pager, "w");
X  	if (was_raw) raw();
X  	
X***************
X*** 329,335 ****
X  		fclose(art);
X  		return 0;
X  	    }
X! 	    was_raw = no_raw();
X  	    if (save_name) 
X  #ifdef PAGED_OUTPUT
X  		sprintf(copybuf, "cd %s && %s %s", save_name, unshar_cmd, pager_redir);
X--- 329,335 ----
X  		fclose(art);
X  		return 0;
X  	    }
X! 	    was_raw = unset_raw();
X  	    if (save_name) 
X  #ifdef PAGED_OUTPUT
X  		sprintf(copybuf, "cd %s && %s %s", save_name, unshar_cmd, pager_redir);
X***************
X*** 383,389 ****
X      }
X  
X      if (mode == FULL_HEADER) {
X! 	int cnt = ah->fpos - ah->hpos;
X  	while (--cnt >= 0) {
X  	    if ((c = getc(art)) == EOF) break;
X  	    putc(c, save_file);
X--- 383,389 ----
X      }
X  
X      if (mode == FULL_HEADER) {
X! 	off_t cnt = ah->fpos - ah->hpos;
X  	while (--cnt >= 0) {
X  	    if ((c = getc(art)) == EOF) break;
X  	    putc(c, save_file);
X
X*** /usr/storm/nn6.3.2/selection.c	Wed Jun 28 20:08:10 1989
X--- selection.c	Sat Jul  8 16:21:37 1989
X***************
X*** 5,11 ****
X  #include "config.h"
X  #include "articles.h"
X  
X! #define	SLMAGIC	0x536c6374
X  #define GNAME_LGT 32
X  
X  static struct sel_header {
X--- 5,11 ----
X  #include "config.h"
X  #include "articles.h"
X  
X! #define	SLMAGIC	0x536c6375
X  #define GNAME_LGT 32
X  
X  static struct sel_header {
X***************
X*** 35,47 ****
X  };
X  
X  
X! save_selection(gh, first, last)
X  group_header *gh;
X  article_number first, last;
X  {
X      register article_header *ah, **ahp;
X!     register int art;
X!     register int save_count, seen_count, flags;
NN_IS_BETTER
echo "End of part 2"
echo "File PATCH.4 is continued in part 3"
echo "3" > s2_seq_.tmp
exit 0

-- 
Kim F. Storm        storm at texas.dk        Tel +45 429 174 00
Texas Instruments, Marielundvej 46E, DK-2730 Herlev, Denmark
	  No news is good news, but nn is better!



More information about the Comp.sources.bugs mailing list