Coverage Report

Created: 2026-09-06 07:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/nom-8.0.0/src/number/mod.rs
Line
Count
Source
1
//! Parsers recognizing numbers
2
3
use core::{
4
  marker::PhantomData,
5
  ops::{Add, Shl},
6
};
7
8
use crate::{
9
  branch::alt,
10
  character::{char, digit1},
11
  combinator::{cut, map, opt, recognize},
12
  error::{make_error, ErrorKind, ParseError},
13
  sequence::pair,
14
  AsBytes, AsChar, Compare, Either, Emit, Err, Input, IsStreaming, Mode, Needed, Offset, OutputM,
15
  Parser,
16
};
17
18
pub mod complete;
19
pub mod streaming;
20
21
/// Configurable endianness
22
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
23
pub enum Endianness {
24
  /// Big endian
25
  Big,
26
  /// Little endian
27
  Little,
28
  /// Will match the host's endianness
29
  Native,
30
}
31
32
/// creates a big endian unsigned integer parser
33
///
34
/// * `bound`: the number of bytes that will be read
35
/// * `Uint`: the output type
36
#[inline]
37
421M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
421M
where
39
421M
  I: Input<Item = u8>,
40
421M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
421M
  BeUint {
43
421M
    bound,
44
421M
    e: PhantomData,
45
421M
    u: PhantomData,
46
421M
  }
47
421M
}
nom::number::be_uint::<&[u8], u8, suricata::quic::error::QuicError>
Line
Count
Source
37
7.20M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
7.20M
where
39
7.20M
  I: Input<Item = u8>,
40
7.20M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
7.20M
  BeUint {
43
7.20M
    bound,
44
7.20M
    e: PhantomData,
45
7.20M
    u: PhantomData,
46
7.20M
  }
47
7.20M
}
nom::number::be_uint::<&[u8], u32, suricata::quic::error::QuicError>
Line
Count
Source
37
1.30M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
1.30M
where
39
1.30M
  I: Input<Item = u8>,
40
1.30M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
1.30M
  BeUint {
43
1.30M
    bound,
44
1.30M
    e: PhantomData,
45
1.30M
    u: PhantomData,
46
1.30M
  }
47
1.30M
}
nom::number::be_uint::<&[u8], u16, suricata::quic::error::QuicError>
Line
Count
Source
37
15.8k
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
15.8k
where
39
15.8k
  I: Input<Item = u8>,
40
15.8k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
15.8k
  BeUint {
43
15.8k
    bound,
44
15.8k
    e: PhantomData,
45
15.8k
    u: PhantomData,
46
15.8k
  }
47
15.8k
}
nom::number::be_uint::<&[u8], u8, suricata::pgsql::parser::PgsqlParseError<&[u8]>>
Line
Count
Source
37
15.7M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
15.7M
where
39
15.7M
  I: Input<Item = u8>,
40
15.7M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
15.7M
  BeUint {
43
15.7M
    bound,
44
15.7M
    e: PhantomData,
45
15.7M
    u: PhantomData,
46
15.7M
  }
47
15.7M
}
nom::number::be_uint::<&[u8], u8, suricata::rdp::error::RdpError>
Line
Count
Source
37
9.08M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
9.08M
where
39
9.08M
  I: Input<Item = u8>,
40
9.08M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
9.08M
  BeUint {
43
9.08M
    bound,
44
9.08M
    e: PhantomData,
45
9.08M
    u: PhantomData,
46
9.08M
  }
47
9.08M
}
nom::number::be_uint::<&[u8], u32, suricata::pgsql::parser::PgsqlParseError<&[u8]>>
Line
Count
Source
37
911k
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
911k
where
39
911k
  I: Input<Item = u8>,
40
911k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
911k
  BeUint {
43
911k
    bound,
44
911k
    e: PhantomData,
45
911k
    u: PhantomData,
46
911k
  }
47
911k
}
nom::number::be_uint::<&[u8], u16, suricata::pgsql::parser::PgsqlParseError<&[u8]>>
Line
Count
Source
37
2.01M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
2.01M
where
39
2.01M
  I: Input<Item = u8>,
40
2.01M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
2.01M
  BeUint {
43
2.01M
    bound,
44
2.01M
    e: PhantomData,
45
2.01M
    u: PhantomData,
46
2.01M
  }
47
2.01M
}
nom::number::be_uint::<&[u8], u16, suricata::rdp::error::RdpError>
Line
Count
Source
37
5.45M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
5.45M
where
39
5.45M
  I: Input<Item = u8>,
40
5.45M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
5.45M
  BeUint {
43
5.45M
    bound,
44
5.45M
    e: PhantomData,
45
5.45M
    u: PhantomData,
46
5.45M
  }
47
5.45M
}
nom::number::be_uint::<&[u8], u16, suricata::smb::error::SmbError>
Line
Count
Source
37
22.4k
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
22.4k
where
39
22.4k
  I: Input<Item = u8>,
40
22.4k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
22.4k
  BeUint {
43
22.4k
    bound,
44
22.4k
    e: PhantomData,
45
22.4k
    u: PhantomData,
46
22.4k
  }
47
22.4k
}
nom::number::be_uint::<&[u8], u64, nom::error::Error<&[u8]>>
Line
Count
Source
37
616k
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
616k
where
39
616k
  I: Input<Item = u8>,
40
616k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
616k
  BeUint {
43
616k
    bound,
44
616k
    e: PhantomData,
45
616k
    u: PhantomData,
46
616k
  }
47
616k
}
nom::number::be_uint::<&[u8], u8, nom::error::Error<&[u8]>>
Line
Count
Source
37
184M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
184M
where
39
184M
  I: Input<Item = u8>,
40
184M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
184M
  BeUint {
43
184M
    bound,
44
184M
    e: PhantomData,
45
184M
    u: PhantomData,
46
184M
  }
47
184M
}
nom::number::be_uint::<&[u8], u32, nom::error::Error<&[u8]>>
Line
Count
Source
37
19.7M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
19.7M
where
39
19.7M
  I: Input<Item = u8>,
40
19.7M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
19.7M
  BeUint {
43
19.7M
    bound,
44
19.7M
    e: PhantomData,
45
19.7M
    u: PhantomData,
46
19.7M
  }
47
19.7M
}
nom::number::be_uint::<&[u8], u16, nom::error::Error<&[u8]>>
Line
Count
Source
37
158M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
158M
where
39
158M
  I: Input<Item = u8>,
40
158M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
158M
  BeUint {
43
158M
    bound,
44
158M
    e: PhantomData,
45
158M
    u: PhantomData,
46
158M
  }
47
158M
}
nom::number::be_uint::<&[u8], u8, nom::error::Error<&[u8]>>
Line
Count
Source
37
16.4M
fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38
16.4M
where
39
16.4M
  I: Input<Item = u8>,
40
16.4M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41
{
42
16.4M
  BeUint {
43
16.4M
    bound,
44
16.4M
    e: PhantomData,
45
16.4M
    u: PhantomData,
46
16.4M
  }
47
16.4M
}
Unexecuted instantiation: nom::number::be_uint::<_, _, _>
48
49
/// Big endian unsigned integer parser
50
struct BeUint<Uint, E> {
51
  bound: usize,
52
  e: PhantomData<E>,
53
  u: PhantomData<Uint>,
54
}
55
56
impl<I, Uint, E: ParseError<I>> Parser<I> for BeUint<Uint, E>
57
where
58
  I: Input<Item = u8>,
59
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
60
{
61
  type Output = Uint;
62
  type Error = E;
63
64
  #[inline(always)]
65
421M
  fn process<OM: crate::OutputMode>(
66
421M
    &mut self,
67
421M
    input: I,
68
421M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
421M
    if input.input_len() < self.bound {
70
5.23M
      if OM::Incomplete::is_streaming() {
71
3.65M
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
1.58M
        Err(Err::Error(OM::Error::bind(|| {
74
1.58M
          make_error(input, ErrorKind::Eof)
75
1.58M
        })))
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
73
606
        Err(Err::Error(OM::Error::bind(|| {
74
606
          make_error(input, ErrorKind::Eof)
75
606
        })))
<nom::number::BeUint<u8, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
73
1.08M
        Err(Err::Error(OM::Error::bind(|| {
74
1.08M
          make_error(input, ErrorKind::Eof)
75
1.08M
        })))
<nom::number::BeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
73
7.29k
        Err(Err::Error(OM::Error::bind(|| {
74
7.29k
          make_error(input, ErrorKind::Eof)
75
7.29k
        })))
<nom::number::BeUint<u32, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
73
11.2k
        Err(Err::Error(OM::Error::bind(|| {
74
11.2k
          make_error(input, ErrorKind::Eof)
75
11.2k
        })))
<nom::number::BeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
73
16.8k
        Err(Err::Error(OM::Error::bind(|| {
74
16.8k
          make_error(input, ErrorKind::Eof)
75
16.8k
        })))
<nom::number::BeUint<u16, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
73
7
        Err(Err::Error(OM::Error::bind(|| {
74
7
          make_error(input, ErrorKind::Eof)
75
7
        })))
Unexecuted instantiation: <nom::number::BeUint<u8, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u8, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u32, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u16, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u16, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u16, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::BeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
73
464k
        Err(Err::Error(OM::Error::bind(|| {
74
464k
          make_error(input, ErrorKind::Eof)
75
464k
        })))
Unexecuted instantiation: <nom::number::BeUint<_, _> as nom::internal::Parser<_>>::process::<_>::{closure#0}
76
      }
77
    } else {
78
416M
      let res = OM::Output::bind(|| {
79
416M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
416M
        if self.bound > 1 {
83
416M
          for byte in input.iter_elements().take(self.bound) {
84
416M
            res = (res << 8) + byte.into();
85
416M
          }
86
        } else {
87
230M
          for byte in input.iter_elements().take(self.bound) {
88
230M
            res = byte.into();
89
230M
          }
90
        }
91
92
416M
        res
93
416M
      });
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
78
4.22k
      let res = OM::Output::bind(|| {
79
4.22k
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
4.22k
        if self.bound > 1 {
83
0
          for byte in input.iter_elements().take(self.bound) {
84
0
            res = (res << 8) + byte.into();
85
0
          }
86
        } else {
87
4.22k
          for byte in input.iter_elements().take(self.bound) {
88
4.22k
            res = byte.into();
89
4.22k
          }
90
        }
91
92
4.22k
        res
93
4.22k
      });
<nom::number::BeUint<u8, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
78
6.12M
      let res = OM::Output::bind(|| {
79
6.12M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
6.12M
        if self.bound > 1 {
83
0
          for byte in input.iter_elements().take(self.bound) {
84
0
            res = (res << 8) + byte.into();
85
0
          }
86
        } else {
87
6.12M
          for byte in input.iter_elements().take(self.bound) {
88
6.12M
            res = byte.into();
89
6.12M
          }
90
        }
91
92
6.12M
        res
93
6.12M
      });
<nom::number::BeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
78
1.00M
      let res = OM::Output::bind(|| {
79
1.00M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
1.00M
        if self.bound > 1 {
83
4.01M
          for byte in input.iter_elements().take(self.bound) {
84
4.01M
            res = (res << 8) + byte.into();
85
4.01M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
1.00M
        res
93
1.00M
      });
<nom::number::BeUint<u32, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
78
1.29M
      let res = OM::Output::bind(|| {
79
1.29M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
1.29M
        if self.bound > 1 {
83
5.15M
          for byte in input.iter_elements().take(self.bound) {
84
5.15M
            res = (res << 8) + byte.into();
85
5.15M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
1.29M
        res
93
1.29M
      });
<nom::number::BeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
78
2.95M
      let res = OM::Output::bind(|| {
79
2.95M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
2.95M
        if self.bound > 1 {
83
5.91M
          for byte in input.iter_elements().take(self.bound) {
84
5.91M
            res = (res << 8) + byte.into();
85
5.91M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
2.95M
        res
93
2.95M
      });
<nom::number::BeUint<u16, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
78
15.8k
      let res = OM::Output::bind(|| {
79
15.8k
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
15.8k
        if self.bound > 1 {
83
31.6k
          for byte in input.iter_elements().take(self.bound) {
84
31.6k
            res = (res << 8) + byte.into();
85
31.6k
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
15.8k
        res
93
15.8k
      });
<nom::number::BeUint<u8, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
15.7M
      let res = OM::Output::bind(|| {
79
15.7M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
15.7M
        if self.bound > 1 {
83
0
          for byte in input.iter_elements().take(self.bound) {
84
0
            res = (res << 8) + byte.into();
85
0
          }
86
        } else {
87
15.7M
          for byte in input.iter_elements().take(self.bound) {
88
15.7M
            res = byte.into();
89
15.7M
          }
90
        }
91
92
15.7M
        res
93
15.7M
      });
<nom::number::BeUint<u8, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
9.08M
      let res = OM::Output::bind(|| {
79
9.08M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
9.08M
        if self.bound > 1 {
83
0
          for byte in input.iter_elements().take(self.bound) {
84
0
            res = (res << 8) + byte.into();
85
0
          }
86
        } else {
87
9.08M
          for byte in input.iter_elements().take(self.bound) {
88
9.08M
            res = byte.into();
89
9.08M
          }
90
        }
91
92
9.08M
        res
93
9.08M
      });
<nom::number::BeUint<u32, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
905k
      let res = OM::Output::bind(|| {
79
905k
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
905k
        if self.bound > 1 {
83
3.62M
          for byte in input.iter_elements().take(self.bound) {
84
3.62M
            res = (res << 8) + byte.into();
85
3.62M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
905k
        res
93
905k
      });
<nom::number::BeUint<u16, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
1.94M
      let res = OM::Output::bind(|| {
79
1.94M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
1.94M
        if self.bound > 1 {
83
3.89M
          for byte in input.iter_elements().take(self.bound) {
84
3.89M
            res = (res << 8) + byte.into();
85
3.89M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
1.94M
        res
93
1.94M
      });
<nom::number::BeUint<u16, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
5.45M
      let res = OM::Output::bind(|| {
79
5.45M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
5.45M
        if self.bound > 1 {
83
10.9M
          for byte in input.iter_elements().take(self.bound) {
84
10.9M
            res = (res << 8) + byte.into();
85
10.9M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
5.45M
        res
93
5.45M
      });
<nom::number::BeUint<u16, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
19.4k
      let res = OM::Output::bind(|| {
79
19.4k
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
19.4k
        if self.bound > 1 {
83
38.9k
          for byte in input.iter_elements().take(self.bound) {
84
38.9k
            res = (res << 8) + byte.into();
85
38.9k
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
19.4k
        res
93
19.4k
      });
<nom::number::BeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
614k
      let res = OM::Output::bind(|| {
79
614k
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
614k
        if self.bound > 1 {
83
4.91M
          for byte in input.iter_elements().take(self.bound) {
84
4.91M
            res = (res << 8) + byte.into();
85
4.91M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
614k
        res
93
614k
      });
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
183M
      let res = OM::Output::bind(|| {
79
183M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
183M
        if self.bound > 1 {
83
0
          for byte in input.iter_elements().take(self.bound) {
84
0
            res = (res << 8) + byte.into();
85
0
          }
86
        } else {
87
183M
          for byte in input.iter_elements().take(self.bound) {
88
183M
            res = byte.into();
89
183M
          }
90
        }
91
92
183M
        res
93
183M
      });
<nom::number::BeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
17.4M
      let res = OM::Output::bind(|| {
79
17.4M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
17.4M
        if self.bound > 1 {
83
69.7M
          for byte in input.iter_elements().take(self.bound) {
84
69.7M
            res = (res << 8) + byte.into();
85
69.7M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
17.4M
        res
93
17.4M
      });
<nom::number::BeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
78
153M
      let res = OM::Output::bind(|| {
79
153M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
153M
        if self.bound > 1 {
83
307M
          for byte in input.iter_elements().take(self.bound) {
84
307M
            res = (res << 8) + byte.into();
85
307M
          }
86
        } else {
87
0
          for byte in input.iter_elements().take(self.bound) {
88
0
            res = byte.into();
89
0
          }
90
        }
91
92
153M
        res
93
153M
      });
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
78
16.0M
      let res = OM::Output::bind(|| {
79
16.0M
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
16.0M
        if self.bound > 1 {
83
0
          for byte in input.iter_elements().take(self.bound) {
84
0
            res = (res << 8) + byte.into();
85
0
          }
86
        } else {
87
16.0M
          for byte in input.iter_elements().take(self.bound) {
88
16.0M
            res = byte.into();
89
16.0M
          }
90
        }
91
92
16.0M
        res
93
16.0M
      });
Unexecuted instantiation: <nom::number::BeUint<_, _> as nom::internal::Parser<_>>::process::<_>::{closure#1}
94
95
416M
      Ok((input.take_from(self.bound), res))
96
    }
97
421M
  }
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
65
4.82k
  fn process<OM: crate::OutputMode>(
66
4.82k
    &mut self,
67
4.82k
    input: I,
68
4.82k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
4.82k
    if input.input_len() < self.bound {
70
606
      if OM::Incomplete::is_streaming() {
71
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
606
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
4.22k
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
4.22k
      Ok((input.take_from(self.bound), res))
96
    }
97
4.82k
  }
<nom::number::BeUint<u8, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
65
7.20M
  fn process<OM: crate::OutputMode>(
66
7.20M
    &mut self,
67
7.20M
    input: I,
68
7.20M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
7.20M
    if input.input_len() < self.bound {
70
1.08M
      if OM::Incomplete::is_streaming() {
71
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
1.08M
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
6.12M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
6.12M
      Ok((input.take_from(self.bound), res))
96
    }
97
7.20M
  }
<nom::number::BeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
65
1.01M
  fn process<OM: crate::OutputMode>(
66
1.01M
    &mut self,
67
1.01M
    input: I,
68
1.01M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
1.01M
    if input.input_len() < self.bound {
70
7.29k
      if OM::Incomplete::is_streaming() {
71
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
7.29k
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
1.00M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
1.00M
      Ok((input.take_from(self.bound), res))
96
    }
97
1.01M
  }
<nom::number::BeUint<u32, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
65
1.30M
  fn process<OM: crate::OutputMode>(
66
1.30M
    &mut self,
67
1.30M
    input: I,
68
1.30M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
1.30M
    if input.input_len() < self.bound {
70
11.2k
      if OM::Incomplete::is_streaming() {
71
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
11.2k
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
1.29M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
1.29M
      Ok((input.take_from(self.bound), res))
96
    }
97
1.30M
  }
<nom::number::BeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
65
2.97M
  fn process<OM: crate::OutputMode>(
66
2.97M
    &mut self,
67
2.97M
    input: I,
68
2.97M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
2.97M
    if input.input_len() < self.bound {
70
16.8k
      if OM::Incomplete::is_streaming() {
71
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
16.8k
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
2.95M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
2.95M
      Ok((input.take_from(self.bound), res))
96
    }
97
2.97M
  }
<nom::number::BeUint<u16, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
65
15.8k
  fn process<OM: crate::OutputMode>(
66
15.8k
    &mut self,
67
15.8k
    input: I,
68
15.8k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
15.8k
    if input.input_len() < self.bound {
70
7
      if OM::Incomplete::is_streaming() {
71
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
7
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
15.8k
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
15.8k
      Ok((input.take_from(self.bound), res))
96
    }
97
15.8k
  }
<nom::number::BeUint<u8, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
15.7M
  fn process<OM: crate::OutputMode>(
66
15.7M
    &mut self,
67
15.7M
    input: I,
68
15.7M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
15.7M
    if input.input_len() < self.bound {
70
29.5k
      if OM::Incomplete::is_streaming() {
71
29.5k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
15.7M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
15.7M
      Ok((input.take_from(self.bound), res))
96
    }
97
15.7M
  }
<nom::number::BeUint<u8, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
9.08M
  fn process<OM: crate::OutputMode>(
66
9.08M
    &mut self,
67
9.08M
    input: I,
68
9.08M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
9.08M
    if input.input_len() < self.bound {
70
7.11k
      if OM::Incomplete::is_streaming() {
71
7.11k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
9.08M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
9.08M
      Ok((input.take_from(self.bound), res))
96
    }
97
9.08M
  }
<nom::number::BeUint<u32, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
911k
  fn process<OM: crate::OutputMode>(
66
911k
    &mut self,
67
911k
    input: I,
68
911k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
911k
    if input.input_len() < self.bound {
70
6.35k
      if OM::Incomplete::is_streaming() {
71
6.35k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
905k
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
905k
      Ok((input.take_from(self.bound), res))
96
    }
97
911k
  }
<nom::number::BeUint<u16, suricata::pgsql::parser::PgsqlParseError<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
2.01M
  fn process<OM: crate::OutputMode>(
66
2.01M
    &mut self,
67
2.01M
    input: I,
68
2.01M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
2.01M
    if input.input_len() < self.bound {
70
67.7k
      if OM::Incomplete::is_streaming() {
71
67.7k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
1.94M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
1.94M
      Ok((input.take_from(self.bound), res))
96
    }
97
2.01M
  }
<nom::number::BeUint<u16, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
5.45M
  fn process<OM: crate::OutputMode>(
66
5.45M
    &mut self,
67
5.45M
    input: I,
68
5.45M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
5.45M
    if input.input_len() < self.bound {
70
2.14k
      if OM::Incomplete::is_streaming() {
71
2.14k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
5.45M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
5.45M
      Ok((input.take_from(self.bound), res))
96
    }
97
5.45M
  }
<nom::number::BeUint<u16, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
22.4k
  fn process<OM: crate::OutputMode>(
66
22.4k
    &mut self,
67
22.4k
    input: I,
68
22.4k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
22.4k
    if input.input_len() < self.bound {
70
2.94k
      if OM::Incomplete::is_streaming() {
71
2.94k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
19.4k
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
19.4k
      Ok((input.take_from(self.bound), res))
96
    }
97
22.4k
  }
<nom::number::BeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
616k
  fn process<OM: crate::OutputMode>(
66
616k
    &mut self,
67
616k
    input: I,
68
616k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
616k
    if input.input_len() < self.bound {
70
1.40k
      if OM::Incomplete::is_streaming() {
71
1.40k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
614k
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
614k
      Ok((input.take_from(self.bound), res))
96
    }
97
616k
  }
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
184M
  fn process<OM: crate::OutputMode>(
66
184M
    &mut self,
67
184M
    input: I,
68
184M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
184M
    if input.input_len() < self.bound {
70
433k
      if OM::Incomplete::is_streaming() {
71
433k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
183M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
183M
      Ok((input.take_from(self.bound), res))
96
    }
97
184M
  }
<nom::number::BeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
18.7M
  fn process<OM: crate::OutputMode>(
66
18.7M
    &mut self,
67
18.7M
    input: I,
68
18.7M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
18.7M
    if input.input_len() < self.bound {
70
1.27M
      if OM::Incomplete::is_streaming() {
71
1.27M
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
17.4M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
17.4M
      Ok((input.take_from(self.bound), res))
96
    }
97
18.7M
  }
<nom::number::BeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
65
155M
  fn process<OM: crate::OutputMode>(
66
155M
    &mut self,
67
155M
    input: I,
68
155M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
155M
    if input.input_len() < self.bound {
70
1.82M
      if OM::Incomplete::is_streaming() {
71
1.82M
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
0
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
153M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
153M
      Ok((input.take_from(self.bound), res))
96
    }
97
155M
  }
<nom::number::BeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
65
16.4M
  fn process<OM: crate::OutputMode>(
66
16.4M
    &mut self,
67
16.4M
    input: I,
68
16.4M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69
16.4M
    if input.input_len() < self.bound {
70
464k
      if OM::Incomplete::is_streaming() {
71
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72
      } else {
73
464k
        Err(Err::Error(OM::Error::bind(|| {
74
          make_error(input, ErrorKind::Eof)
75
        })))
76
      }
77
    } else {
78
16.0M
      let res = OM::Output::bind(|| {
79
        let mut res = Uint::default();
80
81
        // special case to avoid shift a byte with overflow
82
        if self.bound > 1 {
83
          for byte in input.iter_elements().take(self.bound) {
84
            res = (res << 8) + byte.into();
85
          }
86
        } else {
87
          for byte in input.iter_elements().take(self.bound) {
88
            res = byte.into();
89
          }
90
        }
91
92
        res
93
      });
94
95
16.0M
      Ok((input.take_from(self.bound), res))
96
    }
97
16.4M
  }
Unexecuted instantiation: <nom::number::BeUint<_, _> as nom::internal::Parser<_>>::process::<_>
98
}
99
100
/// Recognizes an unsigned 1 byte integer.
101
///
102
/// ```rust
103
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
104
/// use nom::number::be_u8;
105
///
106
/// let parser = |s| {
107
///   be_u8::<_, (_, ErrorKind)>().parse(s)
108
/// };
109
///
110
/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
111
/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
112
/// ```
113
#[inline]
114
0
pub fn be_u8<I, E: ParseError<I>>() -> impl Parser<I, Output = u8, Error = E>
115
0
where
116
0
  I: Input<Item = u8>,
117
{
118
0
  be_uint(1)
119
0
}
120
121
/// Recognizes a big endian unsigned 2 bytes integer.
122
///
123
/// ```rust
124
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
125
/// use nom::number::be_u16;
126
///
127
/// let parser = |s| {
128
///   be_u16::<_, (_, ErrorKind)>().parse(s)
129
/// };
130
///
131
/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001)));
132
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
133
/// ```
134
#[inline]
135
2.16M
pub fn be_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
136
2.16M
where
137
2.16M
  I: Input<Item = u8>,
138
{
139
2.16M
  be_uint(2)
140
2.16M
}
nom::number::be_u16::<&[u8], suricata::smb::error::SmbError>
Line
Count
Source
135
22.4k
pub fn be_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
136
22.4k
where
137
22.4k
  I: Input<Item = u8>,
138
{
139
22.4k
  be_uint(2)
140
22.4k
}
nom::number::be_u16::<&[u8], nom::error::Error<&[u8]>>
Line
Count
Source
135
2.14M
pub fn be_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
136
2.14M
where
137
2.14M
  I: Input<Item = u8>,
138
{
139
2.14M
  be_uint(2)
140
2.14M
}
Unexecuted instantiation: nom::number::be_u16::<_, _>
141
142
/// Recognizes a big endian unsigned 3 byte integer.
143
///
144
/// ```rust
145
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
146
/// use nom::number::be_u24;
147
///
148
/// let parser = |s| {
149
///   be_u24::<_, (_, ErrorKind)>().parse(s)
150
/// };
151
///
152
/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102)));
153
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
154
/// ```
155
#[inline]
156
0
pub fn be_u24<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
157
0
where
158
0
  I: Input<Item = u8>,
159
{
160
0
  be_uint(3)
161
0
}
162
163
/// Recognizes a big endian unsigned 4 bytes integer.
164
///
165
/// ```rust
166
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
167
/// use nom::number::be_u32;
168
///
169
/// let parser = |s| {
170
///   be_u32::<_, (_, ErrorKind)>().parse(s)
171
/// };
172
///
173
/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203)));
174
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
175
/// ```
176
#[inline]
177
1.05M
pub fn be_u32<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
178
1.05M
where
179
1.05M
  I: Input<Item = u8>,
180
{
181
1.05M
  be_uint(4)
182
1.05M
}
nom::number::be_u32::<&[u8], nom::error::Error<&[u8]>>
Line
Count
Source
177
1.05M
pub fn be_u32<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
178
1.05M
where
179
1.05M
  I: Input<Item = u8>,
180
{
181
1.05M
  be_uint(4)
182
1.05M
}
Unexecuted instantiation: nom::number::be_u32::<_, _>
183
184
/// Recognizes a big endian unsigned 8 bytes integer.
185
///
186
/// ```rust
187
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
188
/// use nom::number::be_u64;
189
///
190
/// let parser = |s| {
191
///   be_u64::<_, (_, ErrorKind)>().parse(s)
192
/// };
193
///
194
/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607)));
195
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
196
/// ```
197
#[inline]
198
0
pub fn be_u64<I, E: ParseError<I>>() -> impl Parser<I, Output = u64, Error = E>
199
0
where
200
0
  I: Input<Item = u8>,
201
{
202
0
  be_uint(8)
203
0
}
204
205
/// Recognizes a big endian unsigned 16 bytes integer.
206
///
207
/// ```rust
208
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
209
/// use nom::number::be_u128;
210
///
211
/// let parser = |s| {
212
///   be_u128::<_, (_, ErrorKind)>().parse(s)
213
/// };
214
///
215
/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415)));
216
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
217
/// ```
218
#[inline]
219
0
pub fn be_u128<I, E: ParseError<I>>() -> impl Parser<I, Output = u128, Error = E>
220
0
where
221
0
  I: Input<Item = u8>,
222
{
223
0
  be_uint(16)
224
0
}
225
226
/// Recognizes a signed 1 byte integer.
227
///
228
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
229
/// ```rust
230
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
231
/// use nom::number::be_i8;
232
///
233
/// let mut parser = be_i8::<_, (_, ErrorKind)>();
234
///
235
/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
236
/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
237
/// ```
238
#[inline]
239
0
pub fn be_i8<I, E: ParseError<I>>() -> impl Parser<I, Output = i8, Error = E>
240
0
where
241
0
  I: Input<Item = u8>,
242
{
243
0
  be_u8().map(|x| x as i8)
244
0
}
245
246
/// Recognizes a big endian signed 2 bytes integer.
247
///
248
/// ```rust
249
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
250
/// use nom::number::be_i16;
251
///
252
/// let mut parser = be_i16::<_, (_, ErrorKind)>();
253
///
254
/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001)));
255
/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(2))));
256
/// ```
257
#[inline]
258
0
pub fn be_i16<I, E: ParseError<I>>() -> impl Parser<I, Output = i16, Error = E>
259
0
where
260
0
  I: Input<Item = u8>,
261
{
262
0
  be_u16().map(|x| x as i16)
263
0
}
264
265
/// Recognizes a big endian signed 3 bytes integer.
266
///
267
/// ```rust
268
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
269
/// use nom::number::be_i24;
270
///
271
/// let mut parser = be_i24::<_, (_, ErrorKind)>();
272
///
273
/// assert_eq!(parser.parse(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102)));
274
/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(3))));
275
/// ```
276
#[inline]
277
0
pub fn be_i24<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
278
0
where
279
0
  I: Input<Item = u8>,
280
{
281
  // Same as the unsigned version but we need to sign-extend manually here
282
0
  be_u24().map(|x| {
283
0
    if x & 0x80_00_00 != 0 {
284
0
      (x | 0xff_00_00_00) as i32
285
    } else {
286
0
      x as i32
287
    }
288
0
  })
289
0
}
290
291
/// Recognizes a big endian signed 4 bytes integer.
292
///
293
/// ```rust
294
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
295
/// use nom::number::be_i32;
296
///
297
/// let mut parser = be_i32::<_, (_, ErrorKind)>();
298
///
299
/// assert_eq!(parser.parse(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203)));
300
/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(4))));
301
/// ```
302
#[inline]
303
0
pub fn be_i32<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
304
0
where
305
0
  I: Input<Item = u8>,
306
{
307
0
  be_u32().map(|x| x as i32)
308
0
}
309
310
/// Recognizes a big endian signed 8 bytes integer.
311
///
312
/// ```rust
313
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
314
/// use nom::number::be_i64;
315
///
316
/// let mut parser = be_i64::<_, (_, ErrorKind)>();
317
///
318
/// assert_eq!(parser.parse(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607)));
319
/// assert_eq!(parser.parse(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
320
/// ```
321
#[inline]
322
0
pub fn be_i64<I, E: ParseError<I>>() -> impl Parser<I, Output = i64, Error = E>
323
0
where
324
0
  I: Input<Item = u8>,
325
{
326
0
  be_u64().map(|x| x as i64)
327
0
}
328
329
/// Recognizes a big endian signed 16 bytes integer.
330
///
331
/// ```rust
332
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
333
/// use nom::number::be_i128;
334
///
335
/// let mut parser = be_i128::<_, (_, ErrorKind)>();
336
///
337
/// assert_eq!(parser.parse(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415)));
338
/// assert_eq!(parser.parse(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
339
/// ```
340
#[inline]
341
0
pub fn be_i128<I, E: ParseError<I>>() -> impl Parser<I, Output = i128, Error = E>
342
0
where
343
0
  I: Input<Item = u8>,
344
{
345
0
  be_u128().map(|x| x as i128)
346
0
}
347
348
/// creates a little endian unsigned integer parser
349
///
350
/// * `bound`: the number of bytes that will be read
351
/// * `Uint`: the output type
352
#[inline]
353
62.5M
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
62.5M
where
355
62.5M
  I: Input<Item = u8>,
356
62.5M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
62.5M
  LeUint {
359
62.5M
    bound,
360
62.5M
    e: PhantomData,
361
62.5M
    u: PhantomData,
362
62.5M
  }
363
62.5M
}
nom::number::le_uint::<&[u8], u32, suricata::quic::error::QuicError>
Line
Count
Source
353
133k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
133k
where
355
133k
  I: Input<Item = u8>,
356
133k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
133k
  LeUint {
359
133k
    bound,
360
133k
    e: PhantomData,
361
133k
    u: PhantomData,
362
133k
  }
363
133k
}
nom::number::le_uint::<&[u8], u16, suricata::quic::error::QuicError>
Line
Count
Source
353
17.7k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
17.7k
where
355
17.7k
  I: Input<Item = u8>,
356
17.7k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
17.7k
  LeUint {
359
17.7k
    bound,
360
17.7k
    e: PhantomData,
361
17.7k
    u: PhantomData,
362
17.7k
  }
363
17.7k
}
nom::number::le_uint::<&[u8], u8, suricata::rdp::error::RdpError>
Line
Count
Source
353
228k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
228k
where
355
228k
  I: Input<Item = u8>,
356
228k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
228k
  LeUint {
359
228k
    bound,
360
228k
    e: PhantomData,
361
228k
    u: PhantomData,
362
228k
  }
363
228k
}
nom::number::le_uint::<&[u8], u8, suricata::smb::error::SmbError>
Line
Count
Source
353
255k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
255k
where
355
255k
  I: Input<Item = u8>,
356
255k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
255k
  LeUint {
359
255k
    bound,
360
255k
    e: PhantomData,
361
255k
    u: PhantomData,
362
255k
  }
363
255k
}
nom::number::le_uint::<&[u8], u32, suricata::rdp::error::RdpError>
Line
Count
Source
353
3.61k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
3.61k
where
355
3.61k
  I: Input<Item = u8>,
356
3.61k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
3.61k
  LeUint {
359
3.61k
    bound,
360
3.61k
    e: PhantomData,
361
3.61k
    u: PhantomData,
362
3.61k
  }
363
3.61k
}
nom::number::le_uint::<&[u8], u32, suricata::smb::error::SmbError>
Line
Count
Source
353
199k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
199k
where
355
199k
  I: Input<Item = u8>,
356
199k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
199k
  LeUint {
359
199k
    bound,
360
199k
    e: PhantomData,
361
199k
    u: PhantomData,
362
199k
  }
363
199k
}
nom::number::le_uint::<&[u8], u16, suricata::rdp::error::RdpError>
Line
Count
Source
353
5.41k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
5.41k
where
355
5.41k
  I: Input<Item = u8>,
356
5.41k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
5.41k
  LeUint {
359
5.41k
    bound,
360
5.41k
    e: PhantomData,
361
5.41k
    u: PhantomData,
362
5.41k
  }
363
5.41k
}
nom::number::le_uint::<&[u8], u16, suricata::smb::error::SmbError>
Line
Count
Source
353
966k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
966k
where
355
966k
  I: Input<Item = u8>,
356
966k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
966k
  LeUint {
359
966k
    bound,
360
966k
    e: PhantomData,
361
966k
    u: PhantomData,
362
966k
  }
363
966k
}
nom::number::le_uint::<&[u8], u8, nom::error::Error<&[u8]>>
Line
Count
Source
353
22.1M
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
22.1M
where
355
22.1M
  I: Input<Item = u8>,
356
22.1M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
22.1M
  LeUint {
359
22.1M
    bound,
360
22.1M
    e: PhantomData,
361
22.1M
    u: PhantomData,
362
22.1M
  }
363
22.1M
}
nom::number::le_uint::<&[u8], u32, nom::error::Error<&[u8]>>
Line
Count
Source
353
11.3M
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
11.3M
where
355
11.3M
  I: Input<Item = u8>,
356
11.3M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
11.3M
  LeUint {
359
11.3M
    bound,
360
11.3M
    e: PhantomData,
361
11.3M
    u: PhantomData,
362
11.3M
  }
363
11.3M
}
nom::number::le_uint::<&[u8], u16, nom::error::Error<&[u8]>>
Line
Count
Source
353
24.3M
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
24.3M
where
355
24.3M
  I: Input<Item = u8>,
356
24.3M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
24.3M
  LeUint {
359
24.3M
    bound,
360
24.3M
    e: PhantomData,
361
24.3M
    u: PhantomData,
362
24.3M
  }
363
24.3M
}
nom::number::le_uint::<&[u8], u64, nom::error::Error<&[u8]>>
Line
Count
Source
353
2.82M
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
2.82M
where
355
2.82M
  I: Input<Item = u8>,
356
2.82M
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
2.82M
  LeUint {
359
2.82M
    bound,
360
2.82M
    e: PhantomData,
361
2.82M
    u: PhantomData,
362
2.82M
  }
363
2.82M
}
nom::number::le_uint::<&[u8], u16, nom::error::Error<&[u8]>>
Line
Count
Source
353
5.26k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
5.26k
where
355
5.26k
  I: Input<Item = u8>,
356
5.26k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
5.26k
  LeUint {
359
5.26k
    bound,
360
5.26k
    e: PhantomData,
361
5.26k
    u: PhantomData,
362
5.26k
  }
363
5.26k
}
nom::number::le_uint::<&[u8], u8, nom::error::Error<&[u8]>>
Line
Count
Source
353
57.8k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
57.8k
where
355
57.8k
  I: Input<Item = u8>,
356
57.8k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
57.8k
  LeUint {
359
57.8k
    bound,
360
57.8k
    e: PhantomData,
361
57.8k
    u: PhantomData,
362
57.8k
  }
363
57.8k
}
nom::number::le_uint::<&[u8], u32, nom::error::Error<&[u8]>>
Line
Count
Source
353
22.6k
fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354
22.6k
where
355
22.6k
  I: Input<Item = u8>,
356
22.6k
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357
{
358
22.6k
  LeUint {
359
22.6k
    bound,
360
22.6k
    e: PhantomData,
361
22.6k
    u: PhantomData,
362
22.6k
  }
363
22.6k
}
Unexecuted instantiation: nom::number::le_uint::<_, _, _>
364
365
/// Little endian unsigned integer parser
366
struct LeUint<Uint, E> {
367
  bound: usize,
368
  e: PhantomData<E>,
369
  u: PhantomData<Uint>,
370
}
371
372
impl<I, Uint, E: ParseError<I>> Parser<I> for LeUint<Uint, E>
373
where
374
  I: Input<Item = u8>,
375
  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
376
{
377
  type Output = Uint;
378
  type Error = E;
379
380
  #[inline(always)]
381
62.5M
  fn process<OM: crate::OutputMode>(
382
62.5M
    &mut self,
383
62.5M
    input: I,
384
62.5M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
62.5M
    if input.input_len() < self.bound {
386
1.11M
      if OM::Incomplete::is_streaming() {
387
716k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
393k
        Err(Err::Error(OM::Error::bind(|| {
390
393k
          make_error(input, ErrorKind::Eof)
391
393k
        })))
<nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
389
59.3k
        Err(Err::Error(OM::Error::bind(|| {
390
59.3k
          make_error(input, ErrorKind::Eof)
391
59.3k
        })))
<nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
389
66.8k
        Err(Err::Error(OM::Error::bind(|| {
390
66.8k
          make_error(input, ErrorKind::Eof)
391
66.8k
        })))
<nom::number::LeUint<u32, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
389
618
        Err(Err::Error(OM::Error::bind(|| {
390
618
          make_error(input, ErrorKind::Eof)
391
618
        })))
<nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
389
266k
        Err(Err::Error(OM::Error::bind(|| {
390
266k
          make_error(input, ErrorKind::Eof)
391
266k
        })))
<nom::number::LeUint<u16, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
389
559
        Err(Err::Error(OM::Error::bind(|| {
390
559
          make_error(input, ErrorKind::Eof)
391
559
        })))
<nom::number::LeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#0}
Line
Count
Source
389
126
        Err(Err::Error(OM::Error::bind(|| {
390
126
          make_error(input, ErrorKind::Eof)
391
126
        })))
Unexecuted instantiation: <nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u8, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u8, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u32, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u32, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u16, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u16, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#0}
Unexecuted instantiation: <nom::number::LeUint<_, _> as nom::internal::Parser<_>>::process::<_>::{closure#0}
392
      }
393
    } else {
394
61.4M
      let res = OM::Output::bind(|| {
395
61.4M
        let mut res = Uint::default();
396
140M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
140M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
140M
        }
399
400
61.4M
        res
401
61.4M
      });
<nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
394
12.1M
      let res = OM::Output::bind(|| {
395
12.1M
        let mut res = Uint::default();
396
12.1M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
12.1M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
12.1M
        }
399
400
12.1M
        res
401
12.1M
      });
<nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
394
5.28M
      let res = OM::Output::bind(|| {
395
5.28M
        let mut res = Uint::default();
396
21.1M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
21.1M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
21.1M
        }
399
400
5.28M
        res
401
5.28M
      });
<nom::number::LeUint<u32, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
394
132k
      let res = OM::Output::bind(|| {
395
132k
        let mut res = Uint::default();
396
529k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
529k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
529k
        }
399
400
132k
        res
401
132k
      });
<nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
394
8.85M
      let res = OM::Output::bind(|| {
395
8.85M
        let mut res = Uint::default();
396
17.7M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
17.7M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
17.7M
        }
399
400
8.85M
        res
401
8.85M
      });
<nom::number::LeUint<u16, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
394
17.2k
      let res = OM::Output::bind(|| {
395
17.2k
        let mut res = Uint::default();
396
34.4k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
34.4k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
34.4k
        }
399
400
17.2k
        res
401
17.2k
      });
<nom::number::LeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>::{closure#1}
Line
Count
Source
394
927k
      let res = OM::Output::bind(|| {
395
927k
        let mut res = Uint::default();
396
7.41M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
7.41M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
7.41M
        }
399
400
927k
        res
401
927k
      });
<nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
9.57M
      let res = OM::Output::bind(|| {
395
9.57M
        let mut res = Uint::default();
396
9.57M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
9.57M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
9.57M
        }
399
400
9.57M
        res
401
9.57M
      });
<nom::number::LeUint<u8, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
227k
      let res = OM::Output::bind(|| {
395
227k
        let mut res = Uint::default();
396
227k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
227k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
227k
        }
399
400
227k
        res
401
227k
      });
<nom::number::LeUint<u8, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
218k
      let res = OM::Output::bind(|| {
395
218k
        let mut res = Uint::default();
396
218k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
218k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
218k
        }
399
400
218k
        res
401
218k
      });
<nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
5.92M
      let res = OM::Output::bind(|| {
395
5.92M
        let mut res = Uint::default();
396
23.7M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
23.7M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
23.7M
        }
399
400
5.92M
        res
401
5.92M
      });
<nom::number::LeUint<u32, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
3.03k
      let res = OM::Output::bind(|| {
395
3.03k
        let mut res = Uint::default();
396
12.1k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
12.1k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
12.1k
        }
399
400
3.03k
        res
401
3.03k
      });
<nom::number::LeUint<u32, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
197k
      let res = OM::Output::bind(|| {
395
197k
        let mut res = Uint::default();
396
790k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
790k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
790k
        }
399
400
197k
        res
401
197k
      });
<nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
15.1M
      let res = OM::Output::bind(|| {
395
15.1M
        let mut res = Uint::default();
396
30.2M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
30.2M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
30.2M
        }
399
400
15.1M
        res
401
15.1M
      });
<nom::number::LeUint<u16, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
4.56k
      let res = OM::Output::bind(|| {
395
4.56k
        let mut res = Uint::default();
396
9.13k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
9.13k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
9.13k
        }
399
400
4.56k
        res
401
4.56k
      });
<nom::number::LeUint<u16, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
882k
      let res = OM::Output::bind(|| {
395
882k
        let mut res = Uint::default();
396
1.76M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
1.76M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
1.76M
        }
399
400
882k
        res
401
882k
      });
<nom::number::LeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
1.88M
      let res = OM::Output::bind(|| {
395
1.88M
        let mut res = Uint::default();
396
15.1M
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
15.1M
          res = res + (Uint::from(byte) << (8 * index as u8));
398
15.1M
        }
399
400
1.88M
        res
401
1.88M
      });
<nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
3.95k
      let res = OM::Output::bind(|| {
395
3.95k
        let mut res = Uint::default();
396
7.91k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
7.91k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
7.91k
        }
399
400
3.95k
        res
401
3.95k
      });
<nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
56.1k
      let res = OM::Output::bind(|| {
395
56.1k
        let mut res = Uint::default();
396
56.1k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
56.1k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
56.1k
        }
399
400
56.1k
        res
401
56.1k
      });
<nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>::{closure#1}
Line
Count
Source
394
18.0k
      let res = OM::Output::bind(|| {
395
18.0k
        let mut res = Uint::default();
396
72.1k
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
72.1k
          res = res + (Uint::from(byte) << (8 * index as u8));
398
72.1k
        }
399
400
18.0k
        res
401
18.0k
      });
Unexecuted instantiation: <nom::number::LeUint<_, _> as nom::internal::Parser<_>>::process::<_>::{closure#1}
402
403
61.4M
      Ok((input.take_from(self.bound), res))
404
    }
405
62.5M
  }
<nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
381
12.1M
  fn process<OM: crate::OutputMode>(
382
12.1M
    &mut self,
383
12.1M
    input: I,
384
12.1M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
12.1M
    if input.input_len() < self.bound {
386
59.3k
      if OM::Incomplete::is_streaming() {
387
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
59.3k
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
12.1M
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
12.1M
      Ok((input.take_from(self.bound), res))
404
    }
405
12.1M
  }
<nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
381
5.34M
  fn process<OM: crate::OutputMode>(
382
5.34M
    &mut self,
383
5.34M
    input: I,
384
5.34M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
5.34M
    if input.input_len() < self.bound {
386
66.8k
      if OM::Incomplete::is_streaming() {
387
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
66.8k
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
5.28M
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
5.28M
      Ok((input.take_from(self.bound), res))
404
    }
405
5.34M
  }
<nom::number::LeUint<u32, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
381
133k
  fn process<OM: crate::OutputMode>(
382
133k
    &mut self,
383
133k
    input: I,
384
133k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
133k
    if input.input_len() < self.bound {
386
618
      if OM::Incomplete::is_streaming() {
387
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
618
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
132k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
132k
      Ok((input.take_from(self.bound), res))
404
    }
405
133k
  }
<nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
381
9.11M
  fn process<OM: crate::OutputMode>(
382
9.11M
    &mut self,
383
9.11M
    input: I,
384
9.11M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
9.11M
    if input.input_len() < self.bound {
386
266k
      if OM::Incomplete::is_streaming() {
387
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
266k
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
8.85M
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
8.85M
      Ok((input.take_from(self.bound), res))
404
    }
405
9.11M
  }
<nom::number::LeUint<u16, suricata::quic::error::QuicError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
381
17.7k
  fn process<OM: crate::OutputMode>(
382
17.7k
    &mut self,
383
17.7k
    input: I,
384
17.7k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
17.7k
    if input.input_len() < self.bound {
386
559
      if OM::Incomplete::is_streaming() {
387
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
559
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
17.2k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
17.2k
      Ok((input.take_from(self.bound), res))
404
    }
405
17.7k
  }
<nom::number::LeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Complete>>
Line
Count
Source
381
927k
  fn process<OM: crate::OutputMode>(
382
927k
    &mut self,
383
927k
    input: I,
384
927k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
927k
    if input.input_len() < self.bound {
386
126
      if OM::Incomplete::is_streaming() {
387
0
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
126
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
927k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
927k
      Ok((input.take_from(self.bound), res))
404
    }
405
927k
  }
<nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
9.96M
  fn process<OM: crate::OutputMode>(
382
9.96M
    &mut self,
383
9.96M
    input: I,
384
9.96M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
9.96M
    if input.input_len() < self.bound {
386
382k
      if OM::Incomplete::is_streaming() {
387
382k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
9.57M
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
9.57M
      Ok((input.take_from(self.bound), res))
404
    }
405
9.96M
  }
<nom::number::LeUint<u8, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
228k
  fn process<OM: crate::OutputMode>(
382
228k
    &mut self,
383
228k
    input: I,
384
228k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
228k
    if input.input_len() < self.bound {
386
1.56k
      if OM::Incomplete::is_streaming() {
387
1.56k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
227k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
227k
      Ok((input.take_from(self.bound), res))
404
    }
405
228k
  }
<nom::number::LeUint<u8, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
255k
  fn process<OM: crate::OutputMode>(
382
255k
    &mut self,
383
255k
    input: I,
384
255k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
255k
    if input.input_len() < self.bound {
386
36.7k
      if OM::Incomplete::is_streaming() {
387
36.7k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
218k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
218k
      Ok((input.take_from(self.bound), res))
404
    }
405
255k
  }
<nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
5.98M
  fn process<OM: crate::OutputMode>(
382
5.98M
    &mut self,
383
5.98M
    input: I,
384
5.98M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
5.98M
    if input.input_len() < self.bound {
386
60.4k
      if OM::Incomplete::is_streaming() {
387
60.4k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
5.92M
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
5.92M
      Ok((input.take_from(self.bound), res))
404
    }
405
5.98M
  }
<nom::number::LeUint<u32, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
3.61k
  fn process<OM: crate::OutputMode>(
382
3.61k
    &mut self,
383
3.61k
    input: I,
384
3.61k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
3.61k
    if input.input_len() < self.bound {
386
588
      if OM::Incomplete::is_streaming() {
387
588
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
3.03k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
3.03k
      Ok((input.take_from(self.bound), res))
404
    }
405
3.61k
  }
<nom::number::LeUint<u32, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
199k
  fn process<OM: crate::OutputMode>(
382
199k
    &mut self,
383
199k
    input: I,
384
199k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
199k
    if input.input_len() < self.bound {
386
1.96k
      if OM::Incomplete::is_streaming() {
387
1.96k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
197k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
197k
      Ok((input.take_from(self.bound), res))
404
    }
405
199k
  }
<nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
15.2M
  fn process<OM: crate::OutputMode>(
382
15.2M
    &mut self,
383
15.2M
    input: I,
384
15.2M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
15.2M
    if input.input_len() < self.bound {
386
129k
      if OM::Incomplete::is_streaming() {
387
129k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
15.1M
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
15.1M
      Ok((input.take_from(self.bound), res))
404
    }
405
15.2M
  }
<nom::number::LeUint<u16, suricata::rdp::error::RdpError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
5.41k
  fn process<OM: crate::OutputMode>(
382
5.41k
    &mut self,
383
5.41k
    input: I,
384
5.41k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
5.41k
    if input.input_len() < self.bound {
386
846
      if OM::Incomplete::is_streaming() {
387
846
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
4.56k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
4.56k
      Ok((input.take_from(self.bound), res))
404
    }
405
5.41k
  }
<nom::number::LeUint<u16, suricata::smb::error::SmbError> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
966k
  fn process<OM: crate::OutputMode>(
382
966k
    &mut self,
383
966k
    input: I,
384
966k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
966k
    if input.input_len() < self.bound {
386
83.8k
      if OM::Incomplete::is_streaming() {
387
83.8k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
882k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
882k
      Ok((input.take_from(self.bound), res))
404
    }
405
966k
  }
<nom::number::LeUint<u64, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
1.90M
  fn process<OM: crate::OutputMode>(
382
1.90M
    &mut self,
383
1.90M
    input: I,
384
1.90M
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
1.90M
    if input.input_len() < self.bound {
386
11.4k
      if OM::Incomplete::is_streaming() {
387
11.4k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
1.88M
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
1.88M
      Ok((input.take_from(self.bound), res))
404
    }
405
1.90M
  }
<nom::number::LeUint<u16, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
5.26k
  fn process<OM: crate::OutputMode>(
382
5.26k
    &mut self,
383
5.26k
    input: I,
384
5.26k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
5.26k
    if input.input_len() < self.bound {
386
1.30k
      if OM::Incomplete::is_streaming() {
387
1.30k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
3.95k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
3.95k
      Ok((input.take_from(self.bound), res))
404
    }
405
5.26k
  }
<nom::number::LeUint<u8, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
57.8k
  fn process<OM: crate::OutputMode>(
382
57.8k
    &mut self,
383
57.8k
    input: I,
384
57.8k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
57.8k
    if input.input_len() < self.bound {
386
1.65k
      if OM::Incomplete::is_streaming() {
387
1.65k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
56.1k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
56.1k
      Ok((input.take_from(self.bound), res))
404
    }
405
57.8k
  }
<nom::number::LeUint<u32, nom::error::Error<&[u8]>> as nom::internal::Parser<&[u8]>>::process::<nom::internal::OutputM<nom::internal::Emit, nom::internal::Emit, nom::internal::Streaming>>
Line
Count
Source
381
22.6k
  fn process<OM: crate::OutputMode>(
382
22.6k
    &mut self,
383
22.6k
    input: I,
384
22.6k
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385
22.6k
    if input.input_len() < self.bound {
386
4.61k
      if OM::Incomplete::is_streaming() {
387
4.61k
        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388
      } else {
389
0
        Err(Err::Error(OM::Error::bind(|| {
390
          make_error(input, ErrorKind::Eof)
391
        })))
392
      }
393
    } else {
394
18.0k
      let res = OM::Output::bind(|| {
395
        let mut res = Uint::default();
396
        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397
          res = res + (Uint::from(byte) << (8 * index as u8));
398
        }
399
400
        res
401
      });
402
403
18.0k
      Ok((input.take_from(self.bound), res))
404
    }
405
22.6k
  }
Unexecuted instantiation: <nom::number::LeUint<_, _> as nom::internal::Parser<_>>::process::<_>
406
}
407
408
/// Recognizes an unsigned 1 byte integer.
409
///
410
/// ```rust
411
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
412
/// use nom::number::le_u8;
413
///
414
/// let mut parser = le_u8::<_, (_, ErrorKind)>();
415
///
416
/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
417
/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
418
/// ```
419
#[inline]
420
0
pub fn le_u8<I, E: ParseError<I>>() -> impl Parser<I, Output = u8, Error = E>
421
0
where
422
0
  I: Input<Item = u8>,
423
{
424
0
  le_uint(1)
425
0
}
426
427
/// Recognizes a little endian unsigned 2 bytes integer.
428
///
429
///
430
/// ```rust
431
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
432
/// use nom::number::le_u16;
433
///
434
/// let parser = |s| {
435
///   le_u16::<_, (_, ErrorKind)>().parse(s)
436
/// };
437
///
438
/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100)));
439
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
440
/// ```
441
#[inline]
442
3.18M
pub fn le_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
443
3.18M
where
444
3.18M
  I: Input<Item = u8>,
445
{
446
3.18M
  le_uint(2)
447
3.18M
}
nom::number::le_u16::<&[u8], suricata::smb::error::SmbError>
Line
Count
Source
442
20.8k
pub fn le_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
443
20.8k
where
444
20.8k
  I: Input<Item = u8>,
445
{
446
20.8k
  le_uint(2)
447
20.8k
}
nom::number::le_u16::<&[u8], nom::error::Error<&[u8]>>
Line
Count
Source
442
3.16M
pub fn le_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
443
3.16M
where
444
3.16M
  I: Input<Item = u8>,
445
{
446
3.16M
  le_uint(2)
447
3.16M
}
Unexecuted instantiation: nom::number::le_u16::<_, _>
448
449
/// Recognizes a little endian unsigned 3 bytes integer.
450
///
451
/// ```rust
452
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
453
/// use nom::number::le_u24;
454
///
455
/// let parser = |s| {
456
///   le_u24::<_, (_, ErrorKind)>().parse(s)
457
/// };
458
///
459
/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100)));
460
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
461
/// ```
462
#[inline]
463
0
pub fn le_u24<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
464
0
where
465
0
  I: Input<Item = u8>,
466
{
467
0
  le_uint(3)
468
0
}
469
470
/// Recognizes a little endian unsigned 4 bytes integer.
471
///
472
/// ```rust
473
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
474
/// use nom::number::le_u32;
475
///
476
/// let parser = |s| {
477
///   le_u32::<_, (_, ErrorKind)>().parse(s)
478
/// };
479
///
480
/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100)));
481
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
482
/// ```
483
#[inline]
484
1.37M
pub fn le_u32<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
485
1.37M
where
486
1.37M
  I: Input<Item = u8>,
487
{
488
1.37M
  le_uint(4)
489
1.37M
}
nom::number::le_u32::<&[u8], nom::error::Error<&[u8]>>
Line
Count
Source
484
1.37M
pub fn le_u32<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
485
1.37M
where
486
1.37M
  I: Input<Item = u8>,
487
{
488
1.37M
  le_uint(4)
489
1.37M
}
Unexecuted instantiation: nom::number::le_u32::<_, _>
490
491
/// Recognizes a little endian unsigned 8 bytes integer.
492
///
493
/// ```rust
494
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
495
/// use nom::number::le_u64;
496
///
497
/// let parser = |s| {
498
///   le_u64::<_, (_, ErrorKind)>().parse(s)
499
/// };
500
///
501
/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100)));
502
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
503
/// ```
504
#[inline]
505
0
pub fn le_u64<I, E: ParseError<I>>() -> impl Parser<I, Output = u64, Error = E>
506
0
where
507
0
  I: Input<Item = u8>,
508
{
509
0
  le_uint(8)
510
0
}
511
512
/// Recognizes a little endian unsigned 16 bytes integer.
513
///
514
/// ```rust
515
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
516
/// use nom::number::le_u128;
517
///
518
/// let mut parser = |s| {
519
///   le_u128::<_, (_, ErrorKind)>().parse(s)
520
/// };
521
///
522
/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100)));
523
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
524
/// ```
525
#[inline]
526
0
pub fn le_u128<I, E: ParseError<I>>() -> impl Parser<I, Output = u128, Error = E>
527
0
where
528
0
  I: Input<Item = u8>,
529
{
530
0
  le_uint(16)
531
0
}
532
533
/// Recognizes a signed 1 byte integer.
534
///
535
/// ```rust
536
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
537
/// use nom::number::le_i8;
538
///
539
/// let mut parser = le_i8::<_, (_, ErrorKind)>();
540
///
541
/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
542
/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
543
/// ```
544
#[inline]
545
0
pub fn le_i8<I, E: ParseError<I>>() -> impl Parser<I, Output = i8, Error = E>
546
0
where
547
0
  I: Input<Item = u8>,
548
{
549
0
  le_u8().map(|x| x as i8)
550
0
}
551
552
/// Recognizes a little endian signed 2 bytes integer.
553
///
554
/// ```rust
555
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
556
/// use nom::number::le_i16;
557
///
558
/// let parser = |s| {
559
///   le_i16::<_, (_, ErrorKind)>().parse(s)
560
/// };
561
///
562
/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100)));
563
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
564
/// ```
565
#[inline]
566
0
pub fn le_i16<I, E: ParseError<I>>() -> impl Parser<I, Output = i16, Error = E>
567
0
where
568
0
  I: Input<Item = u8>,
569
{
570
0
  le_u16().map(|x| x as i16)
571
0
}
572
573
/// Recognizes a little endian signed 3 bytes integer.
574
///
575
/// ```rust
576
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
577
/// use nom::number::le_i24;
578
///
579
/// let parser = |s| {
580
///   le_i24::<_, (_, ErrorKind)>().parse(s)
581
/// };
582
///
583
/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100)));
584
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
585
/// ```
586
#[inline]
587
0
pub fn le_i24<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
588
0
where
589
0
  I: Input<Item = u8>,
590
{
591
  // Same as the unsigned version but we need to sign-extend manually here
592
0
  le_u24().map(|x| {
593
0
    if x & 0x80_00_00 != 0 {
594
0
      (x | 0xff_00_00_00) as i32
595
    } else {
596
0
      x as i32
597
    }
598
0
  })
599
0
}
600
601
/// Recognizes a little endian signed 4 bytes integer.
602
///
603
/// ```rust
604
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
605
/// use nom::number::le_i32;
606
///
607
/// let parser = |s| {
608
///   le_i32::<_, (_, ErrorKind)>().parse(s)
609
/// };
610
///
611
/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100)));
612
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
613
/// ```
614
#[inline]
615
0
pub fn le_i32<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
616
0
where
617
0
  I: Input<Item = u8>,
618
{
619
0
  le_u32().map(|x| x as i32)
620
0
}
621
622
/// Recognizes a little endian signed 8 bytes integer.
623
///
624
/// ```rust
625
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
626
/// use nom::number::le_i64;
627
///
628
/// let parser = |s| {
629
///   le_i64::<_, (_, ErrorKind)>().parse(s)
630
/// };
631
///
632
/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100)));
633
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
634
/// ```
635
#[inline]
636
0
pub fn le_i64<I, E: ParseError<I>>() -> impl Parser<I, Output = i64, Error = E>
637
0
where
638
0
  I: Input<Item = u8>,
639
{
640
0
  le_u64().map(|x| x as i64)
641
0
}
642
643
/// Recognizes a little endian signed 16 bytes integer.
644
///
645
/// ```rust
646
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
647
/// use nom::number::le_i128;
648
///
649
/// let parser = |s| {
650
///   le_i128::<_, (_, ErrorKind)>().parse(s)
651
/// };
652
///
653
/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100)));
654
/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
655
/// ```
656
#[inline]
657
0
pub fn le_i128<I, E: ParseError<I>>() -> impl Parser<I, Output = i128, Error = E>
658
0
where
659
0
  I: Input<Item = u8>,
660
{
661
0
  le_u128().map(|x| x as i128)
662
0
}
663
664
/// Recognizes an unsigned 1 byte integer
665
///
666
/// Note that endianness does not apply to 1 byte numbers.
667
/// ```rust
668
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
669
/// # use nom::Needed::Size;
670
/// use nom::number::u8;
671
///
672
/// let parser = |s| {
673
///   u8::<_, (_, ErrorKind)>().parse(s)
674
/// };
675
///
676
/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
677
/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
678
/// ```
679
#[inline]
680
0
pub fn u8<I, E: ParseError<I>>() -> impl Parser<I, Output = u8, Error = E>
681
0
where
682
0
  I: Input<Item = u8>,
683
{
684
0
  be_u8()
685
0
}
686
687
/// Recognizes an unsigned 2 bytes integer
688
///
689
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u16 integer,
690
/// otherwise if `nom::number::Endianness::Little` parse a little endian u16 integer.
691
///
692
/// ```rust
693
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
694
/// # use nom::Needed::Size;
695
/// use nom::number::u16;
696
///
697
/// let be_u16 = |s| {
698
///   u16::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
699
/// };
700
///
701
/// assert_eq!(be_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
702
/// assert_eq!(be_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
703
///
704
/// let le_u16 = |s| {
705
///   u16::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
706
/// };
707
///
708
/// assert_eq!(le_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
709
/// assert_eq!(le_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
710
/// ```
711
#[inline]
712
5.35M
pub fn u16<I, E: ParseError<I>>(
713
5.35M
  endian: crate::number::Endianness,
714
5.35M
) -> impl Parser<I, Output = u16, Error = E>
715
5.35M
where
716
5.35M
  I: Input<Item = u8>,
717
{
718
5.35M
  match endian {
719
2.16M
    crate::number::Endianness::Big => Either::Left(be_u16()),
720
3.18M
    crate::number::Endianness::Little => Either::Right(le_u16()),
721
    #[cfg(target_endian = "big")]
722
    crate::number::Endianness::Native => Either::Left(be_u16()),
723
    #[cfg(target_endian = "little")]
724
0
    crate::number::Endianness::Native => Either::Right(le_u16()),
725
  }
726
5.35M
}
nom::number::u16::<&[u8], suricata::smb::error::SmbError>
Line
Count
Source
712
43.3k
pub fn u16<I, E: ParseError<I>>(
713
43.3k
  endian: crate::number::Endianness,
714
43.3k
) -> impl Parser<I, Output = u16, Error = E>
715
43.3k
where
716
43.3k
  I: Input<Item = u8>,
717
{
718
43.3k
  match endian {
719
22.4k
    crate::number::Endianness::Big => Either::Left(be_u16()),
720
20.8k
    crate::number::Endianness::Little => Either::Right(le_u16()),
721
    #[cfg(target_endian = "big")]
722
    crate::number::Endianness::Native => Either::Left(be_u16()),
723
    #[cfg(target_endian = "little")]
724
0
    crate::number::Endianness::Native => Either::Right(le_u16()),
725
  }
726
43.3k
}
nom::number::u16::<&[u8], nom::error::Error<&[u8]>>
Line
Count
Source
712
5.30M
pub fn u16<I, E: ParseError<I>>(
713
5.30M
  endian: crate::number::Endianness,
714
5.30M
) -> impl Parser<I, Output = u16, Error = E>
715
5.30M
where
716
5.30M
  I: Input<Item = u8>,
717
{
718
5.30M
  match endian {
719
2.14M
    crate::number::Endianness::Big => Either::Left(be_u16()),
720
3.16M
    crate::number::Endianness::Little => Either::Right(le_u16()),
721
    #[cfg(target_endian = "big")]
722
    crate::number::Endianness::Native => Either::Left(be_u16()),
723
    #[cfg(target_endian = "little")]
724
0
    crate::number::Endianness::Native => Either::Right(le_u16()),
725
  }
726
5.30M
}
Unexecuted instantiation: nom::number::u16::<_, _>
727
728
/// Recognizes an unsigned 3 byte integer
729
///
730
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u24 integer,
731
/// otherwise if `nom::number::Endianness::Little` parse a little endian u24 integer.
732
/// ```rust
733
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
734
/// # use nom::Needed::Size;
735
/// use nom::number::u24;
736
///
737
/// let be_u24 = |s| {
738
///   u24::<_,(_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
739
/// };
740
///
741
/// assert_eq!(be_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
742
/// assert_eq!(be_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
743
///
744
/// let le_u24 = |s| {
745
///   u24::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
746
/// };
747
///
748
/// assert_eq!(le_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
749
/// assert_eq!(le_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
750
/// ```
751
#[inline]
752
0
pub fn u24<I, E: ParseError<I>>(
753
0
  endian: crate::number::Endianness,
754
0
) -> impl Parser<I, Output = u32, Error = E>
755
0
where
756
0
  I: Input<Item = u8>,
757
{
758
0
  match endian {
759
0
    crate::number::Endianness::Big => Either::Left(be_u24()),
760
0
    crate::number::Endianness::Little => Either::Right(le_u24()),
761
    #[cfg(target_endian = "big")]
762
    crate::number::Endianness::Native => Either::Left(be_u24()),
763
    #[cfg(target_endian = "little")]
764
0
    crate::number::Endianness::Native => Either::Right(le_u24()),
765
  }
766
0
}
767
768
/// Recognizes an unsigned 4 byte integer
769
///
770
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u32 integer,
771
/// otherwise if `nom::number::Endianness::Little` parse a little endian u32 integer.
772
/// ```rust
773
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
774
/// # use nom::Needed::Size;
775
/// use nom::number::u32;
776
///
777
/// let be_u32 = |s| {
778
///   u32::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
779
/// };
780
///
781
/// assert_eq!(be_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
782
/// assert_eq!(be_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
783
///
784
/// let le_u32 = |s| {
785
///   u32::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
786
/// };
787
///
788
/// assert_eq!(le_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
789
/// assert_eq!(le_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
790
/// ```
791
#[inline]
792
2.43M
pub fn u32<I, E: ParseError<I>>(
793
2.43M
  endian: crate::number::Endianness,
794
2.43M
) -> impl Parser<I, Output = u32, Error = E>
795
2.43M
where
796
2.43M
  I: Input<Item = u8>,
797
{
798
2.43M
  match endian {
799
1.05M
    crate::number::Endianness::Big => Either::Left(be_u32()),
800
1.37M
    crate::number::Endianness::Little => Either::Right(le_u32()),
801
    #[cfg(target_endian = "big")]
802
    crate::number::Endianness::Native => Either::Left(be_u32()),
803
    #[cfg(target_endian = "little")]
804
0
    crate::number::Endianness::Native => Either::Right(le_u32()),
805
  }
806
2.43M
}
nom::number::u32::<&[u8], nom::error::Error<&[u8]>>
Line
Count
Source
792
2.43M
pub fn u32<I, E: ParseError<I>>(
793
2.43M
  endian: crate::number::Endianness,
794
2.43M
) -> impl Parser<I, Output = u32, Error = E>
795
2.43M
where
796
2.43M
  I: Input<Item = u8>,
797
{
798
2.43M
  match endian {
799
1.05M
    crate::number::Endianness::Big => Either::Left(be_u32()),
800
1.37M
    crate::number::Endianness::Little => Either::Right(le_u32()),
801
    #[cfg(target_endian = "big")]
802
    crate::number::Endianness::Native => Either::Left(be_u32()),
803
    #[cfg(target_endian = "little")]
804
0
    crate::number::Endianness::Native => Either::Right(le_u32()),
805
  }
806
2.43M
}
Unexecuted instantiation: nom::number::u32::<_, _>
807
808
/// Recognizes an unsigned 8 byte integer
809
///
810
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u64 integer,
811
/// otherwise if `nom::number::Endianness::Little` parse a little endian u64 integer.
812
/// ```rust
813
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
814
/// # use nom::Needed::Size;
815
/// use nom::number::u64;
816
///
817
/// let be_u64 = |s| {
818
///   u64::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
819
/// };
820
///
821
/// assert_eq!(be_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
822
/// assert_eq!(be_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
823
///
824
/// let le_u64 = |s| {
825
///   u64::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
826
/// };
827
///
828
/// assert_eq!(le_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
829
/// assert_eq!(le_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
830
/// ```
831
#[inline]
832
0
pub fn u64<I, E: ParseError<I>>(
833
0
  endian: crate::number::Endianness,
834
0
) -> impl Parser<I, Output = u64, Error = E>
835
0
where
836
0
  I: Input<Item = u8>,
837
{
838
0
  match endian {
839
0
    crate::number::Endianness::Big => Either::Left(be_u64()),
840
0
    crate::number::Endianness::Little => Either::Right(le_u64()),
841
    #[cfg(target_endian = "big")]
842
    crate::number::Endianness::Native => Either::Left(be_u64()),
843
    #[cfg(target_endian = "little")]
844
0
    crate::number::Endianness::Native => Either::Right(le_u64()),
845
  }
846
0
}
847
848
/// Recognizes an unsigned 16 byte integer
849
///
850
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u128 integer,
851
/// otherwise if `nom::number::Endianness::Little` parse a little endian u128 integer.
852
/// ```rust
853
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
854
/// # use nom::Needed::Size;
855
/// use nom::number::u128;
856
///
857
/// let be_u128 = |s| {
858
///   u128::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
859
/// };
860
///
861
/// 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)));
862
/// assert_eq!(be_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
863
///
864
/// let le_u128 = |s| {
865
///   u128::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
866
/// };
867
///
868
/// 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)));
869
/// assert_eq!(le_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
870
/// ```
871
#[inline]
872
0
pub fn u128<I, E: ParseError<I>>(
873
0
  endian: crate::number::Endianness,
874
0
) -> impl Parser<I, Output = u128, Error = E>
875
0
where
876
0
  I: Input<Item = u8>,
877
{
878
0
  match endian {
879
0
    crate::number::Endianness::Big => Either::Left(be_u128()),
880
0
    crate::number::Endianness::Little => Either::Right(le_u128()),
881
    #[cfg(target_endian = "big")]
882
    crate::number::Endianness::Native => Either::Left(be_u128()),
883
    #[cfg(target_endian = "little")]
884
0
    crate::number::Endianness::Native => Either::Right(le_u128()),
885
  }
886
0
}
887
888
/// Recognizes a signed 1 byte integer
889
///
890
/// Note that endianness does not apply to 1 byte numbers.
891
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
892
/// ```rust
893
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
894
/// # use nom::Needed::Size;
895
/// use nom::number::i8;
896
///
897
/// let parser = |s| {
898
///   i8::<_, (_, ErrorKind)>().parse(s)
899
/// };
900
///
901
/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
902
/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
903
/// ```
904
#[inline]
905
0
pub fn i8<I, E: ParseError<I>>() -> impl Parser<I, Output = i8, Error = E>
906
0
where
907
0
  I: Input<Item = u8>,
908
{
909
0
  u8().map(|x| x as i8)
910
0
}
911
912
/// Recognizes a signed 2 byte integer
913
///
914
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i16 integer,
915
/// otherwise if `nom::number::Endianness::Little` parse a little endian i16 integer.
916
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
917
/// ```rust
918
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
919
/// # use nom::Needed::Size;
920
/// use nom::number::i16;
921
///
922
/// let be_i16 = |s| {
923
///   i16::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
924
/// };
925
///
926
/// assert_eq!(be_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
927
/// assert_eq!(be_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
928
///
929
/// let le_i16 = |s| {
930
///   i16::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
931
/// };
932
///
933
/// assert_eq!(le_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
934
/// assert_eq!(le_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
935
/// ```
936
#[inline]
937
0
pub fn i16<I, E: ParseError<I>>(
938
0
  endian: crate::number::Endianness,
939
0
) -> impl Parser<I, Output = i16, Error = E>
940
0
where
941
0
  I: Input<Item = u8>,
942
{
943
0
  match endian {
944
0
    crate::number::Endianness::Big => Either::Left(be_i16()),
945
0
    crate::number::Endianness::Little => Either::Right(le_i16()),
946
    #[cfg(target_endian = "big")]
947
    crate::number::Endianness::Native => Either::Left(be_i16()),
948
    #[cfg(target_endian = "little")]
949
0
    crate::number::Endianness::Native => Either::Right(le_i16()),
950
  }
951
0
}
952
953
/// Recognizes a signed 3 byte integer
954
///
955
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i24 integer,
956
/// otherwise if `nom::number::Endianness::Little` parse a little endian i24 integer.
957
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
958
/// ```rust
959
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
960
/// # use nom::Needed::Size;
961
/// use nom::number::i24;
962
///
963
/// let be_i24 = |s| {
964
///   i24::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
965
/// };
966
///
967
/// assert_eq!(be_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
968
/// assert_eq!(be_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
969
///
970
/// let le_i24 = |s| {
971
///   i24::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
972
/// };
973
///
974
/// assert_eq!(le_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
975
/// assert_eq!(le_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
976
/// ```
977
#[inline]
978
0
pub fn i24<I, E: ParseError<I>>(
979
0
  endian: crate::number::Endianness,
980
0
) -> impl Parser<I, Output = i32, Error = E>
981
0
where
982
0
  I: Input<Item = u8>,
983
{
984
0
  match endian {
985
0
    crate::number::Endianness::Big => Either::Left(be_i24()),
986
0
    crate::number::Endianness::Little => Either::Right(le_i24()),
987
    #[cfg(target_endian = "big")]
988
    crate::number::Endianness::Native => Either::Left(be_i24()),
989
    #[cfg(target_endian = "little")]
990
0
    crate::number::Endianness::Native => Either::Right(le_i24()),
991
  }
992
0
}
993
994
/// Recognizes a signed 4 byte integer
995
///
996
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i32 integer,
997
/// otherwise if `nom::number::Endianness::Little` parse a little endian i32 integer.
998
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
999
/// ```rust
1000
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1001
/// # use nom::Needed::Size;
1002
/// use nom::number::i32;
1003
///
1004
/// let be_i32 = |s| {
1005
///   i32::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1006
/// };
1007
///
1008
/// assert_eq!(be_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
1009
/// assert_eq!(be_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
1010
///
1011
/// let le_i32 = |s| {
1012
///   i32::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1013
/// };
1014
///
1015
/// assert_eq!(le_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
1016
/// assert_eq!(le_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
1017
/// ```
1018
#[inline]
1019
0
pub fn i32<I, E: ParseError<I>>(
1020
0
  endian: crate::number::Endianness,
1021
0
) -> impl Parser<I, Output = i32, Error = E>
1022
0
where
1023
0
  I: Input<Item = u8>,
1024
{
1025
0
  match endian {
1026
0
    crate::number::Endianness::Big => Either::Left(be_i32()),
1027
0
    crate::number::Endianness::Little => Either::Right(le_i32()),
1028
    #[cfg(target_endian = "big")]
1029
    crate::number::Endianness::Native => Either::Left(be_i32()),
1030
    #[cfg(target_endian = "little")]
1031
0
    crate::number::Endianness::Native => Either::Right(le_i32()),
1032
  }
1033
0
}
1034
1035
/// Recognizes a signed 8 byte integer
1036
///
1037
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i64 integer,
1038
/// otherwise if `nom::number::Endianness::Little` parse a little endian i64 integer.
1039
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1040
/// ```rust
1041
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1042
/// # use nom::Needed::Size;
1043
/// use nom::number::i64;
1044
///
1045
/// let be_i64 = |s| {
1046
///   i64::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1047
/// };
1048
///
1049
/// assert_eq!(be_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
1050
/// assert_eq!(be_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
1051
///
1052
/// let le_i64 = |s| {
1053
///   i64::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1054
/// };
1055
///
1056
/// assert_eq!(le_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
1057
/// assert_eq!(le_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
1058
/// ```
1059
#[inline]
1060
0
pub fn i64<I, E: ParseError<I>>(
1061
0
  endian: crate::number::Endianness,
1062
0
) -> impl Parser<I, Output = i64, Error = E>
1063
0
where
1064
0
  I: Input<Item = u8>,
1065
{
1066
0
  match endian {
1067
0
    crate::number::Endianness::Big => Either::Left(be_i64()),
1068
0
    crate::number::Endianness::Little => Either::Right(le_i64()),
1069
    #[cfg(target_endian = "big")]
1070
    crate::number::Endianness::Native => Either::Left(be_i64()),
1071
    #[cfg(target_endian = "little")]
1072
0
    crate::number::Endianness::Native => Either::Right(le_i64()),
1073
  }
1074
0
}
1075
1076
/// Recognizes a signed 16 byte integer
1077
///
1078
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i128 integer,
1079
/// otherwise if `nom::number::Endianness::Little` parse a little endian i128 integer.
1080
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1081
/// ```rust
1082
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1083
/// # use nom::Needed::Size;
1084
/// use nom::number::i128;
1085
///
1086
/// let be_i128 = |s| {
1087
///   i128::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1088
/// };
1089
///
1090
/// 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)));
1091
/// assert_eq!(be_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
1092
///
1093
/// let le_i128 = |s| {
1094
///   i128::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1095
/// };
1096
///
1097
/// 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)));
1098
/// assert_eq!(le_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
1099
/// ```
1100
#[inline]
1101
0
pub fn i128<I, E: ParseError<I>>(
1102
0
  endian: crate::number::Endianness,
1103
0
) -> impl Parser<I, Output = i128, Error = E>
1104
0
where
1105
0
  I: Input<Item = u8>,
1106
{
1107
0
  match endian {
1108
0
    crate::number::Endianness::Big => Either::Left(be_i128()),
1109
0
    crate::number::Endianness::Little => Either::Right(le_i128()),
1110
    #[cfg(target_endian = "big")]
1111
    crate::number::Endianness::Native => Either::Left(be_i128()),
1112
    #[cfg(target_endian = "little")]
1113
0
    crate::number::Endianness::Native => Either::Right(le_i128()),
1114
  }
1115
0
}
1116
1117
/// Recognizes a big endian 4 bytes floating point number.
1118
///
1119
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1120
/// ```rust
1121
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1122
/// use nom::number::be_f32;
1123
///
1124
/// let parser = |s| {
1125
///   be_f32::<_, (_, ErrorKind)>().parse(s)
1126
/// };
1127
///
1128
/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00][..]), Ok((&b""[..], 2.640625)));
1129
/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3))));
1130
/// ```
1131
#[inline]
1132
0
pub fn be_f32<I, E: ParseError<I>>() -> impl Parser<I, Output = f32, Error = E>
1133
0
where
1134
0
  I: Input<Item = u8>,
1135
{
1136
0
  be_u32().map(f32::from_bits)
1137
0
}
1138
1139
/// Recognizes a big endian 8 bytes floating point number.
1140
///
1141
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1142
/// ```rust
1143
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1144
/// use nom::number::be_f64;
1145
///
1146
/// let parser = |s| {
1147
///   be_f64::<_, (_, ErrorKind)>().parse(s)
1148
/// };
1149
///
1150
/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1151
/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7))));
1152
/// ```
1153
#[inline]
1154
0
pub fn be_f64<I, E: ParseError<I>>() -> impl Parser<I, Output = f64, Error = E>
1155
0
where
1156
0
  I: Input<Item = u8>,
1157
{
1158
0
  be_u64().map(f64::from_bits)
1159
0
}
1160
1161
/// Recognizes a little endian 4 bytes floating point number.
1162
///
1163
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1164
/// ```rust
1165
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1166
/// use nom::number::le_f32;
1167
///
1168
/// let parser = |s| {
1169
///   le_f32::<_, (_, ErrorKind)>().parse(s)
1170
/// };
1171
///
1172
/// assert_eq!(parser(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
1173
/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3))));
1174
/// ```
1175
#[inline]
1176
0
pub fn le_f32<I, E: ParseError<I>>() -> impl Parser<I, Output = f32, Error = E>
1177
0
where
1178
0
  I: Input<Item = u8>,
1179
{
1180
0
  le_u32().map(f32::from_bits)
1181
0
}
1182
1183
/// Recognizes a little endian 8 bytes floating point number.
1184
///
1185
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1186
/// ```rust
1187
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1188
/// use nom::number::le_f64;
1189
///
1190
/// let parser = |s| {
1191
///   le_f64::<_, (_, ErrorKind)>().parse(s)
1192
/// };
1193
///
1194
/// assert_eq!(parser(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 3145728.0)));
1195
/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7))));
1196
/// ```
1197
#[inline]
1198
0
pub fn le_f64<I, E: ParseError<I>>() -> impl Parser<I, Output = f64, Error = E>
1199
0
where
1200
0
  I: Input<Item = u8>,
1201
{
1202
0
  le_u64().map(f64::from_bits)
1203
0
}
1204
1205
/// Recognizes a 4 byte floating point number
1206
///
1207
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f32 float,
1208
/// otherwise if `nom::number::Endianness::Little` parse a little endian f32 float.
1209
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1210
/// ```rust
1211
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1212
/// # use nom::Needed::Size;
1213
/// use nom::number::f32;
1214
///
1215
/// let be_f32 = |s| {
1216
///   f32::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1217
/// };
1218
///
1219
/// assert_eq!(be_f32(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1220
/// assert_eq!(be_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1))));
1221
///
1222
/// let le_f32 = |s| {
1223
///   f32::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1224
/// };
1225
///
1226
/// assert_eq!(le_f32(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
1227
/// assert_eq!(le_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1))));
1228
/// ```
1229
#[inline]
1230
0
pub fn f32<I, E: ParseError<I>>(
1231
0
  endian: crate::number::Endianness,
1232
0
) -> impl Parser<I, Output = f32, Error = E>
1233
0
where
1234
0
  I: Input<Item = u8>,
1235
{
1236
0
  match endian {
1237
0
    crate::number::Endianness::Big => Either::Left(be_f32()),
1238
0
    crate::number::Endianness::Little => Either::Right(le_f32()),
1239
    #[cfg(target_endian = "big")]
1240
    crate::number::Endianness::Native => Either::Left(be_f32()),
1241
    #[cfg(target_endian = "little")]
1242
0
    crate::number::Endianness::Native => Either::Right(le_f32()),
1243
  }
1244
0
}
1245
1246
/// Recognizes an 8 byte floating point number
1247
///
1248
/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f64 float,
1249
/// otherwise if `nom::number::Endianness::Little` parse a little endian f64 float.
1250
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1251
/// ```rust
1252
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1253
/// # use nom::Needed::Size;
1254
/// use nom::number::f64;
1255
///
1256
/// let be_f64 = |s| {
1257
///   f64::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1258
/// };
1259
///
1260
/// assert_eq!(be_f64(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1261
/// assert_eq!(be_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5))));
1262
///
1263
/// let le_f64 = |s| {
1264
///   f64::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1265
/// };
1266
///
1267
/// assert_eq!(le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5)));
1268
/// assert_eq!(le_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5))));
1269
/// ```
1270
#[inline]
1271
0
pub fn f64<I, E: ParseError<I>>(
1272
0
  endian: crate::number::Endianness,
1273
0
) -> impl Parser<I, Output = f64, Error = E>
1274
0
where
1275
0
  I: Input<Item = u8>,
1276
{
1277
0
  match endian {
1278
0
    crate::number::Endianness::Big => Either::Left(be_f64()),
1279
0
    crate::number::Endianness::Little => Either::Right(le_f64()),
1280
    #[cfg(target_endian = "big")]
1281
    crate::number::Endianness::Native => Either::Left(be_f64()),
1282
    #[cfg(target_endian = "little")]
1283
0
    crate::number::Endianness::Native => Either::Right(le_f64()),
1284
  }
1285
0
}
1286
1287
/// Recognizes a floating point number in text format and returns the corresponding part of the input.
1288
///
1289
/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if it reaches the end of input.
1290
///
1291
/// ```rust
1292
/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1293
/// use nom::number::recognize_float;
1294
///
1295
/// let parser = |s| {
1296
///   recognize_float().parse(s)
1297
/// };
1298
///
1299
/// assert_eq!(parser("11e-1;"), Ok((";", "11e-1")));
1300
/// assert_eq!(parser("123E-02;"), Ok((";", "123E-02")));
1301
/// assert_eq!(parser("123K-01"), Ok(("K-01", "123")));
1302
/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char))));
1303
/// ```
1304
#[rustfmt::skip]
1305
0
pub fn recognize_float<T, E:ParseError<T>>() -> impl Parser<T, Output=T,Error= E>
1306
0
where
1307
0
  T: Clone + Offset,
1308
0
  T: Input,
1309
0
  <T as Input>::Item: AsChar,
1310
{
1311
0
  recognize((
1312
0
      opt(alt((char('+'), char('-')))),
1313
0
      alt((
1314
0
        map((digit1(), opt(pair(char('.'), opt(digit1())))), |_| ()),
1315
0
        map((char('.'), digit1()), |_| ())
1316
      )),
1317
0
      opt((
1318
0
        alt((char('e'), char('E'))),
1319
0
        opt(alt((char('+'), char('-')))),
1320
0
        cut(digit1())
1321
0
      ))
1322
  ))
1323
0
}
1324
1325
/// float number text parser that also recognizes "nan", "infinity" and "inf" (case insensitive)
1326
0
pub fn recognize_float_or_exceptions<T, E: ParseError<T>>() -> impl Parser<T, Output = T, Error = E>
1327
0
where
1328
0
  T: Clone + Offset,
1329
0
  T: Input + Compare<&'static str>,
1330
0
  <T as Input>::Item: AsChar,
1331
{
1332
0
  alt((
1333
0
    recognize_float::<_, E>(),
1334
0
    |i: T| {
1335
0
      crate::bytes::streaming::tag_no_case::<_, _, E>("nan")(i.clone())
1336
0
        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1337
0
    },
1338
0
    |i: T| {
1339
0
      crate::bytes::streaming::tag_no_case::<_, _, E>("infinity")(i.clone())
1340
0
        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1341
0
    },
1342
0
    |i: T| {
1343
0
      crate::bytes::streaming::tag_no_case::<_, _, E>("inf")(i.clone())
1344
0
        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1345
0
    },
1346
  ))
1347
0
}
1348
1349
/// single precision floating point number parser from text
1350
0
pub fn float<T, E: ParseError<T>>() -> impl Parser<T, Output = f32, Error = E>
1351
0
where
1352
0
  T: Clone + Offset,
1353
0
  T: Input + crate::traits::ParseTo<f32> + Compare<&'static str>,
1354
0
  <T as Input>::Item: AsChar + Clone,
1355
0
  T: AsBytes,
1356
0
  T: for<'a> Compare<&'a [u8]>,
1357
{
1358
0
  Float {
1359
0
    o: PhantomData,
1360
0
    e: PhantomData,
1361
0
  }
1362
0
}
1363
1364
/// double precision floating point number parser from text
1365
0
pub fn double<T, E: ParseError<T>>() -> impl Parser<T, Output = f64, Error = E>
1366
0
where
1367
0
  T: Clone + Offset,
1368
0
  T: Input + crate::traits::ParseTo<f64> + Compare<&'static str>,
1369
0
  <T as Input>::Item: AsChar + Clone,
1370
0
  T: AsBytes,
1371
0
  T: for<'a> Compare<&'a [u8]>,
1372
{
1373
0
  Float {
1374
0
    o: PhantomData,
1375
0
    e: PhantomData,
1376
0
  }
1377
0
}
1378
1379
/// f64 parser from text
1380
struct Float<O, E> {
1381
  o: PhantomData<O>,
1382
  e: PhantomData<E>,
1383
}
1384
1385
impl<I, O, E: ParseError<I>> Parser<I> for Float<O, E>
1386
where
1387
  I: Clone + Offset,
1388
  I: Input + crate::traits::ParseTo<O> + Compare<&'static str>,
1389
  <I as Input>::Item: AsChar + Clone,
1390
  I: AsBytes,
1391
  I: for<'a> Compare<&'a [u8]>,
1392
{
1393
  type Output = O;
1394
  type Error = E;
1395
1396
0
  fn process<OM: crate::OutputMode>(
1397
0
    &mut self,
1398
0
    input: I,
1399
0
  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
1400
0
    let (i, s) =
1401
0
      recognize_float_or_exceptions().process::<OutputM<Emit, OM::Error, OM::Incomplete>>(input)?;
1402
1403
0
    match s.parse_to() {
1404
0
      Some(f) => Ok((i, OM::Output::bind(|| f))),
1405
0
      None => Err(crate::Err::Error(OM::Error::bind(|| {
1406
0
        E::from_error_kind(i, crate::error::ErrorKind::Float)
1407
0
      }))),
1408
    }
1409
0
  }
1410
}
1411
1412
#[cfg(test)]
1413
#[cfg(feature = "std")]
1414
mod tests {
1415
  use super::*;
1416
  use crate::error::ErrorKind;
1417
  use crate::internal::Err;
1418
1419
  macro_rules! assert_parse(
1420
    ($left: expr, $right: expr) => {
1421
      let res: $crate::IResult<_, _, (_, ErrorKind)> = $left;
1422
      assert_eq!(res, $right);
1423
    };
1424
  );
1425
1426
  #[test]
1427
  fn float_test() {
1428
    let mut test_cases = vec![
1429
      "+3.14",
1430
      "3.14",
1431
      "-3.14",
1432
      "0",
1433
      "0.0",
1434
      "1.",
1435
      ".789",
1436
      "-.5",
1437
      "1e7",
1438
      "-1E-7",
1439
      ".3e-2",
1440
      "1.e4",
1441
      "1.2e4",
1442
      "12.34",
1443
      "-1.234E-12",
1444
      "-1.234e-12",
1445
      "0.00000000000000000087",
1446
    ];
1447
1448
    for test in test_cases.drain(..) {
1449
      let expected32 = str::parse::<f32>(test).unwrap();
1450
      let expected64 = str::parse::<f64>(test).unwrap();
1451
1452
      println!("now parsing: {} -> {}", test, expected32);
1453
1454
      assert_parse!(recognize_float().parse_complete(test), Ok(("", test)));
1455
1456
      /*assert_parse!(float(test.as_bytes()), Ok((&b""[..], expected32)));
1457
      assert_parse!(float(test), Ok(("", expected32)));
1458
      */
1459
1460
      assert_parse!(
1461
        double().parse_complete(test.as_bytes()),
1462
        Ok((&b""[..], expected64))
1463
      );
1464
      assert_parse!(double().parse_complete(test), Ok(("", expected64)));
1465
    }
1466
1467
    let remaining_exponent = "-1.234E-";
1468
    assert_parse!(
1469
      recognize_float().parse_complete(remaining_exponent),
1470
      Err(Err::Failure(("", ErrorKind::Digit)))
1471
    );
1472
1473
    /*let (_i, nan) = float::<_, ()>("NaN").unwrap();
1474
    assert!(nan.is_nan());
1475
1476
    let (_i, inf) = float::<_, ()>("inf").unwrap();
1477
    assert!(inf.is_infinite());
1478
    let (i, inf) = float::<_, ()>("infinity").unwrap();
1479
    assert!(inf.is_infinite());
1480
    assert!(i.is_empty());*/
1481
  }
1482
}