int gt_track_insert_block(GtTrack *track, GtBlock *block, GtError *err) { GtLine *line = NULL; int had_err = 0; gt_assert(track && block); had_err = get_next_free_line(track, &line, block, err); if (!had_err) { if (line) { block = gt_block_ref(block); gt_line_insert_block(line, block); had_err = gt_line_breaker_register_block(track->lb, line, block, err); } } return had_err; }
/* Create lists of all GtBlocks in the diagram. */ static int collect_blocks(GT_UNUSED void *key, void *value, void *data, GT_UNUSED GtError *err) { NodeInfoElement *ni = (NodeInfoElement*) value; GtDiagram *diagram = (GtDiagram*) data; GtBlock *block = NULL; GtStr *trackid_str; GtUword i = 0; trackid_str = gt_str_new(); for (i = 0; i < gt_str_array_size(ni->types); i++) { const char *type; GtUword j; GtArray *list; PerTypeInfo *type_struc = NULL; GtBlock* mainblock = NULL; type = gt_str_array_get(ni->types, i); type_struc = gt_hashmap_get(ni->type_index, type); gt_assert(type_struc); for (j=0; j<gt_array_size(type_struc->blocktuples); j++) { GtBlockTuple *bt; bt = *(GtBlockTuple**) gt_array_get(type_struc->blocktuples, j); if (bt->rep == GT_UNDEF_REPR && type_struc->must_merge) { block = mainblock = gt_block_ref(bt->block); gt_block_delete(mainblock); gt_free(bt); continue; } else { if (mainblock) { block = gt_block_clone(mainblock); gt_block_merge(block, bt->block); gt_block_delete(bt->block); } else block = bt->block; } gt_assert(block); gt_str_reset(trackid_str); /* execute hook for track selector function */ diagram->select_func(block, trackid_str, diagram->ptr); if (!(list = (GtArray*) gt_hashmap_get(diagram->blocks, gt_str_get(trackid_str)))) { list = gt_array_new(sizeof (GtBlock*)); gt_hashmap_add(diagram->blocks, gt_cstr_dup(gt_str_get(trackid_str)), list); }; gt_assert(list); gt_array_add(list, block); gt_free(bt); } gt_array_delete(type_struc->blocktuples); gt_hashmap_delete(type_struc->rep_index); gt_block_delete(mainblock); } gt_hashmap_delete(ni->type_index); gt_str_array_delete(ni->types); gt_free(ni); gt_str_delete(trackid_str); return 0; }