coreutils

General Software Utilities
git clone http://git.omkov.net/coreutils
Log | Tree | Refs | README | LICENCE | Download

coreutils/src/rand.c (107 lines, 2.8 KiB) -rw-r--r-- file download

69fd1df Jamozed 2020-07-06 23:19:56
0
// rand.c, version 1.0.1
d798a09 Jamozed 2020-06-27 02:00:02
1
// OMKOV coreutils rand
d798a09 Jamozed 2020-06-27 02:00:02
2
// Copyright (C) 2020, Jakob Wakeling
e2140ec Jamozed 2022-03-06 15:27:45
3
// MIT Licence
d798a09 Jamozed 2020-06-27 02:00:02
4
b181413 Jamozed 2022-02-05 22:32:00
5
#include "util/error.h"
b181413 Jamozed 2022-02-05 22:32:00
6
#include "util/optget.h"
69fd1df Jamozed 2020-07-06 23:19:56
7
d798a09 Jamozed 2020-06-27 02:00:02
8
#include <stdint.h>
d798a09 Jamozed 2020-06-27 02:00:02
9
#include <stdio.h>
d798a09 Jamozed 2020-06-27 02:00:02
10
#include <stdlib.h>
30cf081 Jamozed 2020-08-28 23:01:02
11
#include <string.h>
69fd1df Jamozed 2020-07-06 23:19:56
12
69fd1df Jamozed 2020-07-06 23:19:56
13
#define VERSION "1.0.1"
d798a09 Jamozed 2020-06-27 02:00:02
14
d798a09 Jamozed 2020-06-27 02:00:02
15
#define aSIZE (sizeof (aset) - 1)
d798a09 Jamozed 2020-06-27 02:00:02
16
#define ASIZE (sizeof (Aset) - 1)
d798a09 Jamozed 2020-06-27 02:00:02
17
#define nSIZE (sizeof (nset) - 1)
d798a09 Jamozed 2020-06-27 02:00:02
18
#define sSIZE (sizeof (sset) - 1)
d798a09 Jamozed 2020-06-27 02:00:02
19
30cf081 Jamozed 2020-08-28 23:01:02
20
static struct lop lops[] = {
30cf081 Jamozed 2020-08-28 23:01:02
21
	{ "help",    ARG_NUL, 256 },
30cf081 Jamozed 2020-08-28 23:01:02
22
	{ "version", ARG_NUL, 257 },
30cf081 Jamozed 2020-08-28 23:01:02
23
	{ NULL, 0, 0 }
30cf081 Jamozed 2020-08-28 23:01:02
24
};
30cf081 Jamozed 2020-08-28 23:01:02
25
d798a09 Jamozed 2020-06-27 02:00:02
26
static const char aset[] = "abcdefghijklmnopqrstuvwxyz";
d798a09 Jamozed 2020-06-27 02:00:02
27
static const char Aset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
d798a09 Jamozed 2020-06-27 02:00:02
28
static const char nset[] = "0123456789";
d798a09 Jamozed 2020-06-27 02:00:02
29
static const char sset[] = "!@#$%^&*";
d798a09 Jamozed 2020-06-27 02:00:02
30
d798a09 Jamozed 2020-06-27 02:00:02
31
static int       mode;
d798a09 Jamozed 2020-06-27 02:00:02
32
static uintmax_t len;
d798a09 Jamozed 2020-06-27 02:00:02
33
30cf081 Jamozed 2020-08-28 23:01:02
34
static void hlp(void);
30cf081 Jamozed 2020-08-28 23:01:02
35
static void ver(void);
d798a09 Jamozed 2020-06-27 02:00:02
36
69fd1df Jamozed 2020-07-06 23:19:56
37
int main(int ac, char *av[]) { A0 = av[0];
30cf081 Jamozed 2020-08-28 23:01:02
38
	struct opt opt = OPTGET_INIT; opt.str = "aAns"; opt.lops = lops;
30cf081 Jamozed 2020-08-28 23:01:02
39
	for (int o; (o = optget(&opt, av, 1)) != -1;) switch (o) {
d798a09 Jamozed 2020-06-27 02:00:02
40
	case 'a': { mode |= 1; break; }
d798a09 Jamozed 2020-06-27 02:00:02
41
	case 'A': { mode |= 2; break; }
d798a09 Jamozed 2020-06-27 02:00:02
42
	case 'n': { mode |= 4; break; }
d798a09 Jamozed 2020-06-27 02:00:02
43
	case 's': { mode |= 8; break; }
30cf081 Jamozed 2020-08-28 23:01:02
44
	case 256: { hlp(); return 0; }
30cf081 Jamozed 2020-08-28 23:01:02
45
	case 257: { ver(); return 0; }
d798a09 Jamozed 2020-06-27 02:00:02
46
	default: { return 1; }
d798a09 Jamozed 2020-06-27 02:00:02
47
	}
d798a09 Jamozed 2020-06-27 02:00:02
48
	
d798a09 Jamozed 2020-06-27 02:00:02
49
	if (!mode) { mode = 6; }
69fd1df Jamozed 2020-07-06 23:19:56
50
	if (opt.ind == ac) { len = 8; }
d798a09 Jamozed 2020-06-27 02:00:02
51
	else {
69fd1df Jamozed 2020-07-06 23:19:56
52
		register uintmax_t d; register char *p = av[opt.ind];
d798a09 Jamozed 2020-06-27 02:00:02
53
		for (; *p >= '0' && *p <= '9'; ++p) {
d798a09 Jamozed 2020-06-27 02:00:02
54
			d = (uintmax_t)*p - '0';
d798a09 Jamozed 2020-06-27 02:00:02
55
			if (len > (UINTMAX_MAX - d) / 10) { break; }
d798a09 Jamozed 2020-06-27 02:00:02
56
			len = len * 10 + d;
d798a09 Jamozed 2020-06-27 02:00:02
57
		}
d798a09 Jamozed 2020-06-27 02:00:02
58
		
69fd1df Jamozed 2020-07-06 23:19:56
59
		if (*p) { error(1, "%s: invalid length", av[opt.ind]); }
d798a09 Jamozed 2020-06-27 02:00:02
60
	}
d798a09 Jamozed 2020-06-27 02:00:02
61
	
d798a09 Jamozed 2020-06-27 02:00:02
62
	FILE *rand; char *set; unsigned setlen = 0, n;
d798a09 Jamozed 2020-06-27 02:00:02
63
	if (!(rand = fopen("/dev/urandom", "r"))) {
69fd1df Jamozed 2020-07-06 23:19:56
64
		error(1, "%s: %s", "/dev/urandom", serr());
d798a09 Jamozed 2020-06-27 02:00:02
65
	}
d798a09 Jamozed 2020-06-27 02:00:02
66
	
d798a09 Jamozed 2020-06-27 02:00:02
67
	if (mode & 1) { setlen += aSIZE; }
d798a09 Jamozed 2020-06-27 02:00:02
68
	if (mode & 2) { setlen += ASIZE; }
d798a09 Jamozed 2020-06-27 02:00:02
69
	if (mode & 4) { setlen += nSIZE; }
d798a09 Jamozed 2020-06-27 02:00:02
70
	if (mode & 8) { setlen += sSIZE; }
d798a09 Jamozed 2020-06-27 02:00:02
71
	
d798a09 Jamozed 2020-06-27 02:00:02
72
	if (!(set = (char *)malloc(setlen + 1))) {
69fd1df Jamozed 2020-07-06 23:19:56
73
		fclose(rand); error(1, "%s", serr());
d798a09 Jamozed 2020-06-27 02:00:02
74
	}
d798a09 Jamozed 2020-06-27 02:00:02
75
	
d798a09 Jamozed 2020-06-27 02:00:02
76
	if (mode & 1) { strcat(set, aset); }
d798a09 Jamozed 2020-06-27 02:00:02
77
	if (mode & 2) { strcat(set, Aset); }
d798a09 Jamozed 2020-06-27 02:00:02
78
	if (mode & 4) { strcat(set, nset); }
d798a09 Jamozed 2020-06-27 02:00:02
79
	if (mode & 8) { strcat(set, sset); }
d798a09 Jamozed 2020-06-27 02:00:02
80
	
d798a09 Jamozed 2020-06-27 02:00:02
81
	for (uintmax_t i = 0; i < len; ++i) {
d798a09 Jamozed 2020-06-27 02:00:02
82
		fread(&n, sizeof (unsigned long), 1, rand); n %= setlen;
d798a09 Jamozed 2020-06-27 02:00:02
83
		fputc(set[n], stdout);
d798a09 Jamozed 2020-06-27 02:00:02
84
	} fputc('\n', stdout);
d798a09 Jamozed 2020-06-27 02:00:02
85
	
d798a09 Jamozed 2020-06-27 02:00:02
86
	fclose(rand); free(set); return 0;
d798a09 Jamozed 2020-06-27 02:00:02
87
}
d798a09 Jamozed 2020-06-27 02:00:02
88
30cf081 Jamozed 2020-08-28 23:01:02
89
static void hlp(void) {
d798a09 Jamozed 2020-06-27 02:00:02
90
	puts("rand - generate random string\n");
d798a09 Jamozed 2020-06-27 02:00:02
91
	puts("usage: rand [-aAns] [length]\n");
d798a09 Jamozed 2020-06-27 02:00:02
92
	puts("options:");
d798a09 Jamozed 2020-06-27 02:00:02
93
	puts("  -a         Enable lowercase letters in the string output");
d798a09 Jamozed 2020-06-27 02:00:02
94
	puts("  -A         Enable uppercase letters in the string output");
d798a09 Jamozed 2020-06-27 02:00:02
95
	puts("  -n         Enable numbers in the string output");
d798a09 Jamozed 2020-06-27 02:00:02
96
	puts("  -s         Enable symbols '!@#$%^&*' in the string output");
d798a09 Jamozed 2020-06-27 02:00:02
97
	puts("  --help     Display help information");
d798a09 Jamozed 2020-06-27 02:00:02
98
	puts("  --version  Display version information");
d798a09 Jamozed 2020-06-27 02:00:02
99
}
d798a09 Jamozed 2020-06-27 02:00:02
100
30cf081 Jamozed 2020-08-28 23:01:02
101
static void ver(void) {
69fd1df Jamozed 2020-07-06 23:19:56
102
	puts("OMKOV coreutils rand, version " VERSION);
d798a09 Jamozed 2020-06-27 02:00:02
103
	puts("Copyright (C) 2020, Jakob Wakeling");
e2140ec Jamozed 2022-03-06 15:27:45
104
	puts("MIT Licence (https://opensource.org/licenses/MIT)");
d798a09 Jamozed 2020-06-27 02:00:02
105
}
106