/// Recognizes an unsigned 1 byte integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_u8; /// /// let parser = |s| { /// be_u8::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn be_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 1; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(1)))
} else { let res = input.iter_elements().next().unwrap();
Ok((input.slice(bound..), res))
}
}
/// Recognizes a big endian unsigned 2 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_u16; /// /// let parser = |s| { /// be_u16::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn be_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 2; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u16; for byte in input.iter_elements().take(bound) {
res = (res << 8) + byte as u16;
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a big endian unsigned 3 byte integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_u24; /// /// let parser = |s| { /// be_u24::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); /// ``` #[inline] pubfn be_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 3; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u32; for byte in input.iter_elements().take(bound) {
res = (res << 8) + byte as u32;
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a big endian unsigned 4 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_u32; /// /// let parser = |s| { /// be_u32::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn be_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 4; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u32; for byte in input.iter_elements().take(bound) {
res = (res << 8) + byte as u32;
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a big endian unsigned 8 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_u64; /// /// let parser = |s| { /// be_u64::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn be_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 8; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u64; for byte in input.iter_elements().take(bound) {
res = (res << 8) + byte as u64;
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a big endian unsigned 16 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_u128; /// /// let parser = |s| { /// be_u128::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// ``` #[inline] pubfn be_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 16; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u128; for byte in input.iter_elements().take(bound) {
res = (res << 8) + byte as u128;
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a signed 1 byte integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_i8; /// /// let parser = be_i8::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn be_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
be_u8.map(|x| x as i8).parse(input)
}
/// Recognizes a big endian signed 2 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_i16; /// /// let parser = be_i16::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(2)))); /// ``` #[inline] pubfn be_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
be_u16.map(|x| x as i16).parse(input)
}
/// Recognizes a big endian signed 3 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_i24; /// /// let parser = be_i24::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn be_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ // Same as the unsigned version but we need to sign-extend manually here
be_u24
.map(|x| { if x & 0x80_00_00 != 0 {
(x | 0xff_00_00_00) as i32
} else {
x as i32
}
})
.parse(input)
}
/// Recognizes a big endian signed 4 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_i32; /// /// let parser = be_i32::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(4)))); /// ``` #[inline] pubfn be_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
be_u32.map(|x| x as i32).parse(input)
}
/// Recognizes a big endian signed 8 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_i64; /// /// let parser = be_i64::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn be_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
be_u64.map(|x| x as i64).parse(input)
}
/// Recognizes a big endian signed 16 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_i128; /// /// let parser = be_i128::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// ``` #[inline] pubfn be_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
be_u128.map(|x| x as i128).parse(input)
}
/// Recognizes an unsigned 1 byte integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_u8; /// /// let parser = le_u8::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn le_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 1; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(1)))
} else { let res = input.iter_elements().next().unwrap();
Ok((input.slice(bound..), res))
}
}
/// Recognizes a little endian unsigned 2 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_u16; /// /// let parser = |s| { /// le_u16::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn le_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 2; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u16; for (index, byte) in input.iter_indices().take(bound) {
res += (byte as u16) << (8 * index);
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a little endian unsigned 3 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_u24; /// /// let parser = |s| { /// le_u24::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); /// ``` #[inline] pubfn le_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 3; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u32; for (index, byte) in input.iter_indices().take(bound) {
res += (byte as u32) << (8 * index);
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a little endian unsigned 4 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_u32; /// /// let parser = |s| { /// le_u32::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn le_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 4; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u32; for (index, byte) in input.iter_indices().take(bound) {
res += (byte as u32) << (8 * index);
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a little endian unsigned 8 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_u64; /// /// let parser = |s| { /// le_u64::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn le_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 8; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u64; for (index, byte) in input.iter_indices().take(bound) {
res += (byte as u64) << (8 * index);
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a little endian unsigned 16 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_u128; /// /// let parser = |s| { /// le_u128::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// ``` #[inline] pubfn le_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 16; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(bound - input.input_len())))
} else { letmut res = 0u128; for (index, byte) in input.iter_indices().take(bound) {
res += (byte as u128) << (8 * index);
}
Ok((input.slice(bound..), res))
}
}
/// Recognizes a signed 1 byte integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_i8; /// /// let parser = le_i8::<_, (_, ErrorKind)>; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn le_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
le_u8.map(|x| x as i8).parse(input)
}
/// Recognizes a little endian signed 2 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_i16; /// /// let parser = |s| { /// le_i16::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn le_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
le_u16.map(|x| x as i16).parse(input)
}
/// Recognizes a little endian signed 3 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_i24; /// /// let parser = |s| { /// le_i24::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); /// ``` #[inline] pubfn le_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ // Same as the unsigned version but we need to sign-extend manually here
le_u24
.map(|x| { if x & 0x80_00_00 != 0 {
(x | 0xff_00_00_00) as i32
} else {
x as i32
}
})
.parse(input)
}
/// Recognizes a little endian signed 4 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_i32; /// /// let parser = |s| { /// le_i32::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn le_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
le_u32.map(|x| x as i32).parse(input)
}
/// Recognizes a little endian signed 8 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_i64; /// /// let parser = |s| { /// le_i64::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn le_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
le_u64.map(|x| x as i64).parse(input)
}
/// Recognizes a little endian signed 16 bytes integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_i128; /// /// let parser = |s| { /// le_i128::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100))); /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// ``` #[inline] pubfn le_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
le_u128.map(|x| x as i128).parse(input)
}
/// Recognizes an unsigned 1 byte integer /// /// Note that endianness does not apply to 1 byte numbers. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::u8; /// /// let parser = |s| { /// u8::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ let bound: usize = 1; if input.input_len() < bound {
Err(Err::Incomplete(Needed::new(1)))
} else { let res = input.iter_elements().next().unwrap();
Ok((input.slice(bound..), res))
}
}
/// Recognizes an unsigned 2 bytes integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u16 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian u16 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::u16; /// /// let be_u16 = |s| { /// u16::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003))); /// assert_eq!(be_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); /// /// let le_u16 = |s| { /// u16::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300))); /// assert_eq!(le_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn u16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u16, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_u16, crate::number::Endianness::Little => le_u16, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_u16, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_u16,
}
}
/// Recognizes an unsigned 3 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u24 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian u24 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::u24; /// /// let be_u24 = |s| { /// u24::<_,(_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305))); /// assert_eq!(be_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); /// /// let le_u24 = |s| { /// u24::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300))); /// assert_eq!(le_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); /// ``` #[inline] pubfn u24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_u24, crate::number::Endianness::Little => le_u24, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_u24, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_u24,
}
}
/// Recognizes an unsigned 4 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u32 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian u32 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::u32; /// /// let be_u32 = |s| { /// u32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507))); /// assert_eq!(be_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); /// /// let le_u32 = |s| { /// u32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300))); /// assert_eq!(le_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn u32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_u32, crate::number::Endianness::Little => le_u32, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_u32, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_u32,
}
}
/// Recognizes an unsigned 8 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u64 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian u64 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::u64; /// /// let be_u64 = |s| { /// u64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607))); /// assert_eq!(be_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// /// let le_u64 = |s| { /// u64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100))); /// assert_eq!(le_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn u64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_u64, crate::number::Endianness::Little => le_u64, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_u64, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_u64,
}
}
/// Recognizes an unsigned 16 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u128 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian u128 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::u128; /// /// let be_u128 = |s| { /// u128::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// 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))); /// assert_eq!(be_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// /// let le_u128 = |s| { /// u128::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// 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))); /// assert_eq!(le_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// ``` #[inline] pubfn u128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u128, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_u128, crate::number::Endianness::Little => le_u128, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_u128, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_u128,
}
}
/// Recognizes a signed 1 byte integer /// /// Note that endianness does not apply to 1 byte numbers. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::i8; /// /// let parser = |s| { /// i8::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00))); /// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn i8<I, E: ParseError<I>>(i: I) -> IResult<I, i8, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{
u8.map(|x| x as i8).parse(i)
}
/// Recognizes a signed 2 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i16 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian i16 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::i16; /// /// let be_i16 = |s| { /// i16::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003))); /// assert_eq!(be_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); /// /// let le_i16 = |s| { /// i16::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300))); /// assert_eq!(le_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn i16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i16, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_i16, crate::number::Endianness::Little => le_i16, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_i16, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_i16,
}
}
/// Recognizes a signed 3 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i24 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian i24 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::i24; /// /// let be_i24 = |s| { /// i24::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305))); /// assert_eq!(be_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); /// /// let le_i24 = |s| { /// i24::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300))); /// assert_eq!(le_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2)))); /// ``` #[inline] pubfn i24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_i24, crate::number::Endianness::Little => le_i24, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_i24, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_i24,
}
}
/// Recognizes a signed 4 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i32 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian i32 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::i32; /// /// let be_i32 = |s| { /// i32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507))); /// assert_eq!(be_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); /// /// let le_i32 = |s| { /// i32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300))); /// assert_eq!(le_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn i32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_i32, crate::number::Endianness::Little => le_i32, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_i32, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_i32,
}
}
/// Recognizes a signed 8 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i64 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian i64 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::i64; /// /// let be_i64 = |s| { /// i64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607))); /// assert_eq!(be_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// /// let le_i64 = |s| { /// i64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100))); /// assert_eq!(le_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn i64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_i64, crate::number::Endianness::Little => le_i64, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_i64, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_i64,
}
}
/// Recognizes a signed 16 byte integer /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i128 integer, /// otherwise if `nom::number::Endianness::Little` parse a little endian i128 integer. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::i128; /// /// let be_i128 = |s| { /// i128::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// 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))); /// assert_eq!(be_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// /// let le_i128 = |s| { /// i128::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// 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))); /// assert_eq!(le_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15)))); /// ``` #[inline] pubfn i128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i128, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_i128, crate::number::Endianness::Little => le_i128, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_i128, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_i128,
}
}
/// Recognizes a big endian 4 bytes floating point number. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_f32; /// /// let parser = |s| { /// be_f32::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00][..]), Ok((&b""[..], 2.640625))); /// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn be_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match be_u32(input) {
Err(e) => Err(e),
Ok((i, o)) => Ok((i, f32::from_bits(o))),
}
}
/// Recognizes a big endian 8 bytes floating point number. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::be_f64; /// /// let parser = |s| { /// be_f64::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5))); /// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn be_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match be_u64(input) {
Err(e) => Err(e),
Ok((i, o)) => Ok((i, f64::from_bits(o))),
}
}
/// Recognizes a little endian 4 bytes floating point number. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_f32; /// /// let parser = |s| { /// le_f32::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5))); /// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3)))); /// ``` #[inline] pubfn le_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match le_u32(input) {
Err(e) => Err(e),
Ok((i, o)) => Ok((i, f32::from_bits(o))),
}
}
/// Recognizes a little endian 8 bytes floating point number. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::le_f64; /// /// let parser = |s| { /// le_f64::<_, (_, ErrorKind)>(s) /// }; /// /// assert_eq!(parser(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 3145728.0))); /// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7)))); /// ``` #[inline] pubfn le_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match le_u64(input) {
Err(e) => Err(e),
Ok((i, o)) => Ok((i, f64::from_bits(o))),
}
}
/// Recognizes a 4 byte floating point number /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian f32 float, /// otherwise if `nom::number::Endianness::Little` parse a little endian f32 float. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::f32; /// /// let be_f32 = |s| { /// f32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_f32(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5))); /// assert_eq!(be_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1)))); /// /// let le_f32 = |s| { /// f32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_f32(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5))); /// assert_eq!(le_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1)))); /// ``` #[inline] pubfn f32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f32, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_f32, crate::number::Endianness::Little => le_f32, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_f32, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_f32,
}
}
/// Recognizes an 8 byte floating point number /// /// If the parameter is `nom::number::Endianness::Big`, parse a big endian f64 float, /// otherwise if `nom::number::Endianness::Little` parse a little endian f64 float. /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// # use nom::Needed::Size; /// use nom::number::streaming::f64; /// /// let be_f64 = |s| { /// f64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s) /// }; /// /// assert_eq!(be_f64(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5))); /// assert_eq!(be_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5)))); /// /// let le_f64 = |s| { /// f64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s) /// }; /// /// assert_eq!(le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5))); /// assert_eq!(le_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5)))); /// ``` #[inline] pubfn f64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f64, E> where
I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
{ match endian { crate::number::Endianness::Big => be_f64, crate::number::Endianness::Little => le_f64, #[cfg(target_endian = "big")] crate::number::Endianness::Native => be_f64, #[cfg(target_endian = "little")] crate::number::Endianness::Native => le_f64,
}
}
/// Recognizes a hex-encoded integer. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::hex_u32; /// /// let parser = |s| { /// hex_u32(s) /// }; /// /// assert_eq!(parser(b"01AE;"), Ok((&b";"[..], 0x01AE))); /// assert_eq!(parser(b"abc"), Err(Err::Incomplete(Needed::new(1)))); /// assert_eq!(parser(b"ggg"), Err(Err::Error((&b"ggg"[..], ErrorKind::IsA)))); /// ``` #[inline] pubfn hex_u32<'a, E: ParseError<&'a [u8]>>(input: &'a [u8]) -> IResult<&'a [u8], u32, E> { let (i, o) = crate::bytes::streaming::is_a(&b"0123456789abcdefABCDEF"[..])(input)?;
// Do not parse more than 8 characters for a u32 let (parsed, remaining) = if o.len() <= 8 {
(o, i)
} else {
(&input[..8], &input[8..])
};
let res = parsed
.iter()
.rev()
.enumerate()
.map(|(k, &v)| { let digit = v as char;
digit.to_digit(16).unwrap_or(0) << (k * 4)
})
.sum();
Ok((remaining, res))
}
/// Recognizes a floating point number in text format and returns the corresponding part of the input. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if it reaches the end of input. /// /// ```rust /// # use nom::{Err, error::ErrorKind, Needed}; /// use nom::number::streaming::recognize_float; /// /// let parser = |s| { /// recognize_float(s) /// }; /// /// assert_eq!(parser("11e-1;"), Ok((";", "11e-1"))); /// assert_eq!(parser("123E-02;"), Ok((";", "123E-02"))); /// assert_eq!(parser("123K-01"), Ok(("K-01", "123"))); /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char)))); /// ``` #[rustfmt::skip] pubfn recognize_float<T, E:ParseError<T>>(input: T) -> IResult<T, T, E> where
T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
T: Clone + Offset,
T: InputIter,
<T as InputIter>::Item: AsChar,
T: InputTakeAtPosition + InputLength,
<T as InputTakeAtPosition>::Item: AsChar
{
recognize(
tuple((
opt(alt((char('+'), char('-')))),
alt((
map(tuple((digit1, opt(pair(char('.'), opt(digit1))))), |_| ()),
map(tuple((char('.'), digit1)), |_| ())
)),
opt(tuple((
alt((char('e'), char('E'))),
opt(alt((char('+'), char('-')))),
cut(digit1)
)))
))
)(input)
}
/// Recognizes a floating point number in text format /// /// It returns a tuple of (`sign`, `integer part`, `fraction part` and `exponent`) of the input /// data. /// /// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data. /// pubfn recognize_float_parts<T, E: ParseError<T>>(input: T) -> IResult<T, (bool, T, T, i32), E> where
T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
T: Clone + Offset,
T: InputIter + crate::traits::ParseTo<i32>,
<T as InputIter>::Item: AsChar,
T: InputTakeAtPosition + InputTake + InputLength,
<T as InputTakeAtPosition>::Item: AsChar,
T: for<'a> Compare<&'a [u8]>,
T: AsBytes,
{ let (i, sign) = sign(input.clone())?;
//let (i, zeroes) = take_while(|c: <T as InputTakeAtPosition>::Item| c.as_char() == '0')(i)?; let (i, zeroes) = match i.as_bytes().iter().position(|c| *c != b'0') {
Some(index) => i.take_split(index),
None => i.take_split(i.input_len()),
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.