diff options
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/du.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/coreutils/du.c b/coreutils/du.c index 14e0bdf24..e5788c63d 100644 --- a/coreutils/du.c +++ b/coreutils/du.c @@ -32,17 +32,35 @@ #include <sys/stat.h> #endif +typedef void (Display)(size_t, char *); + static const char du_usage[] = -"Usage: du [OPTION]... [FILE]...\n"; +"Usage: du [OPTION]... [FILE]...\n\n" +"\t-s\tdisplay only a total for each argument\n" +; -typedef void (Display)(size_t, char *); +static int du_depth = 0; + +static Display *print; static void -print(size_t size, char *filename) +print_null(size_t size, char *filename) { } + +static void +print_normal(size_t size, char *filename) { fprintf(stdout, "%-7d %s\n", (size >> 1), filename); } +static void +print_summary(size_t size, char *filename) +{ + if (du_depth == 1) { + print_normal(size, filename); + } +} + + /* tiny recursive du */ static size_t du(char *filename) @@ -54,6 +72,8 @@ du(char *filename) fprintf(stdout, "du: %s: %s\n", filename, strerror(errno)); return 0; } + + du_depth++; sum = statbuf.st_blocks; if (S_ISDIR(statbuf.st_mode)) { @@ -76,6 +96,7 @@ du(char *filename) closedir(dir); print(sum, filename); } + du_depth--; return sum; } @@ -85,12 +106,16 @@ du_main(int argc, char **argv) int i; char opt; + /* default behaviour */ + print = print_normal; + /* parse argv[] */ for (i = 1; i < argc; i++) { if (argv[i][0] == '-') { opt = argv[i][1]; switch (opt) { case 's': + print = print_summary; break; case 'h': usage(du_usage); @@ -110,12 +135,12 @@ du_main(int argc, char **argv) } else { int sum; for ( ; i < argc; i++) { - sum = du(argv[i]) >> 1; - if (sum) printf("%-7d %s\n", sum, argv[i]); + sum = du(argv[i]); + if (sum) { print_normal(sum, argv[i]); } } } exit(0); } -/* $Id: du.c,v 1.5 1999/12/10 15:23:47 beppu Exp $ */ +/* $Id: du.c,v 1.6 1999/12/15 18:52:17 beppu Exp $ */ |