1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
pub use self::os::{imaxdiv_t};

use {char_t, int_t};
use stdint::{intmax_t, uintmax_t};
use stddef::{wchar_t};

#[cfg(target_os = "linux")]
#[path = "linux/mod.rs"]
mod os;

pub fn imaxabs(n: intmax_t) -> intmax_t {
    extern { fn imaxabs(n: intmax_t) -> intmax_t; }
    unsafe { imaxabs(n) }
}

pub fn imaxdiv(numer: intmax_t, denom: intmax_t) -> imaxdiv_t {
    extern { fn imaxdiv(numer: intmax_t, denom: intmax_t) -> imaxdiv_t; }
    unsafe { imaxdiv(numer, denom) }
}

extern "C" {
    pub fn strtoimax(nptr: *const char_t, endptr: *mut *mut char_t,
                     base: int_t) -> intmax_t;
    pub fn strtoumax(nptr: *const char_t, endptr: *mut *mut char_t,
                     base: int_t) -> uintmax_t;
    pub fn wcstoimax(nptr: *const wchar_t, endptr: *mut *mut wchar_t,
                     base: int_t) -> intmax_t;
    pub fn wcstoumax(nptr: *const wchar_t, endptr: *mut *mut wchar_t,
                     base: int_t) -> uintmax_t;
}

#[cfg(test)]
mod tests {
    use stdint::{intmax_t};
    use std::num::{Bounded, SignedInt};

    #[test]
    fn test_abs() {
        assert_eq!(super::imaxabs(-55), 55);
        assert_eq!(super::imaxabs(44), 44);
        let min: intmax_t = Bounded::min_value();
        assert_eq!(super::imaxabs(min + 55), SignedInt::abs(min + 55));
    }

    #[test]
    fn test_div() {
        let div = super::imaxdiv(4, 2);
        assert_eq!(div.quot, 2);
        assert_eq!(div.rem, 0);
        let div = super::imaxdiv(5, 2);
        assert_eq!(div.quot, 2);
        assert_eq!(div.rem, 1);
    }
}