Small change to wc

Garrett Cooper yanefbsd at gmail.com
Fri Dec 5 14:48:46 PST 2008


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


More information about the freebsd-hackers mailing list