From cad5364599eb5062d59e0c397ed638ddd61a8d5d Mon Sep 17 00:00:00 2001 From: Manuel Novoa III Date: Wed, 19 Mar 2003 09:13:01 +0000 Subject: Major coreutils update. --- coreutils/sort.c | 98 ++++++++++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 52 deletions(-) (limited to 'coreutils/sort.c') diff --git a/coreutils/sort.c b/coreutils/sort.c index fc12dfb01..8cc4d8886 100644 --- a/coreutils/sort.c +++ b/coreutils/sort.c @@ -2,7 +2,6 @@ /* * Mini sort implementation for busybox * - * * Copyright (C) 2000 by Matt Kraai * * This program is free software; you can redistribute it and/or modify @@ -21,10 +20,20 @@ * */ -#include -#include +/* BB_AUDIT SUSv3 _NOT_ compliant -- a number of options are not supported. */ +/* http://www.opengroup.org/onlinepubs/007904975/utilities/sort.html */ + +/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) + * + * Now does proper error checking on i/o. Plus some space savings. + */ + +#include #include +#include +#include #include "busybox.h" +#include "libcoreutils/coreutils.h" static int compare_ascii(const void *x, const void *y) { @@ -41,66 +50,51 @@ int sort_main(int argc, char **argv) { FILE *fp; char *line, **lines = NULL; - int i, opt, nlines = 0; + int i, nlines = 0, inc; int (*compare)(const void *, const void *) = compare_ascii; -#ifdef CONFIG_FEATURE_SORT_REVERSE - int reverse = FALSE; -#endif -#ifdef CONFIG_FEATURE_SORT_UNIQUE - int unique = FALSE; -#endif - while ((opt = getopt(argc, argv, "nru")) != -1) { - switch (opt) { - case 'n': - compare = compare_numeric; - break; -#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(); - } + int flags; + + bb_default_error_retval = 2; + + flags = bb_getopt_ulflags(argc, argv, "nru"); + if (flags & 1) { + compare = compare_numeric; } - /* read the input */ - for (i = optind; i == optind || i < argc; i++) { - if (argv[i] == NULL) - fp = stdin; - else - fp = xfopen(argv[i], "r"); + argv += optind; + if (!*argv) { + *--argv = "-"; + } - while ((line = get_line_from_file(fp)) != NULL) { + do { + fp = xgetoptfile_sort_uniq(argv, "r"); + while ((line = bb_get_chomped_line_from_file(fp)) != NULL) { lines = xrealloc(lines, sizeof(char *) * (nlines + 1)); - chomp(line); lines[nlines++] = line; } - } + bb_xferror(fp, *argv); + bb_fclose_nonstdin(fp); + } while (*++argv); /* sort it */ qsort(lines, nlines, sizeof(char *), compare); /* print it */ -#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 - puts(lines[i]); - return EXIT_SUCCESS; + i = 0; + --nlines; + if ((inc = 1 - (flags & 2)) < 0) { /* reverse */ + i = nlines; + } + flags &= 4; + + while (nlines >= 0) { + if (!flags || !nlines || strcmp(lines[i+inc], lines[i])) { + puts(lines[i]); + } + i += inc; + --nlines; + } + + bb_fflush_stdout_and_exit(EXIT_SUCCESS); } -- cgit v1.2.3