r-src 0.2.1

The package provides a source of BLAS and LAPACK via R.
Documentation
extern crate libc;
extern crate r_src;

use libc::{c_double, c_int};

extern "C" {
    pub fn drotg_(a: *mut c_double, b: *mut c_double, c: *mut c_double, s: *mut c_double);
    pub fn dgesv_(
        n: *mut c_int,
        nrhs: *mut c_int,
        a: *mut c_double,
        lda: *mut c_int,
        ipiv: *mut c_int,
        b: *mut c_double,
        ldb: *mut c_int,
        info: *mut c_int,
    );
}

#[test]
fn blas_link() {
    unsafe {
        let mut a: f64 = 0.0;
        let mut b: f64 = 0.0;
        let mut c: f64 = 42.0;
        let mut d: f64 = 42.0;
        drotg_(
            &mut a as *mut _,
            &mut b as *mut _,
            &mut c as *mut _,
            &mut d as *mut _,
        );
        assert!(c == 1.0);
        assert!(d == 0.0);
    }
}

#[test]
fn lapack_test() {
    unsafe {
        let mut n = 3;
        let mut nrhs = 1;
        let mut lda = 3;
        let mut ldb = 3;
        let mut ipiv = vec![1, 2, 3];
        let mut info = 0;

        let mut a = vec![
            6.0f64, -4.0f64, 1.0f64, -4.0f64, 6.0f64, -4.0f64, 1.0f64, -4.0f64, 6.0f64,
        ];

        let mut b = vec![4.0f64, 4.0f64, -1f64];

        dgesv_(
            &mut n as *mut _,
            &mut nrhs as *mut _,
            a.as_mut_ptr(),
            &mut lda as *mut _,
            ipiv.as_mut_ptr(),
            b.as_mut_ptr(),
            &mut ldb as *mut _,
            &mut info as *mut _,
        );

        assert!(info == 0);
        for (one, another) in b.iter().zip(&[3.0, 4.0, 2.0]) {
            assert!((one - another).abs() < 1e-14);
        }
    }
}