static int feature_index_lua_get_features_for_seqid(lua_State *L) { GtFeatureIndex **feature_index; const char *seqid; GtArray *features; feature_index = check_feature_index(L, 1); seqid = luaL_checkstring(L, 2); features = gt_feature_index_get_features_for_seqid(*feature_index, seqid); push_features_as_table(L, features); gt_array_delete(features); return 1; }
static int feature_in_stream_next(GtNodeStream *ns, GtGenomeNode **gn, GtError *error) { GtFeatureInStream *stream = feature_in_stream_cast(ns); gt_error_check(error); if (!stream->init) { feature_in_stream_init(stream); stream->init = true; } if (gt_queue_size(stream->regioncache) > 0) { GtGenomeNode *region = gt_queue_get(stream->regioncache); *gn = region; return 0; } if (stream->featurecache == NULL || gt_array_size(stream->featurecache) == 0) { if (stream->featurecache != NULL) { gt_array_delete(stream->featurecache); stream->featurecache = NULL; } if (stream->seqindex == gt_str_array_size(stream->seqids)) { *gn = NULL; return 0; } const char *seqid = gt_str_array_get(stream->seqids, stream->seqindex++); stream->featurecache = gt_feature_index_get_features_for_seqid(stream->fi, seqid, error); gt_array_sort(stream->featurecache, (GtCompare)gt_genome_node_compare); gt_array_reverse(stream->featurecache); } GtGenomeNode *feat = *(GtGenomeNode **)gt_array_pop(stream->featurecache); *gn = gt_genome_node_ref(feat); return 0; }
static int feature_index_lua_get_features_for_seqid(lua_State *L) { GtFeatureIndex **feature_index; const char *seqid; GtArray *features; GtError *err; feature_index = check_feature_index(L, 1); seqid = luaL_checkstring(L, 2); err = gt_error_new(); features = gt_feature_index_get_features_for_seqid(*feature_index, seqid, err); if (!features) return gt_lua_error(L, err); gt_error_delete(err); push_features_as_table(L, features); gt_array_delete(features); return 1; }