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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
pub static mut NAN_STRING: &str = "NaN";
pub static mut INF_STRING: &str = "inf";
pub static mut INFINITY_STRING: &str = "infinity";
pub static mut EXPONENT_DEFAULT_CHAR: u8 = b'e';
pub static mut EXPONENT_BACKUP_CHAR: u8 = b'^';
pub(crate) const MAX_FLOAT_SIZE: usize = 256;
pub(crate) const BUFFER_SIZE: usize = MAX_FLOAT_SIZE;
pub(crate) extern "C" fn exponent_notation_char(base: u32)
-> u8
{
unsafe {
if base >= 15 { EXPONENT_BACKUP_CHAR } else { EXPONENT_DEFAULT_CHAR }
}
}
#[cfg(test)]
mod tests {
use atof::*;
use ftoa::*;
use util::*;
use super::*;
#[test]
fn exponent_notation_char_test() {
unsafe {
assert_eq!(exponent_notation_char(2), EXPONENT_DEFAULT_CHAR);
assert_eq!(exponent_notation_char(8), EXPONENT_DEFAULT_CHAR);
assert_eq!(exponent_notation_char(10), EXPONENT_DEFAULT_CHAR);
assert_eq!(exponent_notation_char(15), EXPONENT_BACKUP_CHAR);
assert_eq!(exponent_notation_char(16), EXPONENT_BACKUP_CHAR);
assert_eq!(exponent_notation_char(32), EXPONENT_BACKUP_CHAR);
}
}
#[test]
#[ignore]
fn special_bytes_test() {
assert!(try_atof32_bytes(10, b"NaN").unwrap().is_nan());
assert!(try_atof32_bytes(10, b"nan").unwrap().is_nan());
assert!(try_atof32_bytes(10, b"NAN").unwrap().is_nan());
assert!(try_atof32_bytes(10, b"inf").unwrap().is_infinite());
assert!(try_atof32_bytes(10, b"INF").unwrap().is_infinite());
assert!(try_atof32_bytes(10, b"Infinity").unwrap().is_infinite());
assert_eq!(f64toa_bytes(f64::NAN, 10), b"NaN".to_vec());
assert_eq!(f64toa_bytes(f64::INFINITY, 10), b"inf".to_vec());
unsafe {
NAN_STRING = "nan";
INF_STRING = "Infinity";
}
assert!(try_atof32_bytes(10, b"inf").is_err());
assert!(try_atof32_bytes(10, b"Infinity").unwrap().is_infinite());
assert_eq!(f64toa_bytes(f64::NAN, 10), b"nan".to_vec());
assert_eq!(f64toa_bytes(f64::INFINITY, 10), b"Infinity".to_vec());
unsafe {
NAN_STRING = "NaN";
INF_STRING = "inf";
}
}
}