/* randomize.c */

/* $Id: randomize.c,v 1.3 1992/07/23 13:52:28 espie Exp espie $ */
/*
 * $Log: randomize.c,v $
 * Revision 1.3  1992/07/23  13:52:28  espie
 * *** empty log message ***
 *
 * Revision 1.2  1992/07/22  14:50:25  espie
 * defs.h
 *
 * Revision 1.1  1992/07/16  17:02:00  espie
 * Initial revision
 *
 */

/* input: a series of names (as argv[1:argc - 1])
 * output: the same names, in a random order.
 * with the new database lookup facility, very useful for e.g.,
 * tracker `randomize *` (jukebox)
 */

#include <stdlib.h>
#include <stdio.h>
#include "defs.h"

LOCAL char *id="$Id: randomize.c,v 1.3 1992/07/23 13:52:28 espie Exp espie $";

/* n = random(max): output a number in the range 0:max - 1.
 * For our purpose, we don't have to get a very random number,
 * so the standard generator is alright.
 */
int random(max)
int max;
    {
    static init = 0;

        /* initialize the generator to an appropriate seed eventually */
    if (!init)
        {
        srand(time(0));
        init = 1;
        }
    return rand()%max;
    }

/* output(s): output s in a suitable format. Ideally, output() should use
 * the shell quoting conventions for difficult names. Right now, it doesn't
 */
void output(s)
char *s;
    {
    for(; *s; s++)
        switch(*s)
            {
    /*    case ' ':
        case '(':
        case ')':
        case '\\':
            putchar('\\');
            */
        default:
            putchar(*s);
            }
    putchar(' ');
    }

int main(argc, argv)
int argc;
char *argv[];
    {
    int i, k;

        /* set up everything so that our names are in argv[0 : argc - 2] */
    for (i = argc - 1, argv++; i; i--)
        {
            /* invariant: the remaining names are in argv[0: i - 1] */
        k = random(i);
        output(argv[k]);
        argv[k] = argv[i - 1];
        }
    }
