1use nom::{
4 bytes::complete::{tag, take_while},
5 error::ParseError,
6 number::complete::{be_u16, be_u32, be_u8},
7 sequence::terminated,
8 IResult,
9};
10
11pub fn rs_string<'a, E: ParseError<&'a [u8]>>(buffer: &'a [u8]) -> IResult<&'a [u8], String, E> {
33 let (buffer, string) = terminated(take_while(|byte| byte != 0), tag([0]))(buffer)?;
34
35 Ok((buffer, String::from_utf8_lossy(string).to_string()))
36}
37
38pub fn be_u32_smart_compat<'a, E: ParseError<&'a [u8]>>(
39 buffer: &'a [u8],
40) -> IResult<&'a [u8], u32, E> {
41 let mut var1 = 0_u32;
42
43 let (mut buffer, mut var2) = be_u16_smart(buffer)?;
44
45 loop {
46 if var2 != 32767 {
47 break;
48 }
49
50 var1 += 32767;
51 let (buf, value) = be_u16_smart(buffer)?;
52 buffer = buf;
53 var2 = value;
54 }
55
56 var1 += var2 as u32;
57
58 Ok((buffer, var1))
59}
60
61pub fn be_i16_smart<'a, E: ParseError<&'a [u8]>>(buffer: &'a [u8]) -> IResult<&'a [u8], u16, E> {
69 if buffer[0] < 128 {
70 let (buffer, value) = be_u8(buffer)?;
71 Ok((buffer, value.wrapping_sub(64) as u16))
72 } else {
73 let (buffer, value) = be_u16(buffer)?;
74 Ok((buffer, value.wrapping_sub(0xC000)))
75 }
76}
77
78pub fn be_u16_smart<'a, E: ParseError<&'a [u8]>>(buffer: &'a [u8]) -> IResult<&'a [u8], u16, E> {
102 if buffer[0] < 128 {
103 let (buffer, value) = be_u8(buffer)?;
104 Ok((buffer, value as u16))
105 } else {
106 let (buffer, value) = be_u16(buffer)?;
107 Ok((buffer, value.wrapping_sub(0x8000)))
108 }
109}
110
111pub fn be_u32_smart<'a, E: ParseError<&'a [u8]>>(buffer: &'a [u8]) -> IResult<&'a [u8], u32, E> {
135 if (buffer[0] ^ 0xff) as i8 <= -1 {
136 let (buffer, value) = be_u16(buffer)?;
137 Ok((buffer, value as u32))
138 } else {
139 let (buffer, value) = be_u32(buffer)?;
140 Ok((buffer, value & 0x7fffffff))
141 }
142}
143
144#[test]
145fn rs_string_parser() -> crate::Result<()> {
146 let buffer = vec![
147 82, 117, 110, 105, 116, 101, 32, 98, 97, 114, 0, 52, 14, 85, 65, 4, 56,
148 ];
149
150 let (buffer, string) = rs_string(&buffer)?;
151
152 assert_eq!(&string, "Runite bar");
153 assert_eq!(&buffer, &[52, 14, 85, 65, 4, 56]);
154
155 Ok(())
156}
157
158#[test]
159fn be_u16_smart_parser() -> crate::Result<()> {
160 let buffer = &[17, 142, 64, 4, 24, 254];
161 let (buffer, value1) = be_u16_smart(buffer)?;
162 let (buffer, value2) = be_u16_smart(buffer)?;
163 assert_eq!(value1, 17);
164 assert_eq!(value2, 3648);
165 assert_eq!(buffer, &[4, 24, 254]);
166
167 Ok(())
168}
169
170#[test]
171fn be_u32_smart_parser() -> crate::Result<()> {
172 let buffer = &[255, 54, 2, 0, 62, 1, 42, 233];
173 let (buffer, value1) = be_u32_smart(buffer)?;
174 let (buffer, value2) = be_u32_smart(buffer)?;
175 assert_eq!(value1, 2134245888);
176 assert_eq!(value2, 15873);
177 assert_eq!(buffer, &[42, 233]);
178
179 Ok(())
180}