16855e09eSopenharmony_ci//! Parsers recognizing numbers, streaming version 26855e09eSopenharmony_ci 36855e09eSopenharmony_ciuse crate::branch::alt; 46855e09eSopenharmony_ciuse crate::bytes::streaming::tag; 56855e09eSopenharmony_ciuse crate::character::streaming::{char, digit1, sign}; 66855e09eSopenharmony_ciuse crate::combinator::{cut, map, opt, recognize}; 76855e09eSopenharmony_ciuse crate::error::{ErrorKind, ParseError}; 86855e09eSopenharmony_ciuse crate::internal::*; 96855e09eSopenharmony_ciuse crate::lib::std::ops::{RangeFrom, RangeTo}; 106855e09eSopenharmony_ciuse crate::sequence::{pair, tuple}; 116855e09eSopenharmony_ciuse crate::traits::{ 126855e09eSopenharmony_ci AsBytes, AsChar, Compare, InputIter, InputLength, InputTake, InputTakeAtPosition, Offset, Slice, 136855e09eSopenharmony_ci}; 146855e09eSopenharmony_ci 156855e09eSopenharmony_ci/// Recognizes an unsigned 1 byte integer. 166855e09eSopenharmony_ci/// 176855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 186855e09eSopenharmony_ci/// ```rust 196855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 206855e09eSopenharmony_ci/// use nom::number::streaming::be_u8; 216855e09eSopenharmony_ci/// 226855e09eSopenharmony_ci/// let parser = |s| { 236855e09eSopenharmony_ci/// be_u8::<_, (_, ErrorKind)>(s) 246855e09eSopenharmony_ci/// }; 256855e09eSopenharmony_ci/// 266855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); 276855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); 286855e09eSopenharmony_ci/// ``` 296855e09eSopenharmony_ci#[inline] 306855e09eSopenharmony_cipub fn be_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> 316855e09eSopenharmony_ciwhere 326855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 336855e09eSopenharmony_ci{ 346855e09eSopenharmony_ci let bound: usize = 1; 356855e09eSopenharmony_ci if input.input_len() < bound { 366855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 376855e09eSopenharmony_ci } else { 386855e09eSopenharmony_ci let res = input.iter_elements().next().unwrap(); 396855e09eSopenharmony_ci 406855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 416855e09eSopenharmony_ci } 426855e09eSopenharmony_ci} 436855e09eSopenharmony_ci 446855e09eSopenharmony_ci/// Recognizes a big endian unsigned 2 bytes integer. 456855e09eSopenharmony_ci/// 466855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 476855e09eSopenharmony_ci/// 486855e09eSopenharmony_ci/// ```rust 496855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 506855e09eSopenharmony_ci/// use nom::number::streaming::be_u16; 516855e09eSopenharmony_ci/// 526855e09eSopenharmony_ci/// let parser = |s| { 536855e09eSopenharmony_ci/// be_u16::<_, (_, ErrorKind)>(s) 546855e09eSopenharmony_ci/// }; 556855e09eSopenharmony_ci/// 566855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001))); 576855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); 586855e09eSopenharmony_ci/// ``` 596855e09eSopenharmony_ci#[inline] 606855e09eSopenharmony_cipub fn be_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E> 616855e09eSopenharmony_ciwhere 626855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 636855e09eSopenharmony_ci{ 646855e09eSopenharmony_ci let bound: usize = 2; 656855e09eSopenharmony_ci if input.input_len() < bound { 666855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 676855e09eSopenharmony_ci } else { 686855e09eSopenharmony_ci let mut res = 0u16; 696855e09eSopenharmony_ci for byte in input.iter_elements().take(bound) { 706855e09eSopenharmony_ci res = (res << 8) + byte as u16; 716855e09eSopenharmony_ci } 726855e09eSopenharmony_ci 736855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 746855e09eSopenharmony_ci } 756855e09eSopenharmony_ci} 766855e09eSopenharmony_ci 776855e09eSopenharmony_ci/// Recognizes a big endian unsigned 3 byte integer. 786855e09eSopenharmony_ci/// 796855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 806855e09eSopenharmony_ci/// 816855e09eSopenharmony_ci/// ```rust 826855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 836855e09eSopenharmony_ci/// use nom::number::streaming::be_u24; 846855e09eSopenharmony_ci/// 856855e09eSopenharmony_ci/// let parser = |s| { 866855e09eSopenharmony_ci/// be_u24::<_, (_, ErrorKind)>(s) 876855e09eSopenharmony_ci/// }; 886855e09eSopenharmony_ci/// 896855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102))); 906855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); 916855e09eSopenharmony_ci/// ``` 926855e09eSopenharmony_ci#[inline] 936855e09eSopenharmony_cipub fn be_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> 946855e09eSopenharmony_ciwhere 956855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 966855e09eSopenharmony_ci{ 976855e09eSopenharmony_ci let bound: usize = 3; 986855e09eSopenharmony_ci if input.input_len() < bound { 996855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 1006855e09eSopenharmony_ci } else { 1016855e09eSopenharmony_ci let mut res = 0u32; 1026855e09eSopenharmony_ci for byte in input.iter_elements().take(bound) { 1036855e09eSopenharmony_ci res = (res << 8) + byte as u32; 1046855e09eSopenharmony_ci } 1056855e09eSopenharmony_ci 1066855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 1076855e09eSopenharmony_ci } 1086855e09eSopenharmony_ci} 1096855e09eSopenharmony_ci 1106855e09eSopenharmony_ci/// Recognizes a big endian unsigned 4 bytes integer. 1116855e09eSopenharmony_ci/// 1126855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 1136855e09eSopenharmony_ci/// 1146855e09eSopenharmony_ci/// ```rust 1156855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 1166855e09eSopenharmony_ci/// use nom::number::streaming::be_u32; 1176855e09eSopenharmony_ci/// 1186855e09eSopenharmony_ci/// let parser = |s| { 1196855e09eSopenharmony_ci/// be_u32::<_, (_, ErrorKind)>(s) 1206855e09eSopenharmony_ci/// }; 1216855e09eSopenharmony_ci/// 1226855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203))); 1236855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); 1246855e09eSopenharmony_ci/// ``` 1256855e09eSopenharmony_ci#[inline] 1266855e09eSopenharmony_cipub fn be_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> 1276855e09eSopenharmony_ciwhere 1286855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 1296855e09eSopenharmony_ci{ 1306855e09eSopenharmony_ci let bound: usize = 4; 1316855e09eSopenharmony_ci if input.input_len() < bound { 1326855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 1336855e09eSopenharmony_ci } else { 1346855e09eSopenharmony_ci let mut res = 0u32; 1356855e09eSopenharmony_ci for byte in input.iter_elements().take(bound) { 1366855e09eSopenharmony_ci res = (res << 8) + byte as u32; 1376855e09eSopenharmony_ci } 1386855e09eSopenharmony_ci 1396855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 1406855e09eSopenharmony_ci } 1416855e09eSopenharmony_ci} 1426855e09eSopenharmony_ci 1436855e09eSopenharmony_ci/// Recognizes a big endian unsigned 8 bytes integer. 1446855e09eSopenharmony_ci/// 1456855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 1466855e09eSopenharmony_ci/// 1476855e09eSopenharmony_ci/// ```rust 1486855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 1496855e09eSopenharmony_ci/// use nom::number::streaming::be_u64; 1506855e09eSopenharmony_ci/// 1516855e09eSopenharmony_ci/// let parser = |s| { 1526855e09eSopenharmony_ci/// be_u64::<_, (_, ErrorKind)>(s) 1536855e09eSopenharmony_ci/// }; 1546855e09eSopenharmony_ci/// 1556855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607))); 1566855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 1576855e09eSopenharmony_ci/// ``` 1586855e09eSopenharmony_ci#[inline] 1596855e09eSopenharmony_cipub fn be_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E> 1606855e09eSopenharmony_ciwhere 1616855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 1626855e09eSopenharmony_ci{ 1636855e09eSopenharmony_ci let bound: usize = 8; 1646855e09eSopenharmony_ci if input.input_len() < bound { 1656855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 1666855e09eSopenharmony_ci } else { 1676855e09eSopenharmony_ci let mut res = 0u64; 1686855e09eSopenharmony_ci for byte in input.iter_elements().take(bound) { 1696855e09eSopenharmony_ci res = (res << 8) + byte as u64; 1706855e09eSopenharmony_ci } 1716855e09eSopenharmony_ci 1726855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 1736855e09eSopenharmony_ci } 1746855e09eSopenharmony_ci} 1756855e09eSopenharmony_ci 1766855e09eSopenharmony_ci/// Recognizes a big endian unsigned 16 bytes integer. 1776855e09eSopenharmony_ci/// 1786855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 1796855e09eSopenharmony_ci/// ```rust 1806855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 1816855e09eSopenharmony_ci/// use nom::number::streaming::be_u128; 1826855e09eSopenharmony_ci/// 1836855e09eSopenharmony_ci/// let parser = |s| { 1846855e09eSopenharmony_ci/// be_u128::<_, (_, ErrorKind)>(s) 1856855e09eSopenharmony_ci/// }; 1866855e09eSopenharmony_ci/// 1876855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415))); 1886855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 1896855e09eSopenharmony_ci/// ``` 1906855e09eSopenharmony_ci#[inline] 1916855e09eSopenharmony_cipub fn be_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E> 1926855e09eSopenharmony_ciwhere 1936855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 1946855e09eSopenharmony_ci{ 1956855e09eSopenharmony_ci let bound: usize = 16; 1966855e09eSopenharmony_ci if input.input_len() < bound { 1976855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 1986855e09eSopenharmony_ci } else { 1996855e09eSopenharmony_ci let mut res = 0u128; 2006855e09eSopenharmony_ci for byte in input.iter_elements().take(bound) { 2016855e09eSopenharmony_ci res = (res << 8) + byte as u128; 2026855e09eSopenharmony_ci } 2036855e09eSopenharmony_ci 2046855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 2056855e09eSopenharmony_ci } 2066855e09eSopenharmony_ci} 2076855e09eSopenharmony_ci 2086855e09eSopenharmony_ci/// Recognizes a signed 1 byte integer. 2096855e09eSopenharmony_ci/// 2106855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 2116855e09eSopenharmony_ci/// ```rust 2126855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 2136855e09eSopenharmony_ci/// use nom::number::streaming::be_i8; 2146855e09eSopenharmony_ci/// 2156855e09eSopenharmony_ci/// let parser = be_i8::<_, (_, ErrorKind)>; 2166855e09eSopenharmony_ci/// 2176855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); 2186855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); 2196855e09eSopenharmony_ci/// ``` 2206855e09eSopenharmony_ci#[inline] 2216855e09eSopenharmony_cipub fn be_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E> 2226855e09eSopenharmony_ciwhere 2236855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 2246855e09eSopenharmony_ci{ 2256855e09eSopenharmony_ci be_u8.map(|x| x as i8).parse(input) 2266855e09eSopenharmony_ci} 2276855e09eSopenharmony_ci 2286855e09eSopenharmony_ci/// Recognizes a big endian signed 2 bytes integer. 2296855e09eSopenharmony_ci/// 2306855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 2316855e09eSopenharmony_ci/// ```rust 2326855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 2336855e09eSopenharmony_ci/// use nom::number::streaming::be_i16; 2346855e09eSopenharmony_ci/// 2356855e09eSopenharmony_ci/// let parser = be_i16::<_, (_, ErrorKind)>; 2366855e09eSopenharmony_ci/// 2376855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001))); 2386855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(2)))); 2396855e09eSopenharmony_ci/// ``` 2406855e09eSopenharmony_ci#[inline] 2416855e09eSopenharmony_cipub fn be_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E> 2426855e09eSopenharmony_ciwhere 2436855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 2446855e09eSopenharmony_ci{ 2456855e09eSopenharmony_ci be_u16.map(|x| x as i16).parse(input) 2466855e09eSopenharmony_ci} 2476855e09eSopenharmony_ci 2486855e09eSopenharmony_ci/// Recognizes a big endian signed 3 bytes integer. 2496855e09eSopenharmony_ci/// 2506855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 2516855e09eSopenharmony_ci/// ```rust 2526855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 2536855e09eSopenharmony_ci/// use nom::number::streaming::be_i24; 2546855e09eSopenharmony_ci/// 2556855e09eSopenharmony_ci/// let parser = be_i24::<_, (_, ErrorKind)>; 2566855e09eSopenharmony_ci/// 2576855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102))); 2586855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(3)))); 2596855e09eSopenharmony_ci/// ``` 2606855e09eSopenharmony_ci#[inline] 2616855e09eSopenharmony_cipub fn be_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> 2626855e09eSopenharmony_ciwhere 2636855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 2646855e09eSopenharmony_ci{ 2656855e09eSopenharmony_ci // Same as the unsigned version but we need to sign-extend manually here 2666855e09eSopenharmony_ci be_u24 2676855e09eSopenharmony_ci .map(|x| { 2686855e09eSopenharmony_ci if x & 0x80_00_00 != 0 { 2696855e09eSopenharmony_ci (x | 0xff_00_00_00) as i32 2706855e09eSopenharmony_ci } else { 2716855e09eSopenharmony_ci x as i32 2726855e09eSopenharmony_ci } 2736855e09eSopenharmony_ci }) 2746855e09eSopenharmony_ci .parse(input) 2756855e09eSopenharmony_ci} 2766855e09eSopenharmony_ci 2776855e09eSopenharmony_ci/// Recognizes a big endian signed 4 bytes integer. 2786855e09eSopenharmony_ci/// 2796855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 2806855e09eSopenharmony_ci/// ```rust 2816855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 2826855e09eSopenharmony_ci/// use nom::number::streaming::be_i32; 2836855e09eSopenharmony_ci/// 2846855e09eSopenharmony_ci/// let parser = be_i32::<_, (_, ErrorKind)>; 2856855e09eSopenharmony_ci/// 2866855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203))); 2876855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(4)))); 2886855e09eSopenharmony_ci/// ``` 2896855e09eSopenharmony_ci#[inline] 2906855e09eSopenharmony_cipub fn be_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> 2916855e09eSopenharmony_ciwhere 2926855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 2936855e09eSopenharmony_ci{ 2946855e09eSopenharmony_ci be_u32.map(|x| x as i32).parse(input) 2956855e09eSopenharmony_ci} 2966855e09eSopenharmony_ci 2976855e09eSopenharmony_ci/// Recognizes a big endian signed 8 bytes integer. 2986855e09eSopenharmony_ci/// 2996855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 3006855e09eSopenharmony_ci/// 3016855e09eSopenharmony_ci/// ```rust 3026855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 3036855e09eSopenharmony_ci/// use nom::number::streaming::be_i64; 3046855e09eSopenharmony_ci/// 3056855e09eSopenharmony_ci/// let parser = be_i64::<_, (_, ErrorKind)>; 3066855e09eSopenharmony_ci/// 3076855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607))); 3086855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 3096855e09eSopenharmony_ci/// ``` 3106855e09eSopenharmony_ci#[inline] 3116855e09eSopenharmony_cipub fn be_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E> 3126855e09eSopenharmony_ciwhere 3136855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 3146855e09eSopenharmony_ci{ 3156855e09eSopenharmony_ci be_u64.map(|x| x as i64).parse(input) 3166855e09eSopenharmony_ci} 3176855e09eSopenharmony_ci 3186855e09eSopenharmony_ci/// Recognizes a big endian signed 16 bytes integer. 3196855e09eSopenharmony_ci/// 3206855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 3216855e09eSopenharmony_ci/// ```rust 3226855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 3236855e09eSopenharmony_ci/// use nom::number::streaming::be_i128; 3246855e09eSopenharmony_ci/// 3256855e09eSopenharmony_ci/// let parser = be_i128::<_, (_, ErrorKind)>; 3266855e09eSopenharmony_ci/// 3276855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415))); 3286855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 3296855e09eSopenharmony_ci/// ``` 3306855e09eSopenharmony_ci#[inline] 3316855e09eSopenharmony_cipub fn be_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E> 3326855e09eSopenharmony_ciwhere 3336855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 3346855e09eSopenharmony_ci{ 3356855e09eSopenharmony_ci be_u128.map(|x| x as i128).parse(input) 3366855e09eSopenharmony_ci} 3376855e09eSopenharmony_ci 3386855e09eSopenharmony_ci/// Recognizes an unsigned 1 byte integer. 3396855e09eSopenharmony_ci/// 3406855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 3416855e09eSopenharmony_ci/// ```rust 3426855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 3436855e09eSopenharmony_ci/// use nom::number::streaming::le_u8; 3446855e09eSopenharmony_ci/// 3456855e09eSopenharmony_ci/// let parser = le_u8::<_, (_, ErrorKind)>; 3466855e09eSopenharmony_ci/// 3476855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); 3486855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); 3496855e09eSopenharmony_ci/// ``` 3506855e09eSopenharmony_ci#[inline] 3516855e09eSopenharmony_cipub fn le_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> 3526855e09eSopenharmony_ciwhere 3536855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 3546855e09eSopenharmony_ci{ 3556855e09eSopenharmony_ci let bound: usize = 1; 3566855e09eSopenharmony_ci if input.input_len() < bound { 3576855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 3586855e09eSopenharmony_ci } else { 3596855e09eSopenharmony_ci let res = input.iter_elements().next().unwrap(); 3606855e09eSopenharmony_ci 3616855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 3626855e09eSopenharmony_ci } 3636855e09eSopenharmony_ci} 3646855e09eSopenharmony_ci 3656855e09eSopenharmony_ci/// Recognizes a little endian unsigned 2 bytes integer. 3666855e09eSopenharmony_ci/// 3676855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 3686855e09eSopenharmony_ci/// 3696855e09eSopenharmony_ci/// ```rust 3706855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 3716855e09eSopenharmony_ci/// use nom::number::streaming::le_u16; 3726855e09eSopenharmony_ci/// 3736855e09eSopenharmony_ci/// let parser = |s| { 3746855e09eSopenharmony_ci/// le_u16::<_, (_, ErrorKind)>(s) 3756855e09eSopenharmony_ci/// }; 3766855e09eSopenharmony_ci/// 3776855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100))); 3786855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); 3796855e09eSopenharmony_ci/// ``` 3806855e09eSopenharmony_ci#[inline] 3816855e09eSopenharmony_cipub fn le_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E> 3826855e09eSopenharmony_ciwhere 3836855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 3846855e09eSopenharmony_ci{ 3856855e09eSopenharmony_ci let bound: usize = 2; 3866855e09eSopenharmony_ci if input.input_len() < bound { 3876855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 3886855e09eSopenharmony_ci } else { 3896855e09eSopenharmony_ci let mut res = 0u16; 3906855e09eSopenharmony_ci for (index, byte) in input.iter_indices().take(bound) { 3916855e09eSopenharmony_ci res += (byte as u16) << (8 * index); 3926855e09eSopenharmony_ci } 3936855e09eSopenharmony_ci 3946855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 3956855e09eSopenharmony_ci } 3966855e09eSopenharmony_ci} 3976855e09eSopenharmony_ci 3986855e09eSopenharmony_ci/// Recognizes a little endian unsigned 3 bytes integer. 3996855e09eSopenharmony_ci/// 4006855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 4016855e09eSopenharmony_ci/// 4026855e09eSopenharmony_ci/// ```rust 4036855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 4046855e09eSopenharmony_ci/// use nom::number::streaming::le_u24; 4056855e09eSopenharmony_ci/// 4066855e09eSopenharmony_ci/// let parser = |s| { 4076855e09eSopenharmony_ci/// le_u24::<_, (_, ErrorKind)>(s) 4086855e09eSopenharmony_ci/// }; 4096855e09eSopenharmony_ci/// 4106855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100))); 4116855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); 4126855e09eSopenharmony_ci/// ``` 4136855e09eSopenharmony_ci#[inline] 4146855e09eSopenharmony_cipub fn le_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> 4156855e09eSopenharmony_ciwhere 4166855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 4176855e09eSopenharmony_ci{ 4186855e09eSopenharmony_ci let bound: usize = 3; 4196855e09eSopenharmony_ci if input.input_len() < bound { 4206855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 4216855e09eSopenharmony_ci } else { 4226855e09eSopenharmony_ci let mut res = 0u32; 4236855e09eSopenharmony_ci for (index, byte) in input.iter_indices().take(bound) { 4246855e09eSopenharmony_ci res += (byte as u32) << (8 * index); 4256855e09eSopenharmony_ci } 4266855e09eSopenharmony_ci 4276855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 4286855e09eSopenharmony_ci } 4296855e09eSopenharmony_ci} 4306855e09eSopenharmony_ci 4316855e09eSopenharmony_ci/// Recognizes a little endian unsigned 4 bytes integer. 4326855e09eSopenharmony_ci/// 4336855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 4346855e09eSopenharmony_ci/// 4356855e09eSopenharmony_ci/// ```rust 4366855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 4376855e09eSopenharmony_ci/// use nom::number::streaming::le_u32; 4386855e09eSopenharmony_ci/// 4396855e09eSopenharmony_ci/// let parser = |s| { 4406855e09eSopenharmony_ci/// le_u32::<_, (_, ErrorKind)>(s) 4416855e09eSopenharmony_ci/// }; 4426855e09eSopenharmony_ci/// 4436855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100))); 4446855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); 4456855e09eSopenharmony_ci/// ``` 4466855e09eSopenharmony_ci#[inline] 4476855e09eSopenharmony_cipub fn le_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> 4486855e09eSopenharmony_ciwhere 4496855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 4506855e09eSopenharmony_ci{ 4516855e09eSopenharmony_ci let bound: usize = 4; 4526855e09eSopenharmony_ci if input.input_len() < bound { 4536855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 4546855e09eSopenharmony_ci } else { 4556855e09eSopenharmony_ci let mut res = 0u32; 4566855e09eSopenharmony_ci for (index, byte) in input.iter_indices().take(bound) { 4576855e09eSopenharmony_ci res += (byte as u32) << (8 * index); 4586855e09eSopenharmony_ci } 4596855e09eSopenharmony_ci 4606855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 4616855e09eSopenharmony_ci } 4626855e09eSopenharmony_ci} 4636855e09eSopenharmony_ci 4646855e09eSopenharmony_ci/// Recognizes a little endian unsigned 8 bytes integer. 4656855e09eSopenharmony_ci/// 4666855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 4676855e09eSopenharmony_ci/// 4686855e09eSopenharmony_ci/// ```rust 4696855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 4706855e09eSopenharmony_ci/// use nom::number::streaming::le_u64; 4716855e09eSopenharmony_ci/// 4726855e09eSopenharmony_ci/// let parser = |s| { 4736855e09eSopenharmony_ci/// le_u64::<_, (_, ErrorKind)>(s) 4746855e09eSopenharmony_ci/// }; 4756855e09eSopenharmony_ci/// 4766855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100))); 4776855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 4786855e09eSopenharmony_ci/// ``` 4796855e09eSopenharmony_ci#[inline] 4806855e09eSopenharmony_cipub fn le_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E> 4816855e09eSopenharmony_ciwhere 4826855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 4836855e09eSopenharmony_ci{ 4846855e09eSopenharmony_ci let bound: usize = 8; 4856855e09eSopenharmony_ci if input.input_len() < bound { 4866855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 4876855e09eSopenharmony_ci } else { 4886855e09eSopenharmony_ci let mut res = 0u64; 4896855e09eSopenharmony_ci for (index, byte) in input.iter_indices().take(bound) { 4906855e09eSopenharmony_ci res += (byte as u64) << (8 * index); 4916855e09eSopenharmony_ci } 4926855e09eSopenharmony_ci 4936855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 4946855e09eSopenharmony_ci } 4956855e09eSopenharmony_ci} 4966855e09eSopenharmony_ci 4976855e09eSopenharmony_ci/// Recognizes a little endian unsigned 16 bytes integer. 4986855e09eSopenharmony_ci/// 4996855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 5006855e09eSopenharmony_ci/// 5016855e09eSopenharmony_ci/// ```rust 5026855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 5036855e09eSopenharmony_ci/// use nom::number::streaming::le_u128; 5046855e09eSopenharmony_ci/// 5056855e09eSopenharmony_ci/// let parser = |s| { 5066855e09eSopenharmony_ci/// le_u128::<_, (_, ErrorKind)>(s) 5076855e09eSopenharmony_ci/// }; 5086855e09eSopenharmony_ci/// 5096855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100))); 5106855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 5116855e09eSopenharmony_ci/// ``` 5126855e09eSopenharmony_ci#[inline] 5136855e09eSopenharmony_cipub fn le_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E> 5146855e09eSopenharmony_ciwhere 5156855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 5166855e09eSopenharmony_ci{ 5176855e09eSopenharmony_ci let bound: usize = 16; 5186855e09eSopenharmony_ci if input.input_len() < bound { 5196855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(bound - input.input_len()))) 5206855e09eSopenharmony_ci } else { 5216855e09eSopenharmony_ci let mut res = 0u128; 5226855e09eSopenharmony_ci for (index, byte) in input.iter_indices().take(bound) { 5236855e09eSopenharmony_ci res += (byte as u128) << (8 * index); 5246855e09eSopenharmony_ci } 5256855e09eSopenharmony_ci 5266855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 5276855e09eSopenharmony_ci } 5286855e09eSopenharmony_ci} 5296855e09eSopenharmony_ci 5306855e09eSopenharmony_ci/// Recognizes a signed 1 byte integer. 5316855e09eSopenharmony_ci/// 5326855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 5336855e09eSopenharmony_ci/// ```rust 5346855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 5356855e09eSopenharmony_ci/// use nom::number::streaming::le_i8; 5366855e09eSopenharmony_ci/// 5376855e09eSopenharmony_ci/// let parser = le_i8::<_, (_, ErrorKind)>; 5386855e09eSopenharmony_ci/// 5396855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); 5406855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); 5416855e09eSopenharmony_ci/// ``` 5426855e09eSopenharmony_ci#[inline] 5436855e09eSopenharmony_cipub fn le_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E> 5446855e09eSopenharmony_ciwhere 5456855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 5466855e09eSopenharmony_ci{ 5476855e09eSopenharmony_ci le_u8.map(|x| x as i8).parse(input) 5486855e09eSopenharmony_ci} 5496855e09eSopenharmony_ci 5506855e09eSopenharmony_ci/// Recognizes a little endian signed 2 bytes integer. 5516855e09eSopenharmony_ci/// 5526855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 5536855e09eSopenharmony_ci/// 5546855e09eSopenharmony_ci/// ```rust 5556855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 5566855e09eSopenharmony_ci/// use nom::number::streaming::le_i16; 5576855e09eSopenharmony_ci/// 5586855e09eSopenharmony_ci/// let parser = |s| { 5596855e09eSopenharmony_ci/// le_i16::<_, (_, ErrorKind)>(s) 5606855e09eSopenharmony_ci/// }; 5616855e09eSopenharmony_ci/// 5626855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100))); 5636855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); 5646855e09eSopenharmony_ci/// ``` 5656855e09eSopenharmony_ci#[inline] 5666855e09eSopenharmony_cipub fn le_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E> 5676855e09eSopenharmony_ciwhere 5686855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 5696855e09eSopenharmony_ci{ 5706855e09eSopenharmony_ci le_u16.map(|x| x as i16).parse(input) 5716855e09eSopenharmony_ci} 5726855e09eSopenharmony_ci 5736855e09eSopenharmony_ci/// Recognizes a little endian signed 3 bytes integer. 5746855e09eSopenharmony_ci/// 5756855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 5766855e09eSopenharmony_ci/// 5776855e09eSopenharmony_ci/// ```rust 5786855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 5796855e09eSopenharmony_ci/// use nom::number::streaming::le_i24; 5806855e09eSopenharmony_ci/// 5816855e09eSopenharmony_ci/// let parser = |s| { 5826855e09eSopenharmony_ci/// le_i24::<_, (_, ErrorKind)>(s) 5836855e09eSopenharmony_ci/// }; 5846855e09eSopenharmony_ci/// 5856855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100))); 5866855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); 5876855e09eSopenharmony_ci/// ``` 5886855e09eSopenharmony_ci#[inline] 5896855e09eSopenharmony_cipub fn le_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> 5906855e09eSopenharmony_ciwhere 5916855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 5926855e09eSopenharmony_ci{ 5936855e09eSopenharmony_ci // Same as the unsigned version but we need to sign-extend manually here 5946855e09eSopenharmony_ci le_u24 5956855e09eSopenharmony_ci .map(|x| { 5966855e09eSopenharmony_ci if x & 0x80_00_00 != 0 { 5976855e09eSopenharmony_ci (x | 0xff_00_00_00) as i32 5986855e09eSopenharmony_ci } else { 5996855e09eSopenharmony_ci x as i32 6006855e09eSopenharmony_ci } 6016855e09eSopenharmony_ci }) 6026855e09eSopenharmony_ci .parse(input) 6036855e09eSopenharmony_ci} 6046855e09eSopenharmony_ci 6056855e09eSopenharmony_ci/// Recognizes a little endian signed 4 bytes integer. 6066855e09eSopenharmony_ci/// 6076855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 6086855e09eSopenharmony_ci/// 6096855e09eSopenharmony_ci/// ```rust 6106855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 6116855e09eSopenharmony_ci/// use nom::number::streaming::le_i32; 6126855e09eSopenharmony_ci/// 6136855e09eSopenharmony_ci/// let parser = |s| { 6146855e09eSopenharmony_ci/// le_i32::<_, (_, ErrorKind)>(s) 6156855e09eSopenharmony_ci/// }; 6166855e09eSopenharmony_ci/// 6176855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100))); 6186855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); 6196855e09eSopenharmony_ci/// ``` 6206855e09eSopenharmony_ci#[inline] 6216855e09eSopenharmony_cipub fn le_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> 6226855e09eSopenharmony_ciwhere 6236855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 6246855e09eSopenharmony_ci{ 6256855e09eSopenharmony_ci le_u32.map(|x| x as i32).parse(input) 6266855e09eSopenharmony_ci} 6276855e09eSopenharmony_ci 6286855e09eSopenharmony_ci/// Recognizes a little endian signed 8 bytes integer. 6296855e09eSopenharmony_ci/// 6306855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 6316855e09eSopenharmony_ci/// 6326855e09eSopenharmony_ci/// ```rust 6336855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 6346855e09eSopenharmony_ci/// use nom::number::streaming::le_i64; 6356855e09eSopenharmony_ci/// 6366855e09eSopenharmony_ci/// let parser = |s| { 6376855e09eSopenharmony_ci/// le_i64::<_, (_, ErrorKind)>(s) 6386855e09eSopenharmony_ci/// }; 6396855e09eSopenharmony_ci/// 6406855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100))); 6416855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 6426855e09eSopenharmony_ci/// ``` 6436855e09eSopenharmony_ci#[inline] 6446855e09eSopenharmony_cipub fn le_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E> 6456855e09eSopenharmony_ciwhere 6466855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 6476855e09eSopenharmony_ci{ 6486855e09eSopenharmony_ci le_u64.map(|x| x as i64).parse(input) 6496855e09eSopenharmony_ci} 6506855e09eSopenharmony_ci 6516855e09eSopenharmony_ci/// Recognizes a little endian signed 16 bytes integer. 6526855e09eSopenharmony_ci/// 6536855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 6546855e09eSopenharmony_ci/// 6556855e09eSopenharmony_ci/// ```rust 6566855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 6576855e09eSopenharmony_ci/// use nom::number::streaming::le_i128; 6586855e09eSopenharmony_ci/// 6596855e09eSopenharmony_ci/// let parser = |s| { 6606855e09eSopenharmony_ci/// le_i128::<_, (_, ErrorKind)>(s) 6616855e09eSopenharmony_ci/// }; 6626855e09eSopenharmony_ci/// 6636855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100))); 6646855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 6656855e09eSopenharmony_ci/// ``` 6666855e09eSopenharmony_ci#[inline] 6676855e09eSopenharmony_cipub fn le_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E> 6686855e09eSopenharmony_ciwhere 6696855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 6706855e09eSopenharmony_ci{ 6716855e09eSopenharmony_ci le_u128.map(|x| x as i128).parse(input) 6726855e09eSopenharmony_ci} 6736855e09eSopenharmony_ci 6746855e09eSopenharmony_ci/// Recognizes an unsigned 1 byte integer 6756855e09eSopenharmony_ci/// 6766855e09eSopenharmony_ci/// Note that endianness does not apply to 1 byte numbers. 6776855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 6786855e09eSopenharmony_ci/// ```rust 6796855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 6806855e09eSopenharmony_ci/// # use nom::Needed::Size; 6816855e09eSopenharmony_ci/// use nom::number::streaming::u8; 6826855e09eSopenharmony_ci/// 6836855e09eSopenharmony_ci/// let parser = |s| { 6846855e09eSopenharmony_ci/// u8::<_, (_, ErrorKind)>(s) 6856855e09eSopenharmony_ci/// }; 6866855e09eSopenharmony_ci/// 6876855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00))); 6886855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); 6896855e09eSopenharmony_ci/// ``` 6906855e09eSopenharmony_ci#[inline] 6916855e09eSopenharmony_cipub fn u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> 6926855e09eSopenharmony_ciwhere 6936855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 6946855e09eSopenharmony_ci{ 6956855e09eSopenharmony_ci let bound: usize = 1; 6966855e09eSopenharmony_ci if input.input_len() < bound { 6976855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 6986855e09eSopenharmony_ci } else { 6996855e09eSopenharmony_ci let res = input.iter_elements().next().unwrap(); 7006855e09eSopenharmony_ci 7016855e09eSopenharmony_ci Ok((input.slice(bound..), res)) 7026855e09eSopenharmony_ci } 7036855e09eSopenharmony_ci} 7046855e09eSopenharmony_ci 7056855e09eSopenharmony_ci/// Recognizes an unsigned 2 bytes integer 7066855e09eSopenharmony_ci/// 7076855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u16 integer, 7086855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u16 integer. 7096855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 7106855e09eSopenharmony_ci/// 7116855e09eSopenharmony_ci/// ```rust 7126855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 7136855e09eSopenharmony_ci/// # use nom::Needed::Size; 7146855e09eSopenharmony_ci/// use nom::number::streaming::u16; 7156855e09eSopenharmony_ci/// 7166855e09eSopenharmony_ci/// let be_u16 = |s| { 7176855e09eSopenharmony_ci/// u16::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 7186855e09eSopenharmony_ci/// }; 7196855e09eSopenharmony_ci/// 7206855e09eSopenharmony_ci/// assert_eq!(be_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003))); 7216855e09eSopenharmony_ci/// assert_eq!(be_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); 7226855e09eSopenharmony_ci/// 7236855e09eSopenharmony_ci/// let le_u16 = |s| { 7246855e09eSopenharmony_ci/// u16::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 7256855e09eSopenharmony_ci/// }; 7266855e09eSopenharmony_ci/// 7276855e09eSopenharmony_ci/// assert_eq!(le_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300))); 7286855e09eSopenharmony_ci/// assert_eq!(le_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); 7296855e09eSopenharmony_ci/// ``` 7306855e09eSopenharmony_ci#[inline] 7316855e09eSopenharmony_cipub fn u16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u16, E> 7326855e09eSopenharmony_ciwhere 7336855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 7346855e09eSopenharmony_ci{ 7356855e09eSopenharmony_ci match endian { 7366855e09eSopenharmony_ci crate::number::Endianness::Big => be_u16, 7376855e09eSopenharmony_ci crate::number::Endianness::Little => le_u16, 7386855e09eSopenharmony_ci #[cfg(target_endian = "big")] 7396855e09eSopenharmony_ci crate::number::Endianness::Native => be_u16, 7406855e09eSopenharmony_ci #[cfg(target_endian = "little")] 7416855e09eSopenharmony_ci crate::number::Endianness::Native => le_u16, 7426855e09eSopenharmony_ci } 7436855e09eSopenharmony_ci} 7446855e09eSopenharmony_ci 7456855e09eSopenharmony_ci/// Recognizes an unsigned 3 byte integer 7466855e09eSopenharmony_ci/// 7476855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u24 integer, 7486855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u24 integer. 7496855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 7506855e09eSopenharmony_ci/// ```rust 7516855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 7526855e09eSopenharmony_ci/// # use nom::Needed::Size; 7536855e09eSopenharmony_ci/// use nom::number::streaming::u24; 7546855e09eSopenharmony_ci/// 7556855e09eSopenharmony_ci/// let be_u24 = |s| { 7566855e09eSopenharmony_ci/// u24::<_,(_, ErrorKind)>(nom::number::Endianness::Big)(s) 7576855e09eSopenharmony_ci/// }; 7586855e09eSopenharmony_ci/// 7596855e09eSopenharmony_ci/// assert_eq!(be_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305))); 7606855e09eSopenharmony_ci/// assert_eq!(be_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); 7616855e09eSopenharmony_ci/// 7626855e09eSopenharmony_ci/// let le_u24 = |s| { 7636855e09eSopenharmony_ci/// u24::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 7646855e09eSopenharmony_ci/// }; 7656855e09eSopenharmony_ci/// 7666855e09eSopenharmony_ci/// assert_eq!(le_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300))); 7676855e09eSopenharmony_ci/// assert_eq!(le_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); 7686855e09eSopenharmony_ci/// ``` 7696855e09eSopenharmony_ci#[inline] 7706855e09eSopenharmony_cipub fn u24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E> 7716855e09eSopenharmony_ciwhere 7726855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 7736855e09eSopenharmony_ci{ 7746855e09eSopenharmony_ci match endian { 7756855e09eSopenharmony_ci crate::number::Endianness::Big => be_u24, 7766855e09eSopenharmony_ci crate::number::Endianness::Little => le_u24, 7776855e09eSopenharmony_ci #[cfg(target_endian = "big")] 7786855e09eSopenharmony_ci crate::number::Endianness::Native => be_u24, 7796855e09eSopenharmony_ci #[cfg(target_endian = "little")] 7806855e09eSopenharmony_ci crate::number::Endianness::Native => le_u24, 7816855e09eSopenharmony_ci } 7826855e09eSopenharmony_ci} 7836855e09eSopenharmony_ci 7846855e09eSopenharmony_ci/// Recognizes an unsigned 4 byte integer 7856855e09eSopenharmony_ci/// 7866855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u32 integer, 7876855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u32 integer. 7886855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 7896855e09eSopenharmony_ci/// ```rust 7906855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 7916855e09eSopenharmony_ci/// # use nom::Needed::Size; 7926855e09eSopenharmony_ci/// use nom::number::streaming::u32; 7936855e09eSopenharmony_ci/// 7946855e09eSopenharmony_ci/// let be_u32 = |s| { 7956855e09eSopenharmony_ci/// u32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 7966855e09eSopenharmony_ci/// }; 7976855e09eSopenharmony_ci/// 7986855e09eSopenharmony_ci/// assert_eq!(be_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507))); 7996855e09eSopenharmony_ci/// assert_eq!(be_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); 8006855e09eSopenharmony_ci/// 8016855e09eSopenharmony_ci/// let le_u32 = |s| { 8026855e09eSopenharmony_ci/// u32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 8036855e09eSopenharmony_ci/// }; 8046855e09eSopenharmony_ci/// 8056855e09eSopenharmony_ci/// assert_eq!(le_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300))); 8066855e09eSopenharmony_ci/// assert_eq!(le_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); 8076855e09eSopenharmony_ci/// ``` 8086855e09eSopenharmony_ci#[inline] 8096855e09eSopenharmony_cipub fn u32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E> 8106855e09eSopenharmony_ciwhere 8116855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 8126855e09eSopenharmony_ci{ 8136855e09eSopenharmony_ci match endian { 8146855e09eSopenharmony_ci crate::number::Endianness::Big => be_u32, 8156855e09eSopenharmony_ci crate::number::Endianness::Little => le_u32, 8166855e09eSopenharmony_ci #[cfg(target_endian = "big")] 8176855e09eSopenharmony_ci crate::number::Endianness::Native => be_u32, 8186855e09eSopenharmony_ci #[cfg(target_endian = "little")] 8196855e09eSopenharmony_ci crate::number::Endianness::Native => le_u32, 8206855e09eSopenharmony_ci } 8216855e09eSopenharmony_ci} 8226855e09eSopenharmony_ci 8236855e09eSopenharmony_ci/// Recognizes an unsigned 8 byte integer 8246855e09eSopenharmony_ci/// 8256855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u64 integer, 8266855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u64 integer. 8276855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 8286855e09eSopenharmony_ci/// ```rust 8296855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 8306855e09eSopenharmony_ci/// # use nom::Needed::Size; 8316855e09eSopenharmony_ci/// use nom::number::streaming::u64; 8326855e09eSopenharmony_ci/// 8336855e09eSopenharmony_ci/// let be_u64 = |s| { 8346855e09eSopenharmony_ci/// u64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 8356855e09eSopenharmony_ci/// }; 8366855e09eSopenharmony_ci/// 8376855e09eSopenharmony_ci/// assert_eq!(be_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607))); 8386855e09eSopenharmony_ci/// assert_eq!(be_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 8396855e09eSopenharmony_ci/// 8406855e09eSopenharmony_ci/// let le_u64 = |s| { 8416855e09eSopenharmony_ci/// u64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 8426855e09eSopenharmony_ci/// }; 8436855e09eSopenharmony_ci/// 8446855e09eSopenharmony_ci/// assert_eq!(le_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100))); 8456855e09eSopenharmony_ci/// assert_eq!(le_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 8466855e09eSopenharmony_ci/// ``` 8476855e09eSopenharmony_ci#[inline] 8486855e09eSopenharmony_cipub fn u64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u64, E> 8496855e09eSopenharmony_ciwhere 8506855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 8516855e09eSopenharmony_ci{ 8526855e09eSopenharmony_ci match endian { 8536855e09eSopenharmony_ci crate::number::Endianness::Big => be_u64, 8546855e09eSopenharmony_ci crate::number::Endianness::Little => le_u64, 8556855e09eSopenharmony_ci #[cfg(target_endian = "big")] 8566855e09eSopenharmony_ci crate::number::Endianness::Native => be_u64, 8576855e09eSopenharmony_ci #[cfg(target_endian = "little")] 8586855e09eSopenharmony_ci crate::number::Endianness::Native => le_u64, 8596855e09eSopenharmony_ci } 8606855e09eSopenharmony_ci} 8616855e09eSopenharmony_ci 8626855e09eSopenharmony_ci/// Recognizes an unsigned 16 byte integer 8636855e09eSopenharmony_ci/// 8646855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u128 integer, 8656855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u128 integer. 8666855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 8676855e09eSopenharmony_ci/// ```rust 8686855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 8696855e09eSopenharmony_ci/// # use nom::Needed::Size; 8706855e09eSopenharmony_ci/// use nom::number::streaming::u128; 8716855e09eSopenharmony_ci/// 8726855e09eSopenharmony_ci/// let be_u128 = |s| { 8736855e09eSopenharmony_ci/// u128::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 8746855e09eSopenharmony_ci/// }; 8756855e09eSopenharmony_ci/// 8766855e09eSopenharmony_ci/// assert_eq!(be_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607))); 8776855e09eSopenharmony_ci/// assert_eq!(be_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 8786855e09eSopenharmony_ci/// 8796855e09eSopenharmony_ci/// let le_u128 = |s| { 8806855e09eSopenharmony_ci/// u128::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 8816855e09eSopenharmony_ci/// }; 8826855e09eSopenharmony_ci/// 8836855e09eSopenharmony_ci/// assert_eq!(le_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100))); 8846855e09eSopenharmony_ci/// assert_eq!(le_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 8856855e09eSopenharmony_ci/// ``` 8866855e09eSopenharmony_ci#[inline] 8876855e09eSopenharmony_cipub fn u128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u128, E> 8886855e09eSopenharmony_ciwhere 8896855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 8906855e09eSopenharmony_ci{ 8916855e09eSopenharmony_ci match endian { 8926855e09eSopenharmony_ci crate::number::Endianness::Big => be_u128, 8936855e09eSopenharmony_ci crate::number::Endianness::Little => le_u128, 8946855e09eSopenharmony_ci #[cfg(target_endian = "big")] 8956855e09eSopenharmony_ci crate::number::Endianness::Native => be_u128, 8966855e09eSopenharmony_ci #[cfg(target_endian = "little")] 8976855e09eSopenharmony_ci crate::number::Endianness::Native => le_u128, 8986855e09eSopenharmony_ci } 8996855e09eSopenharmony_ci} 9006855e09eSopenharmony_ci 9016855e09eSopenharmony_ci/// Recognizes a signed 1 byte integer 9026855e09eSopenharmony_ci/// 9036855e09eSopenharmony_ci/// Note that endianness does not apply to 1 byte numbers. 9046855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 9056855e09eSopenharmony_ci/// ```rust 9066855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 9076855e09eSopenharmony_ci/// # use nom::Needed::Size; 9086855e09eSopenharmony_ci/// use nom::number::streaming::i8; 9096855e09eSopenharmony_ci/// 9106855e09eSopenharmony_ci/// let parser = |s| { 9116855e09eSopenharmony_ci/// i8::<_, (_, ErrorKind)>(s) 9126855e09eSopenharmony_ci/// }; 9136855e09eSopenharmony_ci/// 9146855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00))); 9156855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); 9166855e09eSopenharmony_ci/// ``` 9176855e09eSopenharmony_ci#[inline] 9186855e09eSopenharmony_cipub fn i8<I, E: ParseError<I>>(i: I) -> IResult<I, i8, E> 9196855e09eSopenharmony_ciwhere 9206855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 9216855e09eSopenharmony_ci{ 9226855e09eSopenharmony_ci u8.map(|x| x as i8).parse(i) 9236855e09eSopenharmony_ci} 9246855e09eSopenharmony_ci 9256855e09eSopenharmony_ci/// Recognizes a signed 2 byte integer 9266855e09eSopenharmony_ci/// 9276855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i16 integer, 9286855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i16 integer. 9296855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 9306855e09eSopenharmony_ci/// ```rust 9316855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 9326855e09eSopenharmony_ci/// # use nom::Needed::Size; 9336855e09eSopenharmony_ci/// use nom::number::streaming::i16; 9346855e09eSopenharmony_ci/// 9356855e09eSopenharmony_ci/// let be_i16 = |s| { 9366855e09eSopenharmony_ci/// i16::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 9376855e09eSopenharmony_ci/// }; 9386855e09eSopenharmony_ci/// 9396855e09eSopenharmony_ci/// assert_eq!(be_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003))); 9406855e09eSopenharmony_ci/// assert_eq!(be_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); 9416855e09eSopenharmony_ci/// 9426855e09eSopenharmony_ci/// let le_i16 = |s| { 9436855e09eSopenharmony_ci/// i16::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 9446855e09eSopenharmony_ci/// }; 9456855e09eSopenharmony_ci/// 9466855e09eSopenharmony_ci/// assert_eq!(le_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300))); 9476855e09eSopenharmony_ci/// assert_eq!(le_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); 9486855e09eSopenharmony_ci/// ``` 9496855e09eSopenharmony_ci#[inline] 9506855e09eSopenharmony_cipub fn i16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i16, E> 9516855e09eSopenharmony_ciwhere 9526855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 9536855e09eSopenharmony_ci{ 9546855e09eSopenharmony_ci match endian { 9556855e09eSopenharmony_ci crate::number::Endianness::Big => be_i16, 9566855e09eSopenharmony_ci crate::number::Endianness::Little => le_i16, 9576855e09eSopenharmony_ci #[cfg(target_endian = "big")] 9586855e09eSopenharmony_ci crate::number::Endianness::Native => be_i16, 9596855e09eSopenharmony_ci #[cfg(target_endian = "little")] 9606855e09eSopenharmony_ci crate::number::Endianness::Native => le_i16, 9616855e09eSopenharmony_ci } 9626855e09eSopenharmony_ci} 9636855e09eSopenharmony_ci 9646855e09eSopenharmony_ci/// Recognizes a signed 3 byte integer 9656855e09eSopenharmony_ci/// 9666855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i24 integer, 9676855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i24 integer. 9686855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 9696855e09eSopenharmony_ci/// ```rust 9706855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 9716855e09eSopenharmony_ci/// # use nom::Needed::Size; 9726855e09eSopenharmony_ci/// use nom::number::streaming::i24; 9736855e09eSopenharmony_ci/// 9746855e09eSopenharmony_ci/// let be_i24 = |s| { 9756855e09eSopenharmony_ci/// i24::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 9766855e09eSopenharmony_ci/// }; 9776855e09eSopenharmony_ci/// 9786855e09eSopenharmony_ci/// assert_eq!(be_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305))); 9796855e09eSopenharmony_ci/// assert_eq!(be_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); 9806855e09eSopenharmony_ci/// 9816855e09eSopenharmony_ci/// let le_i24 = |s| { 9826855e09eSopenharmony_ci/// i24::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 9836855e09eSopenharmony_ci/// }; 9846855e09eSopenharmony_ci/// 9856855e09eSopenharmony_ci/// assert_eq!(le_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300))); 9866855e09eSopenharmony_ci/// assert_eq!(le_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); 9876855e09eSopenharmony_ci/// ``` 9886855e09eSopenharmony_ci#[inline] 9896855e09eSopenharmony_cipub fn i24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E> 9906855e09eSopenharmony_ciwhere 9916855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 9926855e09eSopenharmony_ci{ 9936855e09eSopenharmony_ci match endian { 9946855e09eSopenharmony_ci crate::number::Endianness::Big => be_i24, 9956855e09eSopenharmony_ci crate::number::Endianness::Little => le_i24, 9966855e09eSopenharmony_ci #[cfg(target_endian = "big")] 9976855e09eSopenharmony_ci crate::number::Endianness::Native => be_i24, 9986855e09eSopenharmony_ci #[cfg(target_endian = "little")] 9996855e09eSopenharmony_ci crate::number::Endianness::Native => le_i24, 10006855e09eSopenharmony_ci } 10016855e09eSopenharmony_ci} 10026855e09eSopenharmony_ci 10036855e09eSopenharmony_ci/// Recognizes a signed 4 byte integer 10046855e09eSopenharmony_ci/// 10056855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i32 integer, 10066855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i32 integer. 10076855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 10086855e09eSopenharmony_ci/// ```rust 10096855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 10106855e09eSopenharmony_ci/// # use nom::Needed::Size; 10116855e09eSopenharmony_ci/// use nom::number::streaming::i32; 10126855e09eSopenharmony_ci/// 10136855e09eSopenharmony_ci/// let be_i32 = |s| { 10146855e09eSopenharmony_ci/// i32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 10156855e09eSopenharmony_ci/// }; 10166855e09eSopenharmony_ci/// 10176855e09eSopenharmony_ci/// assert_eq!(be_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507))); 10186855e09eSopenharmony_ci/// assert_eq!(be_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); 10196855e09eSopenharmony_ci/// 10206855e09eSopenharmony_ci/// let le_i32 = |s| { 10216855e09eSopenharmony_ci/// i32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 10226855e09eSopenharmony_ci/// }; 10236855e09eSopenharmony_ci/// 10246855e09eSopenharmony_ci/// assert_eq!(le_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300))); 10256855e09eSopenharmony_ci/// assert_eq!(le_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); 10266855e09eSopenharmony_ci/// ``` 10276855e09eSopenharmony_ci#[inline] 10286855e09eSopenharmony_cipub fn i32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E> 10296855e09eSopenharmony_ciwhere 10306855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 10316855e09eSopenharmony_ci{ 10326855e09eSopenharmony_ci match endian { 10336855e09eSopenharmony_ci crate::number::Endianness::Big => be_i32, 10346855e09eSopenharmony_ci crate::number::Endianness::Little => le_i32, 10356855e09eSopenharmony_ci #[cfg(target_endian = "big")] 10366855e09eSopenharmony_ci crate::number::Endianness::Native => be_i32, 10376855e09eSopenharmony_ci #[cfg(target_endian = "little")] 10386855e09eSopenharmony_ci crate::number::Endianness::Native => le_i32, 10396855e09eSopenharmony_ci } 10406855e09eSopenharmony_ci} 10416855e09eSopenharmony_ci 10426855e09eSopenharmony_ci/// Recognizes a signed 8 byte integer 10436855e09eSopenharmony_ci/// 10446855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i64 integer, 10456855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i64 integer. 10466855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 10476855e09eSopenharmony_ci/// ```rust 10486855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 10496855e09eSopenharmony_ci/// # use nom::Needed::Size; 10506855e09eSopenharmony_ci/// use nom::number::streaming::i64; 10516855e09eSopenharmony_ci/// 10526855e09eSopenharmony_ci/// let be_i64 = |s| { 10536855e09eSopenharmony_ci/// i64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 10546855e09eSopenharmony_ci/// }; 10556855e09eSopenharmony_ci/// 10566855e09eSopenharmony_ci/// assert_eq!(be_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607))); 10576855e09eSopenharmony_ci/// assert_eq!(be_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 10586855e09eSopenharmony_ci/// 10596855e09eSopenharmony_ci/// let le_i64 = |s| { 10606855e09eSopenharmony_ci/// i64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 10616855e09eSopenharmony_ci/// }; 10626855e09eSopenharmony_ci/// 10636855e09eSopenharmony_ci/// assert_eq!(le_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100))); 10646855e09eSopenharmony_ci/// assert_eq!(le_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); 10656855e09eSopenharmony_ci/// ``` 10666855e09eSopenharmony_ci#[inline] 10676855e09eSopenharmony_cipub fn i64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i64, E> 10686855e09eSopenharmony_ciwhere 10696855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 10706855e09eSopenharmony_ci{ 10716855e09eSopenharmony_ci match endian { 10726855e09eSopenharmony_ci crate::number::Endianness::Big => be_i64, 10736855e09eSopenharmony_ci crate::number::Endianness::Little => le_i64, 10746855e09eSopenharmony_ci #[cfg(target_endian = "big")] 10756855e09eSopenharmony_ci crate::number::Endianness::Native => be_i64, 10766855e09eSopenharmony_ci #[cfg(target_endian = "little")] 10776855e09eSopenharmony_ci crate::number::Endianness::Native => le_i64, 10786855e09eSopenharmony_ci } 10796855e09eSopenharmony_ci} 10806855e09eSopenharmony_ci 10816855e09eSopenharmony_ci/// Recognizes a signed 16 byte integer 10826855e09eSopenharmony_ci/// 10836855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i128 integer, 10846855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i128 integer. 10856855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 10866855e09eSopenharmony_ci/// ```rust 10876855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 10886855e09eSopenharmony_ci/// # use nom::Needed::Size; 10896855e09eSopenharmony_ci/// use nom::number::streaming::i128; 10906855e09eSopenharmony_ci/// 10916855e09eSopenharmony_ci/// let be_i128 = |s| { 10926855e09eSopenharmony_ci/// i128::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 10936855e09eSopenharmony_ci/// }; 10946855e09eSopenharmony_ci/// 10956855e09eSopenharmony_ci/// assert_eq!(be_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607))); 10966855e09eSopenharmony_ci/// assert_eq!(be_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 10976855e09eSopenharmony_ci/// 10986855e09eSopenharmony_ci/// let le_i128 = |s| { 10996855e09eSopenharmony_ci/// i128::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 11006855e09eSopenharmony_ci/// }; 11016855e09eSopenharmony_ci/// 11026855e09eSopenharmony_ci/// assert_eq!(le_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100))); 11036855e09eSopenharmony_ci/// assert_eq!(le_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); 11046855e09eSopenharmony_ci/// ``` 11056855e09eSopenharmony_ci#[inline] 11066855e09eSopenharmony_cipub fn i128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i128, E> 11076855e09eSopenharmony_ciwhere 11086855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 11096855e09eSopenharmony_ci{ 11106855e09eSopenharmony_ci match endian { 11116855e09eSopenharmony_ci crate::number::Endianness::Big => be_i128, 11126855e09eSopenharmony_ci crate::number::Endianness::Little => le_i128, 11136855e09eSopenharmony_ci #[cfg(target_endian = "big")] 11146855e09eSopenharmony_ci crate::number::Endianness::Native => be_i128, 11156855e09eSopenharmony_ci #[cfg(target_endian = "little")] 11166855e09eSopenharmony_ci crate::number::Endianness::Native => le_i128, 11176855e09eSopenharmony_ci } 11186855e09eSopenharmony_ci} 11196855e09eSopenharmony_ci 11206855e09eSopenharmony_ci/// Recognizes a big endian 4 bytes floating point number. 11216855e09eSopenharmony_ci/// 11226855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 11236855e09eSopenharmony_ci/// ```rust 11246855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 11256855e09eSopenharmony_ci/// use nom::number::streaming::be_f32; 11266855e09eSopenharmony_ci/// 11276855e09eSopenharmony_ci/// let parser = |s| { 11286855e09eSopenharmony_ci/// be_f32::<_, (_, ErrorKind)>(s) 11296855e09eSopenharmony_ci/// }; 11306855e09eSopenharmony_ci/// 11316855e09eSopenharmony_ci/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00][..]), Ok((&b""[..], 2.640625))); 11326855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3)))); 11336855e09eSopenharmony_ci/// ``` 11346855e09eSopenharmony_ci#[inline] 11356855e09eSopenharmony_cipub fn be_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E> 11366855e09eSopenharmony_ciwhere 11376855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 11386855e09eSopenharmony_ci{ 11396855e09eSopenharmony_ci match be_u32(input) { 11406855e09eSopenharmony_ci Err(e) => Err(e), 11416855e09eSopenharmony_ci Ok((i, o)) => Ok((i, f32::from_bits(o))), 11426855e09eSopenharmony_ci } 11436855e09eSopenharmony_ci} 11446855e09eSopenharmony_ci 11456855e09eSopenharmony_ci/// Recognizes a big endian 8 bytes floating point number. 11466855e09eSopenharmony_ci/// 11476855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 11486855e09eSopenharmony_ci/// ```rust 11496855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 11506855e09eSopenharmony_ci/// use nom::number::streaming::be_f64; 11516855e09eSopenharmony_ci/// 11526855e09eSopenharmony_ci/// let parser = |s| { 11536855e09eSopenharmony_ci/// be_f64::<_, (_, ErrorKind)>(s) 11546855e09eSopenharmony_ci/// }; 11556855e09eSopenharmony_ci/// 11566855e09eSopenharmony_ci/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5))); 11576855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7)))); 11586855e09eSopenharmony_ci/// ``` 11596855e09eSopenharmony_ci#[inline] 11606855e09eSopenharmony_cipub fn be_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E> 11616855e09eSopenharmony_ciwhere 11626855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 11636855e09eSopenharmony_ci{ 11646855e09eSopenharmony_ci match be_u64(input) { 11656855e09eSopenharmony_ci Err(e) => Err(e), 11666855e09eSopenharmony_ci Ok((i, o)) => Ok((i, f64::from_bits(o))), 11676855e09eSopenharmony_ci } 11686855e09eSopenharmony_ci} 11696855e09eSopenharmony_ci 11706855e09eSopenharmony_ci/// Recognizes a little endian 4 bytes floating point number. 11716855e09eSopenharmony_ci/// 11726855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 11736855e09eSopenharmony_ci/// ```rust 11746855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 11756855e09eSopenharmony_ci/// use nom::number::streaming::le_f32; 11766855e09eSopenharmony_ci/// 11776855e09eSopenharmony_ci/// let parser = |s| { 11786855e09eSopenharmony_ci/// le_f32::<_, (_, ErrorKind)>(s) 11796855e09eSopenharmony_ci/// }; 11806855e09eSopenharmony_ci/// 11816855e09eSopenharmony_ci/// assert_eq!(parser(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5))); 11826855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3)))); 11836855e09eSopenharmony_ci/// ``` 11846855e09eSopenharmony_ci#[inline] 11856855e09eSopenharmony_cipub fn le_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E> 11866855e09eSopenharmony_ciwhere 11876855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 11886855e09eSopenharmony_ci{ 11896855e09eSopenharmony_ci match le_u32(input) { 11906855e09eSopenharmony_ci Err(e) => Err(e), 11916855e09eSopenharmony_ci Ok((i, o)) => Ok((i, f32::from_bits(o))), 11926855e09eSopenharmony_ci } 11936855e09eSopenharmony_ci} 11946855e09eSopenharmony_ci 11956855e09eSopenharmony_ci/// Recognizes a little endian 8 bytes floating point number. 11966855e09eSopenharmony_ci/// 11976855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 11986855e09eSopenharmony_ci/// ```rust 11996855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 12006855e09eSopenharmony_ci/// use nom::number::streaming::le_f64; 12016855e09eSopenharmony_ci/// 12026855e09eSopenharmony_ci/// let parser = |s| { 12036855e09eSopenharmony_ci/// le_f64::<_, (_, ErrorKind)>(s) 12046855e09eSopenharmony_ci/// }; 12056855e09eSopenharmony_ci/// 12066855e09eSopenharmony_ci/// assert_eq!(parser(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 3145728.0))); 12076855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7)))); 12086855e09eSopenharmony_ci/// ``` 12096855e09eSopenharmony_ci#[inline] 12106855e09eSopenharmony_cipub fn le_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E> 12116855e09eSopenharmony_ciwhere 12126855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 12136855e09eSopenharmony_ci{ 12146855e09eSopenharmony_ci match le_u64(input) { 12156855e09eSopenharmony_ci Err(e) => Err(e), 12166855e09eSopenharmony_ci Ok((i, o)) => Ok((i, f64::from_bits(o))), 12176855e09eSopenharmony_ci } 12186855e09eSopenharmony_ci} 12196855e09eSopenharmony_ci 12206855e09eSopenharmony_ci/// Recognizes a 4 byte floating point number 12216855e09eSopenharmony_ci/// 12226855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f32 float, 12236855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian f32 float. 12246855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 12256855e09eSopenharmony_ci/// ```rust 12266855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 12276855e09eSopenharmony_ci/// # use nom::Needed::Size; 12286855e09eSopenharmony_ci/// use nom::number::streaming::f32; 12296855e09eSopenharmony_ci/// 12306855e09eSopenharmony_ci/// let be_f32 = |s| { 12316855e09eSopenharmony_ci/// f32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 12326855e09eSopenharmony_ci/// }; 12336855e09eSopenharmony_ci/// 12346855e09eSopenharmony_ci/// assert_eq!(be_f32(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5))); 12356855e09eSopenharmony_ci/// assert_eq!(be_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1)))); 12366855e09eSopenharmony_ci/// 12376855e09eSopenharmony_ci/// let le_f32 = |s| { 12386855e09eSopenharmony_ci/// f32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 12396855e09eSopenharmony_ci/// }; 12406855e09eSopenharmony_ci/// 12416855e09eSopenharmony_ci/// assert_eq!(le_f32(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5))); 12426855e09eSopenharmony_ci/// assert_eq!(le_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1)))); 12436855e09eSopenharmony_ci/// ``` 12446855e09eSopenharmony_ci#[inline] 12456855e09eSopenharmony_cipub fn f32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f32, E> 12466855e09eSopenharmony_ciwhere 12476855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 12486855e09eSopenharmony_ci{ 12496855e09eSopenharmony_ci match endian { 12506855e09eSopenharmony_ci crate::number::Endianness::Big => be_f32, 12516855e09eSopenharmony_ci crate::number::Endianness::Little => le_f32, 12526855e09eSopenharmony_ci #[cfg(target_endian = "big")] 12536855e09eSopenharmony_ci crate::number::Endianness::Native => be_f32, 12546855e09eSopenharmony_ci #[cfg(target_endian = "little")] 12556855e09eSopenharmony_ci crate::number::Endianness::Native => le_f32, 12566855e09eSopenharmony_ci } 12576855e09eSopenharmony_ci} 12586855e09eSopenharmony_ci 12596855e09eSopenharmony_ci/// Recognizes an 8 byte floating point number 12606855e09eSopenharmony_ci/// 12616855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f64 float, 12626855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian f64 float. 12636855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 12646855e09eSopenharmony_ci/// ```rust 12656855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 12666855e09eSopenharmony_ci/// # use nom::Needed::Size; 12676855e09eSopenharmony_ci/// use nom::number::streaming::f64; 12686855e09eSopenharmony_ci/// 12696855e09eSopenharmony_ci/// let be_f64 = |s| { 12706855e09eSopenharmony_ci/// f64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) 12716855e09eSopenharmony_ci/// }; 12726855e09eSopenharmony_ci/// 12736855e09eSopenharmony_ci/// assert_eq!(be_f64(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5))); 12746855e09eSopenharmony_ci/// assert_eq!(be_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5)))); 12756855e09eSopenharmony_ci/// 12766855e09eSopenharmony_ci/// let le_f64 = |s| { 12776855e09eSopenharmony_ci/// f64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) 12786855e09eSopenharmony_ci/// }; 12796855e09eSopenharmony_ci/// 12806855e09eSopenharmony_ci/// assert_eq!(le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5))); 12816855e09eSopenharmony_ci/// assert_eq!(le_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5)))); 12826855e09eSopenharmony_ci/// ``` 12836855e09eSopenharmony_ci#[inline] 12846855e09eSopenharmony_cipub fn f64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f64, E> 12856855e09eSopenharmony_ciwhere 12866855e09eSopenharmony_ci I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength, 12876855e09eSopenharmony_ci{ 12886855e09eSopenharmony_ci match endian { 12896855e09eSopenharmony_ci crate::number::Endianness::Big => be_f64, 12906855e09eSopenharmony_ci crate::number::Endianness::Little => le_f64, 12916855e09eSopenharmony_ci #[cfg(target_endian = "big")] 12926855e09eSopenharmony_ci crate::number::Endianness::Native => be_f64, 12936855e09eSopenharmony_ci #[cfg(target_endian = "little")] 12946855e09eSopenharmony_ci crate::number::Endianness::Native => le_f64, 12956855e09eSopenharmony_ci } 12966855e09eSopenharmony_ci} 12976855e09eSopenharmony_ci 12986855e09eSopenharmony_ci/// Recognizes a hex-encoded integer. 12996855e09eSopenharmony_ci/// 13006855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 13016855e09eSopenharmony_ci/// ```rust 13026855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 13036855e09eSopenharmony_ci/// use nom::number::streaming::hex_u32; 13046855e09eSopenharmony_ci/// 13056855e09eSopenharmony_ci/// let parser = |s| { 13066855e09eSopenharmony_ci/// hex_u32(s) 13076855e09eSopenharmony_ci/// }; 13086855e09eSopenharmony_ci/// 13096855e09eSopenharmony_ci/// assert_eq!(parser(b"01AE;"), Ok((&b";"[..], 0x01AE))); 13106855e09eSopenharmony_ci/// assert_eq!(parser(b"abc"), Err(Err::Incomplete(Needed::new(1)))); 13116855e09eSopenharmony_ci/// assert_eq!(parser(b"ggg"), Err(Err::Error((&b"ggg"[..], ErrorKind::IsA)))); 13126855e09eSopenharmony_ci/// ``` 13136855e09eSopenharmony_ci#[inline] 13146855e09eSopenharmony_cipub fn hex_u32<'a, E: ParseError<&'a [u8]>>(input: &'a [u8]) -> IResult<&'a [u8], u32, E> { 13156855e09eSopenharmony_ci let (i, o) = crate::bytes::streaming::is_a(&b"0123456789abcdefABCDEF"[..])(input)?; 13166855e09eSopenharmony_ci 13176855e09eSopenharmony_ci // Do not parse more than 8 characters for a u32 13186855e09eSopenharmony_ci let (parsed, remaining) = if o.len() <= 8 { 13196855e09eSopenharmony_ci (o, i) 13206855e09eSopenharmony_ci } else { 13216855e09eSopenharmony_ci (&input[..8], &input[8..]) 13226855e09eSopenharmony_ci }; 13236855e09eSopenharmony_ci 13246855e09eSopenharmony_ci let res = parsed 13256855e09eSopenharmony_ci .iter() 13266855e09eSopenharmony_ci .rev() 13276855e09eSopenharmony_ci .enumerate() 13286855e09eSopenharmony_ci .map(|(k, &v)| { 13296855e09eSopenharmony_ci let digit = v as char; 13306855e09eSopenharmony_ci digit.to_digit(16).unwrap_or(0) << (k * 4) 13316855e09eSopenharmony_ci }) 13326855e09eSopenharmony_ci .sum(); 13336855e09eSopenharmony_ci 13346855e09eSopenharmony_ci Ok((remaining, res)) 13356855e09eSopenharmony_ci} 13366855e09eSopenharmony_ci 13376855e09eSopenharmony_ci/// Recognizes a floating point number in text format and returns the corresponding part of the input. 13386855e09eSopenharmony_ci/// 13396855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if it reaches the end of input. 13406855e09eSopenharmony_ci/// 13416855e09eSopenharmony_ci/// ```rust 13426855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 13436855e09eSopenharmony_ci/// use nom::number::streaming::recognize_float; 13446855e09eSopenharmony_ci/// 13456855e09eSopenharmony_ci/// let parser = |s| { 13466855e09eSopenharmony_ci/// recognize_float(s) 13476855e09eSopenharmony_ci/// }; 13486855e09eSopenharmony_ci/// 13496855e09eSopenharmony_ci/// assert_eq!(parser("11e-1;"), Ok((";", "11e-1"))); 13506855e09eSopenharmony_ci/// assert_eq!(parser("123E-02;"), Ok((";", "123E-02"))); 13516855e09eSopenharmony_ci/// assert_eq!(parser("123K-01"), Ok(("K-01", "123"))); 13526855e09eSopenharmony_ci/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char)))); 13536855e09eSopenharmony_ci/// ``` 13546855e09eSopenharmony_ci#[rustfmt::skip] 13556855e09eSopenharmony_cipub fn recognize_float<T, E:ParseError<T>>(input: T) -> IResult<T, T, E> 13566855e09eSopenharmony_ciwhere 13576855e09eSopenharmony_ci T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, 13586855e09eSopenharmony_ci T: Clone + Offset, 13596855e09eSopenharmony_ci T: InputIter, 13606855e09eSopenharmony_ci <T as InputIter>::Item: AsChar, 13616855e09eSopenharmony_ci T: InputTakeAtPosition + InputLength, 13626855e09eSopenharmony_ci <T as InputTakeAtPosition>::Item: AsChar 13636855e09eSopenharmony_ci{ 13646855e09eSopenharmony_ci recognize( 13656855e09eSopenharmony_ci tuple(( 13666855e09eSopenharmony_ci opt(alt((char('+'), char('-')))), 13676855e09eSopenharmony_ci alt(( 13686855e09eSopenharmony_ci map(tuple((digit1, opt(pair(char('.'), opt(digit1))))), |_| ()), 13696855e09eSopenharmony_ci map(tuple((char('.'), digit1)), |_| ()) 13706855e09eSopenharmony_ci )), 13716855e09eSopenharmony_ci opt(tuple(( 13726855e09eSopenharmony_ci alt((char('e'), char('E'))), 13736855e09eSopenharmony_ci opt(alt((char('+'), char('-')))), 13746855e09eSopenharmony_ci cut(digit1) 13756855e09eSopenharmony_ci ))) 13766855e09eSopenharmony_ci )) 13776855e09eSopenharmony_ci )(input) 13786855e09eSopenharmony_ci} 13796855e09eSopenharmony_ci 13806855e09eSopenharmony_ci// workaround until issues with minimal-lexical are fixed 13816855e09eSopenharmony_ci#[doc(hidden)] 13826855e09eSopenharmony_cipub fn recognize_float_or_exceptions<T, E: ParseError<T>>(input: T) -> IResult<T, T, E> 13836855e09eSopenharmony_ciwhere 13846855e09eSopenharmony_ci T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, 13856855e09eSopenharmony_ci T: Clone + Offset, 13866855e09eSopenharmony_ci T: InputIter + InputTake + InputLength + Compare<&'static str>, 13876855e09eSopenharmony_ci <T as InputIter>::Item: AsChar, 13886855e09eSopenharmony_ci T: InputTakeAtPosition, 13896855e09eSopenharmony_ci <T as InputTakeAtPosition>::Item: AsChar, 13906855e09eSopenharmony_ci{ 13916855e09eSopenharmony_ci alt(( 13926855e09eSopenharmony_ci |i: T| { 13936855e09eSopenharmony_ci recognize_float::<_, E>(i.clone()).map_err(|e| match e { 13946855e09eSopenharmony_ci crate::Err::Error(_) => crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)), 13956855e09eSopenharmony_ci crate::Err::Failure(_) => crate::Err::Failure(E::from_error_kind(i, ErrorKind::Float)), 13966855e09eSopenharmony_ci crate::Err::Incomplete(needed) => crate::Err::Incomplete(needed), 13976855e09eSopenharmony_ci }) 13986855e09eSopenharmony_ci }, 13996855e09eSopenharmony_ci |i: T| { 14006855e09eSopenharmony_ci crate::bytes::streaming::tag_no_case::<_, _, E>("nan")(i.clone()) 14016855e09eSopenharmony_ci .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float))) 14026855e09eSopenharmony_ci }, 14036855e09eSopenharmony_ci |i: T| { 14046855e09eSopenharmony_ci crate::bytes::streaming::tag_no_case::<_, _, E>("inf")(i.clone()) 14056855e09eSopenharmony_ci .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float))) 14066855e09eSopenharmony_ci }, 14076855e09eSopenharmony_ci |i: T| { 14086855e09eSopenharmony_ci crate::bytes::streaming::tag_no_case::<_, _, E>("infinity")(i.clone()) 14096855e09eSopenharmony_ci .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float))) 14106855e09eSopenharmony_ci }, 14116855e09eSopenharmony_ci ))(input) 14126855e09eSopenharmony_ci} 14136855e09eSopenharmony_ci 14146855e09eSopenharmony_ci/// Recognizes a floating point number in text format 14156855e09eSopenharmony_ci/// 14166855e09eSopenharmony_ci/// It returns a tuple of (`sign`, `integer part`, `fraction part` and `exponent`) of the input 14176855e09eSopenharmony_ci/// data. 14186855e09eSopenharmony_ci/// 14196855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 14206855e09eSopenharmony_ci/// 14216855e09eSopenharmony_cipub fn recognize_float_parts<T, E: ParseError<T>>(input: T) -> IResult<T, (bool, T, T, i32), E> 14226855e09eSopenharmony_ciwhere 14236855e09eSopenharmony_ci T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, 14246855e09eSopenharmony_ci T: Clone + Offset, 14256855e09eSopenharmony_ci T: InputIter + crate::traits::ParseTo<i32>, 14266855e09eSopenharmony_ci <T as InputIter>::Item: AsChar, 14276855e09eSopenharmony_ci T: InputTakeAtPosition + InputTake + InputLength, 14286855e09eSopenharmony_ci <T as InputTakeAtPosition>::Item: AsChar, 14296855e09eSopenharmony_ci T: for<'a> Compare<&'a [u8]>, 14306855e09eSopenharmony_ci T: AsBytes, 14316855e09eSopenharmony_ci{ 14326855e09eSopenharmony_ci let (i, sign) = sign(input.clone())?; 14336855e09eSopenharmony_ci 14346855e09eSopenharmony_ci //let (i, zeroes) = take_while(|c: <T as InputTakeAtPosition>::Item| c.as_char() == '0')(i)?; 14356855e09eSopenharmony_ci let (i, zeroes) = match i.as_bytes().iter().position(|c| *c != b'0') { 14366855e09eSopenharmony_ci Some(index) => i.take_split(index), 14376855e09eSopenharmony_ci None => i.take_split(i.input_len()), 14386855e09eSopenharmony_ci }; 14396855e09eSopenharmony_ci 14406855e09eSopenharmony_ci //let (i, mut integer) = digit0(i)?; 14416855e09eSopenharmony_ci let (i, mut integer) = match i 14426855e09eSopenharmony_ci .as_bytes() 14436855e09eSopenharmony_ci .iter() 14446855e09eSopenharmony_ci .position(|c| !(*c >= b'0' && *c <= b'9')) 14456855e09eSopenharmony_ci { 14466855e09eSopenharmony_ci Some(index) => i.take_split(index), 14476855e09eSopenharmony_ci None => i.take_split(i.input_len()), 14486855e09eSopenharmony_ci }; 14496855e09eSopenharmony_ci 14506855e09eSopenharmony_ci if integer.input_len() == 0 && zeroes.input_len() > 0 { 14516855e09eSopenharmony_ci // keep the last zero if integer is empty 14526855e09eSopenharmony_ci integer = zeroes.slice(zeroes.input_len() - 1..); 14536855e09eSopenharmony_ci } 14546855e09eSopenharmony_ci 14556855e09eSopenharmony_ci let (i, opt_dot) = opt(tag(&b"."[..]))(i)?; 14566855e09eSopenharmony_ci let (i, fraction) = if opt_dot.is_none() { 14576855e09eSopenharmony_ci let i2 = i.clone(); 14586855e09eSopenharmony_ci (i2, i.slice(..0)) 14596855e09eSopenharmony_ci } else { 14606855e09eSopenharmony_ci // match number, trim right zeroes 14616855e09eSopenharmony_ci let mut zero_count = 0usize; 14626855e09eSopenharmony_ci let mut position = None; 14636855e09eSopenharmony_ci for (pos, c) in i.as_bytes().iter().enumerate() { 14646855e09eSopenharmony_ci if *c >= b'0' && *c <= b'9' { 14656855e09eSopenharmony_ci if *c == b'0' { 14666855e09eSopenharmony_ci zero_count += 1; 14676855e09eSopenharmony_ci } else { 14686855e09eSopenharmony_ci zero_count = 0; 14696855e09eSopenharmony_ci } 14706855e09eSopenharmony_ci } else { 14716855e09eSopenharmony_ci position = Some(pos); 14726855e09eSopenharmony_ci break; 14736855e09eSopenharmony_ci } 14746855e09eSopenharmony_ci } 14756855e09eSopenharmony_ci 14766855e09eSopenharmony_ci let position = match position { 14776855e09eSopenharmony_ci Some(p) => p, 14786855e09eSopenharmony_ci None => return Err(Err::Incomplete(Needed::new(1))), 14796855e09eSopenharmony_ci }; 14806855e09eSopenharmony_ci 14816855e09eSopenharmony_ci let index = if zero_count == 0 { 14826855e09eSopenharmony_ci position 14836855e09eSopenharmony_ci } else if zero_count == position { 14846855e09eSopenharmony_ci position - zero_count + 1 14856855e09eSopenharmony_ci } else { 14866855e09eSopenharmony_ci position - zero_count 14876855e09eSopenharmony_ci }; 14886855e09eSopenharmony_ci 14896855e09eSopenharmony_ci (i.slice(position..), i.slice(..index)) 14906855e09eSopenharmony_ci }; 14916855e09eSopenharmony_ci 14926855e09eSopenharmony_ci if integer.input_len() == 0 && fraction.input_len() == 0 { 14936855e09eSopenharmony_ci return Err(Err::Error(E::from_error_kind(input, ErrorKind::Float))); 14946855e09eSopenharmony_ci } 14956855e09eSopenharmony_ci 14966855e09eSopenharmony_ci let i2 = i.clone(); 14976855e09eSopenharmony_ci let (i, e) = match i.as_bytes().iter().next() { 14986855e09eSopenharmony_ci Some(b'e') => (i.slice(1..), true), 14996855e09eSopenharmony_ci Some(b'E') => (i.slice(1..), true), 15006855e09eSopenharmony_ci _ => (i, false), 15016855e09eSopenharmony_ci }; 15026855e09eSopenharmony_ci 15036855e09eSopenharmony_ci let (i, exp) = if e { 15046855e09eSopenharmony_ci cut(crate::character::streaming::i32)(i)? 15056855e09eSopenharmony_ci } else { 15066855e09eSopenharmony_ci (i2, 0) 15076855e09eSopenharmony_ci }; 15086855e09eSopenharmony_ci 15096855e09eSopenharmony_ci Ok((i, (sign, integer, fraction, exp))) 15106855e09eSopenharmony_ci} 15116855e09eSopenharmony_ci 15126855e09eSopenharmony_ci/// Recognizes floating point number in text format and returns a f32. 15136855e09eSopenharmony_ci/// 15146855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 15156855e09eSopenharmony_ci/// 15166855e09eSopenharmony_ci/// ```rust 15176855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 15186855e09eSopenharmony_ci/// # use nom::Needed::Size; 15196855e09eSopenharmony_ci/// use nom::number::complete::float; 15206855e09eSopenharmony_ci/// 15216855e09eSopenharmony_ci/// let parser = |s| { 15226855e09eSopenharmony_ci/// float(s) 15236855e09eSopenharmony_ci/// }; 15246855e09eSopenharmony_ci/// 15256855e09eSopenharmony_ci/// assert_eq!(parser("11e-1"), Ok(("", 1.1))); 15266855e09eSopenharmony_ci/// assert_eq!(parser("123E-02"), Ok(("", 1.23))); 15276855e09eSopenharmony_ci/// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0))); 15286855e09eSopenharmony_ci/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float)))); 15296855e09eSopenharmony_ci/// ``` 15306855e09eSopenharmony_cipub fn float<T, E: ParseError<T>>(input: T) -> IResult<T, f32, E> 15316855e09eSopenharmony_ciwhere 15326855e09eSopenharmony_ci T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, 15336855e09eSopenharmony_ci T: Clone + Offset, 15346855e09eSopenharmony_ci T: InputIter + InputLength + InputTake + crate::traits::ParseTo<f32> + Compare<&'static str>, 15356855e09eSopenharmony_ci <T as InputIter>::Item: AsChar, 15366855e09eSopenharmony_ci <T as InputIter>::IterElem: Clone, 15376855e09eSopenharmony_ci T: InputTakeAtPosition, 15386855e09eSopenharmony_ci <T as InputTakeAtPosition>::Item: AsChar, 15396855e09eSopenharmony_ci T: AsBytes, 15406855e09eSopenharmony_ci T: for<'a> Compare<&'a [u8]>, 15416855e09eSopenharmony_ci{ 15426855e09eSopenharmony_ci /* 15436855e09eSopenharmony_ci let (i, (sign, integer, fraction, exponent)) = recognize_float_parts(input)?; 15446855e09eSopenharmony_ci 15456855e09eSopenharmony_ci let mut float: f32 = minimal_lexical::parse_float( 15466855e09eSopenharmony_ci integer.as_bytes().iter(), 15476855e09eSopenharmony_ci fraction.as_bytes().iter(), 15486855e09eSopenharmony_ci exponent, 15496855e09eSopenharmony_ci ); 15506855e09eSopenharmony_ci if !sign { 15516855e09eSopenharmony_ci float = -float; 15526855e09eSopenharmony_ci } 15536855e09eSopenharmony_ci 15546855e09eSopenharmony_ci Ok((i, float)) 15556855e09eSopenharmony_ci */ 15566855e09eSopenharmony_ci let (i, s) = recognize_float_or_exceptions(input)?; 15576855e09eSopenharmony_ci match s.parse_to() { 15586855e09eSopenharmony_ci Some(f) => Ok((i, f)), 15596855e09eSopenharmony_ci None => Err(crate::Err::Error(E::from_error_kind( 15606855e09eSopenharmony_ci i, 15616855e09eSopenharmony_ci crate::error::ErrorKind::Float, 15626855e09eSopenharmony_ci ))), 15636855e09eSopenharmony_ci } 15646855e09eSopenharmony_ci} 15656855e09eSopenharmony_ci 15666855e09eSopenharmony_ci/// Recognizes floating point number in text format and returns a f64. 15676855e09eSopenharmony_ci/// 15686855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. 15696855e09eSopenharmony_ci/// 15706855e09eSopenharmony_ci/// ```rust 15716855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed}; 15726855e09eSopenharmony_ci/// # use nom::Needed::Size; 15736855e09eSopenharmony_ci/// use nom::number::complete::double; 15746855e09eSopenharmony_ci/// 15756855e09eSopenharmony_ci/// let parser = |s| { 15766855e09eSopenharmony_ci/// double(s) 15776855e09eSopenharmony_ci/// }; 15786855e09eSopenharmony_ci/// 15796855e09eSopenharmony_ci/// assert_eq!(parser("11e-1"), Ok(("", 1.1))); 15806855e09eSopenharmony_ci/// assert_eq!(parser("123E-02"), Ok(("", 1.23))); 15816855e09eSopenharmony_ci/// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0))); 15826855e09eSopenharmony_ci/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float)))); 15836855e09eSopenharmony_ci/// ``` 15846855e09eSopenharmony_cipub fn double<T, E: ParseError<T>>(input: T) -> IResult<T, f64, E> 15856855e09eSopenharmony_ciwhere 15866855e09eSopenharmony_ci T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, 15876855e09eSopenharmony_ci T: Clone + Offset, 15886855e09eSopenharmony_ci T: InputIter + InputLength + InputTake + crate::traits::ParseTo<f64> + Compare<&'static str>, 15896855e09eSopenharmony_ci <T as InputIter>::Item: AsChar, 15906855e09eSopenharmony_ci <T as InputIter>::IterElem: Clone, 15916855e09eSopenharmony_ci T: InputTakeAtPosition, 15926855e09eSopenharmony_ci <T as InputTakeAtPosition>::Item: AsChar, 15936855e09eSopenharmony_ci T: AsBytes, 15946855e09eSopenharmony_ci T: for<'a> Compare<&'a [u8]>, 15956855e09eSopenharmony_ci{ 15966855e09eSopenharmony_ci /* 15976855e09eSopenharmony_ci let (i, (sign, integer, fraction, exponent)) = recognize_float_parts(input)?; 15986855e09eSopenharmony_ci 15996855e09eSopenharmony_ci let mut float: f64 = minimal_lexical::parse_float( 16006855e09eSopenharmony_ci integer.as_bytes().iter(), 16016855e09eSopenharmony_ci fraction.as_bytes().iter(), 16026855e09eSopenharmony_ci exponent, 16036855e09eSopenharmony_ci ); 16046855e09eSopenharmony_ci if !sign { 16056855e09eSopenharmony_ci float = -float; 16066855e09eSopenharmony_ci } 16076855e09eSopenharmony_ci 16086855e09eSopenharmony_ci Ok((i, float)) 16096855e09eSopenharmony_ci */ 16106855e09eSopenharmony_ci let (i, s) = recognize_float_or_exceptions(input)?; 16116855e09eSopenharmony_ci match s.parse_to() { 16126855e09eSopenharmony_ci Some(f) => Ok((i, f)), 16136855e09eSopenharmony_ci None => Err(crate::Err::Error(E::from_error_kind( 16146855e09eSopenharmony_ci i, 16156855e09eSopenharmony_ci crate::error::ErrorKind::Float, 16166855e09eSopenharmony_ci ))), 16176855e09eSopenharmony_ci } 16186855e09eSopenharmony_ci} 16196855e09eSopenharmony_ci 16206855e09eSopenharmony_ci#[cfg(test)] 16216855e09eSopenharmony_cimod tests { 16226855e09eSopenharmony_ci use super::*; 16236855e09eSopenharmony_ci use crate::error::ErrorKind; 16246855e09eSopenharmony_ci use crate::internal::{Err, Needed}; 16256855e09eSopenharmony_ci use proptest::prelude::*; 16266855e09eSopenharmony_ci 16276855e09eSopenharmony_ci macro_rules! assert_parse( 16286855e09eSopenharmony_ci ($left: expr, $right: expr) => { 16296855e09eSopenharmony_ci let res: $crate::IResult<_, _, (_, ErrorKind)> = $left; 16306855e09eSopenharmony_ci assert_eq!(res, $right); 16316855e09eSopenharmony_ci }; 16326855e09eSopenharmony_ci ); 16336855e09eSopenharmony_ci 16346855e09eSopenharmony_ci #[test] 16356855e09eSopenharmony_ci fn i8_tests() { 16366855e09eSopenharmony_ci assert_parse!(be_i8(&[0x00][..]), Ok((&b""[..], 0))); 16376855e09eSopenharmony_ci assert_parse!(be_i8(&[0x7f][..]), Ok((&b""[..], 127))); 16386855e09eSopenharmony_ci assert_parse!(be_i8(&[0xff][..]), Ok((&b""[..], -1))); 16396855e09eSopenharmony_ci assert_parse!(be_i8(&[0x80][..]), Ok((&b""[..], -128))); 16406855e09eSopenharmony_ci assert_parse!(be_i8(&[][..]), Err(Err::Incomplete(Needed::new(1)))); 16416855e09eSopenharmony_ci } 16426855e09eSopenharmony_ci 16436855e09eSopenharmony_ci #[test] 16446855e09eSopenharmony_ci fn i16_tests() { 16456855e09eSopenharmony_ci assert_parse!(be_i16(&[0x00, 0x00][..]), Ok((&b""[..], 0))); 16466855e09eSopenharmony_ci assert_parse!(be_i16(&[0x7f, 0xff][..]), Ok((&b""[..], 32_767_i16))); 16476855e09eSopenharmony_ci assert_parse!(be_i16(&[0xff, 0xff][..]), Ok((&b""[..], -1))); 16486855e09eSopenharmony_ci assert_parse!(be_i16(&[0x80, 0x00][..]), Ok((&b""[..], -32_768_i16))); 16496855e09eSopenharmony_ci assert_parse!(be_i16(&[][..]), Err(Err::Incomplete(Needed::new(2)))); 16506855e09eSopenharmony_ci assert_parse!(be_i16(&[0x00][..]), Err(Err::Incomplete(Needed::new(1)))); 16516855e09eSopenharmony_ci } 16526855e09eSopenharmony_ci 16536855e09eSopenharmony_ci #[test] 16546855e09eSopenharmony_ci fn u24_tests() { 16556855e09eSopenharmony_ci assert_parse!(be_u24(&[0x00, 0x00, 0x00][..]), Ok((&b""[..], 0))); 16566855e09eSopenharmony_ci assert_parse!(be_u24(&[0x00, 0xFF, 0xFF][..]), Ok((&b""[..], 65_535_u32))); 16576855e09eSopenharmony_ci assert_parse!( 16586855e09eSopenharmony_ci be_u24(&[0x12, 0x34, 0x56][..]), 16596855e09eSopenharmony_ci Ok((&b""[..], 1_193_046_u32)) 16606855e09eSopenharmony_ci ); 16616855e09eSopenharmony_ci assert_parse!(be_u24(&[][..]), Err(Err::Incomplete(Needed::new(3)))); 16626855e09eSopenharmony_ci assert_parse!(be_u24(&[0x00][..]), Err(Err::Incomplete(Needed::new(2)))); 16636855e09eSopenharmony_ci assert_parse!( 16646855e09eSopenharmony_ci be_u24(&[0x00, 0x00][..]), 16656855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 16666855e09eSopenharmony_ci ); 16676855e09eSopenharmony_ci } 16686855e09eSopenharmony_ci 16696855e09eSopenharmony_ci #[test] 16706855e09eSopenharmony_ci fn i24_tests() { 16716855e09eSopenharmony_ci assert_parse!(be_i24(&[0xFF, 0xFF, 0xFF][..]), Ok((&b""[..], -1_i32))); 16726855e09eSopenharmony_ci assert_parse!(be_i24(&[0xFF, 0x00, 0x00][..]), Ok((&b""[..], -65_536_i32))); 16736855e09eSopenharmony_ci assert_parse!( 16746855e09eSopenharmony_ci be_i24(&[0xED, 0xCB, 0xAA][..]), 16756855e09eSopenharmony_ci Ok((&b""[..], -1_193_046_i32)) 16766855e09eSopenharmony_ci ); 16776855e09eSopenharmony_ci assert_parse!(be_i24(&[][..]), Err(Err::Incomplete(Needed::new(3)))); 16786855e09eSopenharmony_ci assert_parse!(be_i24(&[0x00][..]), Err(Err::Incomplete(Needed::new(2)))); 16796855e09eSopenharmony_ci assert_parse!( 16806855e09eSopenharmony_ci be_i24(&[0x00, 0x00][..]), 16816855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 16826855e09eSopenharmony_ci ); 16836855e09eSopenharmony_ci } 16846855e09eSopenharmony_ci 16856855e09eSopenharmony_ci #[test] 16866855e09eSopenharmony_ci fn i32_tests() { 16876855e09eSopenharmony_ci assert_parse!(be_i32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0))); 16886855e09eSopenharmony_ci assert_parse!( 16896855e09eSopenharmony_ci be_i32(&[0x7f, 0xff, 0xff, 0xff][..]), 16906855e09eSopenharmony_ci Ok((&b""[..], 2_147_483_647_i32)) 16916855e09eSopenharmony_ci ); 16926855e09eSopenharmony_ci assert_parse!(be_i32(&[0xff, 0xff, 0xff, 0xff][..]), Ok((&b""[..], -1))); 16936855e09eSopenharmony_ci assert_parse!( 16946855e09eSopenharmony_ci be_i32(&[0x80, 0x00, 0x00, 0x00][..]), 16956855e09eSopenharmony_ci Ok((&b""[..], -2_147_483_648_i32)) 16966855e09eSopenharmony_ci ); 16976855e09eSopenharmony_ci assert_parse!(be_i32(&[][..]), Err(Err::Incomplete(Needed::new(4)))); 16986855e09eSopenharmony_ci assert_parse!(be_i32(&[0x00][..]), Err(Err::Incomplete(Needed::new(3)))); 16996855e09eSopenharmony_ci assert_parse!( 17006855e09eSopenharmony_ci be_i32(&[0x00, 0x00][..]), 17016855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(2))) 17026855e09eSopenharmony_ci ); 17036855e09eSopenharmony_ci assert_parse!( 17046855e09eSopenharmony_ci be_i32(&[0x00, 0x00, 0x00][..]), 17056855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 17066855e09eSopenharmony_ci ); 17076855e09eSopenharmony_ci } 17086855e09eSopenharmony_ci 17096855e09eSopenharmony_ci #[test] 17106855e09eSopenharmony_ci fn i64_tests() { 17116855e09eSopenharmony_ci assert_parse!( 17126855e09eSopenharmony_ci be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 17136855e09eSopenharmony_ci Ok((&b""[..], 0)) 17146855e09eSopenharmony_ci ); 17156855e09eSopenharmony_ci assert_parse!( 17166855e09eSopenharmony_ci be_i64(&[0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]), 17176855e09eSopenharmony_ci Ok((&b""[..], 9_223_372_036_854_775_807_i64)) 17186855e09eSopenharmony_ci ); 17196855e09eSopenharmony_ci assert_parse!( 17206855e09eSopenharmony_ci be_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]), 17216855e09eSopenharmony_ci Ok((&b""[..], -1)) 17226855e09eSopenharmony_ci ); 17236855e09eSopenharmony_ci assert_parse!( 17246855e09eSopenharmony_ci be_i64(&[0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 17256855e09eSopenharmony_ci Ok((&b""[..], -9_223_372_036_854_775_808_i64)) 17266855e09eSopenharmony_ci ); 17276855e09eSopenharmony_ci assert_parse!(be_i64(&[][..]), Err(Err::Incomplete(Needed::new(8)))); 17286855e09eSopenharmony_ci assert_parse!(be_i64(&[0x00][..]), Err(Err::Incomplete(Needed::new(7)))); 17296855e09eSopenharmony_ci assert_parse!( 17306855e09eSopenharmony_ci be_i64(&[0x00, 0x00][..]), 17316855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(6))) 17326855e09eSopenharmony_ci ); 17336855e09eSopenharmony_ci assert_parse!( 17346855e09eSopenharmony_ci be_i64(&[0x00, 0x00, 0x00][..]), 17356855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(5))) 17366855e09eSopenharmony_ci ); 17376855e09eSopenharmony_ci assert_parse!( 17386855e09eSopenharmony_ci be_i64(&[0x00, 0x00, 0x00, 0x00][..]), 17396855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(4))) 17406855e09eSopenharmony_ci ); 17416855e09eSopenharmony_ci assert_parse!( 17426855e09eSopenharmony_ci be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00][..]), 17436855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(3))) 17446855e09eSopenharmony_ci ); 17456855e09eSopenharmony_ci assert_parse!( 17466855e09eSopenharmony_ci be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 17476855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(2))) 17486855e09eSopenharmony_ci ); 17496855e09eSopenharmony_ci assert_parse!( 17506855e09eSopenharmony_ci be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 17516855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 17526855e09eSopenharmony_ci ); 17536855e09eSopenharmony_ci } 17546855e09eSopenharmony_ci 17556855e09eSopenharmony_ci #[test] 17566855e09eSopenharmony_ci fn i128_tests() { 17576855e09eSopenharmony_ci assert_parse!( 17586855e09eSopenharmony_ci be_i128( 17596855e09eSopenharmony_ci &[ 17606855e09eSopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17616855e09eSopenharmony_ci 0x00 17626855e09eSopenharmony_ci ][..] 17636855e09eSopenharmony_ci ), 17646855e09eSopenharmony_ci Ok((&b""[..], 0)) 17656855e09eSopenharmony_ci ); 17666855e09eSopenharmony_ci assert_parse!( 17676855e09eSopenharmony_ci be_i128( 17686855e09eSopenharmony_ci &[ 17696855e09eSopenharmony_ci 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 17706855e09eSopenharmony_ci 0xff 17716855e09eSopenharmony_ci ][..] 17726855e09eSopenharmony_ci ), 17736855e09eSopenharmony_ci Ok(( 17746855e09eSopenharmony_ci &b""[..], 17756855e09eSopenharmony_ci 170_141_183_460_469_231_731_687_303_715_884_105_727_i128 17766855e09eSopenharmony_ci )) 17776855e09eSopenharmony_ci ); 17786855e09eSopenharmony_ci assert_parse!( 17796855e09eSopenharmony_ci be_i128( 17806855e09eSopenharmony_ci &[ 17816855e09eSopenharmony_ci 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 17826855e09eSopenharmony_ci 0xff 17836855e09eSopenharmony_ci ][..] 17846855e09eSopenharmony_ci ), 17856855e09eSopenharmony_ci Ok((&b""[..], -1)) 17866855e09eSopenharmony_ci ); 17876855e09eSopenharmony_ci assert_parse!( 17886855e09eSopenharmony_ci be_i128( 17896855e09eSopenharmony_ci &[ 17906855e09eSopenharmony_ci 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17916855e09eSopenharmony_ci 0x00 17926855e09eSopenharmony_ci ][..] 17936855e09eSopenharmony_ci ), 17946855e09eSopenharmony_ci Ok(( 17956855e09eSopenharmony_ci &b""[..], 17966855e09eSopenharmony_ci -170_141_183_460_469_231_731_687_303_715_884_105_728_i128 17976855e09eSopenharmony_ci )) 17986855e09eSopenharmony_ci ); 17996855e09eSopenharmony_ci assert_parse!(be_i128(&[][..]), Err(Err::Incomplete(Needed::new(16)))); 18006855e09eSopenharmony_ci assert_parse!(be_i128(&[0x00][..]), Err(Err::Incomplete(Needed::new(15)))); 18016855e09eSopenharmony_ci assert_parse!( 18026855e09eSopenharmony_ci be_i128(&[0x00, 0x00][..]), 18036855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(14))) 18046855e09eSopenharmony_ci ); 18056855e09eSopenharmony_ci assert_parse!( 18066855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00][..]), 18076855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(13))) 18086855e09eSopenharmony_ci ); 18096855e09eSopenharmony_ci assert_parse!( 18106855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00][..]), 18116855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(12))) 18126855e09eSopenharmony_ci ); 18136855e09eSopenharmony_ci assert_parse!( 18146855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00][..]), 18156855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(11))) 18166855e09eSopenharmony_ci ); 18176855e09eSopenharmony_ci assert_parse!( 18186855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18196855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(10))) 18206855e09eSopenharmony_ci ); 18216855e09eSopenharmony_ci assert_parse!( 18226855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18236855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(9))) 18246855e09eSopenharmony_ci ); 18256855e09eSopenharmony_ci assert_parse!( 18266855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18276855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(8))) 18286855e09eSopenharmony_ci ); 18296855e09eSopenharmony_ci assert_parse!( 18306855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18316855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(7))) 18326855e09eSopenharmony_ci ); 18336855e09eSopenharmony_ci assert_parse!( 18346855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18356855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(6))) 18366855e09eSopenharmony_ci ); 18376855e09eSopenharmony_ci assert_parse!( 18386855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18396855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(5))) 18406855e09eSopenharmony_ci ); 18416855e09eSopenharmony_ci assert_parse!( 18426855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18436855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(4))) 18446855e09eSopenharmony_ci ); 18456855e09eSopenharmony_ci assert_parse!( 18466855e09eSopenharmony_ci be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 18476855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(3))) 18486855e09eSopenharmony_ci ); 18496855e09eSopenharmony_ci assert_parse!( 18506855e09eSopenharmony_ci be_i128( 18516855e09eSopenharmony_ci &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..] 18526855e09eSopenharmony_ci ), 18536855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(2))) 18546855e09eSopenharmony_ci ); 18556855e09eSopenharmony_ci assert_parse!( 18566855e09eSopenharmony_ci be_i128( 18576855e09eSopenharmony_ci &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] 18586855e09eSopenharmony_ci [..] 18596855e09eSopenharmony_ci ), 18606855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 18616855e09eSopenharmony_ci ); 18626855e09eSopenharmony_ci } 18636855e09eSopenharmony_ci 18646855e09eSopenharmony_ci #[test] 18656855e09eSopenharmony_ci fn le_i8_tests() { 18666855e09eSopenharmony_ci assert_parse!(le_i8(&[0x00][..]), Ok((&b""[..], 0))); 18676855e09eSopenharmony_ci assert_parse!(le_i8(&[0x7f][..]), Ok((&b""[..], 127))); 18686855e09eSopenharmony_ci assert_parse!(le_i8(&[0xff][..]), Ok((&b""[..], -1))); 18696855e09eSopenharmony_ci assert_parse!(le_i8(&[0x80][..]), Ok((&b""[..], -128))); 18706855e09eSopenharmony_ci } 18716855e09eSopenharmony_ci 18726855e09eSopenharmony_ci #[test] 18736855e09eSopenharmony_ci fn le_i16_tests() { 18746855e09eSopenharmony_ci assert_parse!(le_i16(&[0x00, 0x00][..]), Ok((&b""[..], 0))); 18756855e09eSopenharmony_ci assert_parse!(le_i16(&[0xff, 0x7f][..]), Ok((&b""[..], 32_767_i16))); 18766855e09eSopenharmony_ci assert_parse!(le_i16(&[0xff, 0xff][..]), Ok((&b""[..], -1))); 18776855e09eSopenharmony_ci assert_parse!(le_i16(&[0x00, 0x80][..]), Ok((&b""[..], -32_768_i16))); 18786855e09eSopenharmony_ci } 18796855e09eSopenharmony_ci 18806855e09eSopenharmony_ci #[test] 18816855e09eSopenharmony_ci fn le_u24_tests() { 18826855e09eSopenharmony_ci assert_parse!(le_u24(&[0x00, 0x00, 0x00][..]), Ok((&b""[..], 0))); 18836855e09eSopenharmony_ci assert_parse!(le_u24(&[0xFF, 0xFF, 0x00][..]), Ok((&b""[..], 65_535_u32))); 18846855e09eSopenharmony_ci assert_parse!( 18856855e09eSopenharmony_ci le_u24(&[0x56, 0x34, 0x12][..]), 18866855e09eSopenharmony_ci Ok((&b""[..], 1_193_046_u32)) 18876855e09eSopenharmony_ci ); 18886855e09eSopenharmony_ci } 18896855e09eSopenharmony_ci 18906855e09eSopenharmony_ci #[test] 18916855e09eSopenharmony_ci fn le_i24_tests() { 18926855e09eSopenharmony_ci assert_parse!(le_i24(&[0xFF, 0xFF, 0xFF][..]), Ok((&b""[..], -1_i32))); 18936855e09eSopenharmony_ci assert_parse!(le_i24(&[0x00, 0x00, 0xFF][..]), Ok((&b""[..], -65_536_i32))); 18946855e09eSopenharmony_ci assert_parse!( 18956855e09eSopenharmony_ci le_i24(&[0xAA, 0xCB, 0xED][..]), 18966855e09eSopenharmony_ci Ok((&b""[..], -1_193_046_i32)) 18976855e09eSopenharmony_ci ); 18986855e09eSopenharmony_ci } 18996855e09eSopenharmony_ci 19006855e09eSopenharmony_ci #[test] 19016855e09eSopenharmony_ci fn le_i32_tests() { 19026855e09eSopenharmony_ci assert_parse!(le_i32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0))); 19036855e09eSopenharmony_ci assert_parse!( 19046855e09eSopenharmony_ci le_i32(&[0xff, 0xff, 0xff, 0x7f][..]), 19056855e09eSopenharmony_ci Ok((&b""[..], 2_147_483_647_i32)) 19066855e09eSopenharmony_ci ); 19076855e09eSopenharmony_ci assert_parse!(le_i32(&[0xff, 0xff, 0xff, 0xff][..]), Ok((&b""[..], -1))); 19086855e09eSopenharmony_ci assert_parse!( 19096855e09eSopenharmony_ci le_i32(&[0x00, 0x00, 0x00, 0x80][..]), 19106855e09eSopenharmony_ci Ok((&b""[..], -2_147_483_648_i32)) 19116855e09eSopenharmony_ci ); 19126855e09eSopenharmony_ci } 19136855e09eSopenharmony_ci 19146855e09eSopenharmony_ci #[test] 19156855e09eSopenharmony_ci fn le_i64_tests() { 19166855e09eSopenharmony_ci assert_parse!( 19176855e09eSopenharmony_ci le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 19186855e09eSopenharmony_ci Ok((&b""[..], 0)) 19196855e09eSopenharmony_ci ); 19206855e09eSopenharmony_ci assert_parse!( 19216855e09eSopenharmony_ci le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f][..]), 19226855e09eSopenharmony_ci Ok((&b""[..], 9_223_372_036_854_775_807_i64)) 19236855e09eSopenharmony_ci ); 19246855e09eSopenharmony_ci assert_parse!( 19256855e09eSopenharmony_ci le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]), 19266855e09eSopenharmony_ci Ok((&b""[..], -1)) 19276855e09eSopenharmony_ci ); 19286855e09eSopenharmony_ci assert_parse!( 19296855e09eSopenharmony_ci le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80][..]), 19306855e09eSopenharmony_ci Ok((&b""[..], -9_223_372_036_854_775_808_i64)) 19316855e09eSopenharmony_ci ); 19326855e09eSopenharmony_ci } 19336855e09eSopenharmony_ci 19346855e09eSopenharmony_ci #[test] 19356855e09eSopenharmony_ci fn le_i128_tests() { 19366855e09eSopenharmony_ci assert_parse!( 19376855e09eSopenharmony_ci le_i128( 19386855e09eSopenharmony_ci &[ 19396855e09eSopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19406855e09eSopenharmony_ci 0x00 19416855e09eSopenharmony_ci ][..] 19426855e09eSopenharmony_ci ), 19436855e09eSopenharmony_ci Ok((&b""[..], 0)) 19446855e09eSopenharmony_ci ); 19456855e09eSopenharmony_ci assert_parse!( 19466855e09eSopenharmony_ci le_i128( 19476855e09eSopenharmony_ci &[ 19486855e09eSopenharmony_ci 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 19496855e09eSopenharmony_ci 0x7f 19506855e09eSopenharmony_ci ][..] 19516855e09eSopenharmony_ci ), 19526855e09eSopenharmony_ci Ok(( 19536855e09eSopenharmony_ci &b""[..], 19546855e09eSopenharmony_ci 170_141_183_460_469_231_731_687_303_715_884_105_727_i128 19556855e09eSopenharmony_ci )) 19566855e09eSopenharmony_ci ); 19576855e09eSopenharmony_ci assert_parse!( 19586855e09eSopenharmony_ci le_i128( 19596855e09eSopenharmony_ci &[ 19606855e09eSopenharmony_ci 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 19616855e09eSopenharmony_ci 0xff 19626855e09eSopenharmony_ci ][..] 19636855e09eSopenharmony_ci ), 19646855e09eSopenharmony_ci Ok((&b""[..], -1)) 19656855e09eSopenharmony_ci ); 19666855e09eSopenharmony_ci assert_parse!( 19676855e09eSopenharmony_ci le_i128( 19686855e09eSopenharmony_ci &[ 19696855e09eSopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19706855e09eSopenharmony_ci 0x80 19716855e09eSopenharmony_ci ][..] 19726855e09eSopenharmony_ci ), 19736855e09eSopenharmony_ci Ok(( 19746855e09eSopenharmony_ci &b""[..], 19756855e09eSopenharmony_ci -170_141_183_460_469_231_731_687_303_715_884_105_728_i128 19766855e09eSopenharmony_ci )) 19776855e09eSopenharmony_ci ); 19786855e09eSopenharmony_ci } 19796855e09eSopenharmony_ci 19806855e09eSopenharmony_ci #[test] 19816855e09eSopenharmony_ci fn be_f32_tests() { 19826855e09eSopenharmony_ci assert_parse!(be_f32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0_f32))); 19836855e09eSopenharmony_ci assert_parse!( 19846855e09eSopenharmony_ci be_f32(&[0x4d, 0x31, 0x1f, 0xd8][..]), 19856855e09eSopenharmony_ci Ok((&b""[..], 185_728_392_f32)) 19866855e09eSopenharmony_ci ); 19876855e09eSopenharmony_ci } 19886855e09eSopenharmony_ci 19896855e09eSopenharmony_ci #[test] 19906855e09eSopenharmony_ci fn be_f64_tests() { 19916855e09eSopenharmony_ci assert_parse!( 19926855e09eSopenharmony_ci be_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 19936855e09eSopenharmony_ci Ok((&b""[..], 0_f64)) 19946855e09eSopenharmony_ci ); 19956855e09eSopenharmony_ci assert_parse!( 19966855e09eSopenharmony_ci be_f64(&[0x41, 0xa6, 0x23, 0xfb, 0x10, 0x00, 0x00, 0x00][..]), 19976855e09eSopenharmony_ci Ok((&b""[..], 185_728_392_f64)) 19986855e09eSopenharmony_ci ); 19996855e09eSopenharmony_ci } 20006855e09eSopenharmony_ci 20016855e09eSopenharmony_ci #[test] 20026855e09eSopenharmony_ci fn le_f32_tests() { 20036855e09eSopenharmony_ci assert_parse!(le_f32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0_f32))); 20046855e09eSopenharmony_ci assert_parse!( 20056855e09eSopenharmony_ci le_f32(&[0xd8, 0x1f, 0x31, 0x4d][..]), 20066855e09eSopenharmony_ci Ok((&b""[..], 185_728_392_f32)) 20076855e09eSopenharmony_ci ); 20086855e09eSopenharmony_ci } 20096855e09eSopenharmony_ci 20106855e09eSopenharmony_ci #[test] 20116855e09eSopenharmony_ci fn le_f64_tests() { 20126855e09eSopenharmony_ci assert_parse!( 20136855e09eSopenharmony_ci le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), 20146855e09eSopenharmony_ci Ok((&b""[..], 0_f64)) 20156855e09eSopenharmony_ci ); 20166855e09eSopenharmony_ci assert_parse!( 20176855e09eSopenharmony_ci le_f64(&[0x00, 0x00, 0x00, 0x10, 0xfb, 0x23, 0xa6, 0x41][..]), 20186855e09eSopenharmony_ci Ok((&b""[..], 185_728_392_f64)) 20196855e09eSopenharmony_ci ); 20206855e09eSopenharmony_ci } 20216855e09eSopenharmony_ci 20226855e09eSopenharmony_ci #[test] 20236855e09eSopenharmony_ci fn hex_u32_tests() { 20246855e09eSopenharmony_ci assert_parse!( 20256855e09eSopenharmony_ci hex_u32(&b";"[..]), 20266855e09eSopenharmony_ci Err(Err::Error(error_position!(&b";"[..], ErrorKind::IsA))) 20276855e09eSopenharmony_ci ); 20286855e09eSopenharmony_ci assert_parse!(hex_u32(&b"ff;"[..]), Ok((&b";"[..], 255))); 20296855e09eSopenharmony_ci assert_parse!(hex_u32(&b"1be2;"[..]), Ok((&b";"[..], 7138))); 20306855e09eSopenharmony_ci assert_parse!(hex_u32(&b"c5a31be2;"[..]), Ok((&b";"[..], 3_315_801_058))); 20316855e09eSopenharmony_ci assert_parse!(hex_u32(&b"C5A31be2;"[..]), Ok((&b";"[..], 3_315_801_058))); 20326855e09eSopenharmony_ci assert_parse!(hex_u32(&b"00c5a31be2;"[..]), Ok((&b"e2;"[..], 12_952_347))); 20336855e09eSopenharmony_ci assert_parse!( 20346855e09eSopenharmony_ci hex_u32(&b"c5a31be201;"[..]), 20356855e09eSopenharmony_ci Ok((&b"01;"[..], 3_315_801_058)) 20366855e09eSopenharmony_ci ); 20376855e09eSopenharmony_ci assert_parse!(hex_u32(&b"ffffffff;"[..]), Ok((&b";"[..], 4_294_967_295))); 20386855e09eSopenharmony_ci assert_parse!(hex_u32(&b"0x1be2;"[..]), Ok((&b"x1be2;"[..], 0))); 20396855e09eSopenharmony_ci assert_parse!(hex_u32(&b"12af"[..]), Err(Err::Incomplete(Needed::new(1)))); 20406855e09eSopenharmony_ci } 20416855e09eSopenharmony_ci 20426855e09eSopenharmony_ci #[test] 20436855e09eSopenharmony_ci #[cfg(feature = "std")] 20446855e09eSopenharmony_ci fn float_test() { 20456855e09eSopenharmony_ci let mut test_cases = vec![ 20466855e09eSopenharmony_ci "+3.14", 20476855e09eSopenharmony_ci "3.14", 20486855e09eSopenharmony_ci "-3.14", 20496855e09eSopenharmony_ci "0", 20506855e09eSopenharmony_ci "0.0", 20516855e09eSopenharmony_ci "1.", 20526855e09eSopenharmony_ci ".789", 20536855e09eSopenharmony_ci "-.5", 20546855e09eSopenharmony_ci "1e7", 20556855e09eSopenharmony_ci "-1E-7", 20566855e09eSopenharmony_ci ".3e-2", 20576855e09eSopenharmony_ci "1.e4", 20586855e09eSopenharmony_ci "1.2e4", 20596855e09eSopenharmony_ci "12.34", 20606855e09eSopenharmony_ci "-1.234E-12", 20616855e09eSopenharmony_ci "-1.234e-12", 20626855e09eSopenharmony_ci "0.00000000000000000087", 20636855e09eSopenharmony_ci ]; 20646855e09eSopenharmony_ci 20656855e09eSopenharmony_ci for test in test_cases.drain(..) { 20666855e09eSopenharmony_ci let expected32 = str::parse::<f32>(test).unwrap(); 20676855e09eSopenharmony_ci let expected64 = str::parse::<f64>(test).unwrap(); 20686855e09eSopenharmony_ci 20696855e09eSopenharmony_ci println!("now parsing: {} -> {}", test, expected32); 20706855e09eSopenharmony_ci 20716855e09eSopenharmony_ci let larger = format!("{};", test); 20726855e09eSopenharmony_ci assert_parse!(recognize_float(&larger[..]), Ok((";", test))); 20736855e09eSopenharmony_ci 20746855e09eSopenharmony_ci assert_parse!(float(larger.as_bytes()), Ok((&b";"[..], expected32))); 20756855e09eSopenharmony_ci assert_parse!(float(&larger[..]), Ok((";", expected32))); 20766855e09eSopenharmony_ci 20776855e09eSopenharmony_ci assert_parse!(double(larger.as_bytes()), Ok((&b";"[..], expected64))); 20786855e09eSopenharmony_ci assert_parse!(double(&larger[..]), Ok((";", expected64))); 20796855e09eSopenharmony_ci } 20806855e09eSopenharmony_ci 20816855e09eSopenharmony_ci let remaining_exponent = "-1.234E-"; 20826855e09eSopenharmony_ci assert_parse!( 20836855e09eSopenharmony_ci recognize_float(remaining_exponent), 20846855e09eSopenharmony_ci Err(Err::Incomplete(Needed::new(1))) 20856855e09eSopenharmony_ci ); 20866855e09eSopenharmony_ci 20876855e09eSopenharmony_ci let (_i, nan) = float::<_, ()>("NaN").unwrap(); 20886855e09eSopenharmony_ci assert!(nan.is_nan()); 20896855e09eSopenharmony_ci 20906855e09eSopenharmony_ci let (_i, inf) = float::<_, ()>("inf").unwrap(); 20916855e09eSopenharmony_ci assert!(inf.is_infinite()); 20926855e09eSopenharmony_ci let (_i, inf) = float::<_, ()>("infinite").unwrap(); 20936855e09eSopenharmony_ci assert!(inf.is_infinite()); 20946855e09eSopenharmony_ci } 20956855e09eSopenharmony_ci 20966855e09eSopenharmony_ci #[test] 20976855e09eSopenharmony_ci fn configurable_endianness() { 20986855e09eSopenharmony_ci use crate::number::Endianness; 20996855e09eSopenharmony_ci 21006855e09eSopenharmony_ci fn be_tst16(i: &[u8]) -> IResult<&[u8], u16> { 21016855e09eSopenharmony_ci u16(Endianness::Big)(i) 21026855e09eSopenharmony_ci } 21036855e09eSopenharmony_ci fn le_tst16(i: &[u8]) -> IResult<&[u8], u16> { 21046855e09eSopenharmony_ci u16(Endianness::Little)(i) 21056855e09eSopenharmony_ci } 21066855e09eSopenharmony_ci assert_eq!(be_tst16(&[0x80, 0x00]), Ok((&b""[..], 32_768_u16))); 21076855e09eSopenharmony_ci assert_eq!(le_tst16(&[0x80, 0x00]), Ok((&b""[..], 128_u16))); 21086855e09eSopenharmony_ci 21096855e09eSopenharmony_ci fn be_tst32(i: &[u8]) -> IResult<&[u8], u32> { 21106855e09eSopenharmony_ci u32(Endianness::Big)(i) 21116855e09eSopenharmony_ci } 21126855e09eSopenharmony_ci fn le_tst32(i: &[u8]) -> IResult<&[u8], u32> { 21136855e09eSopenharmony_ci u32(Endianness::Little)(i) 21146855e09eSopenharmony_ci } 21156855e09eSopenharmony_ci assert_eq!( 21166855e09eSopenharmony_ci be_tst32(&[0x12, 0x00, 0x60, 0x00]), 21176855e09eSopenharmony_ci Ok((&b""[..], 302_014_464_u32)) 21186855e09eSopenharmony_ci ); 21196855e09eSopenharmony_ci assert_eq!( 21206855e09eSopenharmony_ci le_tst32(&[0x12, 0x00, 0x60, 0x00]), 21216855e09eSopenharmony_ci Ok((&b""[..], 6_291_474_u32)) 21226855e09eSopenharmony_ci ); 21236855e09eSopenharmony_ci 21246855e09eSopenharmony_ci fn be_tst64(i: &[u8]) -> IResult<&[u8], u64> { 21256855e09eSopenharmony_ci u64(Endianness::Big)(i) 21266855e09eSopenharmony_ci } 21276855e09eSopenharmony_ci fn le_tst64(i: &[u8]) -> IResult<&[u8], u64> { 21286855e09eSopenharmony_ci u64(Endianness::Little)(i) 21296855e09eSopenharmony_ci } 21306855e09eSopenharmony_ci assert_eq!( 21316855e09eSopenharmony_ci be_tst64(&[0x12, 0x00, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]), 21326855e09eSopenharmony_ci Ok((&b""[..], 1_297_142_246_100_992_000_u64)) 21336855e09eSopenharmony_ci ); 21346855e09eSopenharmony_ci assert_eq!( 21356855e09eSopenharmony_ci le_tst64(&[0x12, 0x00, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]), 21366855e09eSopenharmony_ci Ok((&b""[..], 36_028_874_334_666_770_u64)) 21376855e09eSopenharmony_ci ); 21386855e09eSopenharmony_ci 21396855e09eSopenharmony_ci fn be_tsti16(i: &[u8]) -> IResult<&[u8], i16> { 21406855e09eSopenharmony_ci i16(Endianness::Big)(i) 21416855e09eSopenharmony_ci } 21426855e09eSopenharmony_ci fn le_tsti16(i: &[u8]) -> IResult<&[u8], i16> { 21436855e09eSopenharmony_ci i16(Endianness::Little)(i) 21446855e09eSopenharmony_ci } 21456855e09eSopenharmony_ci assert_eq!(be_tsti16(&[0x00, 0x80]), Ok((&b""[..], 128_i16))); 21466855e09eSopenharmony_ci assert_eq!(le_tsti16(&[0x00, 0x80]), Ok((&b""[..], -32_768_i16))); 21476855e09eSopenharmony_ci 21486855e09eSopenharmony_ci fn be_tsti32(i: &[u8]) -> IResult<&[u8], i32> { 21496855e09eSopenharmony_ci i32(Endianness::Big)(i) 21506855e09eSopenharmony_ci } 21516855e09eSopenharmony_ci fn le_tsti32(i: &[u8]) -> IResult<&[u8], i32> { 21526855e09eSopenharmony_ci i32(Endianness::Little)(i) 21536855e09eSopenharmony_ci } 21546855e09eSopenharmony_ci assert_eq!( 21556855e09eSopenharmony_ci be_tsti32(&[0x00, 0x12, 0x60, 0x00]), 21566855e09eSopenharmony_ci Ok((&b""[..], 1_204_224_i32)) 21576855e09eSopenharmony_ci ); 21586855e09eSopenharmony_ci assert_eq!( 21596855e09eSopenharmony_ci le_tsti32(&[0x00, 0x12, 0x60, 0x00]), 21606855e09eSopenharmony_ci Ok((&b""[..], 6_296_064_i32)) 21616855e09eSopenharmony_ci ); 21626855e09eSopenharmony_ci 21636855e09eSopenharmony_ci fn be_tsti64(i: &[u8]) -> IResult<&[u8], i64> { 21646855e09eSopenharmony_ci i64(Endianness::Big)(i) 21656855e09eSopenharmony_ci } 21666855e09eSopenharmony_ci fn le_tsti64(i: &[u8]) -> IResult<&[u8], i64> { 21676855e09eSopenharmony_ci i64(Endianness::Little)(i) 21686855e09eSopenharmony_ci } 21696855e09eSopenharmony_ci assert_eq!( 21706855e09eSopenharmony_ci be_tsti64(&[0x00, 0xFF, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]), 21716855e09eSopenharmony_ci Ok((&b""[..], 71_881_672_479_506_432_i64)) 21726855e09eSopenharmony_ci ); 21736855e09eSopenharmony_ci assert_eq!( 21746855e09eSopenharmony_ci le_tsti64(&[0x00, 0xFF, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]), 21756855e09eSopenharmony_ci Ok((&b""[..], 36_028_874_334_732_032_i64)) 21766855e09eSopenharmony_ci ); 21776855e09eSopenharmony_ci } 21786855e09eSopenharmony_ci 21796855e09eSopenharmony_ci #[cfg(feature = "std")] 21806855e09eSopenharmony_ci fn parse_f64(i: &str) -> IResult<&str, f64, ()> { 21816855e09eSopenharmony_ci use crate::traits::ParseTo; 21826855e09eSopenharmony_ci match recognize_float_or_exceptions(i) { 21836855e09eSopenharmony_ci Err(e) => Err(e), 21846855e09eSopenharmony_ci Ok((i, s)) => { 21856855e09eSopenharmony_ci if s.is_empty() { 21866855e09eSopenharmony_ci return Err(Err::Error(())); 21876855e09eSopenharmony_ci } 21886855e09eSopenharmony_ci match s.parse_to() { 21896855e09eSopenharmony_ci Some(n) => Ok((i, n)), 21906855e09eSopenharmony_ci None => Err(Err::Error(())), 21916855e09eSopenharmony_ci } 21926855e09eSopenharmony_ci } 21936855e09eSopenharmony_ci } 21946855e09eSopenharmony_ci } 21956855e09eSopenharmony_ci 21966855e09eSopenharmony_ci proptest! { 21976855e09eSopenharmony_ci #[test] 21986855e09eSopenharmony_ci #[cfg(feature = "std")] 21996855e09eSopenharmony_ci fn floats(s in "\\PC*") { 22006855e09eSopenharmony_ci println!("testing {}", s); 22016855e09eSopenharmony_ci let res1 = parse_f64(&s); 22026855e09eSopenharmony_ci let res2 = double::<_, ()>(s.as_str()); 22036855e09eSopenharmony_ci assert_eq!(res1, res2); 22046855e09eSopenharmony_ci } 22056855e09eSopenharmony_ci } 22066855e09eSopenharmony_ci} 2207