Skip to main content

jomini/
data.rs

1const fn create_windows_1252_table() -> [char; 256] {
2    let mut table = [0 as char; 256];
3    let mut i = 0usize;
4    while i < 256 {
5        let c = match i {
6            128 => '\u{20ac}',
7            129 => '\u{81}',
8            130 => '\u{201a}',
9            131 => '\u{0192}',
10            132 => '\u{201e}',
11            133 => '\u{2026}',
12            134 => '\u{2020}',
13            135 => '\u{2021}',
14            136 => '\u{02c6}',
15            137 => '\u{2030}',
16            138 => '\u{0160}',
17            139 => '\u{2039}',
18            140 => '\u{0152}',
19            141 => '\u{8d}',
20            142 => '\u{017d}',
21            143 => '\u{8f}',
22            144 => '\u{90}',
23            145 => '\u{2018}',
24            146 => '\u{2019}',
25            147 => '\u{201c}',
26            148 => '\u{201d}',
27            149 => '\u{2022}',
28            150 => '\u{2013}',
29            151 => '\u{2014}',
30            152 => '\u{02dc}',
31            153 => '\u{2122}',
32            154 => '\u{0161}',
33            155 => '\u{203a}',
34            156 => '\u{0153}',
35            157 => '\u{9d}',
36            158 => '\u{017e}',
37            159 => '\u{0178}',
38            i => i as u8 as char,
39        };
40        table[i] = c;
41        i += 1;
42    }
43    table
44}
45
46pub(crate) static WINDOWS_1252: [char; 256] = create_windows_1252_table();
47
48#[inline]
49pub(crate) fn is_boundary(b: u8) -> bool {
50    boundary(b) != 0
51}
52
53#[inline]
54pub(crate) fn boundary(b: u8) -> u8 {
55    CHARACTER_CLASS[usize::from(b)]
56}
57
58const fn create_character_class_table() -> [u8; 256] {
59    let mut table = [0u8; 256];
60    table[b'\t' as usize] = 1;
61    table[b'\n' as usize] = 1;
62    table[b'\x0b' as usize] = 1; // \v
63    table[b'\x0c' as usize] = 1; // \f
64    table[b'\r' as usize] = 1;
65    table[b' ' as usize] = 1;
66    table[b'!' as usize] = 1;
67    table[b'#' as usize] = 1;
68    table[b';' as usize] = 1;
69    table[b'<' as usize] = 1;
70    table[b'=' as usize] = 1;
71    table[b'>' as usize] = 1;
72    table[b'[' as usize] = 1;
73    table[b']' as usize] = 1;
74    table[b'}' as usize] = 1;
75    table[b'{' as usize] = 1;
76    table
77}
78
79/// This table serves as a way to encode multiple attributes of a character in a
80/// single place. This way we increase the likelihood that the table is in the
81/// cache as it is used in multiple call sites.
82pub(crate) static CHARACTER_CLASS: [u8; 256] = create_character_class_table();