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