Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/rust/syn/whitespace.rs
38271 views
1
// SPDX-License-Identifier: Apache-2.0 OR MIT
2
3
pub(crate) fn skip(mut s: &str) -> &str {
4
'skip: while !s.is_empty() {
5
let byte = s.as_bytes()[0];
6
if byte == b'/' {
7
if s.starts_with("//")
8
&& (!s.starts_with("///") || s.starts_with("////"))
9
&& !s.starts_with("//!")
10
{
11
if let Some(i) = s.find('\n') {
12
s = &s[i + 1..];
13
continue;
14
} else {
15
return "";
16
}
17
} else if s.starts_with("/**/") {
18
s = &s[4..];
19
continue;
20
} else if s.starts_with("/*")
21
&& (!s.starts_with("/**") || s.starts_with("/***"))
22
&& !s.starts_with("/*!")
23
{
24
let mut depth = 0;
25
let bytes = s.as_bytes();
26
let mut i = 0;
27
let upper = bytes.len() - 1;
28
while i < upper {
29
if bytes[i] == b'/' && bytes[i + 1] == b'*' {
30
depth += 1;
31
i += 1; // eat '*'
32
} else if bytes[i] == b'*' && bytes[i + 1] == b'/' {
33
depth -= 1;
34
if depth == 0 {
35
s = &s[i + 2..];
36
continue 'skip;
37
}
38
i += 1; // eat '/'
39
}
40
i += 1;
41
}
42
return s;
43
}
44
}
45
match byte {
46
b' ' | 0x09..=0x0D => {
47
s = &s[1..];
48
continue;
49
}
50
b if b <= 0x7F => {}
51
_ => {
52
let ch = s.chars().next().unwrap();
53
if is_whitespace(ch) {
54
s = &s[ch.len_utf8()..];
55
continue;
56
}
57
}
58
}
59
return s;
60
}
61
s
62
}
63
64
fn is_whitespace(ch: char) -> bool {
65
// Rust treats left-to-right mark and right-to-left mark as whitespace
66
ch.is_whitespace() || ch == '\u{200e}' || ch == '\u{200f}'
67
}
68
69