ntpd: default to FEATURE_NTP_AUTH=y
[oweals/busybox.git] / coreutils / uniq.c
index 358de789490e14f613394c3da952c664a043c3cb..f71557b675081f1843eabcfbd814bf4928653c2e 100644 (file)
@@ -6,10 +6,37 @@
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
+//config:config UNIQ
+//config:      bool "uniq (4.8 kb)"
+//config:      default y
+//config:      help
+//config:      uniq is used to remove duplicate lines from a sorted file.
+
+//applet:IF_UNIQ(APPLET(uniq, BB_DIR_USR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_UNIQ) += uniq.o
 
 /* BB_AUDIT SUSv3 compliant */
 /* http://www.opengroup.org/onlinepubs/007904975/utilities/uniq.html */
 
+//usage:#define uniq_trivial_usage
+//usage:       "[-cdu][-f,s,w N] [INPUT [OUTPUT]]"
+//usage:#define uniq_full_usage "\n\n"
+//usage:       "Discard duplicate lines\n"
+//usage:     "\n       -c      Prefix lines by the number of occurrences"
+//usage:     "\n       -d      Only print duplicate lines"
+//usage:     "\n       -u      Only print unique lines"
+//usage:     "\n       -i      Ignore case"
+//usage:     "\n       -f N    Skip first N fields"
+//usage:     "\n       -s N    Skip first N chars (after any skipped fields)"
+//usage:     "\n       -w N    Compare N characters in line"
+//usage:
+//usage:#define uniq_example_usage
+//usage:       "$ echo -e \"a\\na\\nb\\nc\\nc\\na\" | sort | uniq\n"
+//usage:       "a\n"
+//usage:       "b\n"
+//usage:       "c\n"
+
 #include "libbb.h"
 
 int uniq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
@@ -28,13 +55,13 @@ int uniq_main(int argc UNUSED_PARAM, char **argv)
                OPT_f = 0x8,
                OPT_s = 0x10,
                OPT_w = 0x20,
+               OPT_i = 0x40,
        };
 
        skip_fields = skip_chars = 0;
        max_chars = INT_MAX;
 
-       opt_complementary = "f+:s+:w+";
-       opt = getopt32(argv, "cduf:s:w:", &skip_fields, &skip_chars, &max_chars);
+       opt = getopt32(argv, "cduf:+s:+w:+i", &skip_fields, &skip_chars, &max_chars);
        argv += optind;
 
        input_filename = argv[0];
@@ -81,12 +108,17 @@ int uniq_main(int argc UNUSED_PARAM, char **argv)
                                ++cur_compare;
                        }
 
-                       if (!old_line || strncmp(old_compare, cur_compare, max_chars)) {
+                       if (!old_line)
+                               break;
+                       if ((opt & OPT_i)
+                               ? strncasecmp(old_compare, cur_compare, max_chars)
+                               : strncmp(old_compare, cur_compare, max_chars)
+                       ) {
                                break;
                        }
 
                        free(cur_line);
-                       ++dups;  /* testing for overflow seems excessive */
+                       ++dups;  /* testing for overflow seems excessive */
                }
 
                if (old_line) {
@@ -95,7 +127,7 @@ int uniq_main(int argc UNUSED_PARAM, char **argv)
                                        /* %7lu matches GNU coreutils 6.9 */
                                        printf("%7lu ", dups + 1);
                                }
-                               printf("%s\n", old_line);
+                               puts(old_line);
                        }
                        free(old_line);
                }