diff -Nur coreutils-5.2.1.orig/THANKS coreutils-5.2.1/THANKS --- coreutils-5.2.1.orig/THANKS 2004-03-10 18:52:58.000000000 +0100 +++ coreutils-5.2.1/THANKS 2004-08-25 15:55:21.000000000 +0200 @@ -408,6 +408,7 @@ Theodore Ts'o address@hidden Thomas Bushnell address@hidden Thomas Goerlich address@hidden +Thomas Habets address@hidden Thomas Luzat address@hidden Thomas Quinot address@hidden Tim J. Robbins address@hidden diff -Nur coreutils-5.2.1.orig/man/sort.1 coreutils-5.2.1/man/sort.1 --- coreutils-5.2.1.orig/man/sort.1 2004-03-02 23:52:31.000000000 +0100 +++ coreutils-5.2.1/man/sort.1 2004-08-25 15:57:03.000000000 +0200 @@ -36,6 +36,9 @@ .TP \fB\-r\fR, \fB\-\-reverse\fR reverse the result of comparisons +.TP +\fB\-R\fR, \fB\-\-random\fR +randomize the result of comparisons .PP Other options: .TP diff -Nur coreutils-5.2.1.orig/src/sort.c coreutils-5.2.1/src/sort.c --- coreutils-5.2.1.orig/src/sort.c 2004-02-17 11:47:35.000000000 +0100 +++ coreutils-5.2.1/src/sort.c 2004-08-25 15:59:08.000000000 +0200 @@ -157,6 +157,7 @@ Handle numbers in exponential notation. */ bool month; /* Flag for comparison by month name. */ bool reverse; /* Reverse the sense of comparison. */ + bool random; /* randomize order */ struct keyfield *next; /* Next keyfield to try. */ }; @@ -240,6 +241,9 @@ /* Flag to reverse the order of all comparisons. */ static bool reverse; +/* */ +static bool randomsort; + /* Flag for stable sort. This turns off the last ditch bytewise comparison of lines, and instead leaves lines in the same order they were read if all keys compare equal. */ @@ -297,6 +301,7 @@ -M, --month-sort compare (unknown) < `JAN' < ... < `DEC'\n\ -n, --numeric-sort compare according to string numerical value\n\ -r, --reverse reverse the result of comparisons\n\ + -R, --random randomize order\n\ \n\ "), stdout); fputs (_("\ @@ -346,7 +351,7 @@ exit (status); } -#define COMMON_SHORT_OPTIONS "-bcdfgik:mMno:rsS:t:T:uz" +#define COMMON_SHORT_OPTIONS "-bcdfgik:mMno:rRsS:t:T:uz" static struct option const long_options[] = { @@ -362,6 +367,7 @@ {"numeric-sort", no_argument, NULL, 'n'}, {"output", required_argument, NULL, 'o'}, {"reverse", no_argument, NULL, 'r'}, + {"random", no_argument, NULL, 'R'}, {"stable", no_argument, NULL, 's'}, {"buffer-size", required_argument, NULL, 'S'}, {"field-separator", required_argument, NULL, 't'}, @@ -1349,6 +1355,11 @@ int diff; + if (key->random) + { + return rand()%2 ? -1 : 1; + } + for (;;) { register char const *translate = key->translate; @@ -1516,6 +1527,11 @@ int diff; size_t alen, blen; + if (randomsort) + { + return rand()%2 ? -1 : 1; + } + /* First try to compare on the specified keys (if any). The only two cases with no key at all are unadorned sort, and unadorned sort -r. */ @@ -2192,6 +2208,10 @@ case 'r': key->reverse = true; break; + case 'R': + srand(time(NULL)); + key->random = true; + break; default: return (char *) s; } @@ -2301,7 +2321,7 @@ gkey.ignore = NULL; gkey.translate = NULL; gkey.numeric = gkey.general_numeric = gkey.month = gkey.reverse = false; - gkey.skipsblanks = gkey.skipeblanks = false; + gkey.random = gkey.skipsblanks = gkey.skipeblanks = false; files = xnmalloc (argc, sizeof *files); @@ -2376,6 +2396,7 @@ case 'M': case 'n': case 'r': + case 'R': { char str[2]; str[0] = c; @@ -2515,7 +2536,7 @@ /* Inheritance of global options to individual keys. */ for (key = keylist; key; key = key->next) if (! (key->ignore || key->translate - || (key->skipsblanks | key->reverse + || (key->skipsblanks | key->reverse | key->random | key->skipeblanks | key->month | key->numeric | key->general_numeric))) { @@ -2527,6 +2548,7 @@ key->numeric = gkey.numeric; key->general_numeric = gkey.general_numeric; key->reverse = gkey.reverse; + key->random = gkey.random; } if (!keylist && (gkey.ignore || gkey.translate @@ -2534,6 +2556,7 @@ | gkey.numeric | gkey.general_numeric))) insertkey (&gkey); reverse = gkey.reverse; + randomsort = gkey.random; if (temp_dir_count == 0) {