From: Ben Pfaff Date: Sat, 19 Jul 2025 21:14:34 +0000 (-0700) Subject: compressed writing X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0965cfad0b1b2787eec861ec8257fa4a219626d8;p=pspp compressed writing --- diff --git a/rust/pspp/src/sys/write.rs b/rust/pspp/src/sys/write.rs index 2ba55c2926..356988fa13 100644 --- a/rust/pspp/src/sys/write.rs +++ b/rust/pspp/src/sys/write.rs @@ -6,6 +6,7 @@ use std::{ fmt::Write as _, fs::File, io::{BufWriter, Cursor, Seek, Write}, + iter::repeat_n, path::Path, }; @@ -908,7 +909,60 @@ where } }, - CaseVar::String { width: _, encoding } => todo!(), + CaseVar::String { width: _, encoding } => { + let mut s = datum.as_string().unwrap().as_bytes(); + for segment in encoding { + let data; + (data, s) = s.split_at(segment.data_bytes); + + let (chunks, remainder) = data.as_chunks::<8>(); + for chunk in chunks { + if chunk == b" " { + Self::put_opcode( + &mut self.opcodes, + &mut self.data, + &mut self.inner, + 254, + )?; + } else { + Self::put_opcode( + &mut self.opcodes, + &mut self.data, + &mut self.inner, + 253, + )?; + self.data.extend_from_slice(chunk); + } + } + if !remainder.is_empty() { + if remainder.iter().all(|c| *c == b' ') { + Self::put_opcode( + &mut self.opcodes, + &mut self.data, + &mut self.inner, + 254, + )?; + } else { + Self::put_opcode( + &mut self.opcodes, + &mut self.data, + &mut self.inner, + 253, + )?; + self.data.extend_from_slice(remainder); + self.data.extend(repeat_n(0, 8 - remainder.len())); + } + } + for _ in 0..segment.padding_bytes / 8 { + Self::put_opcode( + &mut self.opcodes, + &mut self.data, + &mut self.inner, + 254, + )?; + } + } + } } } Ok(())