+use smallvec::SmallVec;
+
/// The endianness for integer and floating-point numbers in SPSS system files.
///
/// SPSS system files can declare IBM 370 and DEC VAX floating-point
_ => None,
}
}
+
+ pub fn to_smallvec(self, mut value: u64, n: usize) -> SmallVec<[u8; 16]> {
+ debug_assert!(n <= 8);
+ let mut vec = SmallVec::new();
+ value <<= 8 * (8 - n);
+ for _ in 0..n {
+ vec.push((value >> 56) as u8);
+ value <<= 8;
+ }
+ if self == Endian::Little {
+ vec.reverse();
+ }
+ vec
+ }
}
pub trait ToBytes<T, const N: usize> {
fn to_bytes(self, value: T) -> [u8; N];
}
+impl ToBytes<u64, 8> for Endian {
+ fn to_bytes(self, value: u64) -> [u8; 8] {
+ match self {
+ Endian::Big => u64::to_be_bytes(value),
+ Endian::Little => u64::to_le_bytes(value),
+ }
+ }
+}
impl ToBytes<i64, 8> for Endian {
fn to_bytes(self, value: i64) -> [u8; 8] {
match self {
match self.format.type_() {
Type::P => Some(self.p(number)),
Type::PK => Some(self.pk(number)),
+ Type::IB => Some(self.ib(number)),
_ => None,
}
}
let (_valid, output) = self.bcd(number, self.format.w() * 2);
output
}
+
+ fn ib(&self, number: Option<f64>) -> SmallVec<[u8; 16]> {
+ let number = number.map_or(0.0, |number| (number * power10(self.format.d())).round());
+ let number = if number >= power256(self.format.w) / 2.0 - 1.0
+ || number < -power256(self.format.w) / 2.0
+ {
+ 0.0
+ } else {
+ number
+ };
+ let integer = number.abs() as u64;
+ let integer = if number < 0.0 {
+ (-(integer as i64)) as u64
+ } else {
+ integer
+ };
+ PsppSettings::global()
+ .output_integer_format
+ .to_smallvec(integer, self.format.w())
+ }
}
struct LegacyFormat {
segment::Syntax,
token::{Punct, Token},
},
+ settings::Settings as PsppSettings,
};
fn test(name: &str) {
let input = BufReader::new(File::open(&filename).unwrap());
let mut value = None;
let mut value_name = String::new();
+
for (line_number, line) in input.lines().map(|r| r.unwrap()).enumerate() {
let line = line.trim();
let line_number = line_number + 1;
fn test_pk() {
test_binhex("pk.txt");
}
+
+ #[test]
+ fn test_ib() {
+ test_binhex("ib.txt");
+ }
}