123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- #include "otlgdef.h"
- #include "otlcommn.h"
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** ATTACHMENTS LIST *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
- static void
- otl_attach_point_validate( OTL_Bytes table,
- OTL_Validator valid )
- {
- OTL_Bytes p = table;
- OTL_UInt count;
- if ( p + 2 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- count = OTL_NEXT_USHORT( p );
- if ( table + count*2 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- }
- static void
- otl_attach_list_validate( OTL_Bytes table,
- OTL_Validator valid )
- {
- OTL_Bytes p = table;
- OTL_Bytes coverage;
- OTL_UInt count;
- if ( p + 4 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- coverage = table + OTL_NEXT_USHORT( p );
- count = OTL_NEXT_USHORT( p );
- otl_coverage_validate( coverage, valid );
- if ( count != otl_coverage_get_count( coverage ) )
- OTL_INVALID_DATA;
- if ( p + count*2 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- for ( ; count > 0; count-- )
- otl_attach_point_validate( table + OTL_NEXT_USHORT( p ) );
- }
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** LIGATURE CARETS *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
- static void
- otl_caret_value_validate( OTL_Bytes table,
- OTL_Validator valid )
- {
- OTL_Bytes p = table;
- if ( p + 4 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- format = OTL_NEXT_USHORT( p );
- switch ( format )
- {
- case 1:
- case 2:
- break;
- case 3:
- {
- OTL_Bytes device;
- p += 2;
- if ( p + 2 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- otl_device_table_validate( table + OTL_PEEK_USHORT( p ) );
- }
- break;
- default:
- OTL_INVALID_DATA;
- }
- }
- static void
- otl_ligature_glyph_validate( OTL_Bytes table,
- OTL_Validator valid )
- {
- OTL_Bytes p = table;
- OTL_UInt count;
- if ( p + 2 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- count = OTL_NEXT_USHORT( p );
- if ( p + count*2 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- for ( ; count > 0; count-- )
- otl_caret_value_validate( table + OTL_NEXT_USHORT( p ) );
- }
- static void
- otl_ligature_caret_list_validate( OTL_Bytes table,
- OTL_Validator valid )
- {
- OTL_Bytes p = table;
- OTL_Bytes coverage;
- OTL_UInt count;
- if ( p + 4 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- coverage = table + OTL_NEXT_USHORT( p );
- count = OTL_NEXT_USHORT( p );
- otl_coverage_validate( coverage, valid );
- if ( count != otl_coverage_get_count( coverage ) )
- OTL_INVALID_DATA;
- if ( p + count*2 > valid->limit )
- OTL_INVALID_TOO_SHORT;
- for ( ; count > 0; count-- )
- otl_ligature_glyph_validate( table + OTL_NEXT_USHORT( p ) );
- }
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** GDEF TABLE *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
- OTL_APIDEF( void )
- 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 ) );
- }
|