31#if defined(_WIN32) || defined(_WIN64)
34#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
36#include <sys/random.h>
38void arc4random_buf(
void *,
size_t);
39#elif defined(__unix__)
40#if __has_include(<sys/random.h>)
41#include <sys/random.h>
51 fprintf(stderr,
"Runtime type error: random_number(len) expects integer length\n");
59 fprintf(stderr,
"random_number error: negative length (%" PRId64
")\n",
len);
73 fprintf(stderr,
"random_number error: requested length too large (%" PRId64
", max %" PRId64
")\n",
len,
MAX_RAW);
79 unsigned char *
raw = (
unsigned char *)malloc((
size_t)
len);
80 char *
hex = (
char *)malloc((
size_t)
len * 2 + 1);
85 fprintf(stderr,
"Out of memory in random_number\n");
92#if defined(_WIN32) || defined(_WIN64)
95 NTSTATUS st = BCryptGenRandom(NULL,
raw, (ULONG)
len, BCRYPT_USE_SYSTEM_PREFERRED_RNG);
98#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
100 arc4random_buf(
raw, (
size_t)
len);
103#elif defined(__unix__)
106#if __has_include(<sys/random.h>)
107 ssize_t
n = getrandom(
raw, (
size_t)
len, 0);
113 int fd = open(
"/dev/urandom", O_RDONLY);
117 while (off < (
size_t)
len && (
n = read(
fd,
raw + off, (
size_t)
len - off)) > 0)
120 ok = (off == (size_t)
len);
132 fprintf(stderr,
"random_number error: OS RNG unavailable or failed\n");
137 static const char hexdig[] =
"0123456789abcdef";
138 for (int64_t i = 0; i <
len; ++i) {
139 unsigned char b =
raw[i];
static const char hexdig[]
Tagged union representing a Fun value.
Value make_string(const char *s)
Construct a string Value by duplicating the given C string.
static Value pop_value(VM *vm)
Pop a Value from the VM operand stack.