Add jrand48()/nrand48() compat functions
These functions are not available on all platforms.
This commit is contained in:
parent
e6cd42355b
commit
059ec45f82
3 changed files with 54 additions and 0 deletions
|
@ -170,6 +170,8 @@ check_functions = [
|
||||||
'strdup',
|
'strdup',
|
||||||
'asprintf',
|
'asprintf',
|
||||||
'vasprintf',
|
'vasprintf',
|
||||||
|
'nrand48',
|
||||||
|
'jrand48',
|
||||||
]
|
]
|
||||||
|
|
||||||
foreach f : check_functions
|
foreach f : check_functions
|
||||||
|
|
|
@ -51,3 +51,47 @@ int vasprintf(char **strp, const char *fmt, va_list ap) {
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_NRAND48) || !defined(HAVE_JRAND48)
|
||||||
|
#define SC_RAND48_MASK UINT64_C(0xFFFFFFFFFFFF) // 48 bits
|
||||||
|
#define SC_RAND48_A UINT64_C(0x5DEECE66D)
|
||||||
|
#define SC_RAND48_C 0xB
|
||||||
|
static inline uint64_t rand_iter48(uint64_t x) {
|
||||||
|
assert((x & ~SC_RAND48_MASK) == 0);
|
||||||
|
return (x * SC_RAND48_A + SC_RAND48_C) & SC_RAND48_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t rand_iter48_xsubi(unsigned short xsubi[3]) {
|
||||||
|
uint64_t x = ((uint64_t) xsubi[0] << 32)
|
||||||
|
| ((uint64_t) xsubi[1] << 16)
|
||||||
|
| xsubi[2];
|
||||||
|
|
||||||
|
x = rand_iter48(x);
|
||||||
|
|
||||||
|
xsubi[0] = (x >> 32) & 0XFFFF;
|
||||||
|
xsubi[1] = (x >> 16) & 0XFFFF;
|
||||||
|
xsubi[2] = x & 0XFFFF;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_NRAND48
|
||||||
|
long nrand48(unsigned short xsubi[3]) {
|
||||||
|
// range [0, 2^31)
|
||||||
|
return rand_iter48_xsubi(xsubi) >> 17;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_JRAND48
|
||||||
|
long jrand48(unsigned short xsubi[3]) {
|
||||||
|
// range [-2^31, 2^31)
|
||||||
|
union {
|
||||||
|
uint32_t u;
|
||||||
|
int32_t i;
|
||||||
|
} v;
|
||||||
|
v.u = rand_iter48_xsubi(xsubi) >> 16;
|
||||||
|
return v.i;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -59,4 +59,12 @@ int asprintf(char **strp, const char *fmt, ...);
|
||||||
int vasprintf(char **strp, const char *fmt, va_list ap);
|
int vasprintf(char **strp, const char *fmt, va_list ap);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_NRAND48
|
||||||
|
long nrand48(unsigned short xsubi[3]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_JRAND48
|
||||||
|
long jrand48(unsigned short xsubi[3]);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue