Skip to content

Commit 8d84634

Browse files
committed
Add for escaping the delimiter in writer
1 parent 40ea4c4 commit 8d84634

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

csv-core/src/writer.rs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::fmt;
22
use core::str;
33

4-
use memchr::memchr;
4+
use memchr::{memchr, memchr2};
55

66
use crate::{QuoteStyle, Terminator};
77

@@ -299,7 +299,7 @@ impl Writer {
299299
let (res, i, o) = if self.state.quoting {
300300
quote(input, output, self.quote, self.escape, self.double_quote)
301301
} else {
302-
write_optimistic(input, output)
302+
escape(input, output, self.escape, self.delimiter)
303303
};
304304
nin += i;
305305
nout += o;
@@ -572,6 +572,44 @@ pub fn quote(
572572
}
573573
}
574574

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+
575613
/// Copy the bytes from `input` to `output`. If `output` is too small to fit
576614
/// everything from `input`, then copy `output.len()` bytes from `input`.
577615
/// Otherwise, copy everything from `input` into `output`.

0 commit comments

Comments
 (0)