wc(1): Fix 'wc -L'

I inadvertently broke 'wc -L' in r326736.  We must skip the fast path if -L
was specified, in addition to the existing check for the -l option.

Document long-standing -L behavior (count varies depending on whether wc(1)
is run with the -m option or not) in wc.1.  That behavior dates back to the
introduction of the -L option, but was not documented.

PR:		230300
Reported by:	<amstrnad+bugzilla AT gmail.com>
Sponsored by:	Dell EMC Isilon
This commit is contained in:
cem 2018-08-02 23:45:14 +00:00
parent b2141aeb01
commit 2b9bca3e08
2 changed files with 12 additions and 13 deletions

View File

@ -31,7 +31,7 @@
.\" @(#)wc.1 8.2 (Berkeley) 4/19/94
.\" $FreeBSD$
.\"
.Dd December 1, 2015
.Dd August 2, 2018
.Dt WC 1
.Os
.Sh NAME
@ -76,8 +76,11 @@ See
.Xr xo_parse_args 3
for details on command line arguments.
.It Fl L
The number of characters in the longest input line
is written to the standard output.
Write the length of the line containing the most bytes (default) or characters
(when
.Fl m
is provided)
to standard output.
When more than one
.Ar file
argument is specified, the longest input line of

View File

@ -216,7 +216,7 @@ cnt(const char *file)
* If all we need is the number of characters and it's a regular file,
* just stat it.
*/
if (doline == 0) {
if (doline == 0 && dolongline == 0) {
if (fstat(fd, &sb)) {
xo_warn("%s: fstat", file);
(void)close(fd);
@ -246,7 +246,7 @@ cnt(const char *file)
if (siginfo)
show_cnt(file, linect, wordct, charct, llct);
charct += len;
if (doline) {
if (doline || dolongline) {
for (p = buf; len--; ++p)
if (*p == '\n') {
if (tmpll > llct)
@ -262,10 +262,8 @@ cnt(const char *file)
tlinect += linect;
if (dochar)
tcharct += charct;
if (dolongline) {
if (llct > tlongline)
tlongline = llct;
}
if (dolongline && llct > tlongline)
tlongline = llct;
show_cnt(file, linect, wordct, charct, llct);
(void)close(fd);
return (0);
@ -331,10 +329,8 @@ word: gotsp = 1;
twordct += wordct;
if (dochar || domulti)
tcharct += charct;
if (dolongline) {
if (llct > tlongline)
tlongline = llct;
}
if (dolongline && llct > tlongline)
tlongline = llct;
show_cnt(file, linect, wordct, charct, llct);
(void)close(fd);
return (0);