Merge pull request #102 from sajattack/rand
implement rand and srand using the rand crate
This commit is contained in:
@@ -12,3 +12,4 @@ platform = { path = "../platform" }
|
||||
ralloc = { path = "../../ralloc", default-features = false }
|
||||
ctype = { path = "../ctype" }
|
||||
errno = { path = "../errno" }
|
||||
rand = { git = "https://github.com/rust-lang-nursery/rand/", default-features = false }
|
||||
|
||||
+16
-4
@@ -8,8 +8,10 @@ extern crate ctype;
|
||||
extern crate errno;
|
||||
extern crate platform;
|
||||
extern crate ralloc;
|
||||
extern crate rand;
|
||||
|
||||
use core::{ptr, str};
|
||||
use rand::{Rng, SeedableRng, XorShiftRng};
|
||||
|
||||
use errno::*;
|
||||
use platform::types::*;
|
||||
@@ -19,8 +21,10 @@ static ALLOCATOR: ralloc::Allocator = ralloc::Allocator;
|
||||
|
||||
pub const EXIT_FAILURE: c_int = 1;
|
||||
pub const EXIT_SUCCESS: c_int = 0;
|
||||
pub const RAND_MAX: c_int = 2147483647;
|
||||
|
||||
static mut ATEXIT_FUNCS: [Option<extern "C" fn()>; 32] = [None; 32];
|
||||
static mut RNG: Option<XorShiftRng> = None;
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn a64l(s: *const c_char) -> c_long {
|
||||
@@ -375,8 +379,16 @@ pub extern "C" fn qsort(
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn rand() -> c_int {
|
||||
unimplemented!();
|
||||
pub unsafe extern "C" fn rand() -> c_int {
|
||||
match RNG {
|
||||
Some(ref mut rng) => rng.gen_range::<c_int>(0, RAND_MAX),
|
||||
None => {
|
||||
let mut rng = XorShiftRng::from_seed([1; 16]);
|
||||
let ret = rng.gen_range::<c_int>(0, RAND_MAX);
|
||||
RNG = Some(rng);
|
||||
ret
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -425,8 +437,8 @@ pub extern "C" fn setstate(state: *const c_char) -> *mut c_char {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn srand(seed: c_uint) {
|
||||
unimplemented!();
|
||||
pub unsafe extern "C" fn srand(seed: c_uint) {
|
||||
RNG = Some(XorShiftRng::from_seed([seed as u8; 16]));
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
/sprintf
|
||||
/stdlib/a64l
|
||||
/stdlib/bsearch
|
||||
/stdlib/rand
|
||||
/stdlib/strtol
|
||||
/string/strchr
|
||||
/string/strcspn
|
||||
|
||||
@@ -23,6 +23,7 @@ EXPECT_BINS=\
|
||||
stdlib/bsearch \
|
||||
stdlib/strtol \
|
||||
stdlib/a64l \
|
||||
stdlib/rand \
|
||||
string/strncmp \
|
||||
string/strcspn \
|
||||
string/strchr \
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
printf("%d\n", rand());
|
||||
srand(259);
|
||||
printf("%d\n", rand());
|
||||
}
|
||||
Reference in New Issue
Block a user