Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!usc!cs.utexas.edu!uunet!mcvax!kth!sunic!dkuug!tidk!storm From: storm@texas.dk (Kim F. Storm) Newsgroups: comp.sources.bugs Subject: NN 6.3 -- Official Patch #4 (part 02/03) Keywords: nn patches Message-ID: <361@texas.dk> Date: 10 Jul 89 14:36:42 GMT Organization: Texas Instruments, Denmark Lines: 1933 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@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@texas.dk Tel +45 429 174 00 Texas Instruments, Marielundvej 46E, DK-2730 Herlev, Denmark No news is good news, but nn is better!