/* vi: set sw=4 ts=4: */
/*
 * shuf: Write a random permutation of the input lines to standard output.
 *
 * Copyright (C) 2014 by Bartosz Golaszewski <bartekgola@gmail.com>
 *
 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
 */

//config:config SHUF
//config:	bool "shuf"
//config:	default y
//config:	help
//config:	  Generate random permutations

//kbuild:lib-$(CONFIG_SHUF) += shuf.o
//applet:IF_SHUF(APPLET_NOEXEC(shuf, shuf, BB_DIR_USR_BIN, BB_SUID_DROP, shuf))

//usage:#define shuf_trivial_usage
//usage:       "[-e|-i L-H] [-n NUM] [-o FILE] [-z] [FILE|ARG...]"
//usage:#define shuf_full_usage "\n\n"
//usage:       "Randomly permute lines\n"
//usage:     "\n	-e	Treat ARGs as lines"
//usage:     "\n	-i L-H	Treat numbers L-H as lines"
//usage:     "\n	-n NUM	Output at most NUM lines"
//usage:     "\n	-o FILE	Write to FILE, not standard output"
//usage:     "\n	-z	End lines with zero byte, not newline"

#include "libbb.h"

/* This is a NOEXEC applet. Be very careful! */

#define OPT_e		(1 << 0)
#define OPT_i		(1 << 1)
#define OPT_n		(1 << 2)
#define OPT_o		(1 << 3)
#define OPT_z		(1 << 4)
#define OPT_STR		"ei:n:o:z"

/*
 * Use the Fisher-Yates shuffle algorithm on an array of lines.
 */
static void shuffle_lines(char **lines, unsigned numlines)
{
	unsigned i;
	unsigned r;
	char *tmp;

	srand(monotonic_us());

	for (i = numlines-1; i > 0; i--) {
		r = rand();
		/* RAND_MAX can be as small as 32767 */
		if (i > RAND_MAX)
			r ^= rand() << 15;
		r %= i;
		tmp = lines[i];
		lines[i] = lines[r];
		lines[r] = tmp;
	}
}

int shuf_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int shuf_main(int argc, char **argv)
{
	unsigned opts;
	char *opt_i_str, *opt_n_str, *opt_o_str;
	unsigned i;
	char **lines;
	unsigned numlines;
	char eol;

	opt_complementary = "e--i:i--e"; /* mutually exclusive */
	opts = getopt32(argv, OPT_STR, &opt_i_str, &opt_n_str, &opt_o_str);

	argc -= optind;
	argv += optind;

	/* Prepare lines for shuffling - either: */
	if (opts & OPT_e) {
		/* make lines from command-line arguments */
		numlines = argc;
		lines = argv;
	} else
	if (opts & OPT_i) {
		/* create a range of numbers */
		char *dash;
		unsigned lo, hi;

		dash = strchr(opt_i_str, '-');
		if (!dash) {
			bb_error_msg_and_die("bad range '%s'", opt_i_str);
		}
		*dash = '\0';
		lo = xatou(opt_i_str);
		hi = xatou(dash + 1);
	 	*dash = '-';
		if (hi < lo) {
			bb_error_msg_and_die("bad range '%s'", opt_i_str);
		}

		numlines = (hi+1) - lo;
		lines = xmalloc(numlines * sizeof(lines[0]));
		for (i = 0; i < numlines; i++) {
			lines[i] = (char*)(uintptr_t)lo;
			lo++;
		}
	} else {
		/* default - read lines from stdin or the input file */
		FILE *fp;

		if (argc > 1)
			bb_show_usage();

		fp = xfopen_stdin(argv[0] ? argv[0] : "-");
		lines = NULL;
		numlines = 0;
		for (;;) {
			char *line = xmalloc_fgetline(fp);
			if (!line)
				break;
			lines = xrealloc_vector(lines, 6, numlines);
			lines[numlines++] = line;
		}
		fclose_if_not_stdin(fp);
	}

	if (numlines != 0)
		shuffle_lines(lines, numlines);

	if (opts & OPT_o)
		xmove_fd(xopen(opt_o_str, O_WRONLY|O_CREAT|O_TRUNC), STDOUT_FILENO);

	if (opts & OPT_n) {
		unsigned maxlines;
		maxlines = xatou(opt_n_str);
		if (numlines > maxlines)
			numlines = maxlines;
	}

	eol = '\n';
	if (opts & OPT_z)
		eol = '\0';

	for (i = 0; i < numlines; i++) {
		if (opts & OPT_i)
			printf("%u%c", (unsigned)(uintptr_t)lines[i], eol);
		else
			printf("%s%c", lines[i], eol);
	}

	fflush_stdout_and_exit(EXIT_SUCCESS);
}
