[hackers] [sbase] Finish up wc(1) || FRIGN

From: <git_AT_suckless.org>
Date: Tue, 24 Mar 2015 23:53:33 +0100 (CET)

commit 8ab096d2a4213d9676f9531474afda0c73a7c04a
Author: FRIGN <dev_AT_frign.de>
Date: Sun Feb 1 03:01:11 2015 +0100

    Finish up wc(1)
    
    Use size_t for all counts, fix the manpage and refactor the code.
    Here's yet another place where GNU coreutils fail:
    
    sbase:
    $ echo "GNU/Turd sucks" | wc -cm
        15
    
    coreutils:
    $ echo "GNU/Turd sucks" | wc -cm
         15 15
    
    Take a bloody guess which behaviour is correct[0].
    
    [0]: http://pubs.opengroup.org/onlinepubs/009604499/utilities/wc.html

diff --git a/README b/README
index f465574..12ffd9c 100644
--- a/README
+++ b/README
_AT_@ -82,7 +82,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
 = sha1sum non-posix none
 = sha256sum non-posix none
 = sha512sum non-posix none
- wc yes none
+#* wc yes none
 = xargs no -I, -L, -p, -s, -t, -x
 =* yes non-posix none
 
diff --git a/wc.1 b/wc.1
index 772d814..c18b210 100644
--- a/wc.1
+++ b/wc.1
_AT_@ -1,4 +1,4 @@
-.Dd January 30, 2015
+.Dd February 1, 2015
 .Dt WC 1
 .Os sbase
 .Sh NAME
_AT_@ -6,26 +6,27 @@
 .Nd word count
 .Sh SYNOPSIS
 .Nm
-.Op Fl clmw
+.Op Fl c | Fl m
+.Op Fl lw
 .Op Ar file ...
 .Sh DESCRIPTION
 .Nm
-prints the number of lines, words, and bytes in each file. If any flags are
-given,
+prints the number of lines, words and bytes in each
+.Ar file ,
+unless set differently with flags.
+If no
+.Ar file
+is given
 .Nm
-will print only the requested information. If no
-.Ar files
-are given,
-.Nm
-reads stdin.
+reads from stdin.
 .Sh OPTIONS
 .Bl -tag -width Ds
-.It Fl c
-print the number of bytes.
-.It Fl l
-print the number of lines.
-.It Fl m
-print the number of characters, not bytes.
-.It Fl w
-print the number of words.
+.It Fl c | Fl l | Fl m | Fl w
+Print the number of bytes | lines | characters | words.
 .El
+.Sh STANDARDS
+The
+.Nm
+utility is compliant with the
+.St -p1003.1-2008
+specification.
diff --git a/wc.c b/wc.c
index f2a7206..f283e1b 100644
--- a/wc.c
+++ b/wc.c
_AT_@ -6,18 +6,58 @@
 
 #include "util.h"
 
-static void output(const char *, long, long, long);
-static void wc(FILE *, const char *);
+static int lflag = 0;
+static int wflag = 0;
+static char cmode = 0;
+static size_t tc = 0, tl = 0, tw = 0;
 
-static int lflag = 0;
-static int wflag = 0;
-static char cmode = 0;
-static long tc = 0, tl = 0, tw = 0;
+void
+output(const char *str, size_t nc, size_t nl, size_t nw)
+{
+ int noflags = !cmode && !lflag && !wflag;
+
+ if (lflag || noflags)
+ printf(" %5zu", nl);
+ if (wflag || noflags)
+ printf(" %5zu", nw);
+ if (cmode || noflags)
+ printf(" %5zu", nc);
+ if (str)
+ printf(" %s", str);
+ putchar('\n');
+}
+
+void
+wc(FILE *fp, const char *str)
+{
+ int word = 0;
+ int c;
+ size_t nc = 0, nl = 0, nw = 0;
+
+ while ((c = getc(fp)) != EOF) {
+ if (cmode != 'm' || UTF8_POINT(c))
+ nc++;
+ if (c == '\n')
+ nl++;
+ if (!isspace(c))
+ word = 1;
+ else if (word) {
+ word = 0;
+ nw++;
+ }
+ }
+ if (word)
+ nw++;
+ tc += nc;
+ tl += nl;
+ tw += nw;
+ output(str, nc, nl, nw);
+}
 
 static void
 usage(void)
 {
- eprintf("usage: %s [-clmw] [files...]\n", argv0);
+ eprintf("usage: %s [-c | -m] [-lw] [file ...]\n", argv0);
 }
 
 int
_AT_@ -59,46 +99,3 @@ main(int argc, char *argv[])
         }
         return 0;
 }
-
-void
-output(const char *str, long nc, long nl, long nw)
-{
- int noflags = !cmode && !lflag && !wflag;
-
- if (lflag || noflags)
- printf(" %5ld", nl);
- if (wflag || noflags)
- printf(" %5ld", nw);
- if (cmode || noflags)
- printf(" %5ld", nc);
- if (str)
- printf(" %s", str);
- putchar('\n');
-}
-
-void
-wc(FILE *fp, const char *str)
-{
- int word = 0;
- int c;
- long nc = 0, nl = 0, nw = 0;
-
- while ((c = getc(fp)) != EOF) {
- if (cmode != 'm' || UTF8_POINT(c))
- nc++;
- if (c == '\n')
- nl++;
- if (!isspace(c))
- word = 1;
- else if (word) {
- word = 0;
- nw++;
- }
- }
- if (word)
- nw++;
- tc += nc;
- tl += nl;
- tw += nw;
- output(str, nc, nl, nw);
-}
Received on Tue Mar 24 2015 - 23:53:33 CET

This archive was generated by hypermail 2.3.0 : Wed Mar 25 2015 - 00:07:58 CET