rusty_expressions 0.2.1

Oniguruma remade in pure Rust: named groups, look-around, backreferences, subexp calls, absent expressions, callouts, per-regex encodings (UTF-8/16/32, Shift_JIS, Big5, EUC-*, GB18030, ISO-8859-*) and Perl/Python/Java/POSIX/GNU/Emacs/grep syntax dialects. Match-equivalent to Oniguruma 6.9.10 and ~3x faster than libonig. no_std + alloc with default-features = false, runs on wasm32, no C toolchain.
Documentation
//! WHATWG CJK maps (Shift_JIS, EUC-JP, Big5, GB18030).
//! Generated by tools/gen_cjk_maps.py. Pair tables are packed LE u32 files.

pub static SJIS_DEC: &[u8] = include_bytes!("cjk_sjis_dec.bin");
pub static SJIS_ENC: &[u8] = include_bytes!("cjk_sjis_enc.bin");
pub static EUCJP_DEC: &[u8] = include_bytes!("cjk_eucjp_dec.bin");
pub static EUCJP_ENC: &[u8] = include_bytes!("cjk_eucjp_enc.bin");
pub static BIG5_DEC: &[u8] = include_bytes!("cjk_big5_dec.bin");
pub static BIG5_ENC: &[u8] = include_bytes!("cjk_big5_enc.bin");
pub static GB_DEC: &[u8] = include_bytes!("cjk_gb_dec.bin");
pub static GB_ENC: &[u8] = include_bytes!("cjk_gb_enc.bin");

pub fn lookup_dec(tab: &[u8], mbc: u32) -> Option<u32> {
    lookup_packed(tab, mbc)
}

pub fn lookup_enc(tab: &[u8], cp: u32) -> Option<u32> {
    lookup_packed(tab, cp)
}

fn lookup_packed(tab: &[u8], key: u32) -> Option<u32> {
    let n = tab.len() / 8;
    let mut lo = 0usize;
    let mut hi = n;
    while lo < hi {
        let mid = (lo + hi) / 2;
        let off = mid * 8;
        let k = u32::from_le_bytes([tab[off], tab[off + 1], tab[off + 2], tab[off + 3]]);
        if k < key {
            lo = mid + 1;
        } else if k > key {
            hi = mid;
        } else {
            return Some(u32::from_le_bytes([
                tab[off + 4],
                tab[off + 5],
                tab[off + 6],
                tab[off + 7],
            ]));
        }
    }
    None
}

/// WHATWG gb18030 4-byte pointer -> code point.
pub fn gb4_to_cp(pointer: u32) -> Option<u32> {
    let t = GB4_RANGES;
    let mut lo = 0usize;
    let mut hi = t.len();
    while lo < hi {
        let mid = (lo + hi) / 2;
        if t[mid].0 <= pointer {
            lo = mid + 1;
        } else {
            hi = mid;
        }
    }
    if lo == 0 {
        return None;
    }
    let (off, cp) = t[lo - 1];
    Some(cp + (pointer - off))
}

/// WHATWG gb18030 code point -> 4-byte pointer (when not in the 2-byte map).
pub fn cp_to_gb4(cp: u32) -> Option<u32> {
    let t = GB4_RANGES;
    let mut lo = 0usize;
    let mut hi = t.len();
    while lo < hi {
        let mid = (lo + hi) / 2;
        if t[mid].1 <= cp {
            lo = mid + 1;
        } else {
            hi = mid;
        }
    }
    if lo == 0 {
        return None;
    }
    let (off, base) = t[lo - 1];
    Some(off + (cp - base))
}

#[rustfmt::skip]
pub static GB4_RANGES: &[(u32, u32)] = &[
    (0x0, 0x0080), (0x24, 0x00a5), (0x26, 0x00a9), (0x2d, 0x00b2), (0x32, 0x00b8), (0x51, 0x00d8),
    (0x59, 0x00e2), (0x5f, 0x00eb), (0x60, 0x00ee), (0x64, 0x00f4), (0x67, 0x00f8), (0x68, 0x00fb),
    (0x69, 0x00fd), (0x6d, 0x0102), (0x7e, 0x0114), (0x85, 0x011c), (0x94, 0x012c), (0xac, 0x0145),
    (0xaf, 0x0149), (0xb3, 0x014e), (0xd0, 0x016c), (0x132, 0x01cf), (0x133, 0x01d1), (0x134, 0x01d3),
    (0x135, 0x01d5), (0x136, 0x01d7), (0x137, 0x01d9), (0x138, 0x01db), (0x139, 0x01dd), (0x155, 0x01fa),
    (0x1ac, 0x0252), (0x1bb, 0x0262), (0x220, 0x02c8), (0x221, 0x02cc), (0x22e, 0x02da), (0x2e5, 0x03a2),
    (0x2e6, 0x03aa), (0x2ed, 0x03c2), (0x2ee, 0x03ca), (0x325, 0x0402), (0x333, 0x0450), (0x334, 0x0452),
    (0x1ef2, 0x2011), (0x1ef4, 0x2017), (0x1ef5, 0x201a), (0x1ef7, 0x201e), (0x1efe, 0x2027), (0x1f07, 0x2031),
    (0x1f08, 0x2034), (0x1f09, 0x2036), (0x1f0e, 0x203c), (0x1f7e, 0x20ad), (0x1fd4, 0x2104), (0x1fd5, 0x2106),
    (0x1fd8, 0x210a), (0x1fe4, 0x2117), (0x1fee, 0x2122), (0x202c, 0x216c), (0x2030, 0x217a), (0x2046, 0x2194),
    (0x2048, 0x219a), (0x20b6, 0x2209), (0x20bc, 0x2210), (0x20bd, 0x2212), (0x20c0, 0x2216), (0x20c4, 0x221b),
    (0x20c6, 0x2221), (0x20c8, 0x2224), (0x20c9, 0x2226), (0x20ca, 0x222c), (0x20cc, 0x222f), (0x20d1, 0x2238),
    (0x20d6, 0x223e), (0x20e0, 0x2249), (0x20e3, 0x224d), (0x20e8, 0x2253), (0x20f5, 0x2262), (0x20f7, 0x2268),
    (0x20fd, 0x2270), (0x2122, 0x2296), (0x2125, 0x229a), (0x2130, 0x22a6), (0x2149, 0x22c0), (0x219b, 0x2313),
    (0x22e8, 0x246a), (0x22f2, 0x249c), (0x2356, 0x254c), (0x235a, 0x2574), (0x2367, 0x2590), (0x236a, 0x2596),
    (0x2374, 0x25a2), (0x2384, 0x25b4), (0x238c, 0x25be), (0x2394, 0x25c8), (0x2397, 0x25cc), (0x2399, 0x25d0),
    (0x23ab, 0x25e6), (0x23ca, 0x2607), (0x23cc, 0x260a), (0x2402, 0x2641), (0x2403, 0x2643), (0x2c41, 0x2e82),
    (0x2c43, 0x2e85), (0x2c46, 0x2e89), (0x2c48, 0x2e8d), (0x2c52, 0x2e98), (0x2c61, 0x2ea8), (0x2c63, 0x2eab),
    (0x2c66, 0x2eaf), (0x2c6a, 0x2eb4), (0x2c6c, 0x2eb8), (0x2c6f, 0x2ebc), (0x2c7d, 0x2ecb), (0x2da2, 0x2ffc),
    (0x2da6, 0x3004), (0x2da7, 0x3018), (0x2dac, 0x301f), (0x2dae, 0x302a), (0x2dc2, 0x303f), (0x2dc4, 0x3094),
    (0x2dcb, 0x309f), (0x2dcd, 0x30f7), (0x2dd2, 0x30ff), (0x2dd8, 0x312a), (0x2ece, 0x322a), (0x2ed5, 0x3232),
    (0x2f46, 0x32a4), (0x3030, 0x3390), (0x303c, 0x339f), (0x303e, 0x33a2), (0x3060, 0x33c5), (0x3069, 0x33cf),
    (0x306b, 0x33d3), (0x306d, 0x33d6), (0x30de, 0x3448), (0x3109, 0x3474), (0x3233, 0x359f), (0x32a2, 0x360f),
    (0x32ad, 0x361b), (0x35aa, 0x3919), (0x35ff, 0x396f), (0x365f, 0x39d1), (0x366d, 0x39e0), (0x3700, 0x3a74),
    (0x37da, 0x3b4f), (0x38f9, 0x3c6f), (0x396a, 0x3ce1), (0x3cdf, 0x4057), (0x3de7, 0x4160), (0x3fbe, 0x4338),
    (0x4032, 0x43ad), (0x4036, 0x43b2), (0x4061, 0x43de), (0x4159, 0x44d7), (0x42ce, 0x464d), (0x42e2, 0x4662),
    (0x43a3, 0x4724), (0x43a8, 0x472a), (0x43fa, 0x477d), (0x440a, 0x478e), (0x45c3, 0x4948), (0x45f5, 0x497b),
    (0x45f7, 0x497e), (0x45fb, 0x4984), (0x45fc, 0x4987), (0x4610, 0x499c), (0x4613, 0x49a0), (0x4629, 0x49b8),
    (0x48e8, 0x4c78), (0x490f, 0x4ca4), (0x497e, 0x4d1a), (0x4a12, 0x4daf), (0x4a63, 0x9fa6), (0x82bd, 0xe76c),
    (0x82be, 0xe7c8), (0x82bf, 0xe7e7), (0x82cc, 0xe815), (0x82cd, 0xe819), (0x82d2, 0xe81f), (0x82d9, 0xe827),
    (0x82dd, 0xe82d), (0x82e1, 0xe833), (0x82e9, 0xe83c), (0x82f0, 0xe844), (0x8300, 0xe856), (0x830e, 0xe865),
    (0x93d5, 0xf92d), (0x9421, 0xf97a), (0x943c, 0xf996), (0x948d, 0xf9e8), (0x9496, 0xf9f2), (0x94b0, 0xfa10),
    (0x94b1, 0xfa12), (0x94b2, 0xfa15), (0x94b5, 0xfa19), (0x94bb, 0xfa22), (0x94bc, 0xfa25), (0x94be, 0xfa2a),
    (0x98c4, 0xfe32), (0x98c5, 0xfe45), (0x98c9, 0xfe53), (0x98ca, 0xfe58), (0x98cb, 0xfe67), (0x98cc, 0xfe6c),
    (0x9961, 0xff5f), (0x99e2, 0xffe6), (0x2e248, 0x10000),
];