/* randomize - randomize lines in a file
**
** Copyright (C) 1993 by Jef Poskanzer <jef@acme.com>.  All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
** 1. Redistributions of source code must retain the above copyright
**    notice, this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright
**    notice, this list of conditions and the following disclaimer in the
**    documentation and/or other materials provided with the distribution.
** 
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
** SUCH DAMAGE.
*/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/timeb.h>

extern int getpid();
extern char* malloc();
extern long random();
extern char* realloc();

#define MAXLINE 50000
/* Maximum size of any single line.  There's no limit on the number of lines. */

void
main( int argc, char** argv )
    {
    struct timeb tb;
    FILE* f;
    int i, j, maxlines, nlines;
    char line[MAXLINE];
    char** lines;
    char* t;

    ftime( &tb );
    srandom( (int) ( tb.time ^ tb.millitm ^ getpid( ) ) );

    maxlines = 500;
    lines = (char**) malloc( maxlines * sizeof(char*) );
    nlines = 0;

    if ( argc == 1 )
	{
	while ( fgets( line, MAXLINE, stdin ) != NULL )
	    {
	    if ( nlines >= maxlines )
		{
		maxlines *= 2;
		lines = (char**) realloc(
		    (char*) lines, maxlines * sizeof(char*) );
		}
	    lines[nlines] = (char*) malloc( strlen( line ) + 1 );
	    (void) strcpy( lines[nlines], line );
	    ++nlines;
	    }
	}
    else
	for ( i = 1; i < argc; ++i )
	    {
	    if ( strcmp( argv[i], "-" ) == 0 )
		f = stdin;
	    else
		{
		f = fopen( argv[i], "r" );
		if ( f == (FILE*) 0 )
		    {
		    perror( argv[i] );
		    exit( 1 );
		    }
		}
	    while ( fgets( line, MAXLINE, f ) != NULL )
		{
		if ( nlines >= maxlines )
		    {
		    maxlines *= 2;
		    lines = (char**) realloc(
			(char*) lines, maxlines * sizeof(char*) );
		    }
		lines[nlines] = (char*) malloc( strlen( line ) + 1 );
		(void) strcpy( lines[nlines], line );
		++nlines;
		}
	    if ( f != stdin )
		(void) fclose( f );
	    }

    for ( i = 0; i < nlines; ++i )
	{
	j = random() % nlines;
	t = lines[j];
	lines[j] = lines[i];
	lines[i] = t;
	}

    for ( i = 0; i < nlines; ++i )
	fputs( lines[i], stdout );

    exit( 0 );
    }

