16e652d70Sopenharmony_ciuse crate::output::Output;
26e652d70Sopenharmony_ciuse crate::parse::Properties;
36e652d70Sopenharmony_ciuse crate::CHUNK;
46e652d70Sopenharmony_ci
56e652d70Sopenharmony_ciconst HEAD: &str = "\
66e652d70Sopenharmony_ci// \x40generated by ../generate. To regenerate, run the following in the repo root:
76e652d70Sopenharmony_ci//
86e652d70Sopenharmony_ci// $ curl -LO https://www.unicode.org/Public/zipped/15.0.0/UCD.zip
96e652d70Sopenharmony_ci// $ unzip UCD.zip -d UCD
106e652d70Sopenharmony_ci// $ cargo run --manifest-path generate/Cargo.toml
116e652d70Sopenharmony_ci
126e652d70Sopenharmony_ciconst T: bool = true;
136e652d70Sopenharmony_ciconst F: bool = false;
146e652d70Sopenharmony_ci
156e652d70Sopenharmony_ci#[repr(C, align(8))]
166e652d70Sopenharmony_cipub(crate) struct Align8<T>(pub(crate) T);
176e652d70Sopenharmony_ci#[repr(C, align(64))]
186e652d70Sopenharmony_cipub(crate) struct Align64<T>(pub(crate) T);
196e652d70Sopenharmony_ci";
206e652d70Sopenharmony_ci
216e652d70Sopenharmony_cipub fn output(
226e652d70Sopenharmony_ci    properties: &Properties,
236e652d70Sopenharmony_ci    index_start: &[u8],
246e652d70Sopenharmony_ci    index_continue: &[u8],
256e652d70Sopenharmony_ci    halfdense: &[u8],
266e652d70Sopenharmony_ci) -> Output {
276e652d70Sopenharmony_ci    let mut out = Output::new();
286e652d70Sopenharmony_ci    writeln!(out, "{}", HEAD);
296e652d70Sopenharmony_ci
306e652d70Sopenharmony_ci    writeln!(
316e652d70Sopenharmony_ci        out,
326e652d70Sopenharmony_ci        "pub(crate) static ASCII_START: Align64<[bool; 128]> = Align64([",
336e652d70Sopenharmony_ci    );
346e652d70Sopenharmony_ci    for i in 0u8..4 {
356e652d70Sopenharmony_ci        write!(out, "   ");
366e652d70Sopenharmony_ci        for j in 0..32 {
376e652d70Sopenharmony_ci            let ch = (i * 32 + j) as char;
386e652d70Sopenharmony_ci            let is_xid_start = properties.is_xid_start(ch);
396e652d70Sopenharmony_ci            write!(out, " {},", if is_xid_start { 'T' } else { 'F' });
406e652d70Sopenharmony_ci        }
416e652d70Sopenharmony_ci        writeln!(out);
426e652d70Sopenharmony_ci    }
436e652d70Sopenharmony_ci    writeln!(out, "]);");
446e652d70Sopenharmony_ci    writeln!(out);
456e652d70Sopenharmony_ci
466e652d70Sopenharmony_ci    writeln!(
476e652d70Sopenharmony_ci        out,
486e652d70Sopenharmony_ci        "pub(crate) static ASCII_CONTINUE: Align64<[bool; 128]> = Align64([",
496e652d70Sopenharmony_ci    );
506e652d70Sopenharmony_ci    for i in 0u8..4 {
516e652d70Sopenharmony_ci        write!(out, "   ");
526e652d70Sopenharmony_ci        for j in 0..32 {
536e652d70Sopenharmony_ci            let ch = (i * 32 + j) as char;
546e652d70Sopenharmony_ci            let is_xid_continue = properties.is_xid_continue(ch);
556e652d70Sopenharmony_ci            write!(out, " {},", if is_xid_continue { 'T' } else { 'F' });
566e652d70Sopenharmony_ci        }
576e652d70Sopenharmony_ci        writeln!(out);
586e652d70Sopenharmony_ci    }
596e652d70Sopenharmony_ci    writeln!(out, "]);");
606e652d70Sopenharmony_ci    writeln!(out);
616e652d70Sopenharmony_ci
626e652d70Sopenharmony_ci    writeln!(out, "pub(crate) const CHUNK: usize = {};", CHUNK);
636e652d70Sopenharmony_ci    writeln!(out);
646e652d70Sopenharmony_ci
656e652d70Sopenharmony_ci    writeln!(
666e652d70Sopenharmony_ci        out,
676e652d70Sopenharmony_ci        "pub(crate) static TRIE_START: Align8<[u8; {}]> = Align8([",
686e652d70Sopenharmony_ci        index_start.len(),
696e652d70Sopenharmony_ci    );
706e652d70Sopenharmony_ci    for line in index_start.chunks(16) {
716e652d70Sopenharmony_ci        write!(out, "   ");
726e652d70Sopenharmony_ci        for byte in line {
736e652d70Sopenharmony_ci            write!(out, " 0x{:02X},", byte);
746e652d70Sopenharmony_ci        }
756e652d70Sopenharmony_ci        writeln!(out);
766e652d70Sopenharmony_ci    }
776e652d70Sopenharmony_ci    writeln!(out, "]);");
786e652d70Sopenharmony_ci    writeln!(out);
796e652d70Sopenharmony_ci
806e652d70Sopenharmony_ci    writeln!(
816e652d70Sopenharmony_ci        out,
826e652d70Sopenharmony_ci        "pub(crate) static TRIE_CONTINUE: Align8<[u8; {}]> = Align8([",
836e652d70Sopenharmony_ci        index_continue.len(),
846e652d70Sopenharmony_ci    );
856e652d70Sopenharmony_ci    for line in index_continue.chunks(16) {
866e652d70Sopenharmony_ci        write!(out, "   ");
876e652d70Sopenharmony_ci        for byte in line {
886e652d70Sopenharmony_ci            write!(out, " 0x{:02X},", byte);
896e652d70Sopenharmony_ci        }
906e652d70Sopenharmony_ci        writeln!(out);
916e652d70Sopenharmony_ci    }
926e652d70Sopenharmony_ci    writeln!(out, "]);");
936e652d70Sopenharmony_ci    writeln!(out);
946e652d70Sopenharmony_ci
956e652d70Sopenharmony_ci    writeln!(
966e652d70Sopenharmony_ci        out,
976e652d70Sopenharmony_ci        "pub(crate) static LEAF: Align64<[u8; {}]> = Align64([",
986e652d70Sopenharmony_ci        halfdense.len(),
996e652d70Sopenharmony_ci    );
1006e652d70Sopenharmony_ci    for line in halfdense.chunks(16) {
1016e652d70Sopenharmony_ci        write!(out, "   ");
1026e652d70Sopenharmony_ci        for byte in line {
1036e652d70Sopenharmony_ci            write!(out, " 0x{:02X},", byte);
1046e652d70Sopenharmony_ci        }
1056e652d70Sopenharmony_ci        writeln!(out);
1066e652d70Sopenharmony_ci    }
1076e652d70Sopenharmony_ci    writeln!(out, "]);");
1086e652d70Sopenharmony_ci
1096e652d70Sopenharmony_ci    out
1106e652d70Sopenharmony_ci}
111