From 6e142decab2d71f6de51717d7b55ffffd0602444 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Fri, 11 Jul 2025 00:46:35 -0700 Subject: Getting closer to writing everything. Only dictionary left, and testing obviously. And reading... --- rust/src/lib.rs | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 9b177a1..1508594 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -60,14 +60,12 @@ impl Value { pub fn write(&self, w: &mut W) -> Result<(), std::io::Error> { match self { Self::Integer(x) => { - let mut bb = [0u8]; - bb[0] = 'i' as u8; + let bb = ['i' as u8]; w.write_all(&bb)?; w.write_all(&write_packed_int( *x ))?; }, Self::ByteString(s) => { - let mut bb = [0u8]; - bb[0] = 's' as u8; + let bb = ['s' as u8]; w.write_all(&bb)?; w.write_all(&write_packed_int( s.len() as i64 ))?; w.write_all( &s )?; @@ -78,6 +76,13 @@ impl Value { w.write_all( &bb )?; }, Self::List(l) => { + let mut bb = ['l' as u8]; + w.write_all(&bb)?; + for v in l { + v.write( w )?; + } + bb[0] = 'e' as u8; + w.write_all(&bb)?; }, Self::Dictionary(d) => { }, @@ -102,13 +107,34 @@ impl Value { w.write_all( &bb )?; }, FpCategory::Normal => { - let div = 256f64.ln(); - todo!(); - + let mut bin = Vec::::with_capacity(10); + let (negative, d) = if f.is_sign_negative() { (true, -*f) } else { (false, *f) }; + let scale : i64 = (d.ln() / 256.0f64.ln()) as i64; + let scale = if scale < 0 { -1 } else { scale }; + let mut d = d / 256.0_f64.powf( scale as f64 ); + bin.push( d as u8 ); + d = d.fract(); + for _ in 0..15 { + d = d*256.0; + bin.push( d as u8 ); + d = d.fract(); + if d == 0.0 { + break; + } + } + if negative { + w.write_all( &write_packed_int( -(bin.len() as i64) ) )?; + } else { + w.write_all( &write_packed_int( bin.len() as i64 ) )?; + } + w.write_all( &bin )?; + w.write_all( &write_packed_int( scale ) )?; }, } }, Self::Nothing => { + let bb = ['n' as u8]; + w.write_all( &bb )?; }, } Ok(()) -- cgit v1.2.3