pub(crate) fn count_unescaped_quotes(s: &str) -> usize {
let mut count = 0usize;
let mut backslashes = 0usize;
for ch in s.chars() {
if ch == '\\' {
backslashes += 1;
continue;
}
if ch == '"' && backslashes.is_multiple_of(2) {
count += 1;
}
backslashes = 0;
}
count
}
pub(crate) fn has_complete_quoted_segment(s: &str) -> bool {
count_unescaped_quotes(s) >= 2
}
pub(crate) fn collect_all_quoted(s: &str) -> Vec<String> {
let bytes: &[u8] = s.as_bytes();
let mut out: Vec<String> = Vec::new();
let mut i: usize = 0usize;
while i < bytes.len() {
if bytes[i] == b'"' {
i += 1; let start = i;
while i < bytes.len() && bytes[i] != b'"' {
i += 1;
}
if i <= bytes.len() {
out.push(s[start..i].to_string());
i += 1; continue;
} else {
break; }
}
i += 1;
}
out
}