Patch from Matt Kraai to implement uniq -[cdu]
diff --git a/applets/usage.c b/applets/usage.c
index 75c421a..ae6cec8 100644
--- a/applets/usage.c
+++ b/applets/usage.c
@@ -1365,6 +1365,10 @@
 #ifndef BB_FEATURE_TRIVIAL_HELP
 	"\nDiscard all but one of successive identical lines from INPUT\n"
 	"(or standard input), writing to OUTPUT (or standard output).\n"
+	"Options:\n"
+	"\t-c\tprefix lines by the number of occurrences\n"
+	"\t-d\tonly print duplicate lines\n"
+	"\t-u\tonly print unique lines\n"
 #endif
 	;
 #endif
diff --git a/coreutils/uniq.c b/coreutils/uniq.c
index cfe6cca..c0229ae 100644
--- a/coreutils/uniq.c
+++ b/coreutils/uniq.c
@@ -28,28 +28,59 @@
 #include <string.h>
 #include <errno.h>
 
+static int print_count;
+static int print_uniq = 1;
+static int print_duplicates = 1;
+
+static void print_line(char *line, int count, FILE *fp)
+{
+	if ((print_duplicates && count > 1) || (print_uniq && count == 1)) {
+		if (print_count)
+			fprintf(fp, "%7d\t%s", count, line);
+		else
+			fputs(line, fp);
+	}
+}
+
 int uniq_main(int argc, char **argv)
 {
 	FILE *in = stdin, *out = stdout;
 	char *lastline = NULL, *input;
+	int opt, count = 0;
 
 	/* parse argv[] */
-	if ((argc > 1 && **(argv + 1) == '-') || argc > 3)
-		usage(uniq_usage);
+	while ((opt = getopt(argc, argv, "cdu")) > 0) {
+		switch (opt) {
+			case 'c':
+				print_count = 1;
+				break;
+			case 'd':
+				print_duplicates = 1;
+				print_uniq = 0;
+				break;
+			case 'u':
+				print_duplicates = 0;
+				print_uniq = 1;
+				break;
+		}
+	}
 
-	if (argv[1] != NULL) {
-		in = xfopen(argv[1], "r");
-		if (argv[2] != NULL)
-			out = xfopen(argv[2], "w");
+	if (argv[optind] != NULL) {
+		in = xfopen(argv[optind], "r");
+		if (argv[optind+1] != NULL)
+			out = xfopen(argv[optind+1], "w");
 	}
 
 	while ((input = get_line_from_file(in)) != NULL) {
 		if (lastline == NULL || strcmp(input, lastline) != 0) {
-			fputs(input, out);
+			print_line(lastline, count, out);
 			free(lastline);
 			lastline = input;
+			count = 0;
 		}
+		count++;
 	}
+	print_line(lastline, count, out);
 	free(lastline);
 
 	return EXIT_SUCCESS;
diff --git a/docs/busybox.pod b/docs/busybox.pod
index 2ddacd1..5e47984 100644
--- a/docs/busybox.pod
+++ b/docs/busybox.pod
@@ -1954,6 +1954,12 @@
 
 Discard all but one of successive identical lines from INPUT
 (or standard input), writing to OUTPUT (or standard output).
+	
+Options:
+
+	-c		prefix lines by the number of occurrences
+	-d		only print duplicate lines
+	-u		only print unique lines
 
 Example:
 
@@ -2286,4 +2292,4 @@
 
 =cut
 
-# $Id: busybox.pod,v 1.79 2000/12/08 20:38:00 andersen Exp $
+# $Id: busybox.pod,v 1.80 2000/12/09 16:37:53 andersen Exp $
diff --git a/docs/busybox.sgml b/docs/busybox.sgml
index 1848141..7d86e19 100644
--- a/docs/busybox.sgml
+++ b/docs/busybox.sgml
@@ -3428,6 +3428,18 @@
 		</para>
 
 		<para>
+		Options:
+		</para>
+
+		<para>
+		<screen>
+		-c		prefix lines by the number of occurrences
+		-d		only print duplicate lines
+		-u		only print unique lines
+		</screen>
+		</para>
+
+		<para>
 		Example:
 		</para>
 
diff --git a/uniq.c b/uniq.c
index cfe6cca..c0229ae 100644
--- a/uniq.c
+++ b/uniq.c
@@ -28,28 +28,59 @@
 #include <string.h>
 #include <errno.h>
 
+static int print_count;
+static int print_uniq = 1;
+static int print_duplicates = 1;
+
+static void print_line(char *line, int count, FILE *fp)
+{
+	if ((print_duplicates && count > 1) || (print_uniq && count == 1)) {
+		if (print_count)
+			fprintf(fp, "%7d\t%s", count, line);
+		else
+			fputs(line, fp);
+	}
+}
+
 int uniq_main(int argc, char **argv)
 {
 	FILE *in = stdin, *out = stdout;
 	char *lastline = NULL, *input;
+	int opt, count = 0;
 
 	/* parse argv[] */
-	if ((argc > 1 && **(argv + 1) == '-') || argc > 3)
-		usage(uniq_usage);
+	while ((opt = getopt(argc, argv, "cdu")) > 0) {
+		switch (opt) {
+			case 'c':
+				print_count = 1;
+				break;
+			case 'd':
+				print_duplicates = 1;
+				print_uniq = 0;
+				break;
+			case 'u':
+				print_duplicates = 0;
+				print_uniq = 1;
+				break;
+		}
+	}
 
-	if (argv[1] != NULL) {
-		in = xfopen(argv[1], "r");
-		if (argv[2] != NULL)
-			out = xfopen(argv[2], "w");
+	if (argv[optind] != NULL) {
+		in = xfopen(argv[optind], "r");
+		if (argv[optind+1] != NULL)
+			out = xfopen(argv[optind+1], "w");
 	}
 
 	while ((input = get_line_from_file(in)) != NULL) {
 		if (lastline == NULL || strcmp(input, lastline) != 0) {
-			fputs(input, out);
+			print_line(lastline, count, out);
 			free(lastline);
 			lastline = input;
+			count = 0;
 		}
+		count++;
 	}
+	print_line(lastline, count, out);
 	free(lastline);
 
 	return EXIT_SUCCESS;
diff --git a/usage.c b/usage.c
index 75c421a..ae6cec8 100644
--- a/usage.c
+++ b/usage.c
@@ -1365,6 +1365,10 @@
 #ifndef BB_FEATURE_TRIVIAL_HELP
 	"\nDiscard all but one of successive identical lines from INPUT\n"
 	"(or standard input), writing to OUTPUT (or standard output).\n"
+	"Options:\n"
+	"\t-c\tprefix lines by the number of occurrences\n"
+	"\t-d\tonly print duplicate lines\n"
+	"\t-u\tonly print unique lines\n"
 #endif
 	;
 #endif