1pub fn unescape<S: AsRef<str> + ?Sized>(s: &S) -> String {
2 let string = s.as_ref();
4
5 let mut buf = String::with_capacity(string.len());
6
7 let mut cursor: usize = 0;
9
10 while cursor < string.len() {
11 let ch = string[cursor..].chars().next().unwrap();
12
13 if ch == '\\' {
14 cursor += ch.len_utf8();
16
17 if cursor < string.len() {
18 let ch = string[cursor..].chars().next().unwrap();
19
20 match ch {
21 ':' => buf.push(';'),
22 's' => buf.push(' '),
23 'r' => buf.push('\r'),
24 'n' => buf.push('\n'),
25 _ => buf.push(ch),
26 }
27 }
28 } else {
29 buf.push(ch);
30 }
31
32 cursor += ch.len_utf8();
33 }
34
35 buf
36}
37
38pub fn escape<S: AsRef<str> + ?Sized>(s: &S) -> String {
39 let string = s.as_ref();
41
42 let mut buf = String::with_capacity(string.len());
43
44 for c in string.chars() {
45 match c {
46 ';' => buf.push_str("\\:"),
47 ' ' => buf.push_str("\\s"),
48 '\\' => buf.push_str("\\\\"),
49 '\r' => buf.push_str("\\r"),
50 '\n' => buf.push_str("\\n"),
51 c => buf.push(c),
52 }
53 }
54
55 buf
56}