static int stream_evaluator_lua_new(lua_State *L) { GtStreamEvaluator **stream_evaluator; GtNodeStream **reality_stream, **prediction_stream; reality_stream = check_genome_stream(L, 1); prediction_stream = check_genome_stream(L, 2); stream_evaluator = lua_newuserdata(L, sizeof (GtStreamEvaluator*)); *stream_evaluator = gt_stream_evaluator_new(*reality_stream, *prediction_stream, true, false, 0); luaL_getmetatable(L, STREAM_EVALUATOR_METATABLE); lua_setmetatable(L, -2); return 1; }
static int gff3_out_stream_lua_new(lua_State *L) { GtNodeStream **out_stream, **in_stream = check_genome_stream(L, 1); gt_assert(L); /* construct object */ out_stream = lua_newuserdata(L, sizeof (GtNodeStream*)); *out_stream = gt_gff3_out_stream_new(*in_stream, NULL); gt_assert(*out_stream); luaL_getmetatable(L, GENOME_STREAM_METATABLE); lua_setmetatable(L, -2); 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; }
static int lua_custom_stream_next(GtNodeStream *ns, GtGenomeNode **gn, GtError *err) { GT_UNUSED GtNodeStream **s; GtGenomeNode **retnode; GtLuaCustomStream *lcs; int had_err = 0; gt_assert(ns); gt_error_check(err); lcs = lua_custom_stream_cast(ns); /* push correct Lua object for this stream */ lua_rawgeti(lcs->L, LUA_REGISTRYINDEX, lcs->ref); s = check_genome_stream(lcs->L, -1); /* get overridden next_tree method */ lua_pushstring(lcs->L, "next_tree"); lua_gettable(lcs->L, -2); /* make sure there is one */ gt_assert(!lua_isnil(lcs->L, -1)); lua_pushvalue(lcs->L, -2); if (lua_pcall(lcs->L, 1, 1, 0)) { const char *error = lua_tostring(lcs->L, -1); gt_error_set(err, "%s", error); had_err = -1; } if (!had_err) { if (lua_isnil(lcs->L, -1)) { *gn = NULL; } else { retnode = gt_lua_try_checkudata(lcs->L, -1, GENOME_NODE_METATABLE); if (!retnode) { const char *type; type = lua_tostring(lcs->L, -1); gt_error_set(err, "custom 'next_tree' method must return a genome " "node or nil, was %s", type); had_err = -1; } else { *gn = gt_genome_node_ref(*retnode); } } } return had_err; }
static int csa_stream_lua_new(lua_State *L) { GtNodeStream **csa_stream, **in_stream; long join_length; in_stream = check_genome_stream(L, 1); if (lua_gettop(L) >= 2) { join_length = luaL_checklong(L, 2); luaL_argcheck(L, join_length >= 0, 2, "must be >= 0"); } else join_length = GT_DEFAULT_JOIN_LENGTH; csa_stream = lua_newuserdata(L, sizeof (GtNodeStream*)); gt_assert(csa_stream); *csa_stream = gt_csa_stream_new(*in_stream, join_length); luaL_getmetatable(L, GENOME_STREAM_METATABLE); lua_setmetatable(L, -2); return 1; }
static int gt_node_stream_lua_delete(lua_State *L) { GtNodeStream **gs = check_genome_stream(L, 1); gt_node_stream_delete(*gs); return 0; }