1*37da2899SCharles.Forsyth #include "otlbase.h" 2*37da2899SCharles.Forsyth #include "otlcommn.h" 3*37da2899SCharles.Forsyth 4*37da2899SCharles.Forsyth static void otl_base_coord_validate(OTL_Bytes table,OTL_Validator valid)5*37da2899SCharles.Forsyth otl_base_coord_validate( OTL_Bytes table, 6*37da2899SCharles.Forsyth OTL_Validator valid ) 7*37da2899SCharles.Forsyth { 8*37da2899SCharles.Forsyth OTL_Bytes p = table; 9*37da2899SCharles.Forsyth OTL_UInt format; 10*37da2899SCharles.Forsyth 11*37da2899SCharles.Forsyth OTL_CHECK( 4 ); 12*37da2899SCharles.Forsyth 13*37da2899SCharles.Forsyth format = OTL_NEXT_USHORT( p ); 14*37da2899SCharles.Forsyth p += 2; 15*37da2899SCharles.Forsyth 16*37da2899SCharles.Forsyth switch ( format ) 17*37da2899SCharles.Forsyth { 18*37da2899SCharles.Forsyth case 1: 19*37da2899SCharles.Forsyth break; 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsyth case 2: 22*37da2899SCharles.Forsyth OTL_CHECK( 4 ); 23*37da2899SCharles.Forsyth break; 24*37da2899SCharles.Forsyth 25*37da2899SCharles.Forsyth case 3: 26*37da2899SCharles.Forsyth OTL_CHECK( 2 ); 27*37da2899SCharles.Forsyth otl_device_table_validate( table + OTL_PEEK_USHORT( p ) ); 28*37da2899SCharles.Forsyth break; 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsyth default: 31*37da2899SCharles.Forsyth OTL_INVALID_DATA; 32*37da2899SCharles.Forsyth } 33*37da2899SCharles.Forsyth } 34*37da2899SCharles.Forsyth 35*37da2899SCharles.Forsyth 36*37da2899SCharles.Forsyth static void otl_base_tag_list_validate(OTL_Bytes table,OTL_Validator valid)37*37da2899SCharles.Forsyth otl_base_tag_list_validate( OTL_Bytes table, 38*37da2899SCharles.Forsyth OTL_Validator valid ) 39*37da2899SCharles.Forsyth { 40*37da2899SCharles.Forsyth OTL_Bytes p = table; 41*37da2899SCharles.Forsyth OTL_UInt count; 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsyth OTL_CHECK(2); 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsyth count = OTL_NEXT_USHORT( p ); 46*37da2899SCharles.Forsyth OTL_CHECK( count*4 ); 47*37da2899SCharles.Forsyth } 48*37da2899SCharles.Forsyth 49*37da2899SCharles.Forsyth 50*37da2899SCharles.Forsyth 51*37da2899SCharles.Forsyth static void otl_base_values_validate(OTL_Bytes table,OTL_Validator valid)52*37da2899SCharles.Forsyth otl_base_values_validate( OTL_Bytes table, 53*37da2899SCharles.Forsyth OTL_Validator valid ) 54*37da2899SCharles.Forsyth { 55*37da2899SCharles.Forsyth OTL_Bytes p = table; 56*37da2899SCharles.Forsyth OTL_UInt count; 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsyth OTL_CHECK( 4 ); 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsyth p += 2; /* skip default index */ 61*37da2899SCharles.Forsyth count = OTL_NEXT_USHORT( p ); 62*37da2899SCharles.Forsyth 63*37da2899SCharles.Forsyth OTL_CHECK( count*2 ); 64*37da2899SCharles.Forsyth 65*37da2899SCharles.Forsyth for ( ; count > 0; count-- ) 66*37da2899SCharles.Forsyth otl_base_coord_validate( table + OTL_NEXT_USHORT( p ), valid ); 67*37da2899SCharles.Forsyth } 68*37da2899SCharles.Forsyth 69*37da2899SCharles.Forsyth 70*37da2899SCharles.Forsyth static void otl_base_minmax_validate(OTL_Bytes table,OTL_Validator valid)71*37da2899SCharles.Forsyth otl_base_minmax_validate( OTL_Bytes table, 72*37da2899SCharles.Forsyth OTL_Validator valid ) 73*37da2899SCharles.Forsyth { 74*37da2899SCharles.Forsyth OTL_Bytes p = table; 75*37da2899SCharles.Forsyth OTL_UInt min_coord, max_coord, count; 76*37da2899SCharles.Forsyth 77*37da2899SCharles.Forsyth OTL_CHECK(6); 78*37da2899SCharles.Forsyth min_coord = OTL_NEXT_USHORT( p ); 79*37da2899SCharles.Forsyth max_coord = OTL_NEXT_USHORT( p ); 80*37da2899SCharles.Forsyth count = OTL_NEXT_USHORT( p ); 81*37da2899SCharles.Forsyth 82*37da2899SCharles.Forsyth if ( min_coord ) 83*37da2899SCharles.Forsyth otl_base_coord_validate( table + min_coord, valid ); 84*37da2899SCharles.Forsyth 85*37da2899SCharles.Forsyth if ( max_coord ) 86*37da2899SCharles.Forsyth otl_base_coord_validate( table + max_coord, valid ); 87*37da2899SCharles.Forsyth 88*37da2899SCharles.Forsyth OTL_CHECK( count*8 ); 89*37da2899SCharles.Forsyth for ( ; count > 0; count-- ) 90*37da2899SCharles.Forsyth { 91*37da2899SCharles.Forsyth p += 4; /* ignore tag */ 92*37da2899SCharles.Forsyth min_coord = OTL_NEXT_USHORT( p ); 93*37da2899SCharles.Forsyth max_coord = OTL_NEXT_USHORT( p ); 94*37da2899SCharles.Forsyth 95*37da2899SCharles.Forsyth if ( min_coord ) 96*37da2899SCharles.Forsyth otl_base_coord_validate( table + min_coord, valid ); 97*37da2899SCharles.Forsyth 98*37da2899SCharles.Forsyth if ( max_coord ) 99*37da2899SCharles.Forsyth otl_base_coord_validate( table + max_coord, valid ); 100*37da2899SCharles.Forsyth } 101*37da2899SCharles.Forsyth } 102*37da2899SCharles.Forsyth 103*37da2899SCharles.Forsyth 104*37da2899SCharles.Forsyth static void otl_base_script_validate(OTL_Bytes table,OTL_Validator valid)105*37da2899SCharles.Forsyth otl_base_script_validate( OTL_Bytes table, 106*37da2899SCharles.Forsyth OTL_Validator valid ) 107*37da2899SCharles.Forsyth { 108*37da2899SCharles.Forsyth OTL_Bytes p = table; 109*37da2899SCharles.Forsyth OTL_UInt values, default_minmax; 110*37da2899SCharles.Forsyth 111*37da2899SCharles.Forsyth OTL_CHECK(6); 112*37da2899SCharles.Forsyth 113*37da2899SCharles.Forsyth values = OTL_NEXT_USHORT( p ); 114*37da2899SCharles.Forsyth default_minmax = OTL_NEXT_USHORT( p ); 115*37da2899SCharles.Forsyth count = OTL_NEXT_USHORT( p ); 116*37da2899SCharles.Forsyth 117*37da2899SCharles.Forsyth if ( values ) 118*37da2899SCharles.Forsyth otl_base_values_validate( table + values, valid ); 119*37da2899SCharles.Forsyth 120*37da2899SCharles.Forsyth if ( default_minmax ) 121*37da2899SCharles.Forsyth otl_base_minmax_validate( table + default_minmax, valid ); 122*37da2899SCharles.Forsyth 123*37da2899SCharles.Forsyth OTL_CHECK( count*6 ); 124*37da2899SCharles.Forsyth for ( ; count > 0; count-- ) 125*37da2899SCharles.Forsyth { 126*37da2899SCharles.Forsyth p += 4; /* ignore tag */ 127*37da2899SCharles.Forsyth otl_base_minmax_validate( table + OTL_NEXT_USHORT( p ), valid ); 128*37da2899SCharles.Forsyth } 129*37da2899SCharles.Forsyth } 130*37da2899SCharles.Forsyth 131*37da2899SCharles.Forsyth 132*37da2899SCharles.Forsyth static void otl_base_script_list_validate(OTL_Bytes table,OTL_Validator valid)133*37da2899SCharles.Forsyth otl_base_script_list_validate( OTL_Bytes table, 134*37da2899SCharles.Forsyth OTL_Validator valid ) 135*37da2899SCharles.Forsyth { 136*37da2899SCharles.Forsyth OTL_Bytes p = table; 137*37da2899SCharles.Forsyth OTL_UInt count; 138*37da2899SCharles.Forsyth 139*37da2899SCharles.Forsyth OTL_CHECK(2); 140*37da2899SCharles.Forsyth 141*37da2899SCharles.Forsyth count = OTL_NEXT_USHORT( p ); 142*37da2899SCharles.Forsyth OTL_CHECK(count*6); 143*37da2899SCharles.Forsyth 144*37da2899SCharles.Forsyth for ( ; count > 0; count-- ) 145*37da2899SCharles.Forsyth { 146*37da2899SCharles.Forsyth p += 4; /* ignore script tag */ 147*37da2899SCharles.Forsyth otl_base_script_validate( table + OTL_NEXT_USHORT( p ) ); 148*37da2899SCharles.Forsyth } 149*37da2899SCharles.Forsyth } 150*37da2899SCharles.Forsyth 151*37da2899SCharles.Forsyth static void otl_axis_table_validate(OTL_Bytes table,OTL_Validator valid)152*37da2899SCharles.Forsyth otl_axis_table_validate( OTL_Bytes table, 153*37da2899SCharles.Forsyth OTL_Validator valid ) 154*37da2899SCharles.Forsyth { 155*37da2899SCharles.Forsyth OTL_Bytes p = table; 156*37da2899SCharles.Forsyth OTL_UInt tags; 157*37da2899SCharles.Forsyth 158*37da2899SCharles.Forsyth OTL_CHECK(4); 159*37da2899SCharles.Forsyth 160*37da2899SCharles.Forsyth tags = OTL_NEXT_USHORT( p ); 161*37da2899SCharles.Forsyth if ( tags ) 162*37da2899SCharles.Forsyth otl_base_tag_list_validate ( table + tags ); 163*37da2899SCharles.Forsyth 164*37da2899SCharles.Forsyth otl_base_script_list_validate( table + OTL_NEXT_USHORT( p ) ); 165*37da2899SCharles.Forsyth } 166*37da2899SCharles.Forsyth 167*37da2899SCharles.Forsyth 168*37da2899SCharles.Forsyth OTL_LOCALDEF( void ) otl_base_validate(OTL_Bytes table,OTL_Validator valid)169*37da2899SCharles.Forsyth otl_base_validate( OTL_Bytes table, 170*37da2899SCharles.Forsyth OTL_Validator valid ) 171*37da2899SCharles.Forsyth { 172*37da2899SCharles.Forsyth OTL_Bytes p = table; 173*37da2899SCharles.Forsyth 174*37da2899SCharles.Forsyth OTL_CHECK(6); 175*37da2899SCharles.Forsyth 176*37da2899SCharles.Forsyth if ( OTL_NEXT_ULONG( p ) != 0x10000UL ) 177*37da2899SCharles.Forsyth OTL_INVALID_DATA; 178*37da2899SCharles.Forsyth 179*37da2899SCharles.Forsyth otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) ); 180*37da2899SCharles.Forsyth otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) ); 181*37da2899SCharles.Forsyth }