static FT_Error Load_LigGlyph( HB_LigGlyph* lg, FT_Stream stream ) { FT_Memory memory = stream->memory; FT_Error error; FT_UShort n, m, count; FT_ULong cur_offset, new_offset, base_offset; HB_CaretValue* cv; base_offset = FILE_Pos(); if ( ACCESS_Frame( 2L ) ) return error; count = lg->CaretCount = GET_UShort(); FORGET_Frame(); lg->CaretValue = NULL; if ( ALLOC_ARRAY( lg->CaretValue, count, HB_CaretValue ) ) return error; cv = lg->CaretValue; for ( n = 0; n < count; n++ ) { if ( ACCESS_Frame( 2L ) ) goto Fail; new_offset = GET_UShort() + base_offset; FORGET_Frame(); cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || ( error = Load_CaretValue( &cv[n], stream ) ) != FT_Err_Ok ) goto Fail; (void)FILE_Seek( cur_offset ); } return FT_Err_Ok; Fail: for ( m = 0; m < n; m++ ) Free_CaretValue( &cv[m], memory ); FREE( cv ); return error; }
static void Free_LigGlyph( HB_LigGlyph* lg) { HB_UShort n, count; HB_CaretValue* cv; if ( lg->CaretValue ) { count = lg->CaretCount; cv = lg->CaretValue; for ( n = 0; n < count; n++ ) Free_CaretValue( &cv[n] ); FREE( cv ); } }