From: Ben Pfaff Date: Sat, 18 Oct 2025 16:02:10 +0000 (-0700) Subject: seems to work X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Frust;p=pspp seems to work --- diff --git a/rust/pspp/src/output/spv.rs b/rust/pspp/src/output/spv.rs index cff19a88a2..c249ca547c 100644 --- a/rust/pspp/src/output/spv.rs +++ b/rust/pspp/src/output/spv.rs @@ -32,6 +32,7 @@ use crate::output::{ page::PageSetup, pivot::{PivotTable, TableProperties, Value}, spv::{ + legacy_bin::LegacyBin, legacy_xml::Visualization, light::{LightError, LightTable}, }, @@ -39,8 +40,8 @@ use crate::output::{ mod css; pub mod html; -mod legacy_xml; mod legacy_bin; +mod legacy_xml; mod light; #[derive(Debug, Display, thiserror::Error)] @@ -429,7 +430,19 @@ impl Table { Ok(result) => result, Err(error) => panic!("{error:?}"), }; - //dbg!(_visualization); + + let bin_member_name = &self.table_structure.data_path; + let mut bin_member = archive.by_name(bin_member_name)?; + let mut bin_data = Vec::with_capacity(bin_member.size() as usize); + bin_member.read_to_end(&mut bin_data)?; + let mut cursor = Cursor::new(bin_data); + let _legacy_bin = LegacyBin::read(&mut cursor).map_err(|e| { + e.with_message(format!( + "While parsing {bin_member_name:?} as legacy binary SPV member" + )) + })?; + //dbg!(&_legacy_bin); + Ok(PivotTable::new([]).into_item()) } } diff --git a/rust/pspp/src/output/spv/legacy_bin.rs b/rust/pspp/src/output/spv/legacy_bin.rs index bcaabdd404..c306a09cab 100644 --- a/rust/pspp/src/output/spv/legacy_bin.rs +++ b/rust/pspp/src/output/spv/legacy_bin.rs @@ -1,6 +1,8 @@ use std::io::{Read, Seek, SeekFrom}; -use binrw::{BinRead, binread}; +use binrw::{BinRead, BinResult, binread}; + +use crate::output::spv::light::{U32String, parse_vec}; #[binread] #[br(little)] @@ -13,8 +15,10 @@ pub struct LegacyBin { member_size: u32, #[br(count(n_sources), args { inner: (version,) })] metadata: Vec, - #[br(count(n_sources), args { inner: metadata.as_slice() })] + #[br(parse_with(parse_data), args(metadata.as_slice()))] data: Vec, + #[br(parse_with(parse_strings))] + strings: Option, } #[binread] @@ -45,6 +49,24 @@ struct Data { variables: Vec, } +#[binrw::parser(reader, endian)] +fn parse_data(metadata: &[Metadata]) -> BinResult> { + let mut data = Vec::with_capacity(metadata.len()); + for metadata in metadata { + reader.seek(SeekFrom::Start(metadata.data_offset as u64))?; + let mut variables = Vec::with_capacity(metadata.n_variables as usize); + for _ in 0..metadata.n_variables { + variables.push(Variable::read_options( + reader, + endian, + (metadata.n_values,), + )?); + } + data.push(Data { variables }); + } + Ok(data) +} + impl BinRead for Data { type Args<'a> = &'a [Metadata]; @@ -74,3 +96,59 @@ struct Variable { #[br(count(n_values))] values: Vec, } + +#[binrw::parser(reader, endian)] +fn parse_strings() -> BinResult> { + let position = reader.stream_position()?; + let length = reader.seek(SeekFrom::End(0))?; + if position != length { + reader.seek(SeekFrom::Start(position))?; + Ok(Some(Strings::read_options(reader, endian, ())?)) + } else { + Ok(None) + } +} + +#[binread] +#[br(little)] +#[derive(Debug)] +struct Strings { + #[br(parse_with(parse_vec))] + source_maps: Vec, + #[br(parse_with(parse_vec))] + labels: Vec