use core::f32; use core::str::{self, FromStr}; pub struct Parser { pub curr: u32, pub buffer: [u8; 1000], } impl Parser { pub fn new() -> Self { Self { curr: 0, buffer: [0_u8; 1000], } } pub fn input_byte(&mut self, b: u8) -> Option { if b == b'\n' || b == b'\r' { let mut split = self.buffer.split(|num| { num == &(u8::try_from(',').unwrap()) || num == &(u8::try_from(' ').unwrap()) || num == &0 }); // TODO: the use \0 and ' ' as split is kinda hacky let buf = split.next()?; let ret = if buf.contains(&b'.') { Some((4095f32 / 3.3 * f32::from_str(str::from_utf8(buf).ok()?).ok()?) as u32) } else { Some(u32::from_str(str::from_utf8(buf).ok()?).ok()?) }; for i in 0..self.curr { self.buffer[i as usize] = 0; } self.curr = 0; ret } else { self.buffer[self.curr as usize] = b; self.curr += 1; None } } }