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