xref: /minix3/minix/commands/swifi/tests/rnd.c (revision 875abb872412bde4d3ba5da66423f55431e19dcf)
1*875abb87SDavid van Moolenbroek /*
2*875abb87SDavid van Moolenbroek rnd.c
3*875abb87SDavid van Moolenbroek 
4*875abb87SDavid van Moolenbroek Generate random numbers
5*875abb87SDavid van Moolenbroek */
6*875abb87SDavid van Moolenbroek 
7*875abb87SDavid van Moolenbroek #include <stdarg.h>
8*875abb87SDavid van Moolenbroek #include <stdio.h>
9*875abb87SDavid van Moolenbroek #include <stdlib.h>
10*875abb87SDavid van Moolenbroek #include <string.h>
11*875abb87SDavid van Moolenbroek #include <unistd.h>
12*875abb87SDavid van Moolenbroek 
13*875abb87SDavid van Moolenbroek static char *progname;
14*875abb87SDavid van Moolenbroek 
15*875abb87SDavid van Moolenbroek static void fatal(char *fmt, ...);
16*875abb87SDavid van Moolenbroek static void usage(void);
17*875abb87SDavid van Moolenbroek 
main(int argc,char * argv[])18*875abb87SDavid van Moolenbroek int main(int argc, char *argv[])
19*875abb87SDavid van Moolenbroek {
20*875abb87SDavid van Moolenbroek 	int c, i, count;
21*875abb87SDavid van Moolenbroek 	unsigned long n, v, high, modulus;
22*875abb87SDavid van Moolenbroek 	unsigned seed;
23*875abb87SDavid van Moolenbroek 	char *check;
24*875abb87SDavid van Moolenbroek 	char *c_arg, *m_arg, *s_arg;
25*875abb87SDavid van Moolenbroek 
26*875abb87SDavid van Moolenbroek 	(progname=strrchr(argv[0],'/')) ? progname++ : (progname=argv[0]);
27*875abb87SDavid van Moolenbroek 
28*875abb87SDavid van Moolenbroek 	c_arg= m_arg= s_arg= NULL;
29*875abb87SDavid van Moolenbroek 	while (c= getopt(argc, argv, "?c:m:s:"), c != -1)
30*875abb87SDavid van Moolenbroek 	{
31*875abb87SDavid van Moolenbroek 		switch(c)
32*875abb87SDavid van Moolenbroek 		{
33*875abb87SDavid van Moolenbroek 		case 'c': c_arg= optarg; break;
34*875abb87SDavid van Moolenbroek 		case 'm': m_arg= optarg; break;
35*875abb87SDavid van Moolenbroek 		case 's': s_arg= optarg; break;
36*875abb87SDavid van Moolenbroek 		default:
37*875abb87SDavid van Moolenbroek 			fatal("getopt failed: '%c'", c);
38*875abb87SDavid van Moolenbroek 		}
39*875abb87SDavid van Moolenbroek 	}
40*875abb87SDavid van Moolenbroek 	if (optind != argc)
41*875abb87SDavid van Moolenbroek 		usage();
42*875abb87SDavid van Moolenbroek 	if (c_arg)
43*875abb87SDavid van Moolenbroek 	{
44*875abb87SDavid van Moolenbroek 		count= strtol(c_arg, &check, 0);
45*875abb87SDavid van Moolenbroek 		if (check[0] != '\0')
46*875abb87SDavid van Moolenbroek 			fatal("bad count '%s'", c_arg);
47*875abb87SDavid van Moolenbroek 	}
48*875abb87SDavid van Moolenbroek 	else
49*875abb87SDavid van Moolenbroek 		count= 1;
50*875abb87SDavid van Moolenbroek 	if (m_arg)
51*875abb87SDavid van Moolenbroek 	{
52*875abb87SDavid van Moolenbroek 		modulus= strtoul(m_arg, &check, 0);
53*875abb87SDavid van Moolenbroek 		if (check[0] != '\0' || modulus == 0)
54*875abb87SDavid van Moolenbroek 			fatal("bad modulus '%s'", m_arg);
55*875abb87SDavid van Moolenbroek 		n= 0x80000000UL / modulus;
56*875abb87SDavid van Moolenbroek 		if (n == 0)
57*875abb87SDavid van Moolenbroek 			fatal("bad modulus %lu (too big)", modulus);
58*875abb87SDavid van Moolenbroek 		high= n * modulus;
59*875abb87SDavid van Moolenbroek 	}
60*875abb87SDavid van Moolenbroek 	else
61*875abb87SDavid van Moolenbroek 		modulus= high= 0x80000000UL;
62*875abb87SDavid van Moolenbroek 	if (s_arg)
63*875abb87SDavid van Moolenbroek 	{
64*875abb87SDavid van Moolenbroek 		seed= strtol(s_arg, &check, 0);
65*875abb87SDavid van Moolenbroek 		if (check[0] != '\0')
66*875abb87SDavid van Moolenbroek 			fatal("bad seed '%s'", s_arg);
67*875abb87SDavid van Moolenbroek 		srandom(seed);
68*875abb87SDavid van Moolenbroek 	}
69*875abb87SDavid van Moolenbroek 
70*875abb87SDavid van Moolenbroek 	for (i= 0; i<count; i++)
71*875abb87SDavid van Moolenbroek 	{
72*875abb87SDavid van Moolenbroek 		do
73*875abb87SDavid van Moolenbroek 		{
74*875abb87SDavid van Moolenbroek 			v= random();
75*875abb87SDavid van Moolenbroek 		} while (v > high);
76*875abb87SDavid van Moolenbroek 
77*875abb87SDavid van Moolenbroek 		printf("%lu\n", v % modulus);
78*875abb87SDavid van Moolenbroek 	}
79*875abb87SDavid van Moolenbroek }
80*875abb87SDavid van Moolenbroek 
fatal(char * fmt,...)81*875abb87SDavid van Moolenbroek static void fatal(char *fmt, ...)
82*875abb87SDavid van Moolenbroek {
83*875abb87SDavid van Moolenbroek 	va_list ap;
84*875abb87SDavid van Moolenbroek 
85*875abb87SDavid van Moolenbroek 	fprintf(stderr, "%s: ", progname);
86*875abb87SDavid van Moolenbroek 	va_start(ap, fmt);
87*875abb87SDavid van Moolenbroek 	vfprintf(stderr, fmt, ap);
88*875abb87SDavid van Moolenbroek 	va_end(ap);
89*875abb87SDavid van Moolenbroek 	fprintf(stderr, "\n");
90*875abb87SDavid van Moolenbroek 	exit(1);
91*875abb87SDavid van Moolenbroek }
92*875abb87SDavid van Moolenbroek 
usage(void)93*875abb87SDavid van Moolenbroek static void usage(void)
94*875abb87SDavid van Moolenbroek {
95*875abb87SDavid van Moolenbroek 	fprintf(stderr, "Usage: rnd [-c <count>] [-m <modulus>] [-s <seed>]\n");
96*875abb87SDavid van Moolenbroek 	exit(1);
97*875abb87SDavid van Moolenbroek }
98