45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
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<u32> {
|
|
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
|
|
}
|
|
}
|
|
}
|