Fix mtab so it works on libc5
[oweals/busybox.git] / uniq.c
diff --git a/uniq.c b/uniq.c
index cfe6cca5e2d23026b6766c824e8b24d37742cc70..53e3c64f29c421d48cbc1e8fc7044154b0b8ab5a 100644 (file)
--- a/uniq.c
+++ b/uniq.c
@@ -3,7 +3,7 @@
  * Mini uniq implementation for busybox
  *
  *
- * Copyright (C) 1999,2000 by Lineo, inc.
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
  * Written by John Beppu <beppu@lineo.com>
  * Rewritten by Matt Kraai <kraai@alumni.carnegiemellon.edu>
  *
  *
  */
 
-#include "busybox.h"
 #include <stdio.h>
 #include <string.h>
+#include <getopt.h>
 #include <errno.h>
+#include <stdlib.h>
+#include "busybox.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;