forsyth20121205-174063a80cc13 years agoHistory
181 lines · 3.8 KB · C
RawDownload
#include "otlbase.h"#include "otlcommn.h"   static void  otl_base_coord_validate( OTL_Bytes      table,                           OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   format;     OTL_CHECK( 4 );     format = OTL_NEXT_USHORT( p );    p += 2;     switch ( format )    {      case 1:        break;       case 2:        OTL_CHECK( 4 );        break;       case 3:        OTL_CHECK( 2 );        otl_device_table_validate( table + OTL_PEEK_USHORT( p ) );        break;       default:        OTL_INVALID_DATA;    }  }    static void  otl_base_tag_list_validate( OTL_Bytes      table,                              OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count;     OTL_CHECK(2);     count = OTL_NEXT_USHORT( p );    OTL_CHECK( count*4 );  }     static void  otl_base_values_validate( OTL_Bytes      table,                            OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count;     OTL_CHECK( 4 );     p    += 2;  /* skip default index */    count = OTL_NEXT_USHORT( p );     OTL_CHECK( count*2 );     for ( ; count > 0; count-- )      otl_base_coord_validate( table + OTL_NEXT_USHORT( p ), valid );  }    static void  otl_base_minmax_validate( OTL_Bytes      table,                            OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   min_coord, max_coord, count;     OTL_CHECK(6);    min_coord = OTL_NEXT_USHORT( p );    max_coord = OTL_NEXT_USHORT( p );    count     = OTL_NEXT_USHORT( p );     if ( min_coord )      otl_base_coord_validate( table + min_coord, valid );     if ( max_coord )      otl_base_coord_validate( table + max_coord, valid );     OTL_CHECK( count*8 );    for ( ; count > 0; count-- )    {      p += 4;  /* ignore tag */      min_coord = OTL_NEXT_USHORT( p );      max_coord = OTL_NEXT_USHORT( p );       if ( min_coord )        otl_base_coord_validate( table + min_coord, valid );       if ( max_coord )        otl_base_coord_validate( table + max_coord, valid );    }  }    static void  otl_base_script_validate( OTL_Bytes      table,                            OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   values, default_minmax;     OTL_CHECK(6);     values         = OTL_NEXT_USHORT( p );    default_minmax = OTL_NEXT_USHORT( p );    count          = OTL_NEXT_USHORT( p );     if ( values )      otl_base_values_validate( table + values, valid );     if ( default_minmax )      otl_base_minmax_validate( table + default_minmax, valid );     OTL_CHECK( count*6 );    for ( ; count > 0; count-- )    {      p += 4;  /* ignore tag */      otl_base_minmax_validate( table + OTL_NEXT_USHORT( p ), valid );    }  }    static void  otl_base_script_list_validate( OTL_Bytes      table,                                 OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count;     OTL_CHECK(2);     count = OTL_NEXT_USHORT( p );    OTL_CHECK(count*6);     for ( ; count > 0; count-- )    {      p += 4;  /* ignore script tag */      otl_base_script_validate( table + OTL_NEXT_USHORT( p ) );    }  }   static void  otl_axis_table_validate( OTL_Bytes      table,                           OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   tags;     OTL_CHECK(4);     tags = OTL_NEXT_USHORT( p );    if ( tags )      otl_base_tag_list_validate   ( table + tags );     otl_base_script_list_validate( table + OTL_NEXT_USHORT( p ) );  }    OTL_LOCALDEF( void )  otl_base_validate( OTL_Bytes      table,                     OTL_Validator  valid )  {    OTL_Bytes p = table;     OTL_CHECK(6);     if ( OTL_NEXT_ULONG( p ) != 0x10000UL )      OTL_INVALID_DATA;     otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );    otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );  }