diff --git a/usr.bin/wc/Makefile b/usr.bin/wc/Makefile index 907d5db7e96c..55ac918151be 100644 --- a/usr.bin/wc/Makefile +++ b/usr.bin/wc/Makefile @@ -1,5 +1,5 @@ -# $NetBSD: Makefile,v 1.3 1997/01/09 20:23:18 tls Exp $ -# from: @(#)Makefile 5.3 (Berkeley) 5/11/90 +# $NetBSD: Makefile,v 1.4 1997/10/18 16:48:29 mrg Exp $ +# from: @(#)Makefile 8.1 (Berkeley) 6/6/93 PROG= wc diff --git a/usr.bin/wc/wc.1 b/usr.bin/wc/wc.1 index 0b02132026f9..6a394d5f0787 100644 --- a/usr.bin/wc/wc.1 +++ b/usr.bin/wc/wc.1 @@ -1,7 +1,7 @@ -.\" $NetBSD: wc.1,v 1.5 1997/01/09 20:23:19 tls Exp $ +.\" $NetBSD: wc.1,v 1.6 1997/10/18 16:48:35 mrg Exp $ .\" -.\" Copyright (c) 1991 Regents of the University of California. -.\" All rights reserved. +.\" Copyright (c) 1991, 1993 +.\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" the Institute of Electrical and Electronics Engineers, Inc. @@ -34,15 +34,14 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" from: @(#)wc.1 6.4 (Berkeley) 6/27/91 -.\" $NetBSD: wc.1,v 1.5 1997/01/09 20:23:19 tls Exp $ +.\" from: @(#)wc.1 8.2 (Berkeley) 4/19/94 .\" -.Dd June 27, 1991 +.Dd April 19, 1994 .Dt WC 1 .Os .Sh NAME .Nm wc -.Nd Word, line, and byte count. +.Nd word, line, and byte count .Sh SYNOPSIS .Nm wc .Op Fl c | Fl m @@ -51,16 +50,20 @@ .Sh DESCRIPTION The .Nm wc -utility reads one or more input text files, and, by -default, writes the number of lines, words, and bytes -contained in each input file to the standard output. -If more than one input file is specified, -a line of cumulative count(s) for all named files is output on a -separate line -following the last file count. -.Nm Wc -considers a word to be a maximal string of -characters delimited by white space. +utility displays the number of lines, words, and bytes contained in each +input +.Ar file +(or standard input, by default) to the standard output. +A line is defined as a string of characters delimited by a +character, +and a word is defined as a string of characters delimited by white space +characters. +White space characters are the set of characters for which the +.Xr isspace 3 +function returns true. +If more than one input file is specified, a line of cumulative counts +for all the files is displayed on a separate line after the output for +the last file. .Pp The following options are available: .Bl -tag -width Ds @@ -96,9 +99,7 @@ A pathname of an input file. .Pp If no file names are specified, the standard input is used and -a file name is not output. The resulting output is one -line of the requested count(s) with the cumulative sum -of all files read in via standard input. +no file name is displayed. .Pp By default, the standard output contains a line for each input file of the form: @@ -106,12 +107,26 @@ input file of the form: lines words bytes file_name .Ed .Pp -The counts for lines, words and bytes are integers separated -by spaces. .Pp The .Nm wc utility exits 0 on success, and >0 if an error occurs. +.Sh SEE ALSO +.Xr isspace 3 +.Sh COMPATIBILITY +Historically, the +.Nm wc +utility was documented to define a word as a ``maximal string of +characters delimited by , or characters''. +The implementation, however, didn't handle non-printing characters +correctly so that `` ^D^E '' counted as 6 spaces, while ``foo^D^Ebar'' +counted as 8 characters. +4BSD systems after 4.3BSD modified the implementation to be consistent +with the documentation. +This implementation defines a ``word'' in terms of the +.Xr isspace 3 +function, as required by +.St -p1003.2 . .Sh STANDARDS The .Nm wc diff --git a/usr.bin/wc/wc.c b/usr.bin/wc/wc.c index 2733757259d3..9af4df7e5c8a 100644 --- a/usr.bin/wc/wc.c +++ b/usr.bin/wc/wc.c @@ -1,8 +1,8 @@ -/* $NetBSD: wc.c,v 1.10 1997/01/09 20:23:20 tls Exp $ */ +/* $NetBSD: wc.c,v 1.11 1997/10/18 16:48:39 mrg Exp $ */ /* - * Copyright (c) 1980, 1987 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1980, 1987, 1991, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,19 +34,29 @@ */ #ifndef lint -char copyright[] = -"@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\ - All rights reserved.\n"; +static char copyright[] = +"@(#) Copyright (c) 1980, 1987, 1991, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -/*static char sccsid[] = "from: @(#)wc.c 5.7 (Berkeley) 3/2/91";*/ -static char rcsid[] = "$NetBSD: wc.c,v 1.10 1997/01/09 20:23:20 tls Exp $"; +#if 0 +static char sccsid[] = "@(#)wc.c 8.2 (Berkeley) 5/2/95"; +#else +static char rcsid[] = "$NetBSD: wc.c,v 1.11 1997/10/18 16:48:39 mrg Exp $"; +#endif #endif /* not lint */ /* wc line, word and char count */ +#include +#include + +#include +#include +#include #include + #include #include #include @@ -58,18 +68,19 @@ static char rcsid[] = "$NetBSD: wc.c,v 1.10 1997/01/09 20:23:20 tls Exp $"; #include #include -static void print_counts(); -static void cnt(); -static long tlinect, twordct, tcharct; +static ulong tlinect, twordct, tcharct; static int doline, doword, dochar; static int rval = 0; +static void cnt __P((char *)); +static void print_counts __P((long, long, long, char *)); +static void usage __P((void)); + int main(argc, argv) int argc; - char **argv; + char *argv[]; { - extern int optind; register int ch; setlocale(LC_ALL, ""); @@ -88,23 +99,17 @@ main(argc, argv) break; case '?': default: - fprintf(stderr, "usage: wc [-c | -m] [-lw] [file ...]\n"); - exit(1); + usage(); } argv += optind; argc -= optind; - /* - * wc is unusual in that its flags are on by default, so, - * if you don't get any arguments, you have to turn them - * all on. - */ - if (!doline && !doword && !dochar) { + /* Wc's flags are on by default. */ + if (doline + doword + dochar == 0) doline = doword = dochar = 1; - } if (!*argv) { - cnt((char *)NULL); + cnt(NULL); } else { int dototal = (argc > 1); @@ -113,30 +118,29 @@ main(argc, argv) } while(*++argv); if (dototal) { - print_counts (tlinect, twordct, tcharct, "total"); + print_counts(tlinect, twordct, tcharct, "total"); } } exit(rval); } - static void cnt(file) char *file; { register u_char *C; register short gotsp; - register int len; - register long linect, wordct, charct; - struct stat sbuf; + register int ch, len; + register u_long linect, wordct, charct; + struct stat sb; int fd; u_char buf[MAXBSIZE]; linect = wordct = charct = 0; if (file) { if ((fd = open(file, O_RDONLY, 0)) < 0) { - warn ("%s", file); + warn("%s", file); rval = 1; return; } @@ -151,7 +155,7 @@ cnt(file) * the word count requires some logic. */ if (doline) { - while((len = read(fd, buf, MAXBSIZE)) > 0) { + while ((len = read(fd, buf, MAXBSIZE)) > 0) { charct += len; for (C = buf; len--; ++C) if (*C == '\n') @@ -173,16 +177,16 @@ cnt(file) else if (dochar) { int ifmt; - if (fstat(fd, &sbuf)) { - warn ("%s", file); + if (fstat(fd, &sb)) { + warn("%s", file); rval = 1; } else { - ifmt = sbuf.st_mode & S_IFMT; + ifmt = sb.st_mode & S_IFMT; if (ifmt == S_IFREG || ifmt == S_IFLNK || ifmt == S_IFDIR) { - charct = sbuf.st_size; + charct = sb.st_size; } else { - while((len = read(fd, buf, MAXBSIZE)) > 0) + while ((len = read(fd, buf, MAXBSIZE)) > 0) charct += len; if (len == -1) { warn ("%s", file); @@ -199,7 +203,7 @@ cnt(file) while ((len = read(fd, buf, MAXBSIZE)) > 0) { charct += len; for (C = buf; len--; ++C) { - if (isspace (*C)) { + if (isspace(*C)) { gotsp = 1; if (*C == '\n') { ++linect; @@ -221,12 +225,12 @@ cnt(file) } } if (len == -1) { - warn ("%s", file); + warn("%s", file); rval = 1; } } - print_counts (linect, wordct, charct, file ? file : ""); + print_counts(linect, wordct, charct, file ? file : ""); /* don't bother checkint doline, doword, or dochar --- speeds up the common case */ @@ -240,9 +244,8 @@ cnt(file) } } - -void -print_counts (lines, words, chars, name) +static void +print_counts(lines, words, chars, name) long lines; long words; long chars; @@ -256,5 +259,12 @@ print_counts (lines, words, chars, name) if (dochar) printf(" %7ld", chars); - printf (" %s\n", name); + printf(" %s\n", name); +} + +static void +usage() +{ + (void)fprintf(stderr, "usage: wc [-clw] [files]\n"); + exit(1); }