2 => Ok(Some(VariableRecord::read(reader, endian, warn)?)),
3 => Ok(ValueLabelRecord::read(reader, endian, var_types, warn)?),
6 => Ok(Some(DocumentRecord::read(reader, endian)?)),
- 7 => Extension::read(reader, endian, var_types.n_values(), warn),
+ 7 => Extension::read(reader, endian, var_types, warn),
999 => Ok(Some(Record::EndOfHeaders(
endian.parse(read_bytes(reader)?),
))),
impl Alignment {
fn try_decode(source: u32) -> Result<Option<Alignment>, Warning> {
match source {
- 0 => Ok(None),
- 1 => Ok(Some(Alignment::Left)),
- 2 => Ok(Some(Alignment::Right)),
- 3 => Ok(Some(Alignment::Center)),
+ 0 => Ok(Some(Alignment::Left)),
+ 1 => Ok(Some(Alignment::Right)),
+ 2 => Ok(Some(Alignment::Center)),
_ => Err(Warning::InvalidAlignment(source)),
}
}
fn parse(
ext: &Extension,
- n_vars: usize,
+ var_types: &VarTypes,
endian: Endian,
warn: &dyn Fn(Warning),
) -> Result<Record, Warning> {
});
}
+ let n_vars = var_types.n_vars();
let has_width = if ext.count as usize == 3 * n_vars {
true
} else if ext.count as usize == 2 * n_vars {
return Err(Warning::InvalidVariableDisplayCount {
count: ext.count as usize,
first: 2 * n_vars,
- second: 2 * n_vars,
+ second: 3 * n_vars,
});
};
fn read<R: Read + Seek>(
r: &mut R,
endian: Endian,
- n_vars: usize,
+ var_types: &VarTypes,
warn: &dyn Fn(Warning),
) -> Result<Option<Record>, Error> {
let subtype = endian.parse(read_bytes(r)?);
let result = match subtype {
IntegerInfoRecord::SUBTYPE => IntegerInfoRecord::parse(&extension, endian),
FloatInfoRecord::SUBTYPE => FloatInfoRecord::parse(&extension, endian),
- VarDisplayRecord::SUBTYPE => VarDisplayRecord::parse(&extension, n_vars, endian, warn),
+ VarDisplayRecord::SUBTYPE => {
+ VarDisplayRecord::parse(&extension, var_types, endian, warn)
+ }
MultipleResponseRecord::SUBTYPE | 19 => {
MultipleResponseRecord::parse(&extension, endian)
}
.iter()
.map(|var_type| var_type.unwrap_or(VarType::String))
}
+
+ pub fn n_vars(&self) -> usize {
+ self.types.iter().flatten().count()
+ }
}
--- /dev/null
+# File header.
+"$FL2"; s60 "$(#) SPSS DATA FILE PSPP synthetic test file";
+2; # Layout code
+19; # Nominal case size
+0; # Not compressed
+0; # Not weighted
+0; # No cases.
+100.0; # Bias.
+"01 Jan 11"; "20:53:52"; s64 "PSPP synthetic test file";
+i8 0 *3;
+
+# Numeric variables.
+2; 0; 0; 0; 0x050800 *2; s8 "A";
+2; 0; 0; 0; 0x050800 *2; s8 "B";
+2; 0; 0; 0; 0x050800 *2; s8 "C";
+2; 0; 0; 0; 0x050800 *2; s8 "D";
+
+# Short string variables.
+2; 3; 0; 0; 0x010300 *2; s8 "H";
+2; 3; 0; 0; 0x010300 *2; s8 "I";
+2; 3; 0; 0; 0x010300 *2; s8 "J";
+2; 3; 0; 0; 0x010300 *2; s8 "K";
+
+# Long string variables.
+2; 9; 0; 0; 0x010900 *2; s8 "L";
+2; -1; 0; 0; 0; 0; s8 "";
+2; 10; 0; 0; 0x010a00 *2; s8 "M";
+2; -1; 0; 0; 0; 0; s8 "";
+2; 17; 0; 0; 0x011100 *2; s8 "N";
+( 2; -1; 0; 0; 0; 0; s8 "" ) * 2;
+2; 25; 0; 0; 0x011900 *2; s8 "O";
+( 2; -1; 0; 0; 0; 0; s8 "" ) * 3;
+
+# Variable display parameters
+7; 11; 4; 24;
+1; 0;
+2; 0;
+3; 0;
+1; 1;
+2; 1;
+3; 1;
+1; 2;
+2; 2;
+3; 2;
+0; 0;
+0; 1;
+0; 2;
+
+# Character encoding record.
+7; 20; 1; 12; "windows-1252";
+
+# Dictionary termination record.
+999; 0;