summaryrefslogtreecommitdiffstats
path: root/vendor/nom/src/bits
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
commit9835e2ae736235810b4ea1c162ca5e65c547e770 (patch)
tree3fcebf40ed70e581d776a8a4c65923e8ec20e026 /vendor/nom/src/bits
parentReleasing progress-linux version 1.70.0+dfsg2-1~progress7.99u1. (diff)
downloadrustc-9835e2ae736235810b4ea1c162ca5e65c547e770.tar.xz
rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.zip
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/nom/src/bits')
-rw-r--r--vendor/nom/src/bits/complete.rs47
-rw-r--r--vendor/nom/src/bits/mod.rs10
-rw-r--r--vendor/nom/src/bits/streaming.rs41
3 files changed, 93 insertions, 5 deletions
diff --git a/vendor/nom/src/bits/complete.rs b/vendor/nom/src/bits/complete.rs
index b46bc7a27..bf36dcc2a 100644
--- a/vendor/nom/src/bits/complete.rs
+++ b/vendor/nom/src/bits/complete.rs
@@ -105,6 +105,29 @@ where
}
}
+/// Parses one specific bit as a bool.
+///
+/// # Example
+/// ```rust
+/// # use nom::bits::complete::bool;
+/// # use nom::IResult;
+/// # use nom::error::{Error, ErrorKind};
+///
+/// fn parse(input: (&[u8], usize)) -> IResult<(&[u8], usize), bool> {
+/// bool(input)
+/// }
+///
+/// assert_eq!(parse(([0b10000000].as_ref(), 0)), Ok((([0b10000000].as_ref(), 1), true)));
+/// assert_eq!(parse(([0b10000000].as_ref(), 1)), Ok((([0b10000000].as_ref(), 2), false)));
+/// ```
+pub fn bool<I, E: ParseError<(I, usize)>>(input: (I, usize)) -> IResult<(I, usize), bool, E>
+where
+ I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
+{
+ let (res, bit): (_, u32) = take(1usize)(input)?;
+ Ok((res, bit != 0))
+}
+
#[cfg(test)]
mod test {
use super::*;
@@ -147,4 +170,28 @@ mod test {
Ok((([0b11111111].as_ref(), 4), 0b1000110100111111111111))
);
}
+
+ #[test]
+ fn test_bool_0() {
+ let input = [0b10000000].as_ref();
+
+ let result: crate::IResult<(&[u8], usize), bool> = bool((input, 0));
+
+ assert_eq!(result, Ok(((input, 1), true)));
+ }
+
+ #[test]
+ fn test_bool_eof() {
+ let input = [0b10000000].as_ref();
+
+ let result: crate::IResult<(&[u8], usize), bool> = bool((input, 8));
+
+ assert_eq!(
+ result,
+ Err(crate::Err::Error(crate::error::Error {
+ input: (input, 8),
+ code: ErrorKind::Eof
+ }))
+ );
+ }
}
diff --git a/vendor/nom/src/bits/mod.rs b/vendor/nom/src/bits/mod.rs
index 235b7973e..0d3f73db2 100644
--- a/vendor/nom/src/bits/mod.rs
+++ b/vendor/nom/src/bits/mod.rs
@@ -5,7 +5,7 @@ pub mod complete;
pub mod streaming;
use crate::error::{ErrorKind, ParseError};
-use crate::internal::{Err, IResult, Needed};
+use crate::internal::{Err, IResult, Needed, Parser};
use crate::lib::std::ops::RangeFrom;
use crate::traits::{ErrorConvert, Slice};
@@ -42,9 +42,9 @@ where
E1: ParseError<(I, usize)> + ErrorConvert<E2>,
E2: ParseError<I>,
I: Slice<RangeFrom<usize>>,
- P: FnMut((I, usize)) -> IResult<(I, usize), O, E1>,
+ P: Parser<(I, usize), O, E1>,
{
- move |input: I| match parser((input, 0)) {
+ move |input: I| match parser.parse((input, 0)) {
Ok(((rest, offset), result)) => {
// If the next byte has been partially read, it will be sliced away as well.
// The parser functions might already slice away all fully read bytes.
@@ -88,7 +88,7 @@ where
E1: ParseError<I> + ErrorConvert<E2>,
E2: ParseError<(I, usize)>,
I: Slice<RangeFrom<usize>> + Clone,
- P: FnMut(I) -> IResult<I, O, E1>,
+ P: Parser<I, O, E1>,
{
move |(input, offset): (I, usize)| {
let inner = if offset % 8 != 0 {
@@ -97,7 +97,7 @@ where
input.slice((offset / 8)..)
};
let i = (input, offset);
- match parser(inner) {
+ match parser.parse(inner) {
Ok((rest, res)) => Ok(((rest, 0), res)),
Err(Err::Incomplete(Needed::Unknown)) => Err(Err::Incomplete(Needed::Unknown)),
Err(Err::Incomplete(Needed::Size(sz))) => Err(match sz.get().checked_mul(8) {
diff --git a/vendor/nom/src/bits/streaming.rs b/vendor/nom/src/bits/streaming.rs
index e8adc1c0d..a7c8d0a67 100644
--- a/vendor/nom/src/bits/streaming.rs
+++ b/vendor/nom/src/bits/streaming.rs
@@ -79,6 +79,29 @@ where
}
}
+/// Parses one specific bit as a bool.
+///
+/// # Example
+/// ```rust
+/// # use nom::bits::complete::bool;
+/// # use nom::IResult;
+/// # use nom::error::{Error, ErrorKind};
+///
+/// fn parse(input: (&[u8], usize)) -> IResult<(&[u8], usize), bool> {
+/// bool(input)
+/// }
+///
+/// assert_eq!(parse(([0b10000000].as_ref(), 0)), Ok((([0b10000000].as_ref(), 1), true)));
+/// assert_eq!(parse(([0b10000000].as_ref(), 1)), Ok((([0b10000000].as_ref(), 2), false)));
+/// ```
+pub fn bool<I, E: ParseError<(I, usize)>>(input: (I, usize)) -> IResult<(I, usize), bool, E>
+where
+ I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
+{
+ let (res, bit): (_, u32) = take(1usize)(input)?;
+ Ok((res, bit != 0))
+}
+
#[cfg(test)]
mod test {
use super::*;
@@ -126,4 +149,22 @@ mod test {
}))
);
}
+
+ #[test]
+ fn test_bool_0() {
+ let input = [0b10000000].as_ref();
+
+ let result: crate::IResult<(&[u8], usize), bool> = bool((input, 0));
+
+ assert_eq!(result, Ok(((input, 1), true)));
+ }
+
+ #[test]
+ fn test_bool_eof() {
+ let input = [0b10000000].as_ref();
+
+ let result: crate::IResult<(&[u8], usize), bool> = bool((input, 8));
+
+ assert_eq!(result, Err(crate::Err::Incomplete(Needed::new(1))));
+ }
}