| // Copyright 2021 The Emscripten Authors. All rights reserved. | |
| // Emscripten is available under two separate licenses, the MIT license and the | |
| // University of Illinois/NCSA Open Source License. Both these licenses can be | |
| // found in the LICENSE file. | |
| // Original Source that was modified: | |
| // https://github.com/WebAssembly/binaryen/blob/main/src/tools/fuzzing/random.cpp | |
| namespace wasmfs { | |
| int8_t Random::get() { | |
| if (pos == bytes.size()) { | |
| // We ran out of input; go back to the start for more. | |
| finishedInput = true; | |
| pos = 0; | |
| xorFactor++; | |
| } | |
| return bytes[pos++] ^ xorFactor; | |
| } | |
| int16_t Random::get16() { | |
| auto temp = uint16_t(get()) << 8; | |
| return temp | uint16_t(get()); | |
| } | |
| int32_t Random::get32() { | |
| auto temp = uint32_t(get16()) << 16; | |
| return temp | uint32_t(get16()); | |
| } | |
| int64_t Random::get64() { | |
| auto temp = uint64_t(get32()) << 32; | |
| return temp | uint64_t(get32()); | |
| } | |
| uint32_t Random::upTo(uint32_t x) { | |
| if (x == 0) { | |
| return 0; | |
| } | |
| uint32_t raw; | |
| if (x <= 255) { | |
| raw = get(); | |
| } else if (x <= 65535) { | |
| raw = get16(); | |
| } else { | |
| raw = get32(); | |
| } | |
| auto ret = raw % x; | |
| // use extra bits as "noise" for later | |
| xorFactor += raw / x; | |
| return ret; | |
| } | |
| // Returns a random length string of random characters. | |
| std::string Random::getString(int8_t size) { | |
| static const char alphanum[] = "0123456789" | |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | |
| "abcdefghijklmnopqrstuvwxyz"; | |
| std::string ret; | |
| ret.reserve(size); | |
| for (int i = 0; i < size; ++i) { | |
| ret += alphanum[upTo(sizeof(alphanum) - 1)]; | |
| } | |
| return ret; | |
| } | |
| // Returns a random length string of the same character. | |
| std::string Random::getSingleSymbolString(uint32_t length) { | |
| return std::string(length, getString(1)[0]); | |
| } | |
| } // namespace wasmfs | |