X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=util.c;h=3d4b48021952ab1d8a7fa619c677c979875f2667;hb=1d745fd1f9b0448a00140cef0b68d9a3aa73f1f1;hp=32051a3f0d70997e24c36cb30fc284728cfc7bf6;hpb=87d9371a5c08f5b05ba70b11c63df80960b40831;p=xonotic%2Fgmqcc.git diff --git a/util.c b/util.c index 32051a3..3d4b480 100644 --- a/util.c +++ b/util.c @@ -22,10 +22,6 @@ * SOFTWARE. */ #define GMQCC_PLATFORM_HEADER -#include -#include -#include - #include "gmqcc.h" #include "platform.h" @@ -280,9 +276,45 @@ const char *util_ctime(const time_t *timer) { return platform_ctime(timer); } -void util_seed(uint32_t value) { - srand((int)value); +bool util_isatty(fs_file_t *file) { + if (file == (fs_file_t*)stdout) return !!platform_isatty(STDOUT_FILENO); + if (file == (fs_file_t*)stderr) return !!platform_isatty(STDERR_FILENO); + return false; } +/* + * A small noncryptographic PRNG based on: + * http://burtleburtle.net/bob/rand/smallprng.html + */ +static uint32_t util_rand_state[4] = { + 0xF1EA5EED, 0x00000000, + 0x00000000, 0x00000000 +}; + +#define util_rand_rot(X, Y) (((X)<<(Y))|((X)>>(32-(Y)))) + uint32_t util_rand() { - return rand(); + uint32_t last; + + last = util_rand_state[0] - util_rand_rot(util_rand_state[1], 27); + util_rand_state[0] = util_rand_state[1] ^ util_rand_rot(util_rand_state[2], 17); + util_rand_state[1] = util_rand_state[2] + util_rand_state[3]; + util_rand_state[2] = util_rand_state[3] + last; + util_rand_state[3] = util_rand_state[0] + last; + + return util_rand_state[3]; +} + +#undef util_rand_rot + +void util_seed(uint32_t value) { + size_t i; + + util_rand_state[0] = 0xF1EA5EED; + util_rand_state[1] = value; + util_rand_state[2] = value; + util_rand_state[3] = value; + + for (i = 0; i < 20; ++i) + (void)util_rand(); } +