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_iterator_lua_next(lua_State *L) { GtFeatureNodeIterator **fni; GtFeatureNode *fn; fni = check_gt_feature_node_iterator(L, 1); fn = gt_feature_node_iterator_next(*fni); if (fn) gt_lua_genome_node_push(L, gt_genome_node_ref((GtGenomeNode*) fn)); else lua_pushnil(L); return 1; }
static int gt_node_stream_lua_next_tree(lua_State *L) { GtNodeStream **gs = check_genome_stream(L, 1); GtGenomeNode *gn; GtError *err = gt_error_new(); if (gt_node_stream_next(*gs, &gn, err)) return gt_lua_error(L, err); /* handle error */ else if (gn) gt_lua_genome_node_push(L, gn); else lua_pushnil(L); gt_error_delete(err); return 1; }
int gt_script_filter_run(GtScriptFilter *sf, GtFeatureNode *gf, bool *select_node, GtError *err) { int had_err = 0; #ifndef NDEBUG int stack_size; #endif GtGenomeNode *gn_lua; #ifndef NDEBUG stack_size = lua_gettop(sf->L); #endif if (!had_err) { lua_getglobal(sf->L, "filter"); if (lua_isnil(sf->L, -1)) { gt_error_set(err, "function 'filter' is not defined"); had_err = -1; lua_pop(sf->L, 1); } } if (!had_err) { gn_lua = gt_genome_node_ref((GtGenomeNode*) gf); gt_lua_genome_node_push(sf->L, gn_lua); if (lua_pcall(sf->L, 1, 1, 0) != 0) { gt_error_set(err, "error running function 'filter': %s", lua_tostring(sf->L, -1)); lua_pop(sf->L, 1); had_err = -1; } } if (!had_err && !lua_isboolean(sf->L, -1)) { gt_error_set(err, "function 'filter' must return boolean"); lua_pop(sf->L, 1); had_err = -1; } if (!had_err) { *select_node = lua_toboolean(sf->L, -1); lua_pop(sf->L, 1); } gt_assert(lua_gettop(sf->L) == stack_size); return had_err; }
static void push_features_as_table(lua_State *L, GtArray *features) { unsigned long i; if (features && gt_array_size(features)) { /* push table containing feature references onto the stack */ lua_newtable(L); for (i = 0; i < gt_array_size(features); i++) { lua_pushinteger(L, i+1); /* in Lua we index from 1 on */ gt_lua_genome_node_push(L, gt_genome_node_ref(*(GtGenomeNode**) gt_array_get(features, i))); lua_rawset(L, -3); } } else lua_pushnil(L); }
static void push_recmap_as_table(lua_State *L, const GtRecMap *rm) { gt_assert(rm); lua_newtable(L); lua_pushstring(L, "nw_x"); lua_pushnumber(L, gt_rec_map_get_northwest_x(rm)); lua_rawset(L, -3); lua_pushstring(L, "nw_y"); lua_pushnumber(L, gt_rec_map_get_northwest_y(rm)); lua_rawset(L, -3); lua_pushstring(L, "se_x"); lua_pushnumber(L, gt_rec_map_get_southeast_x(rm)); lua_rawset(L, -3); lua_pushstring(L, "se_y"); lua_pushnumber(L, gt_rec_map_get_southeast_y(rm)); lua_rawset(L, -3); lua_pushstring(L, "feature_ref"); gt_lua_genome_node_push(L, gt_genome_node_ref((GtGenomeNode*) gt_rec_map_get_genome_feature(rm))); lua_rawset(L, -3); }
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; }