decnumber-sys 0.1.6

Low-level bindings for libdecnumber.
Documentation
use std::ffi::CStr;
use std::mem::MaybeUninit;

use c_str_macro::c_str;
use libc::c_char;

use decnumber_sys::{decContext, decNumber, DEC_INIT_BASE};

#[test]
fn simple_addition() {
    let mut ctx = MaybeUninit::<decContext>::uninit();
    let mut ctx = unsafe {
        decnumber_sys::decContextDefault(ctx.as_mut_ptr(), DEC_INIT_BASE);
        ctx.assume_init()
    };
    ctx.traps = 0;
    ctx.digits = 3;

    let mut a = decNumber {
        digits: 1,
        exponent: 0,
        bits: 0,
        lsu: [0; 12],
    };
    let mut b = decNumber {
        digits: 1,
        exponent: 0,
        bits: 0,
        lsu: [0; 12],
    };

    unsafe {
        decnumber_sys::decNumberFromString(
            &mut a as *mut decNumber,
            c_str!("1.23").as_ptr(),
            &mut ctx,
        );
        decnumber_sys::decNumberFromString(
            &mut b as *mut decNumber,
            c_str!("4.71").as_ptr(),
            &mut ctx,
        );
    }
    let a_as_ptr = &mut a as *mut decNumber;
    unsafe {
        decnumber_sys::decNumberAdd(a_as_ptr, a_as_ptr, &mut b, &mut ctx);
    }

    let mut buf = vec![0_u8; 5];
    unsafe {
        decnumber_sys::decNumberToString(&mut a, buf.as_mut_ptr() as *mut c_char);
    }
    let s = CStr::from_bytes_with_nul(&*buf).unwrap().to_str().unwrap();
    assert_eq!(s, "5.94");
}

#[test]
fn endianness() {
    let mut ctx = MaybeUninit::<decContext>::uninit();
    unsafe {
        decnumber_sys::decContextDefault(ctx.as_mut_ptr(), DEC_INIT_BASE);
        assert_eq!(decnumber_sys::decContextTestEndian(0), 0);
    };
}