Module Name: src
Committed By: ginsbach
Date: Tue Jul 24 02:13:05 UTC 2012
Modified Files:
src/usr.bin/pr: pr.1 pr.c pr.h
Log Message:
- Fix PR 19468 by adding -f and -p options to pr(1).
Changes adapted from patch by Ryan Younce and FreeBSD. The provided
patch was not used directly as the changes didn't mimic the System V
origins of these options. System V pr(1) does not pause for empty files.
These changes follow that precedent.
- Improve man page description of the -i option.
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/usr.bin/pr/pr.1
cvs rdiff -u -r1.22 -r1.23 src/usr.bin/pr/pr.c
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/pr/pr.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/pr/pr.1
diff -u src/usr.bin/pr/pr.1:1.18 src/usr.bin/pr/pr.1:1.19
--- src/usr.bin/pr/pr.1:1.18 Sun Apr 8 22:00:39 2012
+++ src/usr.bin/pr/pr.1 Tue Jul 24 02:13:04 2012
@@ -1,8 +1,10 @@
-.\" $NetBSD: pr.1,v 1.18 2012/04/08 22:00:39 wiz Exp $
+.\" $NetBSD: pr.1,v 1.19 2012/07/24 02:13:04 ginsbach Exp $
.\"
.\" Copyright (c) 1991 Keith Muller.
.\" Copyright (c) 1993
.\" The Regents of the University of California. All rights reserved.
+.\" Copyright (c) 1994-1995, 1997, 1999-2003, 2009, 2012
+.\" The NetBSD Foundation, Inc.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" Keith Muller of the University of California, San Diego.
@@ -32,9 +34,9 @@
.\" SUCH DAMAGE.
.\"
.\" from: @(#)pr.1 8.1 (Berkeley) 6/6/93
-.\" $NetBSD: pr.1,v 1.18 2012/04/08 22:00:39 wiz Exp $
+.\" $NetBSD: pr.1,v 1.19 2012/07/24 02:13:04 ginsbach Exp $
.\"
-.Dd June 6, 1993
+.Dd May 4, 2012
.Dt PR 1
.Os
.Sh NAME
@@ -44,7 +46,7 @@
.Nm
.Op Ar \&+page
.Op Fl Ar column
-.Op Fl adFmrt
+.Op Fl adFfmprt
.Oo
.Op Fl e
.Op Ar char
@@ -161,6 +163,11 @@ instead of the default behavior that use
sequence of
.Em \*[Lt]newline\*[Gt]
characters.
+.It Fl f
+Same as
+.Fl F .
+Additionally pause before beginning the first page
+if the standard output is associated with a terminal.
.It Fl h Ar header
Use the string
.Ar header
@@ -184,6 +191,12 @@ If any nondigit character,
is specified, it is used as the output
.Em \*[Lt]tab\*[Gt]
character.
+If the first character of
+.Ar char
+is a digit then
+.Ar char
+is treated as
+.Ar gap .
.It Fl l Ar lines
Override the 66 line default and reset the page length to
.Ar lines .
@@ -239,6 +252,16 @@ If the
.Fl o
option is not specified, the default is zero.
The space taken is in addition to the output line width.
+.It Fl p
+Pause before beginning each page if the
+standard output is associated with a terminal.
+.Nm
+will write an
+.Em \*[Lt]alert\*[Gt]
+to standard error and wait for a
+.Em \*[Lt]carriage-return\*[Gt]
+to be read on
+.Pa /dev/tty .
.It Fl r
Write no diagnostic reports on failure to open a file.
.It Fl s Ar char
@@ -324,5 +347,5 @@ file printing is complete (when printing
The
.Nm
utility is
-.St -p1003.2
+.St -p1003.1-2008
compatible.
Index: src/usr.bin/pr/pr.c
diff -u src/usr.bin/pr/pr.c:1.22 src/usr.bin/pr/pr.c:1.23
--- src/usr.bin/pr/pr.c:1.22 Mon Mar 12 18:06:24 2012
+++ src/usr.bin/pr/pr.c Tue Jul 24 02:13:04 2012
@@ -1,9 +1,11 @@
-/* $NetBSD: pr.c,v 1.22 2012/03/12 18:06:24 christos Exp $ */
+/* $NetBSD: pr.c,v 1.23 2012/07/24 02:13:04 ginsbach Exp $ */
/*-
* Copyright (c) 1991 Keith Muller.
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
+ * Copyright (c) 2012
+ * The NetBSD Foundation, Inc.
*
* This code is derived from software contributed to Berkeley by
* Keith Muller of the University of California, San Diego.
@@ -43,7 +45,7 @@ __COPYRIGHT("@(#) Copyright (c) 1993\
#if 0
from: static char sccsid[] = "@(#)pr.c 8.1 (Berkeley) 6/6/93";
#else
-__RCSID("$NetBSD: pr.c,v 1.22 2012/03/12 18:06:24 christos Exp $");
+__RCSID("$NetBSD: pr.c,v 1.23 2012/07/24 02:13:04 ginsbach Exp $");
#endif
#endif /* not lint */
@@ -96,9 +98,12 @@ static int offst; /* number of page of
static int nodiag; /* do not report file open errors */
static char schar; /* text column separation character */
static int sflag; /* -s option for multiple columns */
+static int ttyout; /* output is a tty */
static int nohead; /* do not write head and trailer */
+static int pgpause; /* pause before each page */
static int pgwd; /* page width with multiple col output */
static const char *timefrmt = TIMEFMT; /* time conversion string */
+static FILE *ttyinf; /* input terminal for page pauses */
/*
* misc globals
@@ -120,6 +125,7 @@ static int onecol(int, char **);
static int otln(char *, int, int *, int *, int);
static void pfail(void);
static int prhead(char *, const char *, int);
+static void prpause(int);
static int prtail(int, int);
static int setup(int, char **);
__dead static void terminate(int);
@@ -242,9 +248,14 @@ onecol(int argc, char *argv[])
*/
if ((cnt = inln(inf,lbuf,LBUF,&cps,0,&mor)) < 0)
break;
- if (!linecnt && !nohead &&
- prhead(hbuf, fname, pagecnt))
- goto out;
+ if (!linecnt) {
+ if (pgpause)
+ prpause(pagecnt);
+
+ if (!nohead &&
+ prhead(hbuf, fname, pagecnt))
+ goto out;
+ }
/*
* start of new line.
@@ -509,6 +520,9 @@ vertcol(int argc, char *argv[])
if (cvc % clcnt)
++pln;
+ if (pgpause)
+ prpause(pagecnt);
+
/*
* print header
*/
@@ -578,8 +592,13 @@ vertcol(int argc, char *argv[])
/*
* print header
*/
- if (pln && !nohead && prhead(hbuf, fname, pagecnt))
- goto out;
+ if (pln) {
+ if (pgpause)
+ prpause(pagecnt);
+
+ if (!nohead && prhead(hbuf, fname, pagecnt))
+ goto out;
+ }
/*
* output each line
@@ -731,9 +750,14 @@ horzcol(int argc, char *argv[])
*/
if ((j = lstdat - buf) <= offst)
break;
- if (!i && !nohead &&
- prhead(hbuf, fname, pagecnt))
- goto out;
+ if (!i) {
+ if (pgpause)
+ prpause(pagecnt);
+
+ if (!nohead &&
+ prhead(hbuf, fname, pagecnt))
+ goto out;
+ }
/*
* output line
*/
@@ -941,8 +965,13 @@ mulfile(int argc, char *argv[])
if ((j = lstdat - buf) <= offst)
break;
- if (!i && !nohead && prhead(hbuf, fname, pagecnt))
- goto out;
+ if (!i) {
+ if (pgpause)
+ prpause(pagecnt);
+
+ if (!nohead && prhead(hbuf, fname, pagecnt))
+ goto out;
+ }
/*
* output line
@@ -1419,6 +1448,32 @@ addnum(char *buf, int wdth, int line)
}
/*
+ * prpause(): pause before printing each page
+ *
+ * pagcnt page number
+ */
+static void
+prpause(int pagcnt)
+{
+
+ if (ttyout) {
+ int c;
+
+ (void)putc('\a', stderr);
+ (void)fflush(stderr);
+
+ while ((c = getc(ttyinf)) != '\n' && c != EOF)
+ ;
+
+ /*
+ * pause ONLY before first page of first file
+ */
+ if (pgpause == FIRSTPAGE && pagcnt == 1)
+ pgpause = NO_PAUSE;
+ }
+}
+
+/*
* prhead(): prints the top of page header
*
* buf buffer with time field (and offset)
@@ -1561,7 +1616,7 @@ usage(void)
(void)fputs(
" [-i[ch][gap]] [-l line] [-n[ch][width]] [-o offset]\n",errf);
(void)fputs(
- " [-s[ch]] [-w width] [-] [file ...]\n", errf);
+ " [-s[ch]] [-w width] [-fp] [-] [file ...]\n", errf);
}
/*
@@ -1577,6 +1632,8 @@ setup(int argc, char **argv)
int wflag = 0;
int cflag = 0;
+ ttyinf = stdin;
+
if (isatty(fileno(stdout))) {
/*
* defer diagnostics until processing is done
@@ -1585,9 +1642,10 @@ setup(int argc, char **argv)
(void)fputs("Cannot defer diagnostic messages\n",stderr);
return(1);
}
+ ttyout = 1;
} else
errf = stderr;
- while ((c = egetopt(argc, argv, "#adFmrte?h:i?l:n?o:s?T:w:")) != -1) {
+ while ((c = egetopt(argc, argv, "#adFfmrte?h:i?l:n?o:ps?T:w:")) != -1) {
switch (c) {
case '+':
if ((pgnm = atoi(eoptarg)) < 1) {
@@ -1633,6 +1691,9 @@ setup(int argc, char **argv)
} else
ingap = INGAP;
break;
+ case 'f':
+ pgpause |= FIRSTPAGE;
+ /*FALLTHROUGH*/
case 'F':
++formfeed;
break;
@@ -1701,6 +1762,9 @@ setup(int argc, char **argv)
return(1);
}
break;
+ case 'p':
+ pgpause |= EACHPAGE;
+ break;
case 'r':
++nodiag;
break;
@@ -1819,5 +1883,16 @@ setup(int argc, char **argv)
}
}
+ /*
+ * open /dev/tty if we are to pause before each page
+ * but only if stdout is a terminal and stdin is not a terminal
+ */
+ if (ttyout && pgpause && !isatty(fileno(stdin))) {
+ if ((ttyinf = fopen("/dev/tty", "r")) == NULL) {
+ (void)fprintf(errf, "pr: cannot open terminal\n");
+ return(1);
+ }
+ }
+
return(0);
}
Index: src/usr.bin/pr/pr.h
diff -u src/usr.bin/pr/pr.h:1.4 src/usr.bin/pr/pr.h:1.5
--- src/usr.bin/pr/pr.h:1.4 Mon Oct 13 07:41:22 2003
+++ src/usr.bin/pr/pr.h Tue Jul 24 02:13:04 2012
@@ -1,9 +1,11 @@
-/* $NetBSD: pr.h,v 1.4 2003/10/13 07:41:22 agc Exp $ */
+/* $NetBSD: pr.h,v 1.5 2012/07/24 02:13:04 ginsbach Exp $ */
/*-
* Copyright (c) 1991 Keith Muller.
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
+ * Copyright (c) 2012
+ * The NetBSD Foundation, Inc.
*
* This code is derived from software contributed to Berkeley by
* Keith Muller of the University of California, San Diego.
@@ -33,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)pr.h 8.1 (Berkeley) 6/6/93
- * $NetBSD: pr.h,v 1.4 2003/10/13 07:41:22 agc Exp $
+ * $NetBSD: pr.h,v 1.5 2012/07/24 02:13:04 ginsbach Exp $
*/
/*
@@ -62,6 +64,12 @@
#define LBUF 8192
#define HDBUF 512
+/* when to pause before (for -f and -p options) */
+#define NO_PAUSE 0
+#define FIRSTPAGE 1
+#define ENSUINGPAGES 2
+#define EACHPAGE (FIRSTPAGE | ENSUINGPAGES)
+
/*
* structure for vertical columns. Used to balance cols on last page
*/