Skip to content

Commit

Permalink
Merge pull request #259 from epage/escape
Browse files Browse the repository at this point in the history
fix(ascii): Allow escaped_transform on core
  • Loading branch information
epage authored Jun 26, 2023
2 parents f3af22b + 0666747 commit 081f825
Showing 1 changed file with 53 additions and 63 deletions.
116 changes: 53 additions & 63 deletions src/ascii/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1457,7 +1457,7 @@ where
}

fn streaming_escaped_internal<I, Error, F, G, O1, O2>(
input: I,
mut input: I,
normal: &mut F,
control_char: char,
escapable: &mut G,
Expand All @@ -1470,34 +1470,34 @@ where
G: Parser<I, O2, Error>,
Error: ParseError<I>,
{
let mut i = input.clone();
let start = input.clone();

while i.eof_offset() > 0 {
let current_len = i.eof_offset();
while input.eof_offset() > 0 {
let current_len = input.eof_offset();

match normal.parse_next(i.clone()) {
match normal.parse_next(input.clone()) {
Ok((i2, _)) => {
if i2.eof_offset() == 0 {
return Err(ErrMode::Incomplete(Needed::Unknown));
} else if i2.eof_offset() == current_len {
let offset = i2.offset_from(&input);
return Ok(input.next_slice(offset));
let offset = i2.offset_from(&start);
return Ok(start.next_slice(offset));
} else {
i = i2;
input = i2;
}
}
Err(ErrMode::Backtrack(_)) => {
if i.next_token().expect("eof_offset > 0").1.as_char() == control_char {
if input.next_token().expect("eof_offset > 0").1.as_char() == control_char {
let next = control_char.len_utf8();
let (i2, _) = escapable.parse_next(i.next_slice(next).0)?;
let (i2, _) = escapable.parse_next(input.next_slice(next).0)?;
if i2.eof_offset() == 0 {
return Err(ErrMode::Incomplete(Needed::Unknown));
} else {
i = i2;
input = i2;
}
} else {
let offset = i.offset_from(&input);
return Ok(input.next_slice(offset));
let offset = input.offset_from(&start);
return Ok(start.next_slice(offset));
}
}
Err(e) => {
Expand All @@ -1510,7 +1510,7 @@ where
}

fn complete_escaped_internal<'a, I: 'a, Error, F, G, O1, O2>(
input: I,
mut input: I,
normal: &mut F,
control_char: char,
escapable: &mut G,
Expand All @@ -1523,36 +1523,36 @@ where
G: Parser<I, O2, Error>,
Error: ParseError<I>,
{
let mut i = input.clone();
let start = input.clone();

while i.eof_offset() > 0 {
let current_len = i.eof_offset();
while input.eof_offset() > 0 {
let current_len = input.eof_offset();

match normal.parse_next(i.clone()) {
match normal.parse_next(input.clone()) {
Ok((i2, _)) => {
// return if we consumed everything or if the normal parser
// does not consume anything
if i2.eof_offset() == 0 {
return Ok(input.next_slice(input.eof_offset()));
return Ok(start.finish());
} else if i2.eof_offset() == current_len {
let offset = i2.offset_from(&input);
return Ok(input.next_slice(offset));
let offset = i2.offset_from(&start);
return Ok(start.next_slice(offset));
} else {
i = i2;
input = i2;
}
}
Err(ErrMode::Backtrack(_)) => {
if i.next_token().expect("eof_offset > 0").1.as_char() == control_char {
if input.next_token().expect("eof_offset > 0").1.as_char() == control_char {
let next = control_char.len_utf8();
let (i2, _) = escapable.parse_next(i.next_slice(next).0)?;
let (i2, _) = escapable.parse_next(input.next_slice(next).0)?;
if i2.eof_offset() == 0 {
return Ok(input.finish());
return Ok(start.finish());
} else {
i = i2;
input = i2;
}
} else {
let offset = i.offset_from(&input);
return Ok(input.next_slice(offset));
let offset = input.offset_from(&start);
return Ok(start.next_slice(offset));
}
}
Err(e) => {
Expand Down Expand Up @@ -1623,7 +1623,6 @@ where
///
/// assert_eq!(parser(Partial::new("ab\\\"cd\"")), Ok((Partial::new("\""), String::from("ab\"cd"))));
/// ```
#[cfg(feature = "alloc")]
#[inline(always)]
pub fn escaped_transform<I, Error, F, G, Output>(
mut normal: F,
Expand All @@ -1648,9 +1647,8 @@ where
})
}

#[cfg(feature = "alloc")]
fn streaming_escaped_transform_internal<I, Error, F, G, Output>(
input: I,
mut input: I,
normal: &mut F,
control_char: char,
transform: &mut G,
Expand All @@ -1664,37 +1662,33 @@ where
G: Parser<I, <I as Stream>::Slice, Error>,
Error: ParseError<I>,
{
let mut offset = 0;
let mut res = Output::initial(Some(input.eof_offset()));

let i = input.clone();

while offset < i.eof_offset() {
let current_len = i.eof_offset();
let remainder = i.next_slice(offset).0;
match normal.parse_next(remainder.clone()) {
while input.eof_offset() > 0 {
let current_len = input.eof_offset();
match normal.parse_next(input.clone()) {
Ok((i2, o)) => {
res.accumulate(o);
if i2.eof_offset() == 0 {
return Err(ErrMode::Incomplete(Needed::Unknown));
} else if i2.eof_offset() == current_len {
return Ok((remainder, res));
return Ok((i2, res));
} else {
offset = i2.offset_from(&input);
input = i2;
}
}
Err(ErrMode::Backtrack(_)) => {
if remainder.next_token().expect("eof_offset > 0").1.as_char() == control_char {
let next = offset + control_char.len_utf8();
let (i2, o) = transform.parse_next(i.next_slice(next).0)?;
if input.next_token().expect("eof_offset > 0").1.as_char() == control_char {
let next = control_char.len_utf8();
let (i2, o) = transform.parse_next(input.next_slice(next).0)?;
res.accumulate(o);
if i2.eof_offset() == 0 {
return Err(ErrMode::Incomplete(Needed::Unknown));
} else {
offset = i2.offset_from(&input);
input = i2;
}
} else {
return Ok((remainder, res));
return Ok((input, res));
}
}
Err(e) => return Err(e),
Expand All @@ -1703,9 +1697,8 @@ where
Err(ErrMode::Incomplete(Needed::Unknown))
}

#[cfg(feature = "alloc")]
fn complete_escaped_transform_internal<I, Error, F, G, Output>(
input: I,
mut input: I,
normal: &mut F,
control_char: char,
transform: &mut G,
Expand All @@ -1719,43 +1712,40 @@ where
G: Parser<I, <I as Stream>::Slice, Error>,
Error: ParseError<I>,
{
let mut offset = 0;
let mut res = Output::initial(Some(input.eof_offset()));

let i = input.clone();
while input.eof_offset() > 0 {
let current_len = input.eof_offset();

while offset < i.eof_offset() {
let current_len = i.eof_offset();
let (remainder, _) = i.next_slice(offset);
match normal.parse_next(remainder.clone()) {
match normal.parse_next(input.clone()) {
Ok((i2, o)) => {
res.accumulate(o);
if i2.eof_offset() == 0 {
return Ok((i.next_slice(i.eof_offset()).0, res));
return Ok((input.finish().0, res));
} else if i2.eof_offset() == current_len {
return Ok((remainder, res));
return Ok((input, res));
} else {
offset = i2.offset_from(&input);
input = i2;
}
}
Err(ErrMode::Backtrack(_)) => {
if remainder.next_token().expect("eof_offset > 0").1.as_char() == control_char {
let next = offset + control_char.len_utf8();
let (i2, o) = transform.parse_next(i.next_slice(next).0)?;
if input.next_token().expect("eof_offset > 0").1.as_char() == control_char {
let next = control_char.len_utf8();
let (i2, o) = transform.parse_next(input.next_slice(next).0)?;
res.accumulate(o);
if i2.eof_offset() == 0 {
return Ok((i.finish().0, res));
return Ok((input.finish().0, res));
} else {
offset = i2.offset_from(&input);
input = i2;
}
} else {
return Ok((remainder, res));
return Ok((input, res));
}
}
Err(e) => return Err(e),
}
}
Ok((input.next_slice(offset).0, res))
Ok((input, res))
}

mod sealed {
Expand Down

0 comments on commit 081f825

Please sign in to comment.