Reorganise, make it just one function, remove -v option it didnt work properly anyway...
[oweals/busybox.git] / coreutils / sort.c
index 5ecca8b8f841157b1404a03767fbbbfe5412e930..fc12dfb01ee23db6c41d459778d9b156a56678c5 100644 (file)
@@ -43,19 +43,27 @@ int sort_main(int argc, char **argv)
        char *line, **lines = NULL;
        int i, opt, nlines = 0;
        int (*compare)(const void *, const void *) = compare_ascii;
-#ifdef BB_FEATURE_SORT_REVERSE
+#ifdef CONFIG_FEATURE_SORT_REVERSE
        int reverse = FALSE;
 #endif
+#ifdef CONFIG_FEATURE_SORT_UNIQUE
+       int unique = FALSE;
+#endif
 
-       while ((opt = getopt(argc, argv, "nr")) != -1) {
+       while ((opt = getopt(argc, argv, "nru")) != -1) {
                switch (opt) {
                        case 'n':
                                compare = compare_numeric;
                                break;
-#ifdef BB_FEATURE_SORT_REVERSE
+#ifdef CONFIG_FEATURE_SORT_REVERSE
                        case 'r':
                                reverse = TRUE;
                                break;
+#endif
+#ifdef CONFIG_FEATURE_SORT_UNIQUE
+                       case 'u':
+                               unique = TRUE;
+                               break;
 #endif
                        default:
                                show_usage();
@@ -80,13 +88,19 @@ int sort_main(int argc, char **argv)
        qsort(lines, nlines, sizeof(char *), compare);
 
        /* print it */
-#ifdef BB_FEATURE_SORT_REVERSE
-       if (reverse)
-               for (i = nlines - 1; 0 <= i; i--)
-                       puts(lines[i]);
-       else
+#ifdef CONFIG_FEATURE_SORT_REVERSE
+       if (reverse) {
+               for (i = --nlines; 0 <= i; i--)
+#ifdef CONFIG_FEATURE_SORT_UNIQUE
+                       if((!unique) || (i == nlines) || (strcmp(lines[i + 1], lines[i])))
+#endif
+                               puts(lines[i]);
+       } else
+#endif
+               for (i = 0; i < nlines; i++)
+#ifdef CONFIG_FEATURE_SORT_UNIQUE
+                       if((!unique) || (!i) || (strcmp(lines[i - 1], lines[i])))
 #endif
-       for (i = 0; i < nlines; i++)
-               puts(lines[i]);
+                               puts(lines[i]);
        return EXIT_SUCCESS;
 }