static void Free_LigCaretList( HB_LigCaretList* lcl ) { HB_UShort n, count; HB_LigGlyph* lg; if ( !lcl->loaded ) return; if ( lcl->LigGlyph ) { count = lcl->LigGlyphCount; lg = lcl->LigGlyph; for ( n = 0; n < count; n++ ) Free_LigGlyph( &lg[n] ); FREE( lg ); } _HB_OPEN_Free_Coverage( &lcl->Coverage ); }
static FT_Error Load_LigCaretList( HB_LigCaretList* lcl, FT_Stream stream ) { FT_Memory memory = stream->memory; FT_Error error; FT_UShort m, n, count; FT_ULong cur_offset, new_offset, base_offset; HB_LigGlyph* lg; base_offset = FILE_Pos(); if ( ACCESS_Frame( 2L ) ) return error; new_offset = GET_UShort() + base_offset; FORGET_Frame(); cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || ( error = _HB_OPEN_Load_Coverage( &lcl->Coverage, stream ) ) != FT_Err_Ok ) return error; (void)FILE_Seek( cur_offset ); if ( ACCESS_Frame( 2L ) ) goto Fail2; count = lcl->LigGlyphCount = GET_UShort(); FORGET_Frame(); lcl->LigGlyph = NULL; if ( ALLOC_ARRAY( lcl->LigGlyph, count, HB_LigGlyph ) ) goto Fail2; lg = lcl->LigGlyph; for ( n = 0; n < count; n++ ) { if ( ACCESS_Frame( 2L ) ) goto Fail1; new_offset = GET_UShort() + base_offset; FORGET_Frame(); cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || ( error = Load_LigGlyph( &lg[n], stream ) ) != FT_Err_Ok ) goto Fail1; (void)FILE_Seek( cur_offset ); } lcl->loaded = TRUE; return FT_Err_Ok; Fail1: for ( m = 0; m < n; m++ ) Free_LigGlyph( &lg[m], memory ); FREE( lg ); Fail2: _HB_OPEN_Free_Coverage( &lcl->Coverage, memory ); return error; }