Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site sdcrdcf.UUCP Path: utzoo!linus!philabs!cmcl2!seismo!harvard!talcott!panda!genrad!decvax!ittvax!dcdwest!sdcsvax!sdcrdcf!lwall From: lwall@sdcrdcf.UUCP (Larry Wall) Newsgroups: net.sources.bugs Subject: rn 4.3 patch #4 Message-ID: <1965@sdcrdcf.UUCP> Date: Mon, 13-May-85 20:35:10 EDT Article-I.D.: sdcrdcf.1965 Posted: Mon May 13 20:35:10 1985 Date-Received: Thu, 16-May-85 07:45:54 EDT Organization: System Development Corp. R+D, Santa Monica Lines: 627 System: rn version 4.3 Patch #: 4 Priority: ENHANCEMENT Subject: there should be a way to suppress quoted material and signatures From: lwall@sdcrdcf.UUCP (Larry Wall) Description: There have been numerous requests for a way to suppress quoted material and oversized signatures, especially at low baud rates. I resisted implementing any of the proposed solutions in the released version because I didn't feel they were general enough. It suddenly occured to me, however, that we already had regular expressions that supported alternatives, and that by defining a couple more environment variables (which can be set via a baud-rate-controlled -E switch) we could do what we wanted without hardwiring the current net conventions into rn. The following are the new "environment" variables: HIDELINE -- contains, if defined, a pattern of lines to hide. Can be used to suppress lines beginning with ">", for instance. PAGESTOP -- contains, if defined, a pattern of lines to treat as form feeds. This can be used to do page breaks between articles in a digest, and to do a page break before the signature, which can then be recognized (from the "--") and 'n'ed. Fix: From rn, say "| patch -d DIR", where DIR is your rn source directory. Outside of rn, say "cd DIR; patch Patch #: 4 Index: art.c Prereq: 4.3.1.2 *** art.c.old Mon May 13 09:32:42 1985 --- art.c Mon May 13 09:32:48 1985 *************** *** 1,4 ! /* $Header: art.c,v 4.3.1.2 85/05/10 13:46:07 lwall Exp $ * * $Log: art.c,v $ * Revision 4.3.1.2 85/05/10 13:46:07 lwall --- 1,4 ----- ! /* $Header: art.c,v 4.3.1.3 85/05/13 09:29:55 lwall Exp $ * * $Log: art.c,v $ * Revision 4.3.1.3 85/05/13 09:29:55 lwall *************** *** 1,6 /* $Header: art.c,v 4.3.1.2 85/05/10 13:46:07 lwall Exp $ * * $Log: art.c,v $ * Revision 4.3.1.2 85/05/10 13:46:07 lwall * Fixed header reparse bug on backpage. * --- 1,9 ----- /* $Header: art.c,v 4.3.1.3 85/05/13 09:29:55 lwall Exp $ * * $Log: art.c,v $ + * Revision 4.3.1.3 85/05/13 09:29:55 lwall + * Added CUSTOMLINES option. + * * Revision 4.3.1.2 85/05/10 13:46:07 lwall * Fixed header reparse bug on backpage. * *************** *** 61,66 bool firstpage; /* is this the 1st page of article? */ void art_init() { --- 64,71 ----- bool firstpage; /* is this the 1st page of article? */ + char art_buf[LBUFLEN]; /* place for article lines */ + void art_init() { *************** *** 72,78 { register char *s; ART_POS artsize; /* size in bytes of article */ - char art_buf[LBUFLEN]; /* place for article lines */ bool hide_this_line = FALSE; /* hidden header line? */ ART_LINE linenum; /* line # on page, 1 origin */ #ifdef ULSMARTS --- 77,82 ----- { register char *s; ART_POS artsize; /* size in bytes of article */ bool hide_this_line = FALSE; /* hidden header line? */ ART_LINE linenum; /* line # on page, 1 origin */ #ifdef ULSMARTS *************** *** 199,204 hide_this_line = TRUE; /* and do not print either */ notesfiles = FALSE; } if (in_header && htype[in_header].ht_flags & HT_MAGIC) { if (in_header == NGS_LINE) { hide_this_line = (index(art_buf,',') == Nullch && do_hiding); --- 203,213 ----- hide_this_line = TRUE; /* and do not print either */ notesfiles = FALSE; } + #ifdef CUSTOMLINES + if (hideline && bufptr == art_buf && + execute(&hide_compex,art_buf) ) + hide_this_line = TRUE; + #endif if (in_header && htype[in_header].ht_flags & HT_MAGIC) { if (in_header == NGS_LINE) { hide_this_line = (index(art_buf,',') == Nullch); *************** *** 201,207 } if (in_header && htype[in_header].ht_flags & HT_MAGIC) { if (in_header == NGS_LINE) { ! hide_this_line = (index(art_buf,',') == Nullch && do_hiding); } else if (in_header == EXPIR_LINE) { if (!(htype[EXPIR_LINE].ht_flags & HT_HIDE)) --- 210,216 ----- #endif if (in_header && htype[in_header].ht_flags & HT_MAGIC) { if (in_header == NGS_LINE) { ! hide_this_line = (index(art_buf,',') == Nullch); } else if (in_header == EXPIR_LINE) { if (!(htype[EXPIR_LINE].ht_flags & HT_HIDE)) *************** *** 205,211 } else if (in_header == EXPIR_LINE) { if (!(htype[EXPIR_LINE].ht_flags & HT_HIDE)) ! hide_this_line = (strlen(art_buf) < 10 && do_hiding); } } if (in_header == SUBJ_LINE && --- 214,220 ----- } else if (in_header == EXPIR_LINE) { if (!(htype[EXPIR_LINE].ht_flags & HT_HIDE)) ! hide_this_line = (strlen(art_buf) < 10); } } if (in_header == SUBJ_LINE && *************** *** 243,249 underprint(s); /* print subject underlined */ putchar('\n') FLUSH; /* and finish the line */ } ! else if (hide_this_line) { /* do not print line? */ linenum--; /* compensate for linenum++ */ if (!in_header) hide_this_line = FALSE; --- 252,259 ----- underprint(s); /* print subject underlined */ putchar('\n') FLUSH; /* and finish the line */ } ! else if (hide_this_line && do_hiding) { ! /* do not print line? */ linenum--; /* compensate for linenum++ */ if (!in_header) hide_this_line = FALSE; *************** *** 277,282 #endif maybe_eol(); /* PWP */ #endif CLEAREOL for (outpos = 0; outpos < COLS; ) { /* while line has room */ if (*bufptr >= ' ') { /* normal char? */ --- 287,297 ----- #endif maybe_eol(); /* PWP */ #endif CLEAREOL + #ifdef CUSTOMLINES + if (pagestop && bufptr == art_buf && + execute(&page_compex,art_buf) ) + linenum = 32700; + #endif for (outpos = 0; outpos < COLS; ) { /* while line has room */ if (*bufptr >= ' ') { /* normal char? */ *************** *** 559,565 case Ctl('d'): /* half page */ special = TRUE; slines = LINES / 2 + 1; ! if (marking && *blinebeg != '\f') { up_line(); highlight = --artline; restart = blinebeg; --- 574,585 ----- case Ctl('d'): /* half page */ special = TRUE; slines = LINES / 2 + 1; ! if (marking && *blinebeg != '\f' ! #ifdef CUSTOMLINES ! && (!pagestop || blinebeg != art_buf || ! !execute(&page_compex,blinebeg)) ! #endif ! ) { up_line(); highlight = --artline; restart = blinebeg; *************** *** 803,809 clear(); /* else clear screen */ #endif CLEAREOL ! if (*blinebeg != '\f') { restart = blinebeg; artline--; /* restart this line */ artpos = alinebeg; --- 823,834 ----- clear(); /* else clear screen */ #endif CLEAREOL ! if (*blinebeg != '\f' ! #ifdef CUSTOMLINES ! && (!pagestop || blinebeg != art_buf || ! !execute(&page_compex,blinebeg)) ! #endif ! ) { restart = blinebeg; artline--; /* restart this line */ artpos = alinebeg; *************** *** 814,820 /* and remember top line of screen */ /* (line # within article file) */ } ! else if (marking && *blinebeg != '\f') { /* are we marking repeats? */ up_line(); /* go up one line */ highlight = --artline;/* and get ready to highlight */ --- 839,850 ----- /* and remember top line of screen */ /* (line # within article file) */ } ! else if (marking && *blinebeg != '\f' ! #ifdef CUSTOMLINES ! && (!pagestop || blinebeg != art_buf || ! !execute(&page_compex,blinebeg)) ! #endif ! ) { /* are we marking repeats? */ up_line(); /* go up one line */ highlight = --artline;/* and get ready to highlight */ Index: artstate.h Prereq: 4.3 *** artstate.h.old Mon May 13 09:31:51 1985 --- artstate.h Mon May 13 09:31:52 1985 *************** *** 1,4 ! /* $Header: artstate.h,v 4.3 85/05/01 11:35:59 lwall Exp $ * * $Log: artstate.h,v $ * Revision 4.3 85/05/01 11:35:59 lwall --- 1,4 ----- ! /* $Header: artstate.h,v 4.3.1.2 85/05/13 09:30:30 lwall Exp $ * * $Log: artstate.h,v $ * Revision 4.3.1.2 85/05/13 09:30:30 lwall *************** *** 1,6 /* $Header: artstate.h,v 4.3 85/05/01 11:35:59 lwall Exp $ * * $Log: artstate.h,v $ * Revision 4.3 85/05/01 11:35:59 lwall * Baseline for release with 4.3bsd. * --- 1,12 ----- /* $Header: artstate.h,v 4.3.1.2 85/05/13 09:30:30 lwall Exp $ * * $Log: artstate.h,v $ + * Revision 4.3.1.2 85/05/13 09:30:30 lwall + * Added CUSTOMLINES option. + * + * Revision 4.3.1.1 85/05/10 11:31:32 lwall + * Branch for patches. + * * Revision 4.3 85/05/01 11:35:59 lwall * Baseline for release with 4.3bsd. * *************** *** 19,21 EXT char *prompt; /* pointer to current prompt */ EXT char *firstline INIT(Nullch); /* special first line? */ --- 25,33 ----- EXT char *prompt; /* pointer to current prompt */ EXT char *firstline INIT(Nullch); /* special first line? */ + #ifdef CUSTOMLINES + EXT char *hideline INIT(Nullch); /* custom line hiding? */ + EXT char *pagestop INIT(Nullch); /* custom page terminator? */ + EXT COMPEX hide_compex; + EXT COMPEX page_compex; + #endif Index: common.h Prereq: 4.3 *** common.h.old Mon May 13 09:31:29 1985 --- common.h Mon May 13 09:31:33 1985 *************** *** 1,4 ! /* $Header: common.h,v 4.3 85/05/01 11:37:11 lwall Exp $ * * $Log: common.h,v $ * Revision 4.3 85/05/01 11:37:11 lwall --- 1,4 ----- ! /* $Header: common.h,v 4.3.1.2 85/05/13 09:30:39 lwall Exp $ * * $Log: common.h,v $ * Revision 4.3.1.2 85/05/13 09:30:39 lwall *************** *** 1,6 /* $Header: common.h,v 4.3 85/05/01 11:37:11 lwall Exp $ * * $Log: common.h,v $ * Revision 4.3 85/05/01 11:37:11 lwall * Baseline for release with 4.3bsd. * --- 1,12 ----- /* $Header: common.h,v 4.3.1.2 85/05/13 09:30:39 lwall Exp $ * * $Log: common.h,v $ + * Revision 4.3.1.2 85/05/13 09:30:39 lwall + * Added CUSTOMLINES option. + * + * Revision 4.3.1.1 85/05/10 11:32:04 lwall + * Branch for patches. + * * Revision 4.3 85/05/01 11:37:11 lwall * Baseline for release with 4.3bsd. * *************** *** 215,220 /* In general, earlier ones are easier to get along without */ /* Pdp11's without split I and D may have to undefine them all */ #define DEBUGGING /* include debugging code */ #define PUSHBACK /* macros and keymaps using pushback buffer */ #define SPEEDOVERMEM /* use more memory to run faster */ #define WORDERASE /* enable ^W to erase a word */ --- 221,227 ----- /* In general, earlier ones are easier to get along without */ /* Pdp11's without split I and D may have to undefine them all */ #define DEBUGGING /* include debugging code */ + #define CUSTOMLINES /* include code for HIDELINE and PAGESTOP */ #define PUSHBACK /* macros and keymaps using pushback buffer */ #define SPEEDOVERMEM /* use more memory to run faster */ #define WORDERASE /* enable ^W to erase a word */ Index: ng.c Prereq: 4.3 *** ng.c.old Mon May 13 09:32:07 1985 --- ng.c Mon May 13 09:32:13 1985 *************** *** 1,4 ! /* $Header: ng.c,v 4.3 85/05/01 11:43:43 lwall Exp $ * * $Log: ng.c,v $ * Revision 4.3 85/05/01 11:43:43 lwall --- 1,4 ----- ! /* $Header: ng.c,v 4.3.1.2 85/05/13 09:29:28 lwall Exp $ * * $Log: ng.c,v $ * Revision 4.3.1.2 85/05/13 09:29:28 lwall *************** *** 1,6 /* $Header: ng.c,v 4.3 85/05/01 11:43:43 lwall Exp $ * * $Log: ng.c,v $ * Revision 4.3 85/05/01 11:43:43 lwall * Baseline for release with 4.3bsd. * --- 1,12 ----- /* $Header: ng.c,v 4.3.1.2 85/05/13 09:29:28 lwall Exp $ * * $Log: ng.c,v $ + * Revision 4.3.1.2 85/05/13 09:29:28 lwall + * Added CUSTOMLINES option. + * + * Revision 4.3.1.1 85/05/10 11:36:00 lwall + * Branch for patches. + * * Revision 4.3 85/05/01 11:43:43 lwall * Baseline for release with 4.3bsd. * *************** *** 29,34 #include "backpage.h" #include "rcln.h" #include "last.h" #include "INTERN.h" #include "ng.h" #include "artstate.h" /* somebody has to do it */ --- 35,41 ----- #include "backpage.h" #include "rcln.h" #include "last.h" + #include "search.h" #include "INTERN.h" #include "ng.h" #include "artstate.h" /* somebody has to do it */ *************** *** 51,56 #ifdef KILLFILES open_kfile(KF_GLOBAL); #endif } /* do newsgroup on line ng with name ngname */ --- 58,67 ----- #ifdef KILLFILES open_kfile(KF_GLOBAL); #endif + #ifdef CUSTOMLINES + init_compex(&hide_compex); + init_compex(&page_compex); + #endif } /* do newsgroup on line ng with name ngname */ *************** *** 164,173 writelast(); - /* do they want a special top line? */ - - firstline = getval("FIRSTLINE",Nullch); - /* see if there are any special searches to do */ #ifdef KILLFILES --- 175,180 ----- writelast(); /* see if there are any special searches to do */ #ifdef KILLFILES *************** *** 182,187 #endif #endif /* now read each unread article */ rc_changed = doing_ng = TRUE; /* enter the twilight zone */ --- 189,207 ----- #endif #endif + /* do they want a special top line? */ + + firstline = getval("FIRSTLINE",Nullch); + + /* custom line suppression, custom page ending */ + + #ifdef CUSTOMLINES + if (hideline = getval("HIDELINE",Nullch)) + compile(&hide_compex,hideline,TRUE,TRUE); + if (pagestop = getval("PAGESTOP",Nullch)) + compile(&page_compex,pagestop,TRUE,TRUE); + #endif + /* now read each unread article */ rc_changed = doing_ng = TRUE; /* enter the twilight zone */ Index: rn.1 Prereq: 4.3 *** rn.1.old Mon May 13 09:33:24 1985 --- rn.1 Mon May 13 09:33:34 1985 *************** *** 1,4 ! ''' $Header: rn.1,v 4.3 85/05/01 11:48:26 lwall Exp $ ''' ''' $Log: rn.1,v $ ''' Revision 4.3 85/05/01 11:48:26 lwall --- 1,4 ----- ! ''' $Header: rn.1,v 4.3.1.2 85/05/13 09:27:53 lwall Exp $ ''' ''' $Log: rn.1,v $ ''' Revision 4.3.1.2 85/05/13 09:27:53 lwall *************** *** 1,6 ''' $Header: rn.1,v 4.3 85/05/01 11:48:26 lwall Exp $ ''' ''' $Log: rn.1,v $ ''' Revision 4.3 85/05/01 11:48:26 lwall ''' Baseline for release with 4.3bsd. ''' --- 1,12 ----- ''' $Header: rn.1,v 4.3.1.2 85/05/13 09:27:53 lwall Exp $ ''' ''' $Log: rn.1,v $ + ''' Revision 4.3.1.2 85/05/13 09:27:53 lwall + ''' Added CUSTOMLINES option. + ''' + ''' Revision 4.3.1.1 85/05/10 11:38:22 lwall + ''' Branch for patches. + ''' ''' Revision 4.3 85/05/01 11:48:26 lwall ''' Baseline for release with 4.3bsd. ''' *************** *** 1271,1276 Warning: this may go away. .Sp Default: Article %a %(%U%M!=^00$?(%U more%(%M!=^0$? + %M Marked to return)\e) )in %C:, more or less. .Ip HOME 8 Your home directory. Affects ~ interpretation, and the location of your --- 1277,1299 ----- Warning: this may go away. .Sp Default: Article %a %(%U%M!=^00$?(%U more%(%M!=^0$? + %M Marked to return)\e) )in %C:, more or less. + .Ip HIDELINE 8 + If defined, contains a regular expression which matches article lines to + be hidden, in order, for instance, to suppress quoted material. + A recommended string for this purpose is \*(L"^>...\*(R", which \fIdoesn't\fR + hide lines with only \*(L'>\*(R', to give some indication that quoted + material is being skipped. + If you want to hide more than one pattern, you can use \*(L"\|\*(R" to + separate the alternatives. + You can view the hidden lines by restarting the article with the \*(L'v\*(R' + command. + .Sp + There is some overhead involved in matching each line of the article against + a regular expression. + You might wish to use a baud-rate modifier to enable this feature only at + low baud rates. + .Sp + Default: undefined .Ip HOME 8 Your home directory. Affects ~ interpretation, and the location of your *************** *** 1401,1406 May be interpolated using \*(L"%o\*(R". .Sp Default: whatever your news administrator compiled in. .Ip "PIPESAVER (%)" 8 The shell command to execute in order to accomplish a save to a pipe (\*(L"s\ |\ command\*(R" or \*(L"w\ |\ command\*(R"). --- 1424,1449 ----- May be interpolated using \*(L"%o\*(R". .Sp Default: whatever your news administrator compiled in. + .Ip PAGESTOP 8 + If defined, contains a regular expression which matches article lines to + be treated as form-feeds. + There are at least two things you might want to do with this. + To cause page breaks between articles in a digest, you might define it + as \*(L"^--------\*(R". + To force a page break before a signature, you could define it + as \*(L"^-- $\*(R". + (Then, when you see \*(L"--\*(R" at the bottom of the page, you can skip + the signature if you so desire by typing \*(L'n\*(R' instead of space.) + To do both, you could use \*(L"^--\*(R". + If you want to break on more than one pattern, you can use \*(L"\|\*(R" to + separate the alternatives. + .Sp + There is some overhead involved in matching each line of the article against + a regular expression. + You might wish to use a baud-rate modifier to enable this feature only at + low baud rates. + .Sp + Default: undefined .Ip "PIPESAVER (%)" 8 The shell command to execute in order to accomplish a save to a pipe (\*(L"s\ |\ command\*(R" or \*(L"w\ |\ command\*(R").