diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-10-24 05:00:29 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-10-24 05:00:29 +0000 |
commit | bdfd0d78bc44e73d693510e70087857785b3b521 (patch) | |
tree | 153a573095afac8d8d0ea857759ecabd77fb28b7 /wc.c | |
parent | 9260fc5552a3ee52eb95823aa6689d52a1ffd33c (diff) | |
download | busybox-w32-bdfd0d78bc44e73d693510e70087857785b3b521.tar.gz busybox-w32-bdfd0d78bc44e73d693510e70087857785b3b521.tar.bz2 busybox-w32-bdfd0d78bc44e73d693510e70087857785b3b521.zip |
Major rework of the directory structure and the entire build system.
-Erik
Diffstat (limited to 'wc.c')
-rw-r--r-- | wc.c | 156 |
1 files changed, 0 insertions, 156 deletions
@@ -1,156 +0,0 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Mini wc implementation for busybox | ||
4 | * | ||
5 | * Copyright (C) 2000 Edward Betts <edward@debian.org> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <stdio.h> | ||
24 | #include <getopt.h> | ||
25 | #include <string.h> | ||
26 | #include <stdlib.h> | ||
27 | #include "busybox.h" | ||
28 | |||
29 | static int total_lines, total_words, total_chars, max_length; | ||
30 | static int print_lines, print_words, print_chars, print_length; | ||
31 | |||
32 | static void print_counts(int lines, int words, int chars, int length, | ||
33 | const char *name) | ||
34 | { | ||
35 | char const *space = ""; | ||
36 | |||
37 | if (print_lines) { | ||
38 | printf("%7d", lines); | ||
39 | space = " "; | ||
40 | } | ||
41 | if (print_words) { | ||
42 | printf("%s%7d", space, words); | ||
43 | space = " "; | ||
44 | } | ||
45 | if (print_chars) { | ||
46 | printf("%s%7d", space, chars); | ||
47 | space = " "; | ||
48 | } | ||
49 | if (print_length) | ||
50 | printf("%s%7d", space, length); | ||
51 | if (*name) | ||
52 | printf(" %s", name); | ||
53 | putchar('\n'); | ||
54 | } | ||
55 | |||
56 | static void wc_file(FILE * file, const char *name) | ||
57 | { | ||
58 | int lines, words, chars, length; | ||
59 | int in_word = 0, linepos = 0; | ||
60 | int c; | ||
61 | |||
62 | lines = words = chars = length = 0; | ||
63 | while ((c = getc(file)) != EOF) { | ||
64 | chars++; | ||
65 | switch (c) { | ||
66 | case '\n': | ||
67 | lines++; | ||
68 | case '\r': | ||
69 | case '\f': | ||
70 | if (linepos > length) | ||
71 | length = linepos; | ||
72 | linepos = 0; | ||
73 | goto word_separator; | ||
74 | case '\t': | ||
75 | linepos += 8 - (linepos % 8); | ||
76 | goto word_separator; | ||
77 | case ' ': | ||
78 | linepos++; | ||
79 | case '\v': | ||
80 | word_separator: | ||
81 | if (in_word) { | ||
82 | in_word = 0; | ||
83 | words++; | ||
84 | } | ||
85 | break; | ||
86 | default: | ||
87 | linepos++; | ||
88 | in_word = 1; | ||
89 | break; | ||
90 | } | ||
91 | } | ||
92 | if (linepos > length) | ||
93 | length = linepos; | ||
94 | if (in_word) | ||
95 | words++; | ||
96 | print_counts(lines, words, chars, length, name); | ||
97 | total_lines += lines; | ||
98 | total_words += words; | ||
99 | total_chars += chars; | ||
100 | if (length > max_length) | ||
101 | max_length = length; | ||
102 | fclose(file); | ||
103 | fflush(stdout); | ||
104 | } | ||
105 | |||
106 | int wc_main(int argc, char **argv) | ||
107 | { | ||
108 | FILE *file; | ||
109 | unsigned int num_files_counted = 0; | ||
110 | int opt, status = EXIT_SUCCESS; | ||
111 | |||
112 | total_lines = total_words = total_chars = max_length = 0; | ||
113 | print_lines = print_words = print_chars = print_length = 0; | ||
114 | |||
115 | while ((opt = getopt(argc, argv, "clLw")) > 0) { | ||
116 | switch (opt) { | ||
117 | case 'c': | ||
118 | print_chars = 1; | ||
119 | break; | ||
120 | case 'l': | ||
121 | print_lines = 1; | ||
122 | break; | ||
123 | case 'L': | ||
124 | print_length = 1; | ||
125 | break; | ||
126 | case 'w': | ||
127 | print_words = 1; | ||
128 | break; | ||
129 | default: | ||
130 | show_usage(); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | if (!print_lines && !print_words && !print_chars && !print_length) | ||
135 | print_lines = print_words = print_chars = 1; | ||
136 | |||
137 | if (argv[optind] == NULL || strcmp(argv[optind], "-") == 0) { | ||
138 | wc_file(stdin, ""); | ||
139 | return EXIT_SUCCESS; | ||
140 | } else { | ||
141 | while (optind < argc) { | ||
142 | if ((file = wfopen(argv[optind], "r")) != NULL) | ||
143 | wc_file(file, argv[optind]); | ||
144 | else | ||
145 | status = EXIT_FAILURE; | ||
146 | num_files_counted++; | ||
147 | optind++; | ||
148 | } | ||
149 | } | ||
150 | |||
151 | if (num_files_counted > 1) | ||
152 | print_counts(total_lines, total_words, total_chars, | ||
153 | max_length, "total"); | ||
154 | |||
155 | return status; | ||
156 | } | ||