diff -c /tilde/maltz/w/test/nn-6.4.18/admin.c ./admin.c *** /tilde/maltz/w/test/nn-6.4.18/admin.c Sat Dec 19 02:52:52 1992 --- ./admin.c Wed Aug 4 21:57:48 1993 *************** *** 516,521 **** --- 516,525 ---- printf("Subj(%d): %s\n", db_hdr.dh_subject_length, db_data.dh_subject); else printf("No subject\n"); + + + printf("Mess-Id Hash: %x \n", db_hdr.dh_id_hash); /* -dam */ + } out: diff -c /tilde/maltz/w/test/nn-6.4.18/articles.c ./articles.c *** /tilde/maltz/w/test/nn-6.4.18/articles.c Sat Dec 19 02:52:53 1992 --- ./articles.c Fri Nov 12 09:32:19 1993 *************** *** 46,52 **** */ #ifndef ART_THUNK_SIZE ! #define ART_THUNK_SIZE 127 #endif static new_thunk(t, ptr, size) --- 46,55 ---- */ #ifndef ART_THUNK_SIZE ! /* this seems to be the number of new art_headers that get requested from the ! system at once (as opposed to asking for space for each header as it comes ! in) - dam */ ! #define ART_THUNK_SIZE 127 #endif static new_thunk(t, ptr, size) *************** *** 447,452 **** --- 450,457 ---- strcpy(ah->sender, db_data.dh_sender); } else ah->sender = ""; + + ah->message_id = db_hdr.dh_id_hash; /* -dam */ if (ah->subj_length = db_hdr.dh_subject_length) { ah->subject = alloc_str((int)db_hdr.dh_subject_length); diff -c /tilde/maltz/w/test/nn-6.4.18/collect.c ./collect.c *** /tilde/maltz/w/test/nn-6.4.18/collect.c Sat Dec 19 02:38:58 1992 --- ./collect.c Fri Nov 12 09:35:08 1993 *************** *** 7,12 **** --- 7,13 ---- #include "config.h" #include "db.h" #include "news.h" + #include "message_id.h" /* -dam */ #define COUNT_RE_REFERENCES /* no of >>> depends on Reference: line */ *************** *** 81,86 **** --- 82,91 ---- static build_hdr(type) int type; { + static mess_id_type id = 0; /* this hack allows message_id's from the + first digest article to propigate to the + other digest articles... (it is probably buggy + in some wierd cases...) -dam */ register char *name, *subj; int re; *************** *** 104,110 **** name = news.ng_from; subj = news.ng_subj; ! db_hdr.dh_lines = news.ng_lines; db_hdr.dh_hpos = 0; --- 109,116 ---- name = news.ng_from; subj = news.ng_subj; ! id = hash_message_id(news.ng_ident); /* pick out the message_id -dam */ ! db_hdr.dh_lines = news.ng_lines; db_hdr.dh_hpos = 0; *************** *** 119,126 **** } else db_hdr.dh_sender_length = 0; if (type == DH_DIGEST_HEADER) { ! db_hdr.dh_subject_length = 1; db_data.dh_subject[0] = '@'; } else db_hdr.dh_subject_length = 0; --- 125,135 ---- } else db_hdr.dh_sender_length = 0; + /* pack up the message id into the data base -dam */ + db_hdr.dh_id_hash = id; + if (type == DH_DIGEST_HEADER) { ! db_hdr.dh_subject_length = 1; db_data.dh_subject[0] = '@'; } else db_hdr.dh_subject_length = 0; diff -c /tilde/maltz/w/test/nn-6.4.18/data.h ./data.h *** /tilde/maltz/w/test/nn-6.4.18/data.h Sat Dec 19 02:52:18 1992 --- ./data.h Fri Nov 12 18:19:05 1993 *************** *** 1,3 **** --- 1,5 ---- + #ifndef _DATA_H + #define _DATA_H /* * (c) Copyright 1990, Kim Fabricius Storm. All rights reserved. * *************** *** 121,126 **** --- 123,129 ---- char *select_orig; /* original select_line if changed */ int32 unread_count; /* number of unread articles */ + /* unused -dam */ int8 filtered_size; /* filter till no more than n arts on menu */ } group_header; *************** *** 134,139 **** --- 137,144 ---- * Internal article header information. */ + #include "message_id.h" + typedef struct { union { article_number au_number; /* article number in the group */ *************** *** 172,177 **** --- 177,183 ---- # define A_KILL 0x06 /* eliminate article */ # define A_SELECT 0x08 /* article has been selected */ # define A_AUTO_SELECT 0x09 /* will match & A_SELECT */ + # define A_FILTER_SELECT 0x0A /* will match & A_SELECT */ # define A_NOT_DISPLAYED 0x7f /* not currently on menu */ *************** *** 191,199 **** --- 197,208 ---- # define A_CLOSED FLAG(13) /* subject closed on menu */ # define A_HIDE FLAG(14) /* hide subject on menu */ + mess_id_type message_id; /* message-id (or some unique id) -dam 6/93 */ } article_header; #define a_number au_union.au_number #define a_string au_union.au_string + + #endif /* _DATA_H */ diff -c /tilde/maltz/w/test/nn-6.4.18/db.c ./db.c *** /tilde/maltz/w/test/nn-6.4.18/db.c Sat Dec 19 02:51:51 1992 --- ./db.c Fri Nov 12 09:39:54 1993 *************** *** 692,698 **** #define MASTER_FIELDS 5 /* + DB_LOCK_MESSAGE bytes */ #define GROUP_FIELDS 9 ! #define ARTICLE_FIELDS 10 typedef int32 net_long; --- 692,698 ---- #define MASTER_FIELDS 5 /* + DB_LOCK_MESSAGE bytes */ #define GROUP_FIELDS 9 ! #define ARTICLE_FIELDS 11 /* 10 + 1 to hold message id hash -dam */ typedef int32 net_long; *************** *** 900,905 **** --- 900,907 ---- db_hdr.dh_cross_postings = buf[7]; db_hdr.dh_subject_length = buf[8]; db_hdr.dh_sender_length = buf[9]; + db_hdr.dh_id_hash = buf[10]; /* -dam */ + #else if (fread((char *)&db_hdr, sizeof(data_header), 1, f) != 1) return 0; #endif *************** *** 944,949 **** --- 946,952 ---- #ifdef NETWORK_DATABASE net_long buf[ARTICLE_FIELDS]; #endif + article_number art_num = db_hdr.dh_number; switch (db_data.dh_type) { *************** *** 968,973 **** --- 971,977 ---- buf[7] = db_hdr.dh_cross_postings; buf[8] = db_hdr.dh_subject_length; buf[9] = db_hdr.dh_sender_length; + buf[10] =db_hdr.dh_id_hash; /* -dam */ host_to_net(buf, ARTICLE_FIELDS); *************** *** 1075,1078 **** #endif return 1; } - --- 1079,1081 ---- diff -c /tilde/maltz/w/test/nn-6.4.18/db.h ./db.h *** /tilde/maltz/w/test/nn-6.4.18/db.h Sun Apr 29 15:11:59 1990 --- ./db.h Wed Aug 4 21:46:30 1993 *************** *** 28,33 **** --- 28,34 ---- * The data file contains the actual header data. Each article is * represented by a Header, an array of Cross Postings, and the * strings representing the sender name and the article subject: + * {and a hash of the message-id as part of the header -dam} * * header * group_number 1 [ if cross posted ] *************** *** 63,68 **** --- 64,71 ---- #define NETW_CROSS_EXT(cp) cp #endif + #include "message_id.h" /* -dam */ + typedef struct { article_number dh_number; *************** *** 78,83 **** --- 81,87 ---- int8 dh_cross_postings; int8 dh_subject_length; int8 dh_sender_length; + mess_id_type dh_id_hash; /* -dam */ } data_header; #define DBUF_SIZE 255 *************** *** 92,97 **** --- 96,102 ---- cross_post_number dh_cross[DBUF_SIZE+1]; char dh_sender[DBUF_SIZE+1]; char dh_subject[DBUF_SIZE+1]; + char dh_message_id[DBUF_SIZE+1]; } data_dynamic_data; *************** *** 105,107 **** --- 110,114 ---- extern data_header db_hdr; extern data_dynamic_data db_data; + + diff -c /tilde/maltz/w/test/nn-6.4.18/global.h ./global.h *** /tilde/maltz/w/test/nn-6.4.18/global.h Sat Dec 19 02:47:58 1992 --- ./global.h Thu Aug 5 10:23:53 1993 *************** *** 7,12 **** --- 7,14 ---- /* * Marks for global/external variables */ + #ifndef _GLOBAL_H + #define _GLOBAL_H #define export /* export variable from module */ #define import extern /* import variable into module */ *************** *** 259,261 **** --- 261,265 ---- #else #define iso8859(c) ((c) & 0x60) #endif + + #endif /* _GLOBAL_H */ diff -c /tilde/maltz/w/test/nn-6.4.18/init.c ./init.c *** /tilde/maltz/w/test/nn-6.4.18/init.c Sat Dec 19 02:50:57 1992 --- ./init.c Fri Nov 12 09:42:33 1993 *************** *** 199,205 **** in_init = 0; if (first_arg && strncmp(first_arg, "-I", 2) == 0) { ! if (first_arg[2] == NUL) return; first_arg += 2; } else first_arg = dflt_init_files; --- 199,205 ---- in_init = 0; if (first_arg && strncmp(first_arg, "-I", 2) == 0) { ! if (first_arg[2] == NUL) return; first_arg += 2; } else first_arg = dflt_init_files; *************** *** 268,273 **** --- 268,274 ---- "map", 3, 4, "mkdir", 5, 1, "motd", 4, 0, + "participate", 11, 0, /* -dam */ "patch", 5, 0, /* QUICK HACK */ "post", 4, 0, /* QUICK HACK */ "print", 5, -3, /* QUICK HACK */ *************** *** 1216,1221 **** --- 1217,1226 ---- if (display_motd(0)) return AC_REDRAW; msg("no motd file"); break; + } + + CASE( "participate" ) { + return AC_PARTICIPATE; } CASE( "sort" ) { diff -c /tilde/maltz/w/test/nn-6.4.18/inst.sh ./inst.sh *** /tilde/maltz/w/test/nn-6.4.18/inst.sh Sat Dec 19 02:48:05 1992 --- ./inst.sh Wed Dec 22 16:58:42 1993 *************** *** 320,325 **** --- 320,327 ---- ./inst chmod 644 $HELP/$h echo $h done + ./inst copy 744 $HELP updates + echo moved updates file to help directory ;; man) diff -c /tilde/maltz/w/test/nn-6.4.18/keymap.c ./keymap.c *** /tilde/maltz/w/test/nn-6.4.18/keymap.c Sat Dec 19 02:52:22 1992 --- ./keymap.c Fri Nov 12 10:03:57 1993 *************** *** 84,89 **** --- 84,90 ---- * * rot13 D * compress c + * voting: 1-3 good->great; 0 = hate it */ export int more_key_map[KEY_MAP_SIZE] = { *************** *** 136,145 **** /* - */ K_UNBOUND, /* . */ K_NEXT_MATCH, /* / */ K_GOTO_MATCH, ! /* 0 */ K_UNBOUND, ! /* 1 */ K_UNBOUND, ! /* 2 */ K_UNBOUND, ! /* 3 */ K_UNBOUND, /* 4 */ K_UNBOUND, /* 5 */ K_UNBOUND, /* 6 */ K_UNBOUND, --- 137,146 ---- /* - */ K_UNBOUND, /* . */ K_NEXT_MATCH, /* / */ K_GOTO_MATCH, ! /* 0 */ K_VOTE_HATEIT, ! /* 1 */ K_VOTE_LOW, ! /* 2 */ K_VOTE_MED, ! /* 3 */ K_VOTE_HIGH, /* 4 */ K_UNBOUND, /* 5 */ K_UNBOUND, /* 6 */ K_UNBOUND, *************** *** 358,364 **** /* A */ K_ADVANCE_GROUP, /* B */ K_BACK_GROUP, /* C */ K_CANCEL, ! /* D */ K_UNBOUND, /* E */ K_UNBOUND, /* F */ K_FOLLOW_UP, /* G */ K_GOTO_GROUP, --- 359,365 ---- /* A */ K_ADVANCE_GROUP, /* B */ K_BACK_GROUP, /* C */ K_CANCEL, ! /* D */ K_FILTER_MENU, /* E */ K_UNBOUND, /* F */ K_FOLLOW_UP, /* G */ K_GOTO_GROUP, *************** *** 381,389 **** /* X */ K_READ_GROUP_UPDATE, /* Y */ K_GROUP_OVERVIEW, /* Z */ K_READ_GROUP_THEN_SAME, ! /* [ */ K_UNBOUND, /* \ */ K_UNBOUND, ! /* ] */ K_UNBOUND, /* ^ */ K_FIRST_PAGE, /* _ */ K_UNBOUND, /* ` */ K_UNBOUND, --- 382,390 ---- /* X */ K_READ_GROUP_UPDATE, /* Y */ K_GROUP_OVERVIEW, /* Z */ K_READ_GROUP_THEN_SAME, ! /* [ */ K_DEC_FILTERED_SIZE, /* \ */ K_UNBOUND, ! /* ] */ K_INC_FILTERED_SIZE, /* ^ */ K_FIRST_PAGE, /* _ */ K_UNBOUND, /* ` */ K_UNBOUND, *************** *** 459,468 **** --- 460,471 ---- "continue", K_CONTINUE, 0, "continue-no-mark", K_CONTINUE_NO_MARK, K_ONLY_MENU, + "dec-filtered-size", K_DEC_FILTERED_SIZE, K_ONLY_MENU, "decode", K_UUDECODE, 0, "find", K_GOTO_MATCH, 0, "find-next", K_NEXT_MATCH, K_ONLY_MORE, + "filter-menu", K_FILTER_MENU, K_ONLY_MENU, "follow", K_FOLLOW_UP, 0, "full-digest", K_FULL_DIGEST, K_ONLY_MORE, *************** *** 471,476 **** --- 474,481 ---- "help", K_HELP, 0, + "inc-filtered-size", K_INC_FILTERED_SIZE, K_ONLY_MENU, + "junk-articles", K_JUNK_ARTICLES, K_ONLY_MENU, "kill-select", K_KILL_HANDLING, 0, *************** *** 534,539 **** --- 539,548 ---- "unsub", K_UNSUBSCRIBE, 0, "version", K_VERSION, 0, + "vote-high", K_VOTE_HIGH, K_ONLY_MORE, + "vote-med", K_VOTE_MED, K_ONLY_MORE, + "vote-low", K_VOTE_LOW, K_ONLY_MORE, + "vote-hateit", K_VOTE_HATEIT, K_ONLY_MORE, (char *)NULL, 0, 0 }; diff -c /tilde/maltz/w/test/nn-6.4.18/keymap.h ./keymap.h *** /tilde/maltz/w/test/nn-6.4.18/keymap.h Sat Dec 19 02:52:22 1992 --- ./keymap.h Wed Oct 6 16:44:20 1993 *************** *** 102,112 **** --- 102,123 ---- #define K_OPEN_SUBJECT 0x0050 /* open subject on menu */ #define K_CLOSE_SUBJECT 0x0051 /* close subject on menu */ + #define K_FILTER_MENU 0x0052 /* menu shows only collab_select arts */ + #define K_DEC_FILTERED_SIZE 0x0053 /* increase number of collab_select arts*/ + #define K_INC_FILTERED_SIZE 0x0054 /* decrease number of collab_select arts*/ + #define K_EQUAL_KEY 0x0070 /* map command special symbol */ #define K_MACRO 0x0100 /* call macro */ #define K_ARTICLE_ID 0x0200 /* article id in lower part */ #define K_PREFIX_KEY 0x0400 /* key map number in lower part */ + + + /* collaborative filtering rating keys */ + #define K_VOTE_HIGH 0x0080 /* article is a must read */ + #define K_VOTE_MED 0x0081 /* article is a maybe read */ + #define K_VOTE_LOW 0x0082 /* article is better than normal */ + #define K_VOTE_HATEIT 0x0083 /* squish article into the muck */ /* keymap definitions from keymap.c */ diff -c /tilde/maltz/w/test/nn-6.4.18/menu.c ./menu.c *** /tilde/maltz/w/test/nn-6.4.18/menu.c Sat Dec 19 02:57:39 1992 --- ./menu.c Tue Nov 16 19:12:45 1993 *************** *** 10,15 **** --- 10,17 ---- #include "keymap.h" #include "menu.h" #include "regexp.h" + #include "monitor.h" /*-dam 11/93 */ + #include "filter.h" /*-dam 10/93 */ import char *news_lib_directory; *************** *** 72,78 **** char ident[] = "abcdefghijklmnopqrstuvwxyz0123456789"; ! char attributes[30] = " .,+=#! **"; /* Corresponds to A_XXXX in data.h */ static int menu_length; /* current no of line on menu */ static int menu_articles; /* current no of articles on menu */ --- 74,81 ---- char ident[] = "abcdefghijklmnopqrstuvwxyz0123456789"; ! char attributes[30] = " .,+=#! **$"; /* Corresponds to A_XXXX in data.h -dam */ ! /*char attributes[30] = " .,+=#! **"; /* Corresponds to A_XXXX in data.h */ static int menu_length; /* current no of line on menu */ static int menu_articles; /* current no of articles on menu */ *************** *** 180,186 **** while (n < n_articles) { if (articles[n]->attr == 0) unread++; else if (articles[n]->attr & A_SELECT) selected++; ! else if (articles[n]->attr == A_LEAVE_NEXT) left++; total++; if (++n == n_articles) break; if (articles[n]->flag & A_ROOT_ART) break; --- 183,189 ---- while (n < n_articles) { if (articles[n]->attr == 0) unread++; else if (articles[n]->attr & A_SELECT) selected++; ! else if (articles[n]->attr == A_LEAVE_NEXT) left++; total++; if (++n == n_articles) break; if (articles[n]->flag & A_ROOT_ART) break; *************** *** 210,216 **** attr_type cattr; if (mi->mi_total == mi->mi_left) ! cattr = A_LEAVE_NEXT; else if (mi->mi_unread == 0) cattr = A_READ; else if (mi->mi_total == mi->mi_selected) --- 213,219 ---- attr_type cattr; if (mi->mi_total == mi->mi_left) ! cattr = A_LEAVE_NEXT; else if (mi->mi_unread == 0) cattr = A_READ; else if (mi->mi_total == mi->mi_selected) *************** *** 244,249 **** --- 247,253 ---- int pad; char cbuf[80]; attr_type cattr; + extern int show_only_filtered_arts; /* user visible boolean flag */ ah = articles[firsta + cura]; if (!IS_VISIBLE(ah)) return; *************** *** 317,328 **** if (fmt_linenum > 4) fmt_linenum = 1; ! if (!slow_mode && (cattr & A_SELECT)) { ! if (so_gotoxy(1, lno, 1) == 0) ! putchar(attributes[A_SELECT]); ! } else { ! gotoxy(1, lno); ! putchar(cattr == A_KILL ? ' ' : attributes[cattr]); } if (ah->lines < 10) lnum = 1; else --- 321,343 ---- if (fmt_linenum > 4) fmt_linenum = 1; ! if (!slow_mode && (cattr == A_SELECT)) ! { ! if (so_gotoxy(1, lno, 1) == 0) /* leave attr char blank if attr is select */ ! putchar(attributes[A_SELECT]); ! } ! else if (!slow_mode && (cattr & A_SELECT)) ! { ! if (so_gotoxy(1, lno, 0) == 0) /* try to make attr char standout*/ ! putchar(attributes[cattr]); /* if fails, just output normal char */ ! else ! so_printf("%c", attributes[cattr]); /* otherwise ouput as standout */ ! } ! else { /* just print out the attr char */ ! gotoxy(1, lno); ! putchar(cattr == A_KILL ? ' ' : attributes[cattr]); ! /* the prev line seems like a hack to keep ! from showing up ! as an attribute. showing ! is a bug according to the manual */ } if (ah->lines < 10) lnum = 1; else *************** *** 391,410 **** } no_counters: ! if (!fmt_rptsubj && lno > firstl && ah->flag & A_SAME) { if (ah->replies == 0 || prt_replies(ah->replies) == 0) ! so_printf("-"); ! } else { ! lsubj -= prt_replies(ah->replies); ! if (lsubj >= ah->subj_length) ! so_printf("%s", ah->subject); ! else if (collapse_subject < 0) ! so_printf("%-.*s", lsubj, ah->subject); else { ! if (collapse_subject > 0) ! so_printf("%-.*s", collapse_subject, ah->subject); ! so_printf("<>%s", ah->subject + ah->subj_length - lsubj + collapse_subject + 2); } } --- 406,430 ---- } no_counters: ! /* if we're not drawing the top line of menu, and we're not drawing ! only the filtered arts, then we can abbrev the subject line */ ! if (!fmt_rptsubj && (lno > firstl) && (ah->flag & A_SAME) ! && !show_only_filtered_arts) ! { if (ah->replies == 0 || prt_replies(ah->replies) == 0) ! so_printf("-"); ! } ! else { ! lsubj -= prt_replies(ah->replies); ! if (lsubj >= ah->subj_length) ! so_printf("%s", ah->subject); ! else if (collapse_subject < 0) ! so_printf("%-.*s", lsubj, ah->subject); else { ! if (collapse_subject > 0) ! so_printf("%-.*s", collapse_subject, ah->subject); ! so_printf("<>%s", ah->subject + ah->subj_length - lsubj + collapse_subject + 2); } } *************** *** 547,552 **** --- 567,573 ---- attr_type o_attr; import int new_read_prompt; + /* insert here */ do { for (cur = 0; cur < n_articles; cur++) { if (articles[cur]->attr & A_SELECT) break; *************** *** 601,606 **** --- 622,629 ---- goto show; case MC_NEXTSUBJ: + /* mark all arts as read until the next A_ROOT_ART, then go to + the next selected art */ ah->attr = A_READ; for (next = cur+1; next < n_articles; next++) { if ((ah = articles[next])->flag & A_ROOT_ART) break; *************** *** 612,617 **** --- 635,641 ---- break; case MC_ALLSUBJ: + /* select all articles in this subject */ ah->attr = A_READ; for (next = cur+1; next < n_articles; next++) { ah = articles[next]; *************** *** 669,675 **** ah->attr = A_READ; } return MC_NEXTGROUP; ! } if (show_art_next_invalid) for (next = cur+1; next < n_articles; next++) { --- 693,699 ---- ah->attr = A_READ; } return MC_NEXTGROUP; ! } if (show_art_next_invalid) for (next = cur+1; next < n_articles; next++) { *************** *** 676,687 **** if (articles[next]->attr & A_SELECT) break; } prev = cur; cur = next; ! } ! for (cur = 0; cur < n_articles; cur++) ! if (articles[cur]->attr & A_SELECT) break; if (cur < n_articles) continue; ! again = 0; for (cur = 0; cur < n_articles; cur++) { ah = articles[cur]; --- 700,711 ---- if (articles[next]->attr & A_SELECT) break; } prev = cur; cur = next; ! } ! /* if any arts still selected, go back and read them */ for (cur = 0; cur < n_articles; cur++) ! if (articles[cur]->attr & A_SELECT) break; if (cur < n_articles) continue; ! again = 0; for (cur = 0; cur < n_articles; cur++) { ah = articles[cur]; *************** *** 693,699 **** ah->attr = A_SELECT; again++; } ! } if (again > 1) sprintf(delayed_msg, "Showing %ld articles again", again); --- 717,723 ---- ah->attr = A_SELECT; again++; } ! } if (again > 1) sprintf(delayed_msg, "Showing %ld articles again", again); *************** *** 942,948 **** article_number o_firsta, temp1, temp2; int o_mode; /* for recursive calls */ static menu_level = 0; ! char purpose[80], pr_fmt[60]; extern int enable_stop, file_completion(); extern int alt_cmd_key, in_menu_mode; article_number elim_list[3]; --- 966,972 ---- article_number o_firsta, temp1, temp2; int o_mode; /* for recursive calls */ static menu_level = 0; ! char purpose[80], pr_fmt[200]; extern int enable_stop, file_completion(); extern int alt_cmd_key, in_menu_mode; article_number elim_list[3]; *************** *** 949,958 **** --- 973,1011 ---- int entry_check; int auto_read; long o_selected; + int cmmd_from_show_articles; /* -dam */ + int num_articles_selected; /* -dam */ + extern int show_only_filtered_arts; /* user visible, boolean flag */ + extern int collab_select_size; /* how many arts to select */ + int group_filtered_size; + /* int filtered_size; /* desired max num of arts in group */ + + #define NUM_PROMPT_LINES 1 + #define menu_return(cmd) \ { menu_cmd = (cmd); goto menu_exit; } + /* each time we enter a group we reset the filtered size to the global + if people want to have each have a differnt filtered size they can + use the entry macros to reset the nn variable collab-select-size */ + group_filtered_size = collab_select_size; + + /* NOTE: what to do about collab filtering if we reenter a group? + if we goto a group, all the articles may be marked read, or unread + so, if we're on menu level one, we do collab filtering by default + if we're not menu level 1 (meaning the user has done a goto group) + the we see if the user has request filtered menus, if so, we do + collab sort and get rid of the read tag. If not, we leave the read + tags. What happens to kill attrs? were is the kill done? + */ + + /* KNOWN BUG: if you hit the up/down arrows while using the show_only_filtered + arts menu, the cursor will move in strange ways. Why? well the cura is + being incremented by one everytime you give a K_NEXT_LINE key, but + most of the time the cura will be for a menu line that isn't being displayed + */ + flush_input(); o_firsta = firsta; *************** *** 976,982 **** --- 1029,1046 ---- entry_check = 0; auto_read = 0; } + /* at this point the unread_count field of current_group is correct so + add the group to the group monitor now */ + mon_setup_for_new_group(current_group, articles, n_articles); /* -dam 6/93 */ + mon_start_charging_scan_time(); /*-dam we're about to draw the menu, so charge + for the time the users looks at it */ + + if (menu_level == 1 || show_only_filtered_arts) + num_articles_selected = + filter_do_collaborative_preselect(current_group,group_filtered_size, + articles,n_articles); + sprintf(pr_fmt, menu_level == 1 ? "\1\2-- SELECT %s-----%%s-----\1" : *************** *** 1061,1068 **** firstl = CALL(print_header)(); entry_check = 0; ! ! maxa = Lines - preview_window - firstl - 2; if (!long_menu) firstl++, maxa -= 2; if (maxa > (INTERVAL1 + INTERVAL2)) --- 1125,1132 ---- firstl = CALL(print_header)(); entry_check = 0; ! /* changed to allow for extra lines in prompt -dam */ ! maxa = Lines - preview_window - firstl - 1 - NUM_PROMPT_LINES; if (!long_menu) firstl++, maxa -= 2; if (maxa > (INTERVAL1 + INTERVAL2)) *************** *** 1078,1083 **** --- 1142,1148 ---- nexta = root_article(nexta); firsta = nexta; cura = 0; + next_cura = -1; REDRAW_CHECK; *************** *** 1107,1114 **** --- 1172,1186 ---- ah = articles[nexta]; if (ah->flag & A_HIDE) { ah->menu_line = menu_length; /* just in case.... */ + nexta = nexta + 1; /* skip this article and go on */ continue; } + if (show_only_filtered_arts && (ah->attr != A_FILTER_SELECT)) + { + ah->menu_line = menu_length; /* just in case the art shows up */ + nexta = nexta + 1; /* skip this article and go on */ + continue; + } if (menu_length > first_menu_line) { switch (menu_spacing) { case 0: *************** *** 1120,1147 **** mi++; break; } ! if (menu_length >= maxa) break; } ah->menu_line = menu_length; art_id_to_mi[menu_articles] = mi; ! mi->mi_art_id = menu_articles++; mi->mi_cura = cura = nexta - firsta; ! if (ah->flag & A_CLOSED) { /* skip rest of thread */ nexta = thread_counters(nexta); if (nexta == firsta + cura + 1) ! ah->flag &= ~A_CLOSED; ! else { article_number tmpa = firsta + cura; ! while (++tmpa < nexta) ! articles[tmpa]->menu_line = menu_length; ! } ! } else ! nexta++; ! ah->disp_attr = A_NOT_DISPLAYED; ! mark(); ! if (++menu_length >= maxa) break; mi++; } } --- 1192,1224 ---- mi++; break; } ! if (menu_length >= maxa) break; /* check that we haven't filled screen */ } ah->menu_line = menu_length; art_id_to_mi[menu_articles] = mi; ! mi->mi_art_id = menu_articles; ! menu_articles++; mi->mi_cura = cura = nexta - firsta; ! if (!show_only_filtered_arts && (ah->flag & A_CLOSED)) ! { /* skip rest of thread */ nexta = thread_counters(nexta); if (nexta == firsta + cura + 1) ! ah->flag &= ~A_CLOSED; ! else ! { article_number tmpa = firsta + cura; ! while (++tmpa < nexta) ! articles[tmpa]->menu_line = menu_length; ! } ! } /* done skipping thread */ ! else ! nexta++; /* set up for next iteration */ ! ! ah->disp_attr = A_NOT_DISPLAYED; /* magic flag for mark() */ ! mark(); /* print out this menu line */ ! if (++menu_length >= maxa) break; /* we've filled this screen */ mi++; } } *************** *** 1176,1181 **** --- 1253,1268 ---- raw(); + if (group_filtered_size >0 && + (menu_level == 1 || show_only_filtered_arts)) + { + if (num_articles_selected >= 0) + msg("there were %d messages auto selected by the collaborative system", + num_articles_selected); + else + msg("no information about this group is available from the vote server"); + } + Prompt: prompt(pr_fmt, *************** *** 1186,1191 **** --- 1273,1279 ---- delayed_msg[0] = NUL; } + same_prompt: if (cura < 0 || cura > numa) cura = 0; *************** *** 1269,1274 **** --- 1357,1366 ---- case AC_REENTER_GROUP: menu_return(ME_REENTER_GROUP); + + case AC_PARTICIPATE: + sign_up_a_participant(); + goto same_prompt; } case K_QUIT: *************** *** 1808,1813 **** --- 1900,1920 ---- goto Prompt; case K_ARTICLE_ID: + /* this branch is taken when K_SELECT is hit since get_k_cmd converts + the K_SELECT into a K_ARTICLE_ID - I didn't write this, I just + figured it out... -dam */ + + /* note: this is hack solution so that I can release the code + I should figure out what cura, nexta, firsta, and numa do so + that I can make these functions work properly -dam 10/11/93 */ + if (show_only_filtered_arts && is_k_select) + { + msg("sorry, hitting `.' doesn't work in filtered menus yet"); + flush_input(); + goto same_prompt; + } + + if (numa < 0) goto nextmenu; if (!is_k_select && auto_preview_mode) goto auto_preview; *************** *** 1859,1870 **** --- 1966,1991 ---- if (last_k_cmd == K_UNSELECT_ALL) repl_attr_all(A_SELECT, 0, 1); else + { repl_attr_all(A_AUTO_SELECT, 0, 1); + repl_attr_all(A_FILTER_SELECT, 0, 1); + } + fl; cura = 0; goto same_prompt; case K_NEXT_LINE: + /* note: this is hack solution so that I can release the code + I should figure out what cura, nexta, firsta, and numa do so + that I can make these functions work properly -dam 10/11/93 */ + if (show_only_filtered_arts) + { + msg("sorry, arrow keys don't work in filtered menus yet"); + flush_input(); + goto same_prompt; + } + if (numa < 0) goto nextmenu; cura++; *************** *** 1871,1876 **** --- 1992,2007 ---- goto same_prompt; case K_PREV_LINE: + /* note: this is hack solution so that I can release the code + I should figure out what cura, nexta, firsta, and numa do so + that I can make these functions work properly -dam 10/11/93 */ + if (show_only_filtered_arts) + { + msg("sorry, arrow keys don't work in filtered menus yet"); + flush_input(); + goto same_prompt; + } + if (numa < 0) goto nextmenu; if (--cura < 0) cura = numa; *************** *** 1969,1974 **** --- 2100,2140 ---- if (nexta < 0) nexta = 0; goto nextmenu; + case K_INC_FILTERED_SIZE: + group_filtered_size++; + num_articles_selected = + filter_do_collaborative_preselect(current_group,group_filtered_size, + articles,n_articles); + /* redraw menu from first article */ + nexta = 0; + goto nextmenu; + + case K_DEC_FILTERED_SIZE: + if (group_filtered_size > 0) group_filtered_size--; + repl_attr_all(A_FILTER_SELECT, 0, 1); /* clear the old markings */ + num_articles_selected = + filter_do_collaborative_preselect(current_group,group_filtered_size, + articles,n_articles); + /* redraw menu from first article */ + nexta = 0; + goto nextmenu; + + case K_FILTER_MENU: + /* toggle the show_only_filtered_arts flag */ + if (show_only_filtered_arts) + show_only_filtered_arts = 0; + else + { + show_only_filtered_arts = 1; + if (menu_level != 1) /* then we haven't called the select routine yet*/ + num_articles_selected = + filter_do_collaborative_preselect(current_group,group_filtered_size, + articles,n_articles); + } + /* redraw menu from first article */ + nexta = 0; + goto nextmenu; + case K_FIRST_PAGE: if (firsta == 0) goto same_prompt; *************** *** 2089,2096 **** no_raw(); do_auto_read: ! switch (show_articles()) { case MC_MENU: goto redraw; --- 2255,2265 ---- no_raw(); do_auto_read: ! mon_stop_charging_scan_time(); /* -dam */ ! cmmd_from_show_articles = show_articles(); ! mon_start_charging_scan_time(); /* -dam */ + switch (cmmd_from_show_articles) { case MC_MENU: goto redraw; *************** *** 2118,2124 **** } menu_exit: ! cur_bypass = o_bypass; n_selected = o_selected; firsta = o_firsta; --- 2287,2293 ---- } menu_exit: ! mon_stop_charging_scan_time(); /* -dam */ cur_bypass = o_bypass; n_selected = o_selected; firsta = o_firsta; *************** *** 2198,2200 **** --- 2367,2374 ---- fl; goto again; } + + + + + diff -c /tilde/maltz/w/test/nn-6.4.18/menu.h ./menu.h *** /tilde/maltz/w/test/nn-6.4.18/menu.h Sat Apr 21 09:45:19 1990 --- ./menu.h Wed Aug 4 12:02:56 1993 *************** *** 55,57 **** --- 55,61 ---- #define AC_REENTER_GROUP 4 /* reenter group after .newsrc update */ #define AC_KEYCMD 5 /* alt_cmd_key contains command */ #define AC_UNCHANGED 6 /* no display changes */ + + #define AC_PARTICIPATE 7 /* added only to allow people to sign up for study -dam*/ + + diff -c /tilde/maltz/w/test/nn-6.4.18/more.c ./more.c *** /tilde/maltz/w/test/nn-6.4.18/more.c Sat Dec 19 02:51:59 1992 --- ./more.c Thu Dec 16 10:31:32 1993 *************** *** 11,17 **** --- 11,22 ---- #include "menu.h" #include "keymap.h" #include "regexp.h" + #include "monitor.h" + #include "vote.h" + #include "colinterface.h" + #include + export int monitor_mode = 0; export int compress_mode = 0; export int show_article_date = 1; *************** *** 337,364 **** int open_modes, hdr_mode, o_mode; struct header_def *hdef; extern int alt_cmd_key, in_menu_mode, any_message; #ifdef RESIZING int entry_col = Columns; #endif extern char *pct(); #define more_return(cmd) \ { more_cmd = cmd; goto more_exit; } if (ah->a_group != NULL) init_group(ah->a_group); ! open_modes = SKIP_HEADER; ! if (show_article_date || header_lines) { open_modes |= FILL_NEWS_HEADER; if (header_lines == NULL) open_modes |= GET_DATE_ONLY; ! else open_modes |= GET_ALL_FIELDS; if (in_digest) open_modes |= FILL_DIGEST_HEADER; } art = open_news_article(ah, open_modes, ngheader, dgheader); if (art == NULL) { if (expired_msg_delay >= 0) { msg("Canceled or expired: \"%s: %-.35s\"", ah->sender, ah->subject); --- 342,392 ---- int open_modes, hdr_mode, o_mode; struct header_def *hdef; extern int alt_cmd_key, in_menu_mode, any_message; + extern int auto_advance_on_vote; /* from vote.c */ + #ifdef NNTP + extern int nntp_failed; /* from nntp.c -dam */ + #endif #ifdef RESIZING int entry_col = Columns; #endif extern char *pct(); + #define NUM_LINES_TO_LEAVE_AT_BOTTOM 3 /* 2 for prompt + 1 for messages/info -dam */ + #define NUM_PROMPT_LINES 2 + #define more_return(cmd) \ { more_cmd = cmd; goto more_exit; } if (ah->a_group != NULL) init_group(ah->a_group); ! /* NOTE: open_news_article in news.c has been modified to always fill in the ! message-id so we can use news.ng_ident to get the message id -dam */ ! ! open_modes = SKIP_HEADER ; ! ! if (show_article_date || header_lines && in_digest) ! open_modes |= FILL_DIGEST_HEADER; ! ! /* if (show_article_date || header_lines) { open_modes |= FILL_NEWS_HEADER; if (header_lines == NULL) open_modes |= GET_DATE_ONLY; ! else open_modes |= GET_ALL_FIELDS; if (in_digest) open_modes |= FILL_DIGEST_HEADER; + } removed 7/6/93 so I could get message-ids -dam */ + + if (show_article_date || header_lines) { + open_modes |= FILL_NEWS_HEADER; + if (in_digest) open_modes |= FILL_DIGEST_HEADER; } art = open_news_article(ah, open_modes, ngheader, dgheader); + #ifdef NNTP + if (nntp_failed) return MC_MENU; /* couldn't read the news... -dam*/ + #endif /* NNTP */ + if (art == NULL) { if (expired_msg_delay >= 0) { msg("Canceled or expired: \"%s: %-.35s\"", ah->sender, ah->subject); *************** *** 368,373 **** --- 396,408 ---- return MC_NEXT; } + /* by calling mon_reading_art here we make an entry for all + read articles, the ones that aren't then voted on simply + have the default vote */ + + mon_reading_art(ah,news.ng_ident); /* -dam */ + mon_start_charging_time_to_article(); /* -dam 6/93 */ + o_mode = in_menu_mode; in_menu_mode = 0; *************** *** 443,449 **** if (mode & (MM_PREVIEW | MM_DIGEST) || n_selected == 0) sprintf(pr_fmt, ! "\1\2--%s-- %s%s %s--%%s--%%s\1", group_name, (mode & MM_DIGEST) ? "DIGEST" : (mode & MM_PREVIEW) ? "PREVIEW" : "LAST", --- 478,485 ---- if (mode & (MM_PREVIEW | MM_DIGEST) || n_selected == 0) sprintf(pr_fmt, ! "\1\2--%s-- %s%s %s--%%s--%%s\1\3\ ! \1hit #'s 0-3 to vote:0=terrible, 1=good, 2=great, 3=fantastic\1", group_name, (mode & MM_DIGEST) ? "DIGEST" : (mode & MM_PREVIEW) ? "PREVIEW" : "LAST", *************** *** 451,457 **** novice ? "--help:?" : ""); else sprintf(pr_fmt, ! "\1\2--%s-- %ld MORE%s %s--%%s--%%s\1", group_name, n_selected, (ah->flag & A_NEXT_SAME) ? "+next" : "", --- 487,494 ---- novice ? "--help:?" : ""); else sprintf(pr_fmt, ! "\1\2--%s-- %ld MORE%s %s--%%s--%%s\1\3\ ! \1hit #'s 0-3 to vote:0=terrible, 1=good, 2=great, 3=fantastic\1", group_name, n_selected, (ah->flag & A_NEXT_SAME) ? "+next" : "", *************** *** 458,464 **** novice ? "--help:?" : ""); } else sprintf(pr_fmt, ! "\1\2-- %s%s %s-----%%s%s-----%%s\1", (mode & MM_PREVIEW) ? "PREVIEW " : "", (mode & MM_DIGEST) ? "FULL DIGEST" : (mode & MM_LAST_SELECTED) ? "LAST ARTICLE" : "ARTICLE", --- 495,502 ---- novice ? "--help:?" : ""); } else sprintf(pr_fmt, ! "\1\2-- %s%s %s-----%%s%s-----%%s\1\3\ ! \1hit #'s 0-3 to vote:0=terrible, 1=good, 2=great, 3=fantastic\1", (mode & MM_PREVIEW) ? "PREVIEW " : "", (mode & MM_DIGEST) ? "FULL DIGEST" : (mode & MM_LAST_SELECTED) ? "LAST ARTICLE" : "ARTICLE", *************** *** 579,585 **** lno1 = lno; topline = linenum; ! window_lines = Lines - lno - 2; print_lines = window_lines; ignore_nl = 1; /* ignore blank lines at top op screen */ --- 617,623 ---- lno1 = lno; topline = linenum; ! window_lines = Lines - lno - NUM_LINES_TO_LEAVE_AT_BOTTOM; print_lines = window_lines; ignore_nl = 1; /* ignore blank lines at top op screen */ *************** *** 894,900 **** } putchar(c); ! } if (match_start) highlight(0); --- 932,938 ---- } putchar(c); ! } if (match_start) highlight(0); *************** *** 1234,1240 **** clrpage(prompt_line); no_raw(); ! if (print_lines + lno < (Lines - 1)) goto next_page; stop_line = -1; --- 1272,1278 ---- clrpage(prompt_line); no_raw(); ! if (print_lines + lno < (Lines - NUM_PROMPT_LINES)) goto next_page; stop_line = -1; *************** *** 1241,1247 **** scroll_next: gotoxy(0, Lines-1); ! c = print_lines + lno - Lines + 2; while (--c >= 0) { putchar(NL); if (--lno1 < 0) topline++; --- 1279,1285 ---- scroll_next: gotoxy(0, Lines-1); ! c = print_lines + lno - Lines + NUM_LINES_TO_LEAVE_AT_BOTTOM; while (--c >= 0) { putchar(NL); if (--lno1 < 0) topline++; *************** *** 1316,1322 **** goto goto_page; case K_LAST_PAGE: ! goto_line = 30000; goto goto_page; case K_GOTO_MATCH: --- 1354,1360 ---- goto goto_page; case K_LAST_PAGE: ! goto_line = 30000; /* what kind of constant hack is this??? -dam */ goto goto_page; case K_GOTO_MATCH: *************** *** 1427,1432 **** --- 1465,1526 ---- compress_space = !compress_space; goto safe_redraw; + /* description of vote behavior: + if auto_advance_on_vote = 0, then accept vote and do nothing + else + 1) if vote pressed on last screen on text, register vote and behave as if space + had been pressed + 2) if vote pressed in middle of article, register vote and go to next screen + */ + + case K_VOTE_HIGH: + { + FILE *art_dup; /* file stream to the begining of the full article text */ + mon_vote_for_article(HIGH_VOTE, news.ng_ident); + vote_for_article(HIGH_VOTE, news.ng_ident, current_group->group_name); + msg("article given a fantastic recommendation and tapestry `likeit'"); + + /* these next three lines are for the tapestry likeit */ + art_dup = open_news_article(ah, (open_modes & ~SKIP_HEADER), ngheader, dgheader); + vote_send_file_stream_to_shell_command(art_dup, + "/project/tapestry/bin/taplikeit"); + fclose(art_dup); + + if (!auto_advance_on_vote) goto same_prompt; + if (eof) break; /* return with command MC_NEXT as does K_CONTINUE */ + goto next_page; /* -dam */ + } + + case K_VOTE_MED: + mon_vote_for_article(MED_VOTE, news.ng_ident); + vote_for_article(MED_VOTE, news.ng_ident,current_group->group_name); + msg("article given a great reccomendation..."); + if (!auto_advance_on_vote) goto same_prompt; + if (eof) break; /* return with command MC_NEXT as does K_CONTINUE */ + goto next_page; /* -dam */ + + case K_VOTE_LOW: + mon_vote_for_article(LOW_VOTE, news.ng_ident); + vote_for_article(LOW_VOTE, news.ng_ident,current_group->group_name); + msg("article given a good reccomendation..."); + if (!auto_advance_on_vote) goto same_prompt; + if (eof) break; /* return with command MC_NEXT as does K_CONTINUE */ + goto next_page; /* -dam */ + + case K_VOTE_HATEIT: + mon_vote_for_article(HATEIT_VOTE, news.ng_ident); + vote_for_article(HATEIT_VOTE, news.ng_ident,current_group->group_name); + msg("article squished into the ground..."); + if (!auto_advance_on_vote) goto same_prompt; + + if (eof) break; /* return with command MC_NEXT as does K_CONTINUE */ + goto next_page; /* -dam */ + + /* or maybe we should just immeadiately go to the next article, since the + user clearly doesn't like this one -dam */ + /* more_return(MC_NEXT); /* -dam */ + + case K_PREVIEW: if (mode & MM_PREVIEW) more_return(MC_PREVIEW_OTHER); *************** *** 1458,1463 **** --- 1552,1558 ---- if (screen_offset == 0) prompt_line = -1; } + mon_stop_charging_time_to_article(); /* -dam 6/93 */ return more_cmd; } diff -c /tilde/maltz/w/test/nn-6.4.18/news.c ./news.c *** /tilde/maltz/w/test/nn-6.4.18/news.c Sat Dec 19 02:49:16 1992 --- ./news.c Wed Aug 4 12:03:07 1993 *************** *** 162,168 **** case 'M': case 'm': ! if (!all) break; if (strncmp(lp, "essage-", 7)) break; lp += 7; check("ID:", 3, ng_ident); --- 162,168 ---- case 'M': case 'm': ! /* if (!all) break; removed so that message_id is always filled -dam */ if (strncmp(lp, "essage-", 7)) break; lp += 7; check("ID:", 3, ng_ident); *************** *** 276,281 **** --- 276,282 ---- news.ng_ref = NULL; news.ng_bref = NULL; news.ng_sender = NULL; + news.ng_ident = NULL; /* ident moved from all_fields to here -dam */ news.ng_xlines = NULL; *************** *** 282,288 **** if (modes & GET_ALL_FIELDS) { news.ng_path = NULL; news.ng_reply = NULL; - news.ng_ident = NULL; news.ng_follow = NULL; news.ng_keyw = NULL; news.ng_dist = NULL; --- 283,288 ---- diff -c /tilde/maltz/w/test/nn-6.4.18/news.h ./news.h *** /tilde/maltz/w/test/nn-6.4.18/news.h Sat Dec 19 02:46:00 1992 --- ./news.h Fri Aug 6 11:02:53 1993 *************** *** 72,78 **** #define GET_ALL_FIELDS 0x0010 /* get all fields (otherwise only */ ! /* name, subj, groups, lines */ #define GET_DATE_ONLY 0x0020 /* get Date field */ --- 72,78 ---- #define GET_ALL_FIELDS 0x0010 /* get all fields (otherwise only */ ! /* name, subj, groups, lines, mess_id */ #define GET_DATE_ONLY 0x0020 /* get Date field */ *************** *** 85,88 **** #define SKIP_HEADER 0x1000 /* position after (sub) header */ - --- 85,87 ---- diff -c /tilde/maltz/w/test/nn-6.4.18/nn.c ./nn.c *** /tilde/maltz/w/test/nn-6.4.18/nn.c Sat Dec 19 02:53:15 1992 --- ./nn.c Wed Dec 22 17:06:47 1993 *************** *** 11,16 **** --- 11,19 ---- #include "options.h" #include "proto.h" #include "articles.h" + #include "monitor.h" /* -dam 6/93 */ + #include "vote.h" /* -dam 10/93 */ + #ifdef USE_MALLOC_H #include #endif *************** *** 612,618 **** static prt_version() { ! printf("Release %s, Kim F. Storm, 1991\n\n", version_id); } display_motd(check) --- 615,625 ---- static prt_version() { ! extern char* help_directory; /* from global.c */ ! ! printf("Release %s, Kim F. Storm, 1991\n", version_id); ! printf("Modified to support collaborative filtering:\n"); ! printf(" see %s/updates for details...\n\n",help_directory); } display_motd(check) *************** *** 1050,1056 **** --- 1057,1067 ---- flush_newsrc(); if (who_am_i == I_AM_NN) + { log_usage(); + mon_send_session_data(); /* -dam */ + vote_send_votes(); /* -dam */ + } if (must_unlock) proto_lock(I_AM_NN, PL_CLEAR); diff -c /tilde/maltz/w/test/nn-6.4.18/nntp.c ./nntp.c *** /tilde/maltz/w/test/nn-6.4.18/nntp.c Sat Dec 19 02:50:26 1992 --- ./nntp.c Fri Aug 6 15:11:36 1993 *************** *** 416,422 **** can_post = 0; break; default: ! user_error(line); /* NOTREACHED */ } } --- 416,431 ---- can_post = 0; break; default: ! msg("Could not connect to server %s (server sez:%s)", ! nntp_server,line); ! is_connected = 0; ! fclose(nntp_out); ! fclose(nntp_in); ! user_delay(2); ! return -1; ! /* user_error(line); -removed to get rid of nn's annoying habit of ! dumping the user out of the program whenever ! the news server's loadav is > 6 -dam */ /* NOTREACHED */ } } diff -c /tilde/maltz/w/test/nn-6.4.18/patchlevel.h ./patchlevel.h *** /tilde/maltz/w/test/nn-6.4.18/patchlevel.h Sat Dec 19 02:57:38 1992 --- ./patchlevel.h Wed Aug 4 12:04:50 1993 *************** *** 27,38 **** * 1991-03-22: Patch #14 (6.4.14) - MEDIUM * 1991-04-02: Patch #15 (6.4.15) - LOW * 1991-04-18: Patch #16 (6.4.16) - HIGH - * - * (Kim lost interest/dissapeared) - * - * 1991-11-19: Patch #17 (6.4.17) - MEDIUM - * 1991-12-01: Patch #18 (6.4.18) - MEDIUM */ ! #define PATCHLEVEL 18 --- 27,33 ---- * 1991-03-22: Patch #14 (6.4.14) - MEDIUM * 1991-04-02: Patch #15 (6.4.15) - LOW * 1991-04-18: Patch #16 (6.4.16) - HIGH */ ! #define PATCHLEVEL 16 diff -c /tilde/maltz/w/test/nn-6.4.18/save.c ./save.c *** /tilde/maltz/w/test/nn-6.4.18/save.c Sat Dec 19 02:49:23 1992 --- ./save.c Wed Aug 4 12:04:55 1993 *************** *** 417,423 **** int was_raw = 0, set_visual = 0; char copybuf[FILENAME * 4], uniqbuf[FILENAME]; flag_type st_flag = A_ST_FILED; ! int with_header; if (ah->a_group) init_group(ah->a_group); --- 417,423 ---- int was_raw = 0, set_visual = 0; char copybuf[FILENAME * 4], uniqbuf[FILENAME]; flag_type st_flag = A_ST_FILED; ! int with_header, is_mail_format; if (ah->a_group) init_group(ah->a_group); *************** *** 541,546 **** --- 541,548 ---- fflush(save_file); if (s_pipe) goto broken_pipe; + is_mail_format = ((current_folder_type == 1) || + (current_folder_type != 2 && use_mail_folders)); lcount = 0; while (ftell(art) < ah->lpos && fgets(copybuf, 512, art)) { lcount++; *************** *** 547,552 **** --- 549,556 ---- if (rot13_active) rot13_line(copybuf); if (saved_header_escape && with_header && is_header_line(copybuf)) fputs(saved_header_escape, save_file); + else if (is_mail_format && !strncmp(copybuf, "From ", 5)) + fputs(">", save_file); fputs(copybuf, save_file); if (s_pipe) goto broken_pipe; } diff -c /tilde/maltz/w/test/nn-6.4.18/term.c ./term.c *** /tilde/maltz/w/test/nn-6.4.18/term.c Sat Dec 19 02:53:27 1992 --- ./term.c Wed Aug 4 12:05:00 1993 *************** *** 1623,1628 **** --- 1623,1629 ---- static char cur_p[FILENAME]; static char saved_p[FILENAME]; use_vararg; + int extra_lines = 0; /* number of extra lines in the prompt */ BATCH_CHECK; *************** *** 1692,1700 **** printf("Mail "); prompt_length += 5; } - continue; ! } putchar(*cp); prompt_length ++; --- 1693,1705 ---- printf("Mail "); prompt_length += 5; } continue; ! } else if (*cp == '\3') /* do a carrage return -dam */ ! { ! extra_lines = extra_lines + 1; ! gotoxy(0, prompt_line + extra_lines); ! continue; ! } putchar(*cp); prompt_length ++; diff -c /tilde/maltz/w/test/nn-6.4.18/variable.c ./variable.c *** /tilde/maltz/w/test/nn-6.4.18/variable.c Sat Dec 19 02:53:29 1992 --- ./variable.c Tue Nov 16 13:09:16 1993 *************** *** 103,110 **** *trusted_escapes, unshar_command[], *unshar_header_file, ! *user_shell; import int /* boolean variables */ also_cross_postings, also_full_digest, --- 103,112 ---- *trusted_escapes, unshar_command[], *unshar_header_file, ! *user_shell, ! *vote_file; /* -dam */ + import int /* boolean variables */ also_cross_postings, also_full_digest, *************** *** 111,116 **** --- 113,119 ---- also_subgroups, append_sig_mail, append_sig_post, + auto_advance_on_vote, /* -dam */ auto_junk_seen, auto_select_subject, auto_preview_mode, *************** *** 179,184 **** --- 182,188 ---- shell_restrictions, show_article_date, show_current_time, + show_only_filtered_arts, /* -dam */ show_motd_on_entry, silent, slow_mode, *************** *** 188,194 **** use_mmdf_folders, use_path_in_from, use_selections, ! use_visible_bell; import int /* integer variables */ also_read_articles, --- 192,200 ---- use_mmdf_folders, use_path_in_from, use_selections, ! use_visible_bell, ! vote_anonymously, /* -dam */ ! participate_in_study; /* -dam */ import int /* integer variables */ also_read_articles, *************** *** 196,202 **** auto_read_limit, auto_select_closed, check_db_update, ! conf_entry_limit, collapse_subject, Columns, data_bits, --- 202,209 ---- auto_read_limit, auto_select_closed, check_db_update, ! conf_entry_limit, ! collab_select_size, /* -dam */ collapse_subject, Columns, data_bits, *************** *** 300,305 **** --- 307,313 ---- "append-signature-mail", BOOL 0, (char **)&append_sig_mail, "append-signature-post", BOOL 0, (char **)&append_sig_post, "attributes", STR 1, (char **)attributes, + "auto-advance-on-vote", BOOL 0, (char **)&auto_advance_on_vote, "auto-junk-seen", BOOL 0, (char **)&auto_junk_seen, "auto-preview-mode", BOOL 0, (char **)&auto_preview_mode, "auto-read-mode-limit", INT 0, (char **)&auto_read_limit, *************** *** 312,317 **** --- 320,326 ---- "case-fold-search", BOOL 0, (char **)&case_fold_search, "check-db-update-time", INT 0, (char **)&check_db_update, "check-group-access", BOOL 0, (char **)&check_group_access, + "collab-select-size", INT 0, (char **)&collab_select_size, "collapse-subject", INT 3, (char **)&collapse_subject, "columns", INT 1, (char **)&Columns, "comp1-key", KEY 0, (char **)&comp1_key, *************** *** 419,424 **** --- 428,434 ---- "orig-to-include-mask", INT 0, (char **)&orig_to_include_mask, "overlap", INT 0, (char **)&overlap, "pager", STR SAFE 3, (char **)&pager, + "participate-in-study", BOOL 0, (char **)&participate_in_study, /* -dam */ "patch-command", STR SAFE 1, (char **)patch_command, "post-distribution", STR 0, (char **)&distribution_post, "preview-continuation", INT 0, (char **)&preview_continuation, *************** *** 454,459 **** --- 464,470 ---- "shading-on", CODES 1, (char **)&shade_on_attr, "shell", STR SAFE 0, (char **)&user_shell, "shell-restrictions", BOOL INIT 0, (char **)&shell_restrictions, + "show-only-filtered-arts", BOOL 0, (char **)&show_only_filtered_arts, "show-purpose-mode", INT 0, (char **)&show_purpose_mode, "silent", BOOL 0, (char **)&silent, "slow-mode", BOOL 0, (char **)&slow_mode, *************** *** 478,483 **** --- 489,496 ---- "use-path-in-from", BOOL 0, (char **)&use_path_in_from, "use-selections", BOOL 0, (char **)&use_selections, "visible-bell", BOOL 0, (char **)&use_visible_bell, + "vote-anonymously", BOOL 0, (char **)&vote_anonymously, + "vote-filename", STR 2, (char **)&vote_file, "window", INT 1, (char **)&preview_window, "word-key", KEY 0, (char **)&delword_key, "wrap-header-margin", INT 2, (char **)&wrap_headers diff -c /tilde/maltz/w/test/nn-6.4.18/xmakefile ./xmakefile *** /tilde/maltz/w/test/nn-6.4.18/xmakefile Sat Dec 19 02:52:02 1992 --- ./xmakefile Tue Nov 16 17:33:52 1993 *************** *** 79,85 **** MASTER = master.o collect.o expire.o proto.o hostname.o \ global.o options.o active.o db.o nntp.o \ ! pack_date.o pack_name.o pack_subject.o news.o digest.o NN = nn.o admin.o proto.o global.o options.o db.o nntp.o \ init.o variable.o term.o keymap.o macro.o regexp.o \ --- 79,86 ---- MASTER = master.o collect.o expire.o proto.o hostname.o \ global.o options.o active.o db.o nntp.o \ ! pack_date.o pack_name.o pack_subject.o news.o digest.o \ ! message_id.o NN = nn.o admin.o proto.o global.o options.o db.o nntp.o \ init.o variable.o term.o keymap.o macro.o regexp.o \ *************** *** 86,92 **** menu.o more.o newsrc.o group.o folder.o dir.o \ sort.o articles.o sequence.o kill.o active.o fullname.o \ answer.o reroute.o hostname.o save.o unshar.o decode.o execute.o \ ! pack_date.o pack_name.o pack_subject.o news.o digest.o match.o ACCT = account.o global.o options.o proto.o hostname.o --- 87,95 ---- menu.o more.o newsrc.o group.o folder.o dir.o \ sort.o articles.o sequence.o kill.o active.o fullname.o \ answer.o reroute.o hostname.o save.o unshar.o decode.o execute.o \ ! pack_date.o pack_name.o pack_subject.o news.o digest.o match.o \ ! monitor.o vote.o filter.o message_id.o \ ! colinterface.o collabdata.o collabtcp.o ACCT = account.o global.o options.o proto.o hostname.o *************** *** 247,252 **** --- 250,264 ---- term.o: term.c config.h global.h vararg.h data.h term.h keymap.h unshar.o: unshar.c config.h global.h vararg.h data.h variable.o: variable.c config.h global.h vararg.h data.h + + * -dam 6/93 + monitor.o: monitor.c monitor.h data.h + vote.o: vote.h monitor.h data.h + message_id.o: message_id.c message_id.h + filter.o: filter.c message_id.h + colinterface.o: colinterface.c colinterface.h collabconfig.h + collabtcp.o: collabtcp.h collabconfig.h + collabdata.o: collabdata.h collabconfig.h colinterface.h * link debugging version diff -c /tilde/maltz/w/test/nn-6.4.18/help/help.attr help//help.attr *** /tilde/maltz/w/test/nn-6.4.18/help/help.attr Wed Apr 18 15:43:53 1990 --- help//help.attr Wed Dec 22 20:08:08 1993 *************** *** 5,10 **** --- 5,11 ---- (blank) Unread * Selected (if terminal doesn't have standout mode or at slow speed) + $ Selected by filtering system (~ will unselect, D will display) . Read (or saved) , Seen on menu (but not read) diff -c /tilde/maltz/w/test/nn-6.4.18/help/help.commands help//help.commands *** /tilde/maltz/w/test/nn-6.4.18/help/help.commands Sat Dec 19 02:39:00 1992 --- help//help.commands Fri Dec 17 11:15:27 1993 *************** *** 68,70 **** --- 68,71 ---- unshar unshar article(s) unsub U U unsubscribe (or subscribe) to current group version V V print release information + vote 1-3,6 cast vote for an article diff -c /tilde/maltz/w/test/nn-6.4.18/help/help.menu help//help.menu *** /tilde/maltz/w/test/nn-6.4.18/help/help.menu Sat May 5 05:50:18 1990 --- help//help.menu Fri Dec 17 11:18:14 1993 *************** *** 6,14 **** @ ~ Reverse/Undo all selections ^ $ First/Last menu page =regexp Matching subjects (=. selects all) L/JJJJ Leave/Change attributes ! ;:ASHOW SELECTED ARTICLES;:A ! SPACE Show (only when on last menu page) ! Z Show NOW, and return to this group afterwards X Show NOW, and continue with next group ;:AGOTO OTHER GROUPS;:A X Update current group, skip to next. Y Group overview --- 6,14 ---- @ ~ Reverse/Undo all selections ^ $ First/Last menu page =regexp Matching subjects (=. selects all) L/JJJJ Leave/Change attributes ! ;:ASHOW SELECTED ARTICLE;:A D Display filtered/all arts ! SPACE Show (only when on last menu page) [ ] Dec/Inc # of filtered arts ! Z Show NOW, and return to this group X Show NOW, and continue with next group ;:AGOTO OTHER GROUPS;:A X Update current group, skip to next. Y Group overview diff -c /tilde/maltz/w/test/nn-6.4.18/help/help.more help//help.more *** /tilde/maltz/w/test/nn-6.4.18/help/help.more Mon Apr 23 10:32:34 1990 --- help//help.more Fri Dec 17 11:25:37 1993 *************** *** 11,21 **** l mark article for later action U (un)subscribe to group k kill subject (not permanently) K kill/select handling * select subject ! ;:AQUIT / ESCAPE;:A ! ;:ASAVE;:A = back to menu ! s, o, w save with full/short/no header N goto next group ! :unshar :decode :patch unpack article X as N, mark as read ! !, ^Z Shell escape, suspend ;:AREPLY, POST;:A Q quit nn r mail reply to author of article m mail (or forward article) ;:AREDRAW;:A --- 11,21 ---- l mark article for later action U (un)subscribe to group k kill subject (not permanently) K kill/select handling * select subject ! ;:AVOTING;:A ;:AQUIT / ESCAPE;:A ! 1, 2, 3, 0 good, great, fantastic, terrible = back to menu ! ;:ASAVE;:A N goto next group ! s, o, w save with full/short/no header X as N, mark as read ! :unshar :decode :patch unpack article !, ^Z Shell escape, suspend ;:AREPLY, POST;:A Q quit nn r mail reply to author of article m mail (or forward article) ;:AREDRAW;:A