/* wc.c - count the number of lines, words, and characters in a file. * * * * wc [ ...] * * * * wc (C) 1988 by Gary L. Brant * * * * :ts=8 */ #include #define FALSE 0 #define TRUE 1 #define COUNT_LINES 4 #define COUNT_WORDS 2 #define COUNT_CHARS 1 int cur_flag, def_flag = COUNT_LINES | COUNT_WORDS | COUNT_CHARS; int head; long lines, words, chars; long tlines=0, twords=0, tchars=0; char string[] = " "; main (argc, argv) /* count lines, words, chars in input */ int argc; char *argv[]; { register int i = 0, j; register char ch; FILE *input, *fopen (); void fclose (); cur_flag = def_flag; while (++i < argc) { if (argv [i][0] == '-') { /* remember to bump i in loop */ def_flag = cur_flag; cur_flag = 0; for (j = 1; (ch = argv[i][j]) != '\0'; j++) switch (ch) { case 'l': cur_flag |= COUNT_LINES; break; case 'w': cur_flag |= COUNT_WORDS; break; case 'c': cur_flag |= COUNT_CHARS; break; default: cur_flag = def_flag; } } else { ++head; if ((input = fopen (argv[i], "r")) == NULL) { fputs ("wc: can't open ", stderr); fputs (argv[i], stderr); putc ('\n', stderr); continue; } else { wc (input, argv[i]); fclose (input); } } } if (!head) wc (stdin, ""); else if ( head > 1) print (tlines, twords, tchars, "total"); } /* count words, etc. in 1 file * inspired by example from: K.&R. P. 18 */ wc (fp, fn) FILE *fp; char *fn; { register int in, c; in = FALSE; lines = words = chars = 0; while ((c = getc (fp)) != EOF) { ++chars; if (c == '\n') { ++lines; in = FALSE; } else if (c == ' ' || c == '\t') in = FALSE; else if (!in) { in = TRUE; ++words; } } print (lines, words, chars, fn); tlines += lines; twords += words; tchars += chars; } /* print - print counts for a file */ print (lines, words, chars, fn) long lines, words, chars; char *fn; { if (cur_flag & COUNT_LINES) { convert (lines, string); fputs (string, stdout); } if (cur_flag & COUNT_WORDS) { convert (words, string); fputs (string, stdout); } if (cur_flag & COUNT_CHARS) { convert (chars, string); fputs (string, stdout); } if (head) fputs (fn, stdout); putc ('\n', stdout); } convert (val, string) register long val; register char *string; { register int i = 7; if (val == 0) string[i--] = '0'; while (val != 0) { register long j, k; j = val / 10; k = val - 10 * j; val = j; string[i--] = '0' + k; if (i < 0) break; } while (i >= 0) string[i--] = ' '; } _wb_parse () { }