parent
ac69a923a2
commit
5c5b68627a
@ -1 +1,3 @@
|
||||
*~
|
||||
libsrng/target/
|
||||
libsrng/Cargo.lock
|
||||
|
@ -0,0 +1,12 @@
|
||||
install:
|
||||
cp -f libsrng.so /usr/local/lib/libsrng.so
|
||||
ln -sf /usr/local/lib/libsrng.so /usr/lib/libsrng.so
|
||||
|
||||
uninstall:
|
||||
rm -f /usr/local/lib/libsrng.so
|
||||
rm /usr/lib/libsrng.so
|
||||
|
||||
build:
|
||||
cd libsrng && cargo build --release
|
||||
cp libsrng/target/release/libsrng.so ./
|
||||
gpg --sign libsrng.so
|
@ -0,0 +1,5 @@
|
||||
Prebuild binary signed with https://flanchan.moe/flanchan.asc
|
||||
|
||||
To build dependencies yourself run:
|
||||
make build && sudo make install
|
||||
(requires Rust)
|
@ -0,0 +1,19 @@
|
||||
|
||||
(in-package #:cl-rng)
|
||||
|
||||
(defun crandom (&key (limit 1.0) (precision 1) (transform nil))
|
||||
(let ((transform (or transform #'identity)))
|
||||
(multiple-value-bind (result ok) (cl-rng-ffi:ffi-sample)
|
||||
(and ok
|
||||
(funcall transform
|
||||
(* limit
|
||||
(if (< precision 2)
|
||||
result
|
||||
(/ (apply #'+ (mapcan #'(lambda (x)
|
||||
(and (not (null x))
|
||||
(list x)))
|
||||
(loop for x from 0 below precision collect
|
||||
(crandom))))
|
||||
precision))))))))
|
||||
|
||||
(export 'crandom)
|
@ -0,0 +1,19 @@
|
||||
|
||||
(in-package #:cl-rng-ffi)
|
||||
|
||||
(define-foreign-library libsrng
|
||||
(:unix (:or "libsrng.so" "libsrng" "./libsrng.so"))
|
||||
(t (:default "libsrng")))
|
||||
|
||||
(use-foreign-library libsrng)
|
||||
|
||||
(defcfun "sample" :int (to :pointer))
|
||||
|
||||
(defun ffi-sample ()
|
||||
(with-foreign-pointer (value 8)
|
||||
(let ((rval (sample value)))
|
||||
(values
|
||||
(mem-ref value :double 0)
|
||||
(= rval 1)))))
|
||||
|
||||
(export 'ffi-sample)
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "srng"
|
||||
version = "0.1.0"
|
||||
authors = ["Avril <flanchan@cumallover.me>"]
|
||||
edition = "2018"
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
getrandom = "0.1"
|
@ -0,0 +1,56 @@
|
||||
extern crate getrandom;
|
||||
|
||||
use getrandom::*;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn it_works() {
|
||||
let mut f: f64 = 0.0;
|
||||
assert_eq!(sample(&mut f as *mut f64), 1);
|
||||
}
|
||||
}
|
||||
|
||||
fn get<T: Default>() -> Result<T, Error>
|
||||
{
|
||||
let mut value: T = Default::default();
|
||||
unsafe {
|
||||
let mut slice = std::slice::from_raw_parts_mut(&mut value as *mut T as *mut u8, std::mem::size_of::<T>());
|
||||
populate(&mut slice)?;
|
||||
}
|
||||
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
fn double() -> Result<f64, Error>
|
||||
{
|
||||
let long: i64 = get::<i64>()?;
|
||||
|
||||
Ok( ((long & ((1i64 << 53) - 1)) as f64) * (1_f64 / ((1_i64 << 53) as f64)))
|
||||
}
|
||||
|
||||
fn populate(mut value: &mut [u8]) -> Result<(), Error>
|
||||
{
|
||||
getrandom(&mut value)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn sample(value: *mut f64) -> i32
|
||||
{
|
||||
match std::panic::catch_unwind(|| {
|
||||
unsafe {
|
||||
match double() {
|
||||
Ok(x) => *value = x,
|
||||
Err(_) => return 0,
|
||||
}
|
||||
}
|
||||
1
|
||||
}) {
|
||||
Ok(v) => v,
|
||||
Err(_) => 0,
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in new issue