2018-06-12 19:32:55 +00:00
|
|
|
/*
|
2018-06-19 18:51:17 +00:00
|
|
|
* Copyright 2016 - 2018 Andreas Nordal
|
2018-06-12 19:32:55 +00:00
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
2018-07-29 11:04:27 +00:00
|
|
|
pub fn prefixlen(a: &[u8], b: &[u8]) -> usize {
|
|
|
|
let mut i: usize = 0;
|
|
|
|
while i < a.len() && i < b.len() && a[i] == b[i] {
|
|
|
|
i += 1;
|
|
|
|
}
|
|
|
|
i
|
|
|
|
}
|
|
|
|
|
2019-11-28 21:43:06 +00:00
|
|
|
pub fn predlen(pred: impl Fn(u8) -> bool, horizon: &[u8]) -> usize {
|
2018-06-12 19:32:55 +00:00
|
|
|
let mut i: usize = 0;
|
|
|
|
while i < horizon.len() && pred(horizon[i]) {
|
|
|
|
i += 1;
|
|
|
|
}
|
|
|
|
i
|
|
|
|
}
|
|
|
|
|
2020-02-23 19:45:28 +00:00
|
|
|
#[rustfmt::skip]
|
2018-06-12 19:32:55 +00:00
|
|
|
pub fn is_identifierhead(c: u8) -> bool {
|
|
|
|
(c >= b'a' && c <= b'z')
|
|
|
|
|| (c >= b'A' && c <= b'Z')
|
|
|
|
|| (c == b'_')
|
|
|
|
}
|
|
|
|
|
2020-02-23 19:45:28 +00:00
|
|
|
#[rustfmt::skip]
|
2018-06-12 19:32:55 +00:00
|
|
|
pub fn is_identifiertail(c: u8) -> bool {
|
|
|
|
(c >= b'a' && c <= b'z')
|
|
|
|
|| (c >= b'A' && c <= b'Z')
|
|
|
|
|| (c >= b'0' && c <= b'9')
|
|
|
|
|| (c == b'_')
|
|
|
|
}
|
|
|
|
|
2018-06-23 07:56:17 +00:00
|
|
|
pub fn identifierlen(horizon: &[u8]) -> usize {
|
2019-06-12 17:40:17 +00:00
|
|
|
if !horizon.is_empty() && is_identifierhead(horizon[0]) {
|
2019-11-28 21:43:06 +00:00
|
|
|
1 + predlen(is_identifiertail, &horizon[1 ..])
|
2018-06-23 07:56:17 +00:00
|
|
|
} else {
|
|
|
|
0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-14 21:51:09 +00:00
|
|
|
pub fn is_whitespace(c: u8) -> bool {
|
2018-06-12 19:32:55 +00:00
|
|
|
c <= b' '
|
|
|
|
}
|
2018-06-19 18:51:17 +00:00
|
|
|
|
|
|
|
pub fn is_word(byte: u8) -> bool {
|
|
|
|
match byte {
|
2019-11-23 11:18:56 +00:00
|
|
|
0 ..= b' ' => false,
|
2018-06-19 18:51:17 +00:00
|
|
|
b'&' => false,
|
|
|
|
b'(' => false,
|
|
|
|
b')' => false,
|
|
|
|
b';' => false,
|
|
|
|
b'<' => false,
|
|
|
|
b'>' => false,
|
|
|
|
b'`' => false,
|
|
|
|
b'|' => false,
|
2020-02-23 19:45:28 +00:00
|
|
|
_ => true,
|
2018-06-19 18:51:17 +00:00
|
|
|
}
|
|
|
|
}
|