| // 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 |
| |
| #include "random.h" |
| |
| 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 |