/* == Start of generated function == */
/*
 * The following function is generated by running:
 *
 *   ./gen-arabic-joining-list.py ArabicShaping.txt Scripts.txt
 *
 * on files with these headers:
 *
 * # ArabicShaping-13.0.0.txt
 * # Date: 2020-01-31, 23:55:00 GMT [KW, RP]
 * # Scripts-13.0.0.txt
 * # Date: 2020-01-22, 00:07:43 GMT
 */

#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH
#define HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH

static bool
has_arabic_joining (hb_script_t script)
{
  /* List of scripts that have data in arabic-table. */
  switch ((int) script)
  {
    case HB_SCRIPT_ADLAM:
    case HB_SCRIPT_ARABIC:
    case HB_SCRIPT_CHORASMIAN:
    case HB_SCRIPT_HANIFI_ROHINGYA:
    case HB_SCRIPT_MANDAIC:
    case HB_SCRIPT_MANICHAEAN:
    case HB_SCRIPT_MONGOLIAN:
    case HB_SCRIPT_NKO:
    case HB_SCRIPT_PHAGS_PA:
    case HB_SCRIPT_PSALTER_PAHLAVI:
    case HB_SCRIPT_SOGDIAN:
    case HB_SCRIPT_SYRIAC:
      return true;

    default:
      return false;
  }
}


#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_JOINING_LIST_HH */

/* == End of generated function == */
