60#ifdef FT_DEBUG_LEVEL_TRACE
61#define GXV_LOAD_TRACE_VARS
63#undef GXV_LOAD_TRACE_VARS
66#undef GXV_LOAD_UNUSED_VARS
68#define IS_PARANOID_VALIDATION \
69 ( gxvalid->root->level >= FT_VALIDATE_PARANOID )
70#define GXV_SET_ERR_IF_PARANOID( err ) \
71 do { if ( IS_PARANOID_VALIDATION ) ( err ); } while ( 0 )
88 (*GXV_Validate_Func)( FT_Bytes table,
90 GXV_Validator gxvalid );
100 } GXV_LookupValueDesc;
102 typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
104 typedef enum GXV_LookupValue_SignSpec_
106 GXV_LOOKUPVALUE_UNSIGNED = 0,
107 GXV_LOOKUPVALUE_SIGNED
109 } GXV_LookupValue_SignSpec;
113 (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph,
114 GXV_LookupValueCPtr value_p,
115 GXV_Validator gxvalid );
117 typedef GXV_LookupValueDesc
118 (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex,
119 GXV_LookupValueCPtr base_value_p,
120 FT_Bytes lookuptbl_limit,
121 GXV_Validator gxvalid );
126 typedef enum GXV_GlyphOffset_Format_
128 GXV_GLYPHOFFSET_NONE = -1,
129 GXV_GLYPHOFFSET_UCHAR = 2,
130 GXV_GLYPHOFFSET_CHAR,
131 GXV_GLYPHOFFSET_USHORT = 4,
132 GXV_GLYPHOFFSET_SHORT,
133 GXV_GLYPHOFFSET_ULONG = 8,
136 } GXV_GlyphOffset_Format;
139#define GXV_GLYPHOFFSET_FMT( table ) \
140 ( gxvalid->table.entry_glyphoffset_fmt )
142#define GXV_GLYPHOFFSET_SIZE( table ) \
143 ( gxvalid->table.entry_glyphoffset_fmt / 2 )
157 } GXV_StateTable_GlyphOffsetDesc;
159 typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
162 (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size,
163 FT_UShort classTable,
164 FT_UShort stateArray,
165 FT_UShort entryTable,
166 FT_UShort* classTable_length_p,
167 FT_UShort* stateArray_length_p,
168 FT_UShort* entryTable_length_p,
169 GXV_Validator gxvalid );
172 (*GXV_StateTable_Entry_Validate_Func)(
175 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
176 FT_Bytes statetable_table,
177 FT_Bytes statetable_limit,
178 GXV_Validator gxvalid );
181 (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table,
183 GXV_Validator gxvalid );
187 GXV_GlyphOffset_Format entry_glyphoffset_fmt;
190 GXV_StateTable_Subtable_Setup_Func subtable_setup_func;
191 GXV_StateTable_Entry_Validate_Func entry_validate_func;
192 GXV_StateTable_OptData_Load_Func optdata_load_func;
194 } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
199 typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc;
201 typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
204 (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size,
208 FT_ULong* classTable_length_p,
209 FT_ULong* stateArray_length_p,
210 FT_ULong* entryTable_length_p,
211 GXV_Validator gxvalid );
214 (*GXV_XStateTable_Entry_Validate_Func)(
217 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
218 FT_Bytes xstatetable_table,
219 FT_Bytes xstatetable_limit,
220 GXV_Validator gxvalid );
223 typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func;
228 int entry_glyphoffset_fmt;
231 GXV_XStateTable_Subtable_Setup_Func subtable_setup_func;
232 GXV_XStateTable_Entry_Validate_Func entry_validate_func;
233 GXV_XStateTable_OptData_Load_Func optdata_load_func;
236 FT_UShort maxClassID;
238 } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
250 FT_ULong subtable_length;
252 GXV_LookupValue_SignSpec lookupval_sign;
253 GXV_Lookup_Value_Validate_Func lookupval_func;
254 GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans;
255 FT_Bytes lookuptbl_head;
260 GXV_StateTable_ValidatorRec statetable;
261 GXV_XStateTable_ValidatorRec xstatetable;
263#ifdef FT_DEBUG_LEVEL_TRACE
264 FT_UInt debug_indent;
265 const FT_String* debug_function_name[3];
271#define GXV_TABLE_DATA( tag, field ) \
272 ( ( (GXV_ ## tag ## _Data)gxvalid->table_data )->field )
275#define FT_INVALID_( _error ) \
276 ft_validator_error( gxvalid->root, FT_THROW( _error ) )
278#define GXV_LIMIT_CHECK( _count ) \
280 if ( p + _count > ( limit? limit : gxvalid->root->limit ) ) \
281 FT_INVALID_TOO_SHORT; \
285#ifdef FT_DEBUG_LEVEL_TRACE
287#define GXV_INIT gxvalid->debug_indent = 0
289#define GXV_NAME_ENTER( name ) \
291 gxvalid->debug_indent += 2; \
292 FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \
293 FT_TRACE4(( "%s table\n", name )); \
296#define GXV_EXIT gxvalid->debug_indent -= 2
298#define GXV_TRACE( s ) \
300 FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \
306#define GXV_INIT do { } while ( 0 )
307#define GXV_NAME_ENTER( name ) do { } while ( 0 )
308#define GXV_EXIT do { } while ( 0 )
310#define GXV_TRACE( s ) do { } while ( 0 )
323#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
340#define GXV_TRACE_HEXDUMP( p, len ) \
346 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
347 FT_TRACE1(("\\x%02x", *b)); \
351#define GXV_TRACE_HEXDUMP_C( p, len ) \
357 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
358 if ( 0x40 < *b && *b < 0x7E ) \
359 FT_TRACE1(("%c", *b)); \
361 FT_TRACE1(("\\x%02x", *b)); \
365#define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \
366 GXV_TRACE_HEXDUMP( n.string, n.string_len )
378 gxv_BinSrchHeader_validate( FT_Bytes p,
380 FT_UShort* unitSize_p,
382 GXV_Validator gxvalid );
385 gxv_LookupTable_validate( FT_Bytes table,
387 GXV_Validator gxvalid );
399 gxv_glyphid_validate( FT_UShort gid,
400 GXV_Validator gxvalid );
412 gxv_ctlPoint_validate( FT_UShort gid,
414 GXV_Validator gxvalid );
426 gxv_sfntName_validate( FT_UShort name_index,
429 GXV_Validator gxvalid );
441 gxv_StateTable_subtable_setup( FT_UShort table_size,
442 FT_UShort classTable,
443 FT_UShort stateArray,
444 FT_UShort entryTable,
445 FT_UShort* classTable_length_p,
446 FT_UShort* stateArray_length_p,
447 FT_UShort* entryTable_length_p,
448 GXV_Validator gxvalid );
451 gxv_XStateTable_subtable_setup( FT_ULong table_size,
455 FT_ULong* classTable_length_p,
456 FT_ULong* stateArray_length_p,
457 FT_ULong* entryTable_length_p,
458 GXV_Validator gxvalid );
461 gxv_StateTable_validate( FT_Bytes table,
463 GXV_Validator gxvalid );
466 gxv_XStateTable_validate( FT_Bytes table,
468 GXV_Validator gxvalid );
480 gxv_array_getlimits_byte( FT_Bytes table,
484 GXV_Validator gxvalid );
487 gxv_array_getlimits_ushort( FT_Bytes table,
491 GXV_Validator gxvalid );
494 gxv_set_length_by_ushort_offset( FT_UShort* offset,
499 GXV_Validator gxvalid );
502 gxv_set_length_by_ulong_offset( FT_ULong* offset,
507 GXV_Validator gxvalid);
510#define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \
512 if ( (_offset) > gxvalid->subtable_length ) \
516#define GXV_SUBTABLE_LIMIT_CHECK( _count ) \
518 if ( ( p + (_count) - gxvalid->subtable_start ) > \
519 gxvalid->subtable_length ) \
520 FT_INVALID_TOO_SHORT; \
523#define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 )
524#define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE
526#define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 )
527#define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE
544 } GXV_odtect_DataRec, *GXV_odtect_Data;
549 GXV_odtect_Data range;
551 } GXV_odtect_RangeRec, *GXV_odtect_Range;
555 gxv_odtect_add_range( FT_Bytes start,
557 const FT_String* name,
558 GXV_odtect_Range odtect );
561 gxv_odtect_validate( GXV_odtect_Range odtect,
562 GXV_Validator gxvalid );
565#define GXV_ODTECT( n, odtect ) \
566 GXV_odtect_DataRec odtect ## _range[n]; \
567 GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \
568 GXV_odtect_Range odtect = NULL
570#define GXV_ODTECT_INIT( odtect ) \
572 odtect ## _rec.nRanges = 0; \
573 odtect ## _rec.range = odtect ## _range; \
574 odtect = & odtect ## _rec; \