diff options
Diffstat (limited to 'busybox/coreutils/sort.c')
-rw-r--r-- | busybox/coreutils/sort.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/busybox/coreutils/sort.c b/busybox/coreutils/sort.c new file mode 100644 index 000000000..8cc4d8886 --- /dev/null +++ b/busybox/coreutils/sort.c | |||
@@ -0,0 +1,100 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Mini sort implementation for busybox | ||
4 | * | ||
5 | * Copyright (C) 2000 by Matt Kraai <kraai@alumni.carnegiemellon.edu> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | /* BB_AUDIT SUSv3 _NOT_ compliant -- a number of options are not supported. */ | ||
24 | /* http://www.opengroup.org/onlinepubs/007904975/utilities/sort.html */ | ||
25 | |||
26 | /* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) | ||
27 | * | ||
28 | * Now does proper error checking on i/o. Plus some space savings. | ||
29 | */ | ||
30 | |||
31 | #include <stdio.h> | ||
32 | #include <stdlib.h> | ||
33 | #include <string.h> | ||
34 | #include <unistd.h> | ||
35 | #include "busybox.h" | ||
36 | #include "libcoreutils/coreutils.h" | ||
37 | |||
38 | static int compare_ascii(const void *x, const void *y) | ||
39 | { | ||
40 | return strcmp(*(char **)x, *(char **)y); | ||
41 | } | ||
42 | |||
43 | static int compare_numeric(const void *x, const void *y) | ||
44 | { | ||
45 | int z = atoi(*(char **)x) - atoi(*(char **)y); | ||
46 | return z ? z : strcmp(*(char **)x, *(char **)y); | ||
47 | } | ||
48 | |||
49 | int sort_main(int argc, char **argv) | ||
50 | { | ||
51 | FILE *fp; | ||
52 | char *line, **lines = NULL; | ||
53 | int i, nlines = 0, inc; | ||
54 | int (*compare)(const void *, const void *) = compare_ascii; | ||
55 | |||
56 | int flags; | ||
57 | |||
58 | bb_default_error_retval = 2; | ||
59 | |||
60 | flags = bb_getopt_ulflags(argc, argv, "nru"); | ||
61 | if (flags & 1) { | ||
62 | compare = compare_numeric; | ||
63 | } | ||
64 | |||
65 | argv += optind; | ||
66 | if (!*argv) { | ||
67 | *--argv = "-"; | ||
68 | } | ||
69 | |||
70 | do { | ||
71 | fp = xgetoptfile_sort_uniq(argv, "r"); | ||
72 | while ((line = bb_get_chomped_line_from_file(fp)) != NULL) { | ||
73 | lines = xrealloc(lines, sizeof(char *) * (nlines + 1)); | ||
74 | lines[nlines++] = line; | ||
75 | } | ||
76 | bb_xferror(fp, *argv); | ||
77 | bb_fclose_nonstdin(fp); | ||
78 | } while (*++argv); | ||
79 | |||
80 | /* sort it */ | ||
81 | qsort(lines, nlines, sizeof(char *), compare); | ||
82 | |||
83 | /* print it */ | ||
84 | i = 0; | ||
85 | --nlines; | ||
86 | if ((inc = 1 - (flags & 2)) < 0) { /* reverse */ | ||
87 | i = nlines; | ||
88 | } | ||
89 | flags &= 4; | ||
90 | |||
91 | while (nlines >= 0) { | ||
92 | if (!flags || !nlines || strcmp(lines[i+inc], lines[i])) { | ||
93 | puts(lines[i]); | ||
94 | } | ||
95 | i += inc; | ||
96 | --nlines; | ||
97 | } | ||
98 | |||
99 | bb_fflush_stdout_and_exit(EXIT_SUCCESS); | ||
100 | } | ||