00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "otvalid.h"
00020 #include "otvcommn.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029 #undef FT_COMPONENT
00030 #define FT_COMPONENT trace_otvbase
00031
00032
00033 static void
00034 otv_BaseCoord_validate( FT_Bytes table,
00035 OTV_Validator valid )
00036 {
00037 FT_Bytes p = table;
00038 FT_UInt BaseCoordFormat;
00039
00040
00041 OTV_NAME_ENTER( "BaseCoord" );
00042
00043 OTV_LIMIT_CHECK( 4 );
00044 BaseCoordFormat = FT_NEXT_USHORT( p );
00045 p += 2;
00046
00047 OTV_TRACE(( " (format %d)\n", BaseCoordFormat ));
00048
00049 switch ( BaseCoordFormat )
00050 {
00051 case 1:
00052 break;
00053
00054 case 2:
00055 OTV_LIMIT_CHECK( 4 );
00056 break;
00057
00058 case 3:
00059 OTV_LIMIT_CHECK( 2 );
00060
00061 otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
00062 break;
00063
00064 default:
00065 FT_INVALID_FORMAT;
00066 }
00067
00068 OTV_EXIT;
00069 }
00070
00071
00072 static void
00073 otv_BaseTagList_validate( FT_Bytes table,
00074 OTV_Validator valid )
00075 {
00076 FT_Bytes p = table;
00077 FT_UInt BaseTagCount;
00078
00079
00080 OTV_NAME_ENTER( "BaseTagList" );
00081
00082 OTV_LIMIT_CHECK( 2 );
00083
00084 BaseTagCount = FT_NEXT_USHORT( p );
00085
00086 OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount ));
00087
00088 OTV_LIMIT_CHECK( BaseTagCount * 4 );
00089
00090 OTV_EXIT;
00091 }
00092
00093
00094 static void
00095 otv_BaseValues_validate( FT_Bytes table,
00096 OTV_Validator valid )
00097 {
00098 FT_Bytes p = table;
00099 FT_UInt BaseCoordCount;
00100
00101
00102 OTV_NAME_ENTER( "BaseValues" );
00103
00104 OTV_LIMIT_CHECK( 4 );
00105
00106 p += 2;
00107 BaseCoordCount = FT_NEXT_USHORT( p );
00108
00109 OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount ));
00110
00111 OTV_LIMIT_CHECK( BaseCoordCount * 2 );
00112
00113
00114 for ( ; BaseCoordCount > 0; BaseCoordCount-- )
00115 otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid );
00116
00117 OTV_EXIT;
00118 }
00119
00120
00121 static void
00122 otv_MinMax_validate( FT_Bytes table,
00123 OTV_Validator valid )
00124 {
00125 FT_Bytes p = table;
00126 FT_UInt table_size;
00127 FT_UInt FeatMinMaxCount;
00128
00129 OTV_OPTIONAL_TABLE( MinCoord );
00130 OTV_OPTIONAL_TABLE( MaxCoord );
00131
00132
00133 OTV_NAME_ENTER( "MinMax" );
00134
00135 OTV_LIMIT_CHECK( 6 );
00136
00137 OTV_OPTIONAL_OFFSET( MinCoord );
00138 OTV_OPTIONAL_OFFSET( MaxCoord );
00139 FeatMinMaxCount = FT_NEXT_USHORT( p );
00140
00141 OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount ));
00142
00143 table_size = FeatMinMaxCount * 8 + 6;
00144
00145 OTV_SIZE_CHECK( MinCoord );
00146 if ( MinCoord )
00147 otv_BaseCoord_validate( table + MinCoord, valid );
00148
00149 OTV_SIZE_CHECK( MaxCoord );
00150 if ( MaxCoord )
00151 otv_BaseCoord_validate( table + MaxCoord, valid );
00152
00153 OTV_LIMIT_CHECK( FeatMinMaxCount * 8 );
00154
00155
00156 for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- )
00157 {
00158 p += 4;
00159
00160 OTV_OPTIONAL_OFFSET( MinCoord );
00161 OTV_OPTIONAL_OFFSET( MaxCoord );
00162
00163 OTV_SIZE_CHECK( MinCoord );
00164 if ( MinCoord )
00165 otv_BaseCoord_validate( table + MinCoord, valid );
00166
00167 OTV_SIZE_CHECK( MaxCoord );
00168 if ( MaxCoord )
00169 otv_BaseCoord_validate( table + MaxCoord, valid );
00170 }
00171
00172 OTV_EXIT;
00173 }
00174
00175
00176 static void
00177 otv_BaseScript_validate( FT_Bytes table,
00178 OTV_Validator valid )
00179 {
00180 FT_Bytes p = table;
00181 FT_UInt table_size;
00182 FT_UInt BaseLangSysCount;
00183
00184 OTV_OPTIONAL_TABLE( BaseValues );
00185 OTV_OPTIONAL_TABLE( DefaultMinMax );
00186
00187
00188 OTV_NAME_ENTER( "BaseScript" );
00189
00190 OTV_LIMIT_CHECK( 6 );
00191 OTV_OPTIONAL_OFFSET( BaseValues );
00192 OTV_OPTIONAL_OFFSET( DefaultMinMax );
00193 BaseLangSysCount = FT_NEXT_USHORT( p );
00194
00195 OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount ));
00196
00197 table_size = BaseLangSysCount * 6 + 6;
00198
00199 OTV_SIZE_CHECK( BaseValues );
00200 if ( BaseValues )
00201 otv_BaseValues_validate( table + BaseValues, valid );
00202
00203 OTV_SIZE_CHECK( DefaultMinMax );
00204 if ( DefaultMinMax )
00205 otv_MinMax_validate( table + DefaultMinMax, valid );
00206
00207 OTV_LIMIT_CHECK( BaseLangSysCount * 6 );
00208
00209
00210 for ( ; BaseLangSysCount > 0; BaseLangSysCount-- )
00211 {
00212 p += 4;
00213
00214 otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid );
00215 }
00216
00217 OTV_EXIT;
00218 }
00219
00220
00221 static void
00222 otv_BaseScriptList_validate( FT_Bytes table,
00223 OTV_Validator valid )
00224 {
00225 FT_Bytes p = table;
00226 FT_UInt BaseScriptCount;
00227
00228
00229 OTV_NAME_ENTER( "BaseScriptList" );
00230
00231 OTV_LIMIT_CHECK( 2 );
00232 BaseScriptCount = FT_NEXT_USHORT( p );
00233
00234 OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount ));
00235
00236 OTV_LIMIT_CHECK( BaseScriptCount * 6 );
00237
00238
00239 for ( ; BaseScriptCount > 0; BaseScriptCount-- )
00240 {
00241 p += 4;
00242
00243
00244 otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid );
00245 }
00246
00247 OTV_EXIT;
00248 }
00249
00250
00251 static void
00252 otv_Axis_validate( FT_Bytes table,
00253 OTV_Validator valid )
00254 {
00255 FT_Bytes p = table;
00256 FT_UInt table_size;
00257
00258 OTV_OPTIONAL_TABLE( BaseTagList );
00259
00260
00261 OTV_NAME_ENTER( "Axis" );
00262
00263 OTV_LIMIT_CHECK( 4 );
00264 OTV_OPTIONAL_OFFSET( BaseTagList );
00265
00266 table_size = 4;
00267
00268 OTV_SIZE_CHECK( BaseTagList );
00269 if ( BaseTagList )
00270 otv_BaseTagList_validate( table + BaseTagList, valid );
00271
00272
00273 otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid );
00274
00275 OTV_EXIT;
00276 }
00277
00278
00279 FT_LOCAL_DEF( void )
00280 otv_BASE_validate( FT_Bytes table,
00281 FT_Validator ftvalid )
00282 {
00283 OTV_ValidatorRec validrec;
00284 OTV_Validator valid = &validrec;
00285 FT_Bytes p = table;
00286 FT_UInt table_size;
00287
00288 OTV_OPTIONAL_TABLE( HorizAxis );
00289 OTV_OPTIONAL_TABLE( VertAxis );
00290
00291
00292 valid->root = ftvalid;
00293
00294 FT_TRACE3(( "validating BASE table\n" ));
00295 OTV_INIT;
00296
00297 OTV_LIMIT_CHECK( 6 );
00298
00299 if ( FT_NEXT_ULONG( p ) != 0x10000UL )
00300 FT_INVALID_FORMAT;
00301
00302 table_size = 6;
00303
00304 OTV_OPTIONAL_OFFSET( HorizAxis );
00305 OTV_SIZE_CHECK( HorizAxis );
00306 if ( HorizAxis )
00307 otv_Axis_validate( table + HorizAxis, valid );
00308
00309 OTV_OPTIONAL_OFFSET( VertAxis );
00310 OTV_SIZE_CHECK( VertAxis );
00311 if ( VertAxis )
00312 otv_Axis_validate( table + VertAxis, valid );
00313
00314 FT_TRACE4(( "\n" ));
00315 }
00316
00317
00318