blob: b0fa9f406a02bc876af87a79e0b60e9e86f18a02 [file] [log] [blame]
#include "otljstf.h"
#include "otlcommn.h"
#include "otlgpos.h"
static void
otl_jstf_extender_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*2 );
}
static void
otl_jstf_gsub_mods_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*2 );
/* XXX: check GSUB lookup indices */
}
static void
otl_jstf_gpos_mods_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*2 );
/* XXX: check GPOS lookup indices */
}
static void
otl_jstf_max_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*2 );
for ( ; count > 0; count-- )
otl_gpos_subtable_check( table + OTL_NEXT_USHORT( p ), valid );
}
static void
otl_jstf_priority_validate( OTL_Bytes table,
OTL_Validator valid )
{
OTL_Bytes p = table;
OTL_UInt offset;
OTL_CHECK( 20 );
/* shrinkage GSUB enable/disable */
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gsub_mods_validate( table + val, valid );
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gsub_mods_validate( table + val, valid );
/* shrinkage GPOS enable/disable */
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gpos_mods_validate( table + val, valid );
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gpos_mods_validate( table + val, valid );
/* shrinkage JSTF max */
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_max_validate( table + val, valid );
/* extension GSUB enable/disable */
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gsub_mods_validate( table + val, valid );
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gsub_mods_validate( table + val, valid );
/* extension GPOS enable/disable */
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gpos_mods_validate( table + val, valid );
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_gpos_mods_validate( table + val, valid );
/* extension JSTF max */
val = OTL_NEXT_USHORT( p );
if ( val )
otl_jstf_max_validate( table + val, valid );
}
static void
otl_jstf_lang_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*2 );
for ( ; count > 0; count-- )
otl_jstf_priority_validate( table + OTL_NEXT_USHORT( p ), valid );
}
static void
otl_jstf_script_validate( OTL_Bytes table,
OTL_Validator valid )
{
OTL_Bytes p = table;
OTL_UInt count, extender, default_lang;
OTL_CHECK( 6 );
extender = OTL_NEXT_USHORT( p );
default_lang = OTL_NEXT_USHORT( p );
count = OTL_NEXT_USHORT( p );
if ( extender )
otl_jstf_extender_validate( table + extender, valid );
if ( default_lang )
otl_jstf_lang_validate( table + default_lang, valid );
OTL_CHECK( 6*count );
for ( ; count > 0; count-- )
{
p += 4; /* ignore tag */
otl_jstf_lang_validate( table + OTL_NEXT_USHORT( p ), valid );
}
}
OTL_LOCALDEF( void )
otl_jstf_validate( OTL_Bytes table,
OTL_Validator valid )
{
OTL_Bytes p = table;
OTL_UInt count;
OTL_CHECK( 4 );
if ( OTL_NEXT_ULONG( p ) != 0x10000UL )
OTL_INVALID_DATA;
count = OTL_NEXT_USHORT( p );
OTL_CHECK( count*6 );
for ( ; count > 0; count++ )
{
p += 4; /* ignore tag */
otl_jstf_script_validate( table + OTL_NEXT_USHORT( p ), valid );
}
}