| 7 | use std::task::{Context, Poll}; |
| 8 | |
| 9 | fn read_variable_integer(buf: &[u8], offset: usize) -> io::Result<(i32, usize)> { |
| 10 | let mut pos = offset; |
| 11 | let prefix = utils::read_buf(buf, &mut pos); |
| 12 | let mut size = 0; |
| 13 | for shift in 1..=5 { |
| 14 | if prefix & (128 >> (shift - 1)) == 0 { |
| 15 | size = shift; |
| 16 | break; |
| 17 | } |
| 18 | } |
| 19 | if !(1..=5).contains(&size) { |
| 20 | return Err(io::Error::new( |
| 21 | ErrorKind::InvalidData, |
| 22 | format!("Invalid integer size {} at position {}", size, offset), |
| 23 | )); |
| 24 | } |
| 25 | |
| 26 | match size { |
| 27 | 1 => Ok((prefix as i32, size)), |
| 28 | 2 => { |
| 29 | let value = ((utils::read_buf(buf, &mut pos) as i32) << 6) | (prefix as i32 & 0b111111); |
| 30 | Ok((value, size)) |
| 31 | } |
| 32 | 3 => { |
| 33 | let value = (((utils::read_buf(buf, &mut pos) as i32) |
| 34 | | ((utils::read_buf(buf, &mut pos) as i32) << 8)) |
| 35 | << 5) |
| 36 | | (prefix as i32 & 0b11111); |
| 37 | Ok((value, size)) |
| 38 | } |
| 39 | 4 => { |
| 40 | let value = (((utils::read_buf(buf, &mut pos) as i32) |
| 41 | | ((utils::read_buf(buf, &mut pos) as i32) << 8) |
| 42 | | ((utils::read_buf(buf, &mut pos) as i32) << 16)) |
| 43 | << 4) |
| 44 | | (prefix as i32 & 0b1111); |
| 45 | Ok((value, size)) |
| 46 | } |
| 47 | _ => { |
| 48 | let value = (utils::read_buf(buf, &mut pos) as i32) |
| 49 | | ((utils::read_buf(buf, &mut pos) as i32) << 8) |
| 50 | | ((utils::read_buf(buf, &mut pos) as i32) << 16) |
| 51 | | ((utils::read_buf(buf, &mut pos) as i32) << 24); |
| 52 | Ok((value, size)) |
| 53 | } |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | pub struct UmpTransformStream<S> |
| 58 | where |