Skip to main content

irc3/proto/
escaping.rs

1pub fn unescape<S: AsRef<str> + ?Sized>(s: &S) -> String {
2	// get string ref
3	let string = s.as_ref();
4
5	let mut buf = String::with_capacity(string.len());
6
7	// iterate through the string
8	let mut cursor: usize = 0;
9
10	while cursor < string.len() {
11		let ch = string[cursor..].chars().next().unwrap();
12
13		if ch == '\\' {
14			// escape found!!
15			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	// get string ref
40	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}