annotate toys/posix/wc.c @ 674:7e846e281e38

New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
author Rob Landley <rob@landley.net>
date Mon, 08 Oct 2012 00:02:30 -0500
parents 5cb41d56f9d3
children 9414be56b1db
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
386
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* vi: set sw=4 ts=4:
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
387
67b0ded3c56c Add dirname, and typo fixes to wc header.
Rob Landley <rob@landley.net>
parents: 386
diff changeset
3 * wc.c - Word count
386
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
387
67b0ded3c56c Add dirname, and typo fixes to wc header.
Rob Landley <rob@landley.net>
parents: 386
diff changeset
5 * Copyright 2011 Rob Landley <rob@landley.net>
386
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 *
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 * See http://opengroup.org/onlinepubs/9699919799/utilities/wc.html
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 USE_WC(NEWTOY(wc, "cwl", TOYFLAG_USR|TOYFLAG_BIN))
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
10
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 config WC
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 bool "wc"
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 default y
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 help
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 usage: wc -lwc [FILE...]
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
16
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 Count lines, words, and characters in input.
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
18
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -l show lines
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 -w show words
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 -c show characters
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
22
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 By default outputs lines, words, characters, and filename for each
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 argument (or from stdin if none).
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 */
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
26
674
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 662
diff changeset
27 #define FOR_wc
386
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 #include "toys.h"
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
29
674
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 662
diff changeset
30 GLOBALS(
662
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
31 unsigned long totals[3];
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
32 )
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
33
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
34 static void show_lengths(unsigned long *lengths, char *name)
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
35 {
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
36 int i, nospace = 1;
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
37 for (i=0; i<3; i++) {
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
38 if (!toys.optflags || (toys.optflags&(1<<i))) {
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
39 xprintf(" %ld"+nospace, lengths[i]);
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
40 nospace = 0;
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
41 }
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
42 TT.totals[i] += lengths[i];
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
43 }
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
44 if (*toys.optargs) xprintf(" %s", name);
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
45 xputc('\n');
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
46 }
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
47
386
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 static void do_wc(int fd, char *name)
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 {
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 int i, len;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 unsigned long word=0, lengths[]={0,0,0};
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
52
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 for (;;) {
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 len = read(fd, toybuf, sizeof(toybuf));
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 if (len<0) {
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 perror_msg("%s",name);
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 toys.exitval = EXIT_FAILURE;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 }
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 if (len<1) break;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 for (i=0; i<len; i++) {
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 if (toybuf[i]==10) lengths[0]++;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 if (isspace(toybuf[i])) word=0;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 else {
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 if (!word) lengths[1]++;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 word=1;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 }
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 lengths[2]++;
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 }
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 }
662
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
70
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
71 show_lengths(lengths, name);
386
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 }
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
73
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 void wc_main(void)
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 {
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 loopfiles(toys.optargs, do_wc);
662
5cb41d56f9d3 Posix compliance: wc shouldn't have trailing spaces (breaks aboriginal's mkinitr
Rob Landley <rob@landley.net>
parents: 653
diff changeset
77 if (toys.optc>1) show_lengths(TT.totals, "total");
386
03bf7c545b6f Add wc.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 }