Small change to wc

Sheldon Givens sheldon at sigsegv.ca
Fri Dec 5 15:28:01 PST 2008


I've successfully built it in multiple circumstances. The only thing I'm
worried about (I'm on the road now and can't test) is what will occur if wc
is fed a zero-length input... ie, a "touched" file or a echo "" | wc -L.

On Fri, Dec 5, 2008 at 3:23 PM, Garrett Cooper <yanefbsd at gmail.com> wrote:

> On Fri, Dec 5, 2008 at 3:14 PM, Kostik Belousov <kostikbel at gmail.com>
> wrote:
> > On Fri, Dec 05, 2008 at 03:10:56PM -0800, Sheldon Givens wrote:
> >> What's the problem having it? The total code is mere bytes and it eases
> the
> >> transition for others who are migrating from Linux.
> >> You're absolutely right in that it can be done with awk (fairly simply,
> too)
> >> but it doesn't hurt to explore options. Additionally, with awk, you
> can't
> >> get other figures with the same command, which increases ease of use.
> >> IE: What's the equivalent to "wc -clwL" in awk? Would you really rather
> run
> >> wc -clw && awk '{if(length>x){x=length}}END{if(x>0){print x}else{print
> >> 0}}'`?
> >>
> >> Isn't wc -L a more elegant solution than awk
> >> '{if(length>x){x=length}}END{if(x>0){print x}else{print 0}}'`?
> >>
> >> Should I continue?
> >
> > Real argument pro is that you have one less thing to worry when you
> > trying to run some script, written on Linux, on the FreeBSD system.
> >
> >>
> >> On Fri, Dec 5, 2008 at 2:48 PM, Garrett Cooper <yanefbsd at gmail.com>
> wrote:
> >>
> >> > On Fri, Dec 5, 2008 at 2:14 PM, Sheldon Givens <sheldon at sigsegv.ca>
> wrote:
> >> > > Hello everyone,
> >> > > In the process of migrating the last of a few Linux servers to
> FreeBSD,
> >> > we
> >> > > ran in to a bit of a snag with one of our scripts when BSD wc didn't
> have
> >> > an
> >> > > equivalent to the Linux -L. This flag tells wc to keep track of the
> >> > longest
> >> > > line in the input.
> >> > >
> >> > > Here's a little diff to add this functionality to BSD wc.
> >> > >
> >> > > With this patch, an additional parameter is added to output that
> shows
> >> > the
> >> > > length of the longest line
> >> > >
> >> > > My apologies if this is in the wrong format. I don't often post
> here.
> >> > >
> >> > > Happy Holidays,
> >> > >
> >> > > Sheldon Givens
> >> > >
> >> > >
> >> > > ---snip---
> >> > > 65,66c65,66
> >> > > < uintmax_t tlinect, twordct, tcharct;
> >> > > < int doline, doword, dochar, domulti;
> >> > > ---
> >> > >> uintmax_t tlinect, twordct, tcharct, tlongline;
> >> > >> int doline, doword, dochar, domulti, dolongline;
> >> > > 78c78
> >> > > <       while ((ch = getopt(argc, argv, "clmw")) != -1)
> >> > > ---
> >> > >>       while ((ch = getopt(argc, argv, "clmwL")) != -1)
> >> > > 93a94,96
> >> > >>               case 'L':
> >> > >>                       dolongline = 1;
> >> > >>                       break;
> >> > > 127a131,132
> >> > >>               if (dolongline)
> >> > >>                       (void)printf(" %7ju", tlongline);
> >> > > 137c142
> >> > > <       uintmax_t linect, wordct, charct;
> >> > > ---
> >> > >>       uintmax_t linect, wordct, charct, llcnt, tmpll;
> >> > > 146c151
> >> > > <       linect = wordct = charct = 0;
> >> > > ---
> >> > >>       linect = wordct = charct = llcnt = tmpll = 0;
> >> > > 171c176,179
> >> > > <                                       if (*p == '\n')
> >> > > ---
> >> > >>                                       if (*p == '\n') {
> >> > >>                                               if (tmpll > llcnt)
> >> > >>                                                       llcnt =
> tmpll;
> >> > >>                                               tmpll = 0;
> >> > > 172a181
> >> > >>                                       } else { tmpll++; }
> >> > > 179a189,192
> >> > >>                       if (dolongline) {
> >> > >>                               tlongline = llcnt;
> >> > >>                               (void)printf(" %7ju", tlongline);
> >> > >>                       }
> >> > > 197c210
> >> > > <                               return (0);
> >> > > ---
> >> > >>                       return (0);
> >> > > 231a245
> >> > >>                       tmpll++;
> >> > > 234c248,251
> >> > > <                       if (wch == L'\n')
> >> > > ---
> >> > >>                       if (wch == L'\n') {
> >> > >>                               if (tmpll > llcnt)
> >> > >>                                       llcnt = tmpll;
> >> > >>                               tmpll = 0;
> >> > > 235a253
> >> > >>                       }
> >> > > 258a277,280
> >> > >>       if (dolongline) {
> >> > >>               tlongline = llcnt;
> >> > >>               (void)printf(" %7ju", llcnt - 1);
> >> > >>       }
> >> > > 266c288
> >> > > <       (void)fprintf(stderr, "usage: wc [-clmw] [file ...]\n");
> >> > > ---
> >> > >>       (void)fprintf(stderr, "usage: wc [-clmwL] [file ...]\n");
> >> > >
> >> > > ---unsnip---
> >> >
> >> > What's the plus side of having this? I can accomplish the same with
> >> > something like awk without the additional overhead, which would be
> >> > guaranteed to be portable.
> >> > -Garrett
>
> Very true. Ok, I've been easily won over :).
> The patch looks largely ok, but have you gone through compiling it in
> your own dev tree (vatting out possible warnings, etc).
> -Garrett
>


More information about the freebsd-hackers mailing list