/* pr_urand.c -- Print unsigned long random numbers from /dev/urandom.
   Written to test sort_n.c.
   Steve Witham ess double you at remove-this tiac dot net
   2009.01.18
*/

#include <c.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *progname;


void usage( ) {
  fprintf( stderr, "Usage: %s [-w] [how_many]\n", progname );
  fprintf( stderr, "  default is to print 1,000,000 decimal unsigned longs.\n" );
  fprintf( stderr, "  -w: only multiples of 4096, the worst case for sort_n\n" );
  exit( 1 );
}


main( int argc, char **argv ) {
  FILE *urandom;
  unsigned long n;
  char *n_end;
  unsigned long r;
  int ngot;
  int worst = FALSE;
  progname = argv[0];
  
  if( argc > 1  &&  strcmp( argv[1], "-w" ) == 0 ) {
    worst = TRUE;
    argc--;  argv++;
  }
  if( argc > 2  ||  ( argc >=2 && *(argv[1]) == '-' ) ) {
    usage( argv[0] );
  }
  if( argc == 2 ) {
    n = strtoul( argv[1], &n_end, 0 );
    if( n_end == argv[1] ) {
      usage( argv[0] );
    }
  } else {
    n = 1000000;
  }

  urandom = fopen( "/dev/urandom", "r" );
  while( n-- > 0 ) {
    ngot = fread( (char *) &r, sizeof( r ), 1, urandom );
    if( ngot != 1 ) {
      fprintf( stderr, "Read %d instead of 1 long.\n", ngot );
      exit( 1 );
    }
    if( worst )  r &= 0xffffF000;
    printf( "%lu\n", r );
  }
}
    
