* Copyright (c) 1980, 1987 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
"@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\
/*static char sccsid[] = "from: @(#)wc.c 5.7 (Berkeley) 3/2/91";*/
static char rcsid
[] = "$Id: wc.c,v 1.8 1993/11/04 05:43:30 jtc Exp $";
/* wc line, word and char count */
static void print_counts();
static long tlinect
, twordct
, tcharct
;
static int doline
, doword
, dochar
;
while ((ch
= getopt(argc
, argv
, "lwcm")) != -1)
fprintf(stderr
, "usage: wc [-c | -m] [-lw] [file ...]\n");
* wc is unusual in that its flags are on by default, so,
* if you don't get any arguments, you have to turn them
if (!doline
&& !doword
&& !dochar
) {
doline
= doword
= dochar
= 1;
int dototal
= (argc
> 1);
print_counts (tlinect
, twordct
, tcharct
, "total");
register long linect
, wordct
, charct
;
linect
= wordct
= charct
= 0;
if ((fd
= open(file
, O_RDONLY
, 0)) < 0) {
* line counting is split out because it's a lot
* faster to get lines than to get words, since
* the word count requires some logic.
while((len
= read(fd
, buf
, MAXBSIZE
)) > 0) {
for (C
= buf
; len
--; ++C
)
* if all we need is the number of characters and
* it's a directory or a regular or linked file, just
* stat the puppy. We avoid testing for it not being
* a special device in case someone adds a new type
ifmt
= sbuf
.st_mode
& S_IFMT
;
if (ifmt
== S_IFREG
|| ifmt
== S_IFLNK
/* do it the hard way... */
while ((len
= read(fd
, buf
, MAXBSIZE
)) > 0) {
for (C
= buf
; len
--; ++C
) {
* This line implements the POSIX
* spec, i.e. a word is a "maximal
* string of characters delimited by
* whitespace." Notice nothing was
* said about a character being
* printing or non-printing.
print_counts (linect
, wordct
, charct
, file
? file
: "");
/* don't bother checkint doline, doword, or dochar --- speeds
print_counts (lines
, words
, chars
, name
)