MCPcopy Index your code
hub / github.com/TeamPiped/piped-proxy / read_variable_integer

Function read_variable_integer

src/ump_stream.rs:9–55  ·  view source on GitHub ↗
(buf: &[u8], offset: usize)

Source from the content-addressed store, hash-verified

7use std::task::{Context, Poll};
8
9fn 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
57pub struct UmpTransformStream<S>
58where

Callers 1

poll_nextMethod · 0.85

Calls 1

read_bufFunction · 0.85

Tested by

no test coverage detected