A patch from Erik Meusel <erik@wh58-709.st.uni-magdeburg.de>
[oweals/busybox.git] / coreutils / sort.c
index 2aef2d95511f9df59369ee9170ca4eb76eec4e8c..4f4979cc57facff7f476548e43fba6f8b9d2b01c 100644 (file)
  *
  */
 
-#include "busybox.h"
 #include <getopt.h>
+#include <string.h>
 #include <stdlib.h>
+#include "busybox.h"
 
-int compare_ascii(const void *x, const void *y)
+static int compare_ascii(const void *x, const void *y)
 {
        return strcmp(*(char **)x, *(char **)y);
 }
 
-int compare_numeric(const void *x, const void *y)
+static int compare_numeric(const void *x, const void *y)
 {
-       return atoi(*(char **)x) - atoi(*(char **)y);
+       int z = atoi(*(char **)x) - atoi(*(char **)y);
+       return z ? z : strcmp(*(char **)x, *(char **)y);
 }
 
 int sort_main(int argc, char **argv)
@@ -44,8 +46,11 @@ int sort_main(int argc, char **argv)
 #ifdef BB_FEATURE_SORT_REVERSE
        int reverse = FALSE;
 #endif
+#ifdef BB_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;
@@ -54,9 +59,14 @@ int sort_main(int argc, char **argv)
                        case 'r':
                                reverse = TRUE;
                                break;
+#endif
+#ifdef BB_FEATURE_SORT_UNIQUE
+                       case 'u':
+                               unique = TRUE;
+                               break;
 #endif
                        default:
-                               usage(sort_usage);
+                               show_usage();
                }
        }
 
@@ -69,6 +79,7 @@ int sort_main(int argc, char **argv)
 
                while ((line = get_line_from_file(fp)) != NULL) {
                        lines = xrealloc(lines, sizeof(char *) * (nlines + 1));
+                       chomp(line);
                        lines[nlines++] = line;
                }
        }
@@ -78,12 +89,18 @@ int sort_main(int argc, char **argv)
 
        /* print it */
 #ifdef BB_FEATURE_SORT_REVERSE
-       if (reverse)
-               for (i = nlines - 1; 0 <= i; i--)
-                       fputs(lines[i], stdout);
-       else
+       if (reverse) {
+               for (i = --nlines; 0 <= i; i--)
+#ifdef BB_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 BB_FEATURE_SORT_UNIQUE
+                       if((!unique) || (!i) || (strcmp(lines[i - 1], lines[i])))
 #endif
-       for (i = 0; i < nlines; i++)
-               fputs(lines[i], stdout);
+                               puts(lines[i]);
        return EXIT_SUCCESS;
 }