otl_gdef_validate( OTL_Bytes table, OTL_Validator valid ) { OTL_Bytes p = table; if ( p + 12 > valid->limit ) OTL_INVALID_TOO_SHORT; /* check format */ if ( OTL_NEXT_ULONG( p ) != 0x00010000UL ) OTL_INVALID_FORMAT; /* validate class definition table */ otl_class_definition_validate( table + OTL_NEXT_USHORT( p ) ); /* validate attachment point list */ otl_attach_list_validate( table + OTL_NEXT_USHORT( p ) ); /* validate ligature caret list */ otl_ligature_caret_list_validate( table + OTL_NEXT_USHORT( p ) ); /* validate mark attach class */ otl_class_definition_validate( table + OTL_NEXT_USHORT( p ) ); }
static void otl_gsub_lookup6_validate( OTL_Bytes table, OTL_Validator valid ) { OTL_Bytes p = table; OTL_UInt format, coverage; OTL_CHECK( 2 ); format = OTL_NEXT_USHORT( p ); switch ( format ) { case 1: { OTL_UInt coverage, count; OTL_CHECK( 4 ); coverage = OTL_NEXT_USHORT( p ); count = OTL_NEXT_USHORT( p ); otl_coverage_validate( table + coverage, valid ); OTL_CHECK( 2*count ); for ( ; count > 0; count-- ) otl_chain_sub_rule_set_validate( table + coverage, valid ); } break; case 2: { OTL_UInt coverage, back_class, input_class, ahead_class, count; OTL_CHECK( 10 ); coverage = OTL_NEXT_USHORT( p ); back_class = OTL_NEXT_USHORT( p ); input_class = OTL_NEXT_USHORT( p ); ahead_class = OTL_NEXT_USHORT( p ); count = OTL_NEXT_USHORT( p ); otl_coverage_validate( table + coverage, valid ); otl_class_definition_validate( table + back_class, valid ); otl_class_definition_validate( table + input_class, valid ); otl_class_definition_validate( table + ahead_class, valid ); OTL_CHECK( 2*count ); for ( ; count > 0; count-- ) otl_chain_sub_class_set( table + OTL_NEXT_USHORT( p ), valid ); } break; case 3: { OTL_UInt back_count, input_count, ahead_count, subst_count, count; OTL_CHECK( 2 ); back_count = OTL_NEXT_USHORT( p ); OTL_CHECK( 2*back_count+2 ); for ( count = back_count; count > 0; count-- ) otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid ); input_count = OTL_NEXT_USHORT( p ); OTL_CHECK( 2*input_count+2 ); for ( count = input_count; count > 0; count-- ) otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid ); ahead_count = OTL_NEXT_USHORT( p ); OTL_CHECK( 2*ahead_count+2 ); for ( count = ahead_count; count > 0; count-- ) otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid ); subst_count = OTL_NEXT_USHORT( p ); OTL_CHECK( subst_count*4 ); } break; default: OTL_INVALID_DATA; } }
static void otl_gsub_lookup5_validate( OTL_Bytes table, OTL_Validator valid ) { OTL_Bytes p = table; OTL_UInt format, coverage; OTL_CHECK( 2 ); format = OTL_NEXT_USHORT( p ); switch ( format ) { case 1: { OTL_UInt coverage, count; OTL_CHECK( 4 ); coverage = OTL_NEXT_USHORT( p ); count = OTL_NEXT_USHORT( p ); otl_coverage_validate( table + coverage, valid ); OTL_CHECK( 2*count ); for ( ; count > 0; count-- ) otl_sub_rule_set_validate( table + coverage, valid ); } break; case 2: { OTL_UInt coverage, class_def, count; OTL_CHECK( 6 ); coverage = OTL_NEXT_USHORT( p ); class_def = OTL_NEXT_USHORT( p ); count = OTL_NEXT_USHORT( p ); otl_coverage_validate ( table + coverage, valid ); otl_class_definition_validate( table + class_def, valid ); OTL_CHECK( 2*count ); for ( ; count > 0; count-- ) otl_sub_class_rule_set_validate( table + coveragen valid ); } break; case 3: { OTL_UInt glyph_count, subst_count, count; OTL_CHECK( 4 ); glyph_count = OTL_NEXT_USHORT( p ); subst_count = OTL_NEXT_USHORT( p ); OTL_CHECK( 2*glyph_count + 4*subst_count ); for ( count = glyph_count; count > 0; count-- ) otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid ); } break; default: OTL_INVALID_DATA; } }