|
1 | 1 | use core::fmt;
|
2 | 2 | use core::str;
|
3 | 3 |
|
4 |
| -use memchr::memchr; |
| 4 | +use memchr::{memchr, memchr2}; |
5 | 5 |
|
6 | 6 | use crate::{QuoteStyle, Terminator};
|
7 | 7 |
|
@@ -299,7 +299,7 @@ impl Writer {
|
299 | 299 | let (res, i, o) = if self.state.quoting {
|
300 | 300 | quote(input, output, self.quote, self.escape, self.double_quote)
|
301 | 301 | } else {
|
302 |
| - write_optimistic(input, output) |
| 302 | + escape(input, output, self.escape, self.delimiter) |
303 | 303 | };
|
304 | 304 | nin += i;
|
305 | 305 | nout += o;
|
@@ -572,6 +572,44 @@ pub fn quote(
|
572 | 572 | }
|
573 | 573 | }
|
574 | 574 |
|
| 575 | +pub fn escape( |
| 576 | + mut input: &[u8], |
| 577 | + mut output: &mut [u8], |
| 578 | + escape: u8, |
| 579 | + delimiter: u8, |
| 580 | +) -> (WriteResult, usize, usize) { |
| 581 | + let (mut nin, mut nout) = (0, 0); |
| 582 | + loop { |
| 583 | + match memchr2(delimiter, escape, input) { |
| 584 | + None => { |
| 585 | + let (res, i, o) = write_optimistic(input, output); |
| 586 | + nin += i; |
| 587 | + nout += o; |
| 588 | + return (res, nin, nout); |
| 589 | + } |
| 590 | + Some(next) => { |
| 591 | + let char = input[next]; |
| 592 | + let (res, i, o) = write_optimistic(&input[..next], output); |
| 593 | + input = &input[i..]; |
| 594 | + output = &mut moving(output)[o..]; |
| 595 | + nin += i; |
| 596 | + nout += o; |
| 597 | + if let WriteResult::OutputFull = res { |
| 598 | + return (res, nin, nout); |
| 599 | + } |
| 600 | + let (res, o) = write_pessimistic(&[escape, char], output); |
| 601 | + if let WriteResult::OutputFull = res { |
| 602 | + return (res, nin, nout); |
| 603 | + } |
| 604 | + nout += o; |
| 605 | + output = &mut moving(output)[o..]; |
| 606 | + nin += 1; |
| 607 | + input = &input[1..]; |
| 608 | + } |
| 609 | + } |
| 610 | + } |
| 611 | +} |
| 612 | + |
575 | 613 | /// Copy the bytes from `input` to `output`. If `output` is too small to fit
|
576 | 614 | /// everything from `input`, then copy `output.len()` bytes from `input`.
|
577 | 615 | /// Otherwise, copy everything from `input` into `output`.
|
|
0 commit comments