/* This software is licensed by the MIT License, see LICENSE file */ /* Copyright © 2022 Gregory Lirent */ #include #include #include "../include/test.h" #include "../include/random.h" static void init(unsigned int seed) { if (!seed) seed = time(0); printf("\e[36mRandom module initialized with seed: \e[m\e[32m%u\n\e[m", seed); put_separator(0); srand(seed); } int random_init(int argc, char** argv) { if (argc < 2) { init(0); } else init(atol(argv[1])); return 0; } vtype_bool random_boolean() { return rand()&1; } vtype_float random_float() { if (rand()&1) { return ((vtype_float)random_uint16() / (vtype_float)random_int16()) * -1; } return (vtype_float)random_uint16() / (vtype_float)random_int16(); } vtype_double random_double() { if (rand()&1) { return ((vtype_double)random_uint32() / (vtype_double)random_int32()) * -1; } return (vtype_double)random_uint32() / (vtype_double)random_int32(); } vtype_ldouble random_ldouble() { if (rand()&1) { return ((vtype_ldouble)random_uint64() / (vtype_ldouble)random_int64()) * -1; } return (vtype_ldouble)random_uint64() / (vtype_ldouble)random_int64(); } vtype_int8 random_int8() { return random_uint8(); } vtype_int16 random_int16() { return random_uint16(); } vtype_int32 random_int32() { return rand() | ((rand()&1) << 31); } vtype_uint8 random_uint8() { return rand() % 0x100; } vtype_uint16 random_uint16() { return rand() % 0x10000; } vtype_uint32 random_uint32() { return (rand()<<1) | (rand()&1); } vtype_uint64 random_uint64() { return random_int32() * random_int32(); } vtype_int64 random_int64() { return random_uint32() * random_uint32(); } char random_ascii_char() { return (rand()%0x5f) + 0x20; } unsigned int random_unicode_symbol() { switch (rand()%20) { default: case 0: return (random_uint16()%0x005f) + 0x000020; case 1: return (random_uint16()%0x020f) + 0x0000a1; case 2: return (random_uint16()%0x01a8) + 0x000388; case 3: return (random_uint16()%0x0026) + 0x000531; case 4: return (random_uint16()%0x002a) + 0x000560; case 5: return (random_uint16()%0x00c6) + 0x001000; case 6: return (random_uint16()%0x0030) + 0x0010d0; case 7: return (random_uint16()%0x029d) + 0x001400; case 8: return (random_uint16()%0x0058) + 0x0016a0; case 9: return (random_uint16()%0x0074) + 0x001b80; case 10: return (random_uint16()%0x00f4) + 0x001d00; case 11: return (random_uint16()%0x0115) + 0x001e00; case 12: return (random_uint16()%0x008b) + 0x002100; case 13: return (random_uint16()%0x0297) + 0x002190; case 14: return (random_uint16()%0x0714) + 0x002460; case 15: return (random_uint16()%0x00b7) + 0x00a640; case 16: return (random_uint16()%0x0074) + 0x00a8e0; case 17: return (random_uint16()%0x009e) + 0x010400; case 18: return (random_uint16()%0x0137) + 0x010600; case 19: return (random_uint16()%0x03d8) + 0x01f300; } } value_t random_value() { value_t v; switch (random_uint8()%13) { default: case 0: v.value[0].b = random_boolean(); v.type = VTYPE_BOOLEAN; break; case 1: v.value[0].u8 = random_uint8 (); v.type = VTYPE_UINT8; break; case 2: v.value[0].u16 = random_uint16 (); v.type = VTYPE_UINT16; break; case 3: v.value[0].u32 = random_uint32 (); v.type = VTYPE_UINT32; break; case 4: v.value[0].u64 = random_uint64 (); v.type = VTYPE_UINT64; break; case 5: v.value[0].u8 = random_int8 (); v.type = VTYPE_INT8; break; case 6: v.value[0].u16 = random_int16 (); v.type = VTYPE_INT16; break; case 7: v.value[0].u32 = random_int32 (); v.type = VTYPE_INT32; break; case 8: v.value[0].u64 = random_int64 (); v.type = VTYPE_INT64; break; case 9: v.value[0].f = random_float (); v.type = VTYPE_FLOAT; break; case 10: v.value[0].d = random_double (); v.type = VTYPE_DOUBLE; break; case 11: v.value[0].ld = random_ldouble(); v.type = VTYPE_LDOUBLE; break; case 12: v.value[0].ptr = (void*)(uintptr_t)random_uint64(); v.type = VTYPE_POINTER; break; } return v; }