diff options
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/uniq.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/coreutils/uniq.c b/coreutils/uniq.c index 0cc0c83b3..bcdf44026 100644 --- a/coreutils/uniq.c +++ b/coreutils/uniq.c @@ -12,13 +12,14 @@ #include "busybox.h" -static const char uniq_opts[] = "f:s:" "cdu\0\1\2\4"; +static const char uniq_opts[] = "cdu" "f:s:" "cdu\0\1\2\4"; static FILE *xgetoptfile_uniq_s(char **argv, int read0write2) { const char *n; - if ((n = *argv) != NULL) { + n = *argv; + if (n != NULL) { if ((*n != '-') || n[1]) { return xfopen(n, "r\0w" + read0write2); } @@ -30,28 +31,28 @@ int uniq_main(int argc, char **argv); int uniq_main(int argc, char **argv) { FILE *in, *out; - unsigned long dups, skip_fields, skip_chars, i, uniq_flags; + unsigned long dups, skip_fields, skip_chars, i; const char *s0, *e0, *s1, *e1, *input_filename; - int opt; + unsigned opt; - uniq_flags = skip_fields = skip_chars = 0; + enum { + OPT_c = 0x1, + OPT_d = 0x2, + OPT_u = 0x4, + OPT_f = 0x8, + OPT_s = 0x10, + }; - while ((opt = getopt(argc, argv, uniq_opts)) > 0) { - if ((opt == 'f') || (opt == 's')) { - unsigned long t = xatoul(optarg); - if (opt == 'f') { - skip_fields = t; - } else { - skip_chars = t; - } - } else if ((s0 = strchr(uniq_opts, opt)) != NULL) { - uniq_flags |= s0[4]; - } else { - bb_show_usage(); - } - } + skip_fields = skip_chars = 0; + + opt = getopt32(argc, argv, "cduf:s:", &s0, &s1); + if (opt & OPT_f) + skip_fields = xatoul(s0); + if (opt & OPT_s) + skip_chars = xatoul(s1); + argv += optind; - input_filename = *(argv += optind); + input_filename = *argv; in = xgetoptfile_uniq_s(argv, 0); if (*argv) { @@ -90,8 +91,8 @@ int uniq_main(int argc, char **argv) } if (s0) { - if (!(uniq_flags & (2 << !!dups))) { - fprintf(out, "\0%d " + (uniq_flags & 1), dups + 1); + if (!(opt & (OPT_d << !!dups))) { /* (if dups, opt & OPT_e) */ + fprintf(out, "\0%d " + (opt & 1), dups + 1); fprintf(out, "%s\n", s0); } free((void *)s0); |