Added to repository (the code is actually from Oct 1998)
This commit is contained in:
parent
0c146118f1
commit
85e0983e73
|
@ -0,0 +1,13 @@
|
||||||
|
include GNUmakevars
|
||||||
|
include GNUmakerules
|
||||||
|
|
||||||
|
shuffle: shuffle.o
|
||||||
|
$(CC) $^ -lant -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o shuffle core foo bar
|
||||||
|
|
||||||
|
install: $(BINDIR)/shuffle
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f *.bak *.d
|
|
@ -0,0 +1,107 @@
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include <ant/io.h>
|
||||||
|
#include <ant/string.h>
|
||||||
|
|
||||||
|
char *cmnd;
|
||||||
|
|
||||||
|
char **lines;
|
||||||
|
int nr_lines;
|
||||||
|
int nr_lines_a;
|
||||||
|
|
||||||
|
unsigned int seed;
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: %s [-s seed]\n", cmnd);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void readfile(const char *filename)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char *ln;
|
||||||
|
|
||||||
|
if (STREQ(filename, "-")) {
|
||||||
|
fp = stdin;
|
||||||
|
} else {
|
||||||
|
fp = efopen(filename, "r");
|
||||||
|
}
|
||||||
|
while ((ln = getline(fp))) {
|
||||||
|
if (nr_lines >= nr_lines_a) {
|
||||||
|
nr_lines_a = nr_lines_a * 3 / 2 + 1;
|
||||||
|
assert (nr_lines_a > nr_lines);
|
||||||
|
lines = realloc(lines, nr_lines_a * sizeof(*lines));
|
||||||
|
assert(lines);
|
||||||
|
}
|
||||||
|
lines[nr_lines++] = strdup(ln);
|
||||||
|
}
|
||||||
|
if (fp != stdin) {
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void shuffle(void) {
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
srand(seed);
|
||||||
|
for (i = 0; i < nr_lines; i++) {
|
||||||
|
j = rand() / ((double)RAND_MAX + 1) * nr_lines;
|
||||||
|
assert (0 <= j && j < nr_lines);
|
||||||
|
p = lines[i];
|
||||||
|
lines[i] = lines[j];
|
||||||
|
lines[j] = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void dump(void) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nr_lines; i++) {
|
||||||
|
puts(lines[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int i;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
cmnd = argv[0];
|
||||||
|
|
||||||
|
seed = time(NULL);
|
||||||
|
while ((c = getopt(argc, argv, "")) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case 's':
|
||||||
|
seed = strtoul(optarg, &p, 0);
|
||||||
|
if (p == optarg || *p != '\0') usage();
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
usage();
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind == argc) {
|
||||||
|
readfile("-");
|
||||||
|
}
|
||||||
|
for (i = optind; i < argc; i++) {
|
||||||
|
readfile(argv[i]);
|
||||||
|
}
|
||||||
|
shuffle();
|
||||||
|
dump();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue