static int feature_node_lua_remove_leaf(lua_State *L) { GtGenomeNode **parent, **leaf; GtFeatureNode *pf, *lf; parent = check_genome_node(L, 1); leaf = check_genome_node(L, 2); pf = gt_feature_node_try_cast(*parent); luaL_argcheck(L, pf, 1, "not a feature node"); lf = gt_feature_node_try_cast(*leaf); luaL_argcheck(L, lf, 2, "not a feature node"); gt_feature_node_remove_leaf(pf, lf); return 0; }
static int genome_node_lua_add_child(lua_State *L) { GtGenomeNode **parent, **child; GtFeatureNode *pf, *cf; parent = check_genome_node(L, 1); child = check_genome_node(L, 2); pf = gt_feature_node_try_cast(*parent); luaL_argcheck(L, pf, 1, "not a feature node"); cf = gt_feature_node_try_cast(*child); luaL_argcheck(L, cf, 2, "not a feature node"); gt_feature_node_add_child(pf, (GtFeatureNode*) gt_genome_node_ref((GtGenomeNode*) cf)); return 0; }
static int feature_index_lua_add_feature_node(lua_State *L) { GtFeatureIndex **fi; GtGenomeNode **gn; GtFeatureNode *fn; GtStr *seqid; GtError *err; bool has_seqid; gt_assert(L); fi = check_feature_index(L, 1); gn = check_genome_node(L, 2); fn = gt_feature_node_cast(*gn); luaL_argcheck(L, fn, 2, "not a feature node"); seqid = gt_genome_node_get_seqid(*gn); luaL_argcheck(L, seqid, 2, "feature does not have a sequence id"); err = gt_error_new(); if (gt_feature_index_has_seqid(*fi, &has_seqid, gt_str_get(seqid), err)) return gt_lua_error(L, err); gt_error_delete(err); luaL_argcheck(L, has_seqid, 2, "feature index does not contain corresponding sequence region"); err = gt_error_new(); if (gt_feature_index_add_feature_node(*fi, fn, err)) return gt_lua_error(L, err); gt_error_delete(err); return 0; }
static int lua_custom_visitor_visit_node_generic(GT_UNUSED GtNodeVisitor *nv, GtGenomeNode *fn, const char *function, GtError *err) { GT_UNUSED GtNodeVisitor **vis; GtLuaCustomVisitor *lcv; GT_UNUSED GtGenomeNode **node; int had_err = 0; gt_assert(nv); lcv = lua_custom_visitor_cast(nv); node = check_genome_node(lcv->L, 1); vis = check_genome_visitor(lcv->L, 2); gt_assert(*node == (GtGenomeNode*) fn); gt_assert(*vis == (GtNodeVisitor*) nv); lua_pushvalue(lcv->L, 2); lua_pushstring(lcv->L, function); lua_gettable(lcv->L, 2); if (lua_isnil(lcv->L, -1)) { lua_pop(lcv->L, 1); return had_err; } lua_pushvalue(lcv->L, 2); gt_lua_genome_node_push(lcv->L, gt_genome_node_ref((GtGenomeNode*) fn)); if (lua_pcall(lcv->L, 2, 0, 0)) { const char *error = lua_tostring(lcv->L, -1); gt_error_set(err, "%s", error); had_err = -1; } return had_err; }
static int feature_node_lua_extract_sequence(lua_State *L) { GtGenomeNode **gn; GtFeatureNode *fn; const char *type; bool join; GtRegionMapping **region_mapping; GtStr *sequence; GtError *err; gn = check_genome_node(L, 1); /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); type = luaL_checkstring(L, 2); join = lua_toboolean(L, 3); region_mapping = check_region_mapping(L, 4); err = gt_error_new(); sequence = gt_str_new(); if (gt_extract_feature_sequence(sequence, *gn, type, join, NULL, NULL, *region_mapping, err)) { gt_str_delete(sequence); return gt_lua_error(L, err); } if (gt_str_length(sequence)) lua_pushstring(L, gt_str_get(sequence)); else lua_pushnil(L); gt_str_delete(sequence); gt_error_delete(err); return 1; }
static int genome_node_lua_delete(lua_State *L) { GtGenomeNode **gn; gn = check_genome_node(L, 1); gt_genome_node_delete(*gn); return 0; }
static int genome_node_lua_contains_marked(lua_State *L) { GtGenomeNode **gn; gn = check_genome_node(L, 1); lua_pushboolean(L, gt_feature_node_contains_marked(gt_feature_node_cast(*gn))); return 1; }
static int genome_node_lua_get_seqid(lua_State *L) { GtStr *seqid; GtGenomeNode **gn = check_genome_node(L, 1); if ((seqid = gt_genome_node_get_seqid(*gn))) lua_pushstring(L, gt_str_get(seqid)); else lua_pushnil(L); return 1; }
static int feature_node_lua_get_source(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); GtFeatureNode *fn; /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); lua_pushstring(L, gt_feature_node_get_source(fn)); return 1; }
static int feature_node_lua_output_leading(lua_State *L) { GtGenomeNode **gn; GtFeatureNode *fn; gn = check_genome_node(L, 1); /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); gt_gff3_output_leading(fn, NULL); return 0; }
static int feature_node_iterator_lua_new_direct(lua_State *L) { GtFeatureNodeIterator **fni; GtFeatureNode **fn; gt_assert(L); fn = (GtFeatureNode**) check_genome_node(L, 1); fni = lua_newuserdata(L, sizeof (GtFeatureNodeIterator*)); gt_assert(fni); *fni = gt_feature_node_iterator_new_direct(*fn); luaL_getmetatable(L, GENOME_NODE_ITERATOR_METATABLE); lua_setmetatable(L, -2); return 1; }
static int genome_node_lua_accept(lua_State *L) { GtGenomeNode **gn; GtNodeVisitor **gv; GtError *err; gn = check_genome_node(L, 1); gv = check_genome_visitor(L, 2); err = gt_error_new(); if (gt_genome_node_accept(*gn, *gv, err)) return gt_lua_error(L, err); gt_error_delete(err); return 0; }
static int feature_node_lua_get_score(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); GtFeatureNode *fn; /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); if (gt_feature_node_score_is_defined(fn)) lua_pushnumber(L, gt_feature_node_get_score(fn)); else lua_pushnil(L); return 1; }
static int feature_node_lua_get_strand(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); GtFeatureNode *fn; char strand_char[2]; /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); strand_char[0] = GT_STRAND_CHARS[gt_feature_node_get_strand(fn)]; strand_char[1] = '\0'; lua_pushstring(L, strand_char); return 1; }
static int feature_index_lua_add_region_node(lua_State *L) { GtFeatureIndex **fi; GtGenomeNode **gn; GtRegionNode *rn; gt_assert(L); fi = check_feature_index(L, 1); gn = check_genome_node(L, 2); rn = gt_region_node_try_cast(*gn); luaL_argcheck(L, rn, 2, "not a region node"); gt_feature_index_add_region_node(*fi, rn); return 0; }
static int feature_node_lua_set_source(lua_State *L) { const char *source; GtStr *source_str; GtGenomeNode **gn = check_genome_node(L, 1); GtFeatureNode *fn; /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); source = luaL_checkstring(L, 2); source_str = gt_str_new_cstr(source); gt_feature_node_set_source(fn, source_str); gt_str_delete(source_str); return 0; }
static int feature_node_lua_get_attribute(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); const char *attr = NULL, *attrval = NULL; attr = luaL_checkstring(L, 2); GtFeatureNode *fn; /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); attrval = gt_feature_node_get_attribute(fn, attr); if (attrval) lua_pushstring(L, attrval); else lua_pushnil(L); return 1; }
static int feature_index_lua_add_region_node(lua_State *L) { GtFeatureIndex **fi; GtGenomeNode **gn; GtRegionNode *rn; GtError *err; gt_assert(L); fi = check_feature_index(L, 1); gn = check_genome_node(L, 2); rn = gt_region_node_try_cast(*gn); luaL_argcheck(L, rn, 2, "not a region node"); err = gt_error_new(); if (gt_feature_index_add_region_node(*fi, rn, err)) return gt_lua_error(L, err); gt_error_delete(err); return 0; }
static int feature_index_lua_add_feature_node(lua_State *L) { GtFeatureIndex **fi; GtGenomeNode **gn; GtFeatureNode *gf; GtStr *seqid; gt_assert(L); fi = check_feature_index(L, 1); gn = check_genome_node(L, 2); gf = gt_genome_node_cast(gt_feature_node_class(), *gn); luaL_argcheck(L, gf, 2, "not a feature node"); seqid = gt_genome_node_get_seqid(*gn); luaL_argcheck(L, seqid, 2, "feature does not have a sequence id"); luaL_argcheck(L, gt_feature_index_has_seqid(*fi, gt_str_get(seqid)), 2, "feature index does not contain corresponding sequence region"); gt_feature_index_add_feature_node(*fi, gf); return 0; }
static int feature_node_lua_get_exons(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); GtArray *exons = gt_array_new(sizeof (GtGenomeNode*)); GtUword i = 0; GtFeatureNode *fn; /* make sure we get a feature node */ fn = gt_feature_node_try_cast(*gn); luaL_argcheck(L, fn, 1, "not a feature node"); gt_feature_node_get_exons(fn, exons); lua_newtable(L); for (i = 0; i < gt_array_size(exons); i++) { lua_pushnumber(L, i+1); gt_lua_genome_node_push(L, (GtGenomeNode*) gt_genome_node_ref(*(GtGenomeNode**) gt_array_get(exons, i))); lua_rawset(L, -3); } gt_array_delete(exons); return 1; }
static int genome_node_lua_get_range(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); return gt_lua_range_push(L, gt_genome_node_get_range(*gn)); }
static int genome_node_lua_get_filename(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); lua_pushstring(L, gt_genome_node_get_filename(*gn)); return 1; }
static int genome_node_lua_mark(lua_State *L) { GtGenomeNode **gn = check_genome_node(L, 1); gt_feature_node_mark(gt_feature_node_cast(*gn)); return 0; }