[news.admin] enhancement to rn = index command

trb@haddock.ISC.COM (Andrew Tannenbaum) (03/19/88)

System: rn version 4.3
Priority: LOW
Subject: enhancement to rn = index command
>From: trb@ima.isc.com (Andrew Tannenbaum)

Description:
	This patch lets you use printf-style formatting in rn strings,
	most usefully, the SUBJLINE variable.

	This is a patch to rn patch level 40.  I sent it to Larry Wall
	back in Dec 1987, and he said to post it myself.  I didn't add
	new RCS IDs, as I figured it could cause confusion since I don't
	control rn.  I've been running the code for four months on two
	different types of UNIX systems, without incident.

	A sample of the output is just below.  The format used is
	-ESUBJLINE="%:-50.50s %:.24t"

	This work was done by me and Karl Heuer.  Karl points out that
	%+ has special meaning to printf, and %: is used by terminfo to
	disambiguate %wid.prec in a similar manner (see terminfo(4):
	Parameterized strings).  This hack only distinguished + and -
	for justification, it doesn't do %# or fancy %+.  It's all
	#ifdef PADTRUNC.

	I also fixed the /foo/= bug (it wasn't checking SUBJLINE).  I
	notice that the %s fields have all the Re's stripped off, which
	isn't quite right, but I haven't dealt with that.  (That's an
	existing bug, or at least the doc for = says that it uses %s by
	default).

Fix:	To fix rn, install the following patches and recompile.

	From rn, say "| patch -d DIR", where DIR is your rn source directory.
	Outside of rn, say "cd DIR; patch <thisarticle".  If you don't have
	the patch program, apply the following by hand, or get patch.

	Andrew Tannenbaum   Interactive   Boston, MA   +1 617 247 1155
<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
Sample output: 

What next? [^Nnpq] =
...
 5584 Ultrix uucp problems - Help!                  steph@alberta.UUCP
 5585 Ksh question.                                 lenny@quincy.UUCP
 5586 POSIX execlfd and execvfd proposal            karl@tut.cis.ohio-state.
 5588 suggest solutions for "rm *"                  jsb@dasys1.UUCP
 5589 3b5 inode problem with news                   KEN%ORION.BITNET@CUNYVM.
 5590 The whole prompt string thing (was: PS1 and t marcos@caus-dp.UUCP
 5592 setpgrp() bug?                                chapman@sco.COM
 5593 more rm insanity                              chris@mimsy.UUCP
 5595 //host vs "mount point"                       matt@oddjob.UChicago.EDU
...
What next? [^Nnpq]
Type h for help.
What next? [^Nnpq] /gwyn/h=
Searching...
 5576 The whole prompt string thing (was: PS1 and t gwyn@brl.arpa
 5578 Bug in Ultrix2.0?                             gwyn@brl.arpa
 5611 The whole prompt string thing (was: PS1 and t gwyn@brl.arpa
 5612 globbing in the shell (Was Re: more rm insani gwyn@brl.arpa
 5659 Help! How 2 get info from C to Unix script    gwyn@brl.arpa
 5662 globbing in the shell                         gwyn@brl.arpa
 5676 shell globbing universal ?????                gwyn@brl.arpa
 5690 more rm insanity                              gwyn@brl.arpa
 5692 globbing in the shell (Was Re: more rm insani gwyn@brl.arpa
 5695 ACCESS TO SHARED TAPEDRIVES                   gwyn@brl.arpa
What next? [^Nnpq]
<<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>><<>>
*** common.h.ok	Thu Dec  3 16:26:44 1987
--- common.h	Thu Dec  3 16:24:38 1987
***************
*** 166,171 ****
--- 166,174 ----
   *		pattern that had brackets.  %0 matches the last bracket
   *		matched, in case you had alternatives.
   *
+  *	(#ifdef PADTRUNC) Put : in the middle for printf-style formatting:
+  *		-ESUBJLINE="%:-50.50s %:.24t"
+  *
   *	Put ^ in the middle to capitalize the first letter: %^C = Net.jokes
   *	Put _ in the middle to capitalize last component: %_c = net/Jokes
   *
***************
*** 293,298 ****
--- 296,302 ----
  #define KILLFILES	/* automatic article killer files */
  #define ARTSEARCH	/* pattern searches among articles */
  			/* /, ?, ^N, ^P, k, K */
+ #define PADTRUNC	/* printf-style command modifiers */
  
  /* some dependencies among options */
  
*** intrp.c.ok	Tue Dec  1 18:36:38 1987
--- intrp.c	Wed Dec  2 13:31:21 1987
***************
*** 397,402 ****
--- 397,406 ----
      bool upper = FALSE;
      bool lastcomp = FALSE;
      int metabit = 0;
+ #ifdef PADTRUNC
+     int wid;
+     int prec;
+ #endif
  
      while (*pattern && (!stoppers || !index(stoppers,*pattern))) {
  #ifdef DEBUGGING
***************
*** 406,413 ****
--- 410,436 ----
  	if (*pattern == '%' && pattern[1]) {
  	    upper = FALSE;
  	    lastcomp = FALSE;
+ #ifdef PADTRUNC
+ 	    wid = 0;
+ 	    prec = 1000;
+ #endif
  	    for (s=Nullch; !s; ) {
  		switch (*++pattern) {
+ #ifdef PADTRUNC
+ 		case ':':
+ 		    if (isdigit(*++pattern) || *pattern == '-') {
+ 			wid = atol(pattern);
+ 		        while (isdigit(*++pattern) || *pattern == '-')
+ 			    ;
+ 		    }
+ 		    if (*pattern == '.') {
+ 			prec = atol(++pattern);
+ 		    	while (isdigit(*pattern))
+ 			    pattern++;
+ 		    }
+ 		    pattern--;
+ 		    break;
+ #endif
  		case '^':
  		    upper = TRUE;
  		    break;
***************
*** 831,836 ****
--- 854,867 ----
  		if (islower(*t))
  		    *t = toupper(*t);
  	    }
+ #ifdef PADTRUNC
+ 	    if (s != scrbuf) {
+ 		safecpy(scrbuf,s,(sizeof scrbuf));
+ 		s = scrbuf;
+ 	    }
+ 	    sprintf(dest, "%*.*s", wid, prec, s);
+ 	    s = dest;
+ #endif
  	    i = metabit;		/* maybe get into register */
  	    if (s == dest) {
  		while (*dest) {
*** ngstuff.c.ok	Thu Dec  3 14:35:26 1987
--- ngstuff.c	Thu Dec  3 15:22:10 1987
***************
*** 222,228 ****
--- 222,232 ----
      register int ch;
      
      if (toplevel) {
+ #ifdef PADTRUNC
+ 	printf("%5ld ",art);
+ #else
  	printf("%-6ld",art);
+ #endif
  	fflush(stdout);
      }
      for (; ch = *cmdlst; cmdlst++) {
***************
*** 259,265 ****
--- 263,281 ----
  #endif
  	}
  	else if (ch == '=') {
+ #ifdef PADTRUNC
+ 	    char tmpbuf[256];
+ 	    char *subjline = getval("SUBJLINE",Nullch);
+ 
+ 	    if (subjline) {	/* probably fetches it again! */
+ 		/* art = i; */
+ 		interp(tmpbuf, (sizeof tmpbuf), subjline);
+ 		printf(tmpbuf);
+ 	    } else
+ 		printf(fetchsubj(art,FALSE,FALSE));
+ #else
  	    printf("\t%s",fetchsubj(art,FALSE,FALSE));
+ #endif
  #ifdef VERBOSE
  	    IF(verbose)
  		;
*** rn.1.ok	Thu Dec  3 16:41:16 1987
--- rn.1	Thu Dec  3 16:53:17 1987
***************
*** 1247,1252 ****
--- 1247,1260 ----
  \*(L"%^C\*(R" produces something like \*(L"Net.jokes\*(R".
  Inserting \*(L'_\*(R' causes the first letter following the last
  \&\*(L'/\*(R' to be capitalized: \*(L"%_c\*(R" produces \*(L"net/Jokes\*(R".
+ Inserting \*(L':\*(R' causes the substitution value to be printed with
+ printf-style formatting.  If you want your indices to have up to 50
+ characters of subject followed by 24 characters of author,
+ you can define the following environment variable with \-E:
+ .Sp
+ .nf
+ SUBJLINE=\*(L%:"\-50.50s %:.24t\*(R".
+ .fi
  .SH ENVIRONMENT
  The following environment variables are paid attention to by
  .IR rn .

per@erix.UUCP (Per Hedeland) (03/22/88)

In article <3063@haddock.ISC.COM> trb@haddock.isc.com (Andrew Tannenbaum) writes:
>	This patch lets you use printf-style formatting in rn strings,
>	most usefully, the SUBJLINE variable.
>
>	A sample of the output is just below.  The format used is
>	-ESUBJLINE="%:-50.50s %:.24t"

This is actually quite unnecessary, you can achieve the same effect with
standard rn and

-ESUBJLINE="\
%(%s                                                  =\
^\\(..................................................\\)?%1) \
%(%t=^\\(........................\\)?%1:%t)"

(Your example seems to use 45 cols for the subject, though, which is probably
better on an 80 col terminal.) Of course, it's a bit more complicated, but
how often do you change your SUBJLINE? (Here is mine, BTW, created from the
"sample" used the previous time this fix was suggested:

-ESUBJLINE="\
%(%(%f=(\\(.*[^ ].*\\))$?%1:%f)               =^\\(...............\\)?%1) \
(%(    %[lines]=\\(....\\)$?%1)) \
%(%[subject]=^\\(...................................................\\)?\
%1:%[subject])"

)

>	I also fixed the /foo/= bug (it wasn't checking SUBJLINE).  I

I guess it's debatable whether this is correct. I would say that the
documentation is (slightly) inaccurate when saying that = prints the "subject".

>	I notice that the %s fields have all the Re's stripped off, which
>	isn't quite right, but I haven't dealt with that.  (That's an
>	existing bug, or at least the doc for = says that it uses %s by
>	default).

If you want them, just use %[subject] instead of %s above. (Surely, nobody
uses the defaults? :-)

--Per Hedeland
per@erix.ericsson.se  or  {mcvax,uunet}!enea!erix!per