harfrust 0.6.0

A complete HarfBuzz shaping algorithm port to Rust.
Documentation
/* == Start of generated table == */
/*
 * The following table is generated by running:
 *
 *   ./gen-indic-table.py --rust IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
 *
 * on files with these headers:
 *
 * # IndicSyllabicCategory-17.0.0.txt
 * # Date: 2025-08-01, 04:02:23 GMT
 * # IndicPositionalCategory-17.0.0.txt
 * # Date: 2025-07-29, 13:35:52 GMT
 * # Blocks-17.0.0.txt
 * # Date: 2025-08-01
 */

#![allow(unused_parens)]
#![allow(clippy::unnecessary_cast, clippy::unreadable_literal, clippy::double_parens)]
#![allow(non_camel_case_types)]
#![allow(unused_imports)]

use super::ot_shaper_indic::ot_category_t::*;
use super::ot_shaper_indic::ot_position_t::*;


use OT_A     as _OT_A;          /*  53 chars; A */
use OT_As    as _OT_As;         /*   1 chars; As */
use OT_C     as _OT_C;          /* 478 chars; C */
use OT_CM    as _OT_CM;         /*   1 chars; CM */
use OT_CS    as _OT_CS;         /*   2 chars; CS */
use OT_DOTTEDCIRCLE as _OT_DC;         /*   1 chars; DOTTEDCIRCLE */
use OT_H     as _OT_H;          /*  11 chars; H */
use OT_M     as _OT_M;          /* 142 chars; M */
use OT_MH    as _OT_MH;         /*   1 chars; MH */
use OT_ML    as _OT_ML;         /*   1 chars; ML */
use OT_MPst  as _OT_MP;         /*   1 chars; MPst */
use OT_MR    as _OT_MR;         /*   1 chars; MR */
use OT_MW    as _OT_MW;         /*   2 chars; MW */
use OT_MY    as _OT_MY;         /*   3 chars; MY */
use OT_N     as _OT_N;          /*  17 chars; N */
use OT_PLACEHOLDER as _OT_GB;         /* 185 chars; PLACEHOLDER */
use OT_PT    as _OT_PT;         /*   8 chars; PT */
use OT_Ra    as _OT_R;          /*  14 chars; Ra */
use OT_Repha as _OT_Rf;         /*   1 chars; Repha */
use OT_Robatic as _OT_Rt;         /*   3 chars; Robatic */
use OT_SM    as _OT_SM;         /*  50 chars; SM */
use OT_SMPst as _OT_SP;         /*   6 chars; SMPst */
use OT_Symbol as _OT_S;          /*  22 chars; Symbol */
use OT_V     as _OT_V;          /* 172 chars; V */
use OT_VAbv  as _OT_VA;         /*  18 chars; VAbv */
use OT_VBlw  as _OT_VB;         /*   7 chars; VBlw */
use OT_VPre  as _OT_VL;         /*   5 chars; VPre */
use OT_VPst  as _OT_VR;         /*  13 chars; VPst */
use OT_VS    as _OT_VS;         /*  16 chars; VS */
use OT_X     as _OT_X;          /*   2 chars; X */
use OT_Xgroup as _OT_Xg;         /*   7 chars; Xgroup */
use OT_Ygroup as _OT_Yg;         /*   4 chars; Ygroup */
use OT_ZWJ   as _OT_ZWJ;        /*   1 chars; ZWJ */
use OT_ZWNJ  as _OT_ZWNJ;       /*   1 chars; ZWNJ */

use POS_ABOVE_C as _POS_T;         /*  22 chars; ABOVE_C */
use POS_AFTER_MAIN as _POS_A;         /*   3 chars; AFTER_MAIN */
use POS_AFTER_POST as _POS_AP;        /*  50 chars; AFTER_POST */
use POS_AFTER_SUB as _POS_AS;        /*  51 chars; AFTER_SUB */
use POS_BASE_C as _POS_C;         /* 853 chars; BASE_C */
use POS_BEFORE_SUB as _POS_BS;        /*  25 chars; BEFORE_SUB */
use POS_BELOW_C as _POS_B;         /*  13 chars; BELOW_C */
use POS_END  as _POS_X;         /*  71 chars; END */
use POS_POST_C as _POS_R;         /*  13 chars; POST_C */
use POS_PRE_C as _POS_L;         /*   5 chars; PRE_C */
use POS_PRE_M as _POS_LM;        /*  14 chars; PRE_M */
use POS_SMVD as _POS_SM;        /* 130 chars; SMVD */

const fn indic_combine_categories (s: u8, m: u8) -> u16
{
  (s as u16) | ((m as u16) << 8)
}


pub(crate) static _hb_indic_values: [u16; 42]=
[
    indic_combine_categories(_OT_A, _POS_SM),  indic_combine_categories(_OT_As, _POS_X),
     indic_combine_categories(_OT_C, _POS_C),  indic_combine_categories(_OT_CM, _POS_C),
    indic_combine_categories(_OT_CS, _POS_C),  indic_combine_categories(_OT_DC, _POS_C),
    indic_combine_categories(_OT_GB, _POS_C),   indic_combine_categories(_OT_H, _POS_B),
     indic_combine_categories(_OT_H, _POS_T),   indic_combine_categories(_OT_H, _POS_X),
     indic_combine_categories(_OT_M, _POS_A),  indic_combine_categories(_OT_M, _POS_AP),
    indic_combine_categories(_OT_M, _POS_AS),   indic_combine_categories(_OT_M, _POS_B),
    indic_combine_categories(_OT_M, _POS_BS),  indic_combine_categories(_OT_M, _POS_LM),
    indic_combine_categories(_OT_MH, _POS_X),  indic_combine_categories(_OT_ML, _POS_X),
   indic_combine_categories(_OT_MP, _POS_AP),  indic_combine_categories(_OT_MR, _POS_X),
    indic_combine_categories(_OT_MW, _POS_X),  indic_combine_categories(_OT_MY, _POS_X),
     indic_combine_categories(_OT_N, _POS_X),  indic_combine_categories(_OT_PT, _POS_X),
     indic_combine_categories(_OT_R, _POS_C),  indic_combine_categories(_OT_Rf, _POS_X),
    indic_combine_categories(_OT_Rt, _POS_X),  indic_combine_categories(_OT_S, _POS_SM),
   indic_combine_categories(_OT_SM, _POS_BS), indic_combine_categories(_OT_SM, _POS_SM),
   indic_combine_categories(_OT_SP, _POS_SM),   indic_combine_categories(_OT_V, _POS_C),
    indic_combine_categories(_OT_VA, _POS_T),  indic_combine_categories(_OT_VB, _POS_B),
    indic_combine_categories(_OT_VL, _POS_L),  indic_combine_categories(_OT_VR, _POS_R),
    indic_combine_categories(_OT_VS, _POS_X),   indic_combine_categories(_OT_X, _POS_X),
    indic_combine_categories(_OT_Xg, _POS_X),  indic_combine_categories(_OT_Yg, _POS_X),
   indic_combine_categories(_OT_ZWJ, _POS_X),indic_combine_categories(_OT_ZWNJ, _POS_X),
];
pub(crate) static _hb_indic_u8: [u8; 1220]=
[
    1,  0, 50,  4,  5, 96,  0,  7,  8,  9,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,186,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,
    0,  0,  0,  0,208,224,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,
    2,  3,  0,  0,  0,  0,  0,  0,  0,  0,  4,  5,  6,  7,  8,  9,
   10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,  0,  0, 22, 23,
   24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 25, 26,  0,  0,
    0, 27,  0,  0,  0,  0, 28, 29, 30,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0, 31,  0,  0,  0, 32,  0,  0,  0, 33,  0, 34,
    0,  0,  0,  0,  0,  0, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0, 36,  0,  0,  0,  0,  0,  0, 37,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0, 25,  2, 10,  0,  0,  0,  0, 26,  0,
   27,  0,  0,  0, 28,  0,  0,  0,  0,  0, 29, 11, 30,  1,  1,  1,
    4, 31, 32, 33, 34,  1,  6,  2, 35,  1, 12, 13,  7,  1,  1,  3,
   36, 14, 15, 37, 16, 17,  6,  2, 38, 39, 18, 40,  7,  1,  1,  3,
   41, 42, 43, 44, 45, 46, 19,  2, 47,  0, 18, 48, 49,  1,  1,  3,
   20, 14, 50, 51,  0,  0, 21,  2,  0, 52, 53, 13,  7,  1,  1,  3,
   20, 54, 15, 55, 56, 17,  6,  2, 57,  0, 58, 59, 60, 61, 62, 63,
    4, 64, 65, 66, 16,  0, 19,  2,  0,  0, 67,  8,  9,  1,  1,  3,
    4, 22, 68, 69, 70, 71, 23,  2,  0,  0, 12,  8,  9,  1,  1,  3,
   72, 22, 73, 74, 75, 76, 23,  2, 77,  0, 78,  8,  9,  1,  1,  1,
    4, 79, 80, 81, 82, 83, 21,  2,  0, 84, 85,  1,  1, 86, 87, 88,
   89, 90,  2, 91, 92, 93, 94, 95, 96,  1, 97, 98,  2, 99,  0,  0,
    0,  0,  1,  1,  1,100,101, 11,102,103,104,105,106,107,  2, 10,
    0,  0,  0,  0,108,  5,  5,109,110,111,  0,112,113,  0,114,  0,
    0,  0,  0,  0,  0,  0,  0,  0,115,  0,116,  0,  0,  0,  0,  0,
    0,  0,  0,117,  0,  0,  0,  0,  0,118,  0,  0,  0,  0,  5,  5,
  119,120,  0,  0,  0,  0,121,  1,  2,122,  0,  0,  0,  0,  1,  1,
  123,124, 24, 24,  0,  0,  0,  0,  0,  0,125,  0,  0,  0,  0,  0,
    0,126,  0,  0,  2,  2,  2, 10,  0,  0,  0,  0,  2,  2,  2,  2,
    4,  4,  4,  4, 10,  2,  2,  2, 26,  2,  2,  2,  8,  8,  8,  8,
    6, 18,  0,  4, 20, 14, 24,  2,  6,  6, 20,  6, 20,  6, 24,  2,
    4,  0,  0,  0,  6,  6,  6,  6, 66, 12, 14,  6,  6,  6, 20, 14,
    2,  0, 36, 50, 52, 18, 38, 68,  0,  0,  0, 32,  0,  0,  2, 16,
   56, 12, 14,  6,  0,  0,  0,  4, 44,  2, 16,  2,  6, 22,  0,  4,
    2,  0, 36, 28,  6, 28,  0,  4, 30, 30, 30, 30,  0,  0, 42,  0,
   34,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0, 42, 12, 12,  6,  6,
    6,  6, 24,  2,  2, 18, 36,112, 18, 18, 18, 18, 18, 18,114,116,
  118,120,122, 18,  0,  6,  6,  6, 44, 10,  0,  2, 54, 32, 46, 10,
   26,  0,  0,  0,  0,  0, 34, 70,  6, 20,  0, 14, 44,  2, 16, 10,
    2,  0, 72, 50,124, 48,  0, 32, 48, 32, 46,  0,126,  0,  0,  0,
   16,  2, 10, 10, 12,  2,128,  0,  6,  6,  6, 14,  6, 14, 24,  2,
   22, 22, 52, 74, 76, 32, 46,  0, 16, 58, 58, 78,130, 12, 14,  6,
    2,  0, 36,132,134, 32, 46,  0,  0,  0, 80,136, 16,  0,  0,  0,
    0, 70, 14,  6,  6, 20,  0,  6, 20,  6, 24,  0, 16, 10, 10,  2,
    0, 16, 10,  0,  2, 10,  0,  2,  2,  0,  0, 22, 76, 48,  0, 82,
   54, 22, 84,  0, 12, 12,138,  6, 28, 60, 38, 28, 86, 28, 88,  0,
    0,  0,140, 86,  2, 10, 16,  0, 26,  2, 16,  2, 28, 60, 38, 60,
   38, 18, 88,  0,  0,  0, 74, 38,  0,  0, 16, 10,142,144,  0,  0,
   12, 12,146,  6,  2,148,150, 22, 22, 22, 48, 82, 54, 22, 84,152,
    0,  0,  2,154,  0,  0,  0, 14,  0,  2,  2,  2,  2,  2, 26,  2,
    2,156,  2,  2, 90,  6,  6,  6,  6,158, 92, 94,160,162, 62, 58,
  164,166,168,170,  4,  4,  0, 10,  2,  6,  6, 96, 98, 26,  2,172,
  174,100,176,178,100,102,102,  2,104, 62,180,  2,  2,182,184,186,
   12, 12, 12,188,  4, 12,190,  0,  2, 26,  2,  2,  2, 90,  6,  6,
    6,  6,  0, 92, 62, 94, 98,192,194,196, 96,198,200,106,106,108,
  108,202,  0,  0, 42,  0,204,  0,  8,206,  8,  8,208, 40,210, 40,
   40,  2,212,214,  8, 34,  0,  0,  0,  0,216,  0,  4,  4,  4,  0,
    0, 34,  0,  0,  0,  0,110,  0,  0, 64,110,  0,  0,  0,218,  0,
    0, 42,  4, 34,  8, 40, 40, 40,  0,  0,  0,220,  2,  2,104, 16,
    4,  2,  2, 10, 16,  2,  4, 34,  0,222, 78,  2, 56, 12,  0,  0,
    0, 80, 72,  0, 37, 37,  2,  2,  6,  6, 31, 31,  0,  0,  2, 37,
   29, 29, 37, 31, 37,  2, 12, 12, 31, 37, 11, 11, 31,  2, 24,  2,
   14, 14, 36, 36, 37, 11,  6, 37, 22, 27, 12, 37, 27, 27, 37,  6,
   24, 37, 11,  7, 11, 37, 11, 15, 11, 12, 15, 37, 37, 29,  0, 22,
   14, 12, 32, 32, 30, 30,  6, 29, 37, 15, 29, 37, 22, 37, 37, 12,
   12, 11, 22, 22, 37, 22, 15, 15, 11,  8, 14, 37, 14,  8,  2, 31,
   35, 32, 32, 33, 35, 35, 33, 33, 35, 23, 23, 23,  2, 32, 26, 38,
   38, 38, 30, 37, 12, 15, 12,  7, 15, 12, 37,  0,  0, 29, 29, 12,
   18, 11, 37, 13, 37,  3, 37, 28, 11, 10, 10, 37, 10, 11, 29, 31,
   37, 14, 37,  4,  4, 29,  6, 31,  2, 12, 12, 27, 25, 37,  2, 11,
    2, 24, 31, 35, 33, 34,  0, 32, 29,  9,  1, 21, 19, 20, 16,  2,
   21, 21, 17,  2, 23,  2,  2, 35, 32,  2, 20, 35, 34, 32, 32, 29,
    2, 29, 29, 32, 32, 35, 35, 34, 34, 34, 38, 39, 39, 26,  9, 39,
   27, 39,  0, 37,  0, 27, 27,  0,  0,  2,  2,  0, 41, 40,  5, 37,
   31, 12,  2, 23,
];

#[inline(always)]
fn _hb_indic_b4 (a: &[u8], i: usize) -> u8
{
  (a[i>>1]>>((i&1)<<2))&15
}
#[inline]
pub(crate) fn _hb_indic_get_categories_index (u: usize) -> u8
{
  /* packtab: [2^4,2^3,2^3,2^2,2^1] */
  if u<71396usize { (_hb_indic_u8[996usize+(((_hb_indic_u8[488usize+((((_hb_indic_u8[186usize+((((_hb_indic_u8[70usize+((((_hb_indic_b4(&_hb_indic_u8,(((((((((u)>>1))>>2))>>3))>>3) as usize) as usize)) as usize)<<3) as usize+((((((((u)>>1))>>2))>>3))&7) as usize) as usize]) as usize)<<3) as usize+((((((u)>>1))>>2))&7) as usize) as usize]) as usize)<<2) as usize+((((u)>>1))&3) as usize) as usize]) as usize) as usize+((u)&1) as usize) as usize]) as u8 } else { 37 }
}

#[inline]
pub(crate) fn get_categories (u: u32) -> (u8, u8)
{
  let v = _hb_indic_values[_hb_indic_get_categories_index (u as usize) as usize];
  ((v & 0xFF) as u8, (v >> 8) as u8)
}

/* == End of generated table == */