Small change to wc

Garrett Cooper yanefbsd at gmail.com
Fri Dec 5 15:23:01 PST 2008


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