diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-08-31 05:15:21 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-08-31 05:15:21 +0200 |
commit | 44f174e61b9f02e1d9210d292886498cee4aced7 (patch) | |
tree | 331109b8cf6d195216a1e8db041f65ca45b26a9b /coreutils | |
parent | a00329ca8edd29c62084e400aa972cfcd0a8ab02 (diff) | |
download | busybox-w32-44f174e61b9f02e1d9210d292886498cee4aced7.tar.gz busybox-w32-44f174e61b9f02e1d9210d292886498cee4aced7.tar.bz2 busybox-w32-44f174e61b9f02e1d9210d292886498cee4aced7.zip |
uniq: shave off whole 10 bytes off, oh my
text data bss dec hex filename
823673 458 6956 831087 cae6f busybox_old
823663 458 6956 831077 cae65 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/uniq.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/coreutils/uniq.c b/coreutils/uniq.c index 910f46e15..e566dc1bc 100644 --- a/coreutils/uniq.c +++ b/coreutils/uniq.c | |||
@@ -12,20 +12,6 @@ | |||
12 | 12 | ||
13 | #include "libbb.h" | 13 | #include "libbb.h" |
14 | 14 | ||
15 | static void xgetoptfile_uniq_s(const char *n, int fd) | ||
16 | { | ||
17 | if (n == NULL) | ||
18 | return; | ||
19 | if ((n[0] == '-') && !n[1]) | ||
20 | return; | ||
21 | /* close(fd); - optimization */ | ||
22 | xmove_fd( | ||
23 | xopen3(n, | ||
24 | (fd == STDIN_FILENO) ? O_RDONLY : (O_WRONLY | O_CREAT | O_TRUNC), | ||
25 | 0666), | ||
26 | fd); | ||
27 | } | ||
28 | |||
29 | int uniq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 15 | int uniq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
30 | int uniq_main(int argc UNUSED_PARAM, char **argv) | 16 | int uniq_main(int argc UNUSED_PARAM, char **argv) |
31 | { | 17 | { |
@@ -51,15 +37,25 @@ int uniq_main(int argc UNUSED_PARAM, char **argv) | |||
51 | opt = getopt32(argv, "cduf:s:w:", &skip_fields, &skip_chars, &max_chars); | 37 | opt = getopt32(argv, "cduf:s:w:", &skip_fields, &skip_chars, &max_chars); |
52 | argv += optind; | 38 | argv += optind; |
53 | 39 | ||
54 | input_filename = *argv; | 40 | input_filename = argv[0]; |
41 | if (input_filename) { | ||
42 | const char *output; | ||
55 | 43 | ||
56 | xgetoptfile_uniq_s(*argv, STDIN_FILENO); | 44 | if (input_filename[0] != '-' || input_filename[1]) { |
57 | if (*argv) { | 45 | close(STDIN_FILENO); /* == 0 */ |
58 | ++argv; | 46 | xopen(input_filename, O_RDONLY); /* fd will be 0 */ |
59 | } | 47 | } |
60 | xgetoptfile_uniq_s(*argv, STDOUT_FILENO); | 48 | output = argv[1]; |
61 | if (*argv && argv[1]) { | 49 | if (output) { |
62 | bb_show_usage(); | 50 | if (argv[2]) |
51 | bb_show_usage(); | ||
52 | if (output[0] != '-' || output[1]) { | ||
53 | // Won't work with "uniq - FILE" and closed stdin: | ||
54 | //close(STDOUT_FILENO); | ||
55 | //xopen3(output, O_WRONLY | O_CREAT | O_TRUNC, 0666); | ||
56 | xmove_fd(xopen3(output, O_WRONLY | O_CREAT | O_TRUNC, 0666), STDOUT_FILENO); | ||
57 | } | ||
58 | } | ||
63 | } | 59 | } |
64 | 60 | ||
65 | cur_compare = cur_line = NULL; /* prime the pump */ | 61 | cur_compare = cur_line = NULL; /* prime the pump */ |
@@ -95,7 +91,10 @@ int uniq_main(int argc UNUSED_PARAM, char **argv) | |||
95 | 91 | ||
96 | if (old_line) { | 92 | if (old_line) { |
97 | if (!(opt & (OPT_d << !!dups))) { /* (if dups, opt & OPT_u) */ | 93 | if (!(opt & (OPT_d << !!dups))) { /* (if dups, opt & OPT_u) */ |
98 | printf("\0%lu " + (opt & 1), dups + 1); /* 1 == OPT_c */ | 94 | if (opt & OPT_c) { |
95 | /* %7lu matches GNU coreutils 6.9 */ | ||
96 | printf("%7lu ", dups + 1); | ||
97 | } | ||
99 | printf("%s\n", old_line); | 98 | printf("%s\n", old_line); |
100 | } | 99 | } |
101 | free(old_line); | 100 | free(old_line); |