-
-
Notifications
You must be signed in to change notification settings - Fork 12
/
write.rs
110 lines (99 loc) · 2.68 KB
/
write.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::output::Output;
use crate::parse::Properties;
use crate::CHUNK;
const HEAD: &str = "\
// \x40generated by ../generate. To regenerate, run the following in the repo root:
//
// $ curl -LO https://www.unicode.org/Public/zipped/15.0.0/UCD.zip
// $ unzip UCD.zip -d UCD
// $ cargo run --manifest-path generate/Cargo.toml
const T: bool = true;
const F: bool = false;
#[repr(C, align(8))]
pub(crate) struct Align8<T>(pub(crate) T);
#[repr(C, align(64))]
pub(crate) struct Align64<T>(pub(crate) T);
";
pub fn output(
properties: &Properties,
index_start: &[u8],
index_continue: &[u8],
halfdense: &[u8],
) -> Output {
let mut out = Output::new();
writeln!(out, "{}", HEAD);
writeln!(
out,
"pub(crate) static ASCII_START: Align64<[bool; 128]> = Align64([",
);
for i in 0u8..4 {
write!(out, " ");
for j in 0..32 {
let ch = (i * 32 + j) as char;
let is_xid_start = properties.is_xid_start(ch);
write!(out, " {},", if is_xid_start { 'T' } else { 'F' });
}
writeln!(out);
}
writeln!(out, "]);");
writeln!(out);
writeln!(
out,
"pub(crate) static ASCII_CONTINUE: Align64<[bool; 128]> = Align64([",
);
for i in 0u8..4 {
write!(out, " ");
for j in 0..32 {
let ch = (i * 32 + j) as char;
let is_xid_continue = properties.is_xid_continue(ch);
write!(out, " {},", if is_xid_continue { 'T' } else { 'F' });
}
writeln!(out);
}
writeln!(out, "]);");
writeln!(out);
writeln!(out, "pub(crate) const CHUNK: usize = {};", CHUNK);
writeln!(out);
writeln!(
out,
"pub(crate) static TRIE_START: Align8<[u8; {}]> = Align8([",
index_start.len(),
);
for line in index_start.chunks(16) {
write!(out, " ");
for byte in line {
write!(out, " 0x{:02X},", byte);
}
writeln!(out);
}
writeln!(out, "]);");
writeln!(out);
writeln!(
out,
"pub(crate) static TRIE_CONTINUE: Align8<[u8; {}]> = Align8([",
index_continue.len(),
);
for line in index_continue.chunks(16) {
write!(out, " ");
for byte in line {
write!(out, " 0x{:02X},", byte);
}
writeln!(out);
}
writeln!(out, "]);");
writeln!(out);
writeln!(
out,
"pub(crate) static LEAF: Align64<[u8; {}]> = Align64([",
halfdense.len(),
);
for line in halfdense.chunks(16) {
write!(out, " ");
for byte in line {
write!(out, " 0x{:02X},", byte);
}
writeln!(out);
}
writeln!(out, "]);");
out
}